mqtt-tools / pytest-mqtt

pytest-mqtt supports testing systems based on MQTT.
MIT License
9 stars 3 forks source link

[paho-mqtt] DeprecationWarning: Callback API version 1 is deprecated, update to latest version #24

Open parrotrueper opened 1 month ago

parrotrueper commented 1 month ago

Given the following test

import pytest
from pytest_mqtt.model import MqttMessage

@pytest.fixture
def configure_capmqtt_decode_utf8(pytestconfig):
    pytestconfig.option.capmqtt_decode_utf8 = True

def test_basic_submit_text_receive_text_config(configure_capmqtt_decode_utf8,  capmqtt):
    """
    Basic submit/receive roundtrip, with text payload (`str`).

    By using the global `capmqtt_decode_utf8` config option, the payloads
    will be received as `str`, after decoding them from `utf-8`.
    """

    # Submit two MQTT messages.
    capmqtt.publish(topic="foo", payload="bar")
    capmqtt.publish(topic="baz", payload="qux")

    # Demonstrate the `messages` property.
    assert capmqtt.messages == [
        MqttMessage(topic="foo", payload="bar", userdata=None),
        MqttMessage(topic="baz", payload="qux", userdata=None),
    ]

    # Demonstrate the `records` property.
    assert capmqtt.records == [
        ("foo", "bar", None),
        ("baz", "qux", None),

running with:

python -m pytest -x --full-trace --junitxml=./report.xml --mqtt-host=192.168.1.123 --mqtt-port=1883

The test passes but I get the following warning:

/usr/local/lib/python3.11/site-packages/pytest_mqtt/capmqtt.py:38: DeprecationWarning: Callback API version 1 is deprecated, update to latest version 
self.client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1)

Sorry if this is a silly question, but how do I tell capmqtt to use the paho-mqtt Version 2 for the tests?

amotl commented 1 month ago

Hi. It looks like compatibility with paho-mqtt version 2 has been addressed already.

However, support for version 2 might be incomplete, or not thorough, yet.

amotl commented 1 month ago

However, support for version 2 might be incomplete, or not thorough, yet.

/usr/local/lib/python3.11/site-packages/pytest_mqtt/capmqtt.py:38: DeprecationWarning: Callback API version 1 is deprecated, update to latest version 
self.client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1)

I see. Line 38 instructs the library to use mqtt.CallbackAPIVersion.VERSION1.

https://github.com/mqtt-tools/pytest-mqtt/blob/7a9ebb8c0ee0a745bec59b2a1ba71f5193491f74/pytest_mqtt/capmqtt.py#L37-L38

Sorry if this is a silly question, but how do I tell capmqtt to use the paho-mqtt Version 2 for the tests?

So, I guess you are already using paho-mqtt version 2, but still the "Callback API version 1". I think you can do nothing about the situation, other than silencing the warning messages. This, on the other hand, may also be conducted on behalf of pytest-mqtt already.

In the mid-term, pytest-mqtt must update how it uses the callback api of paho-mqtt, in order to adhere to the convention/specification of the "Callback API version 2".

amotl commented 1 month ago

Hi again. bea0d52be78f makes the procedure ignore the deprecation warning, until the transition to Callback API v2 has been concluded. Do you think this will help you already?

pytest-mqtt 0.4.3 has just been released and published to PyPI, including this update.

hyperspacex2 commented 4 weeks ago

As I see in Paho Migrations Doc the new callback uses reason_code (inst of ReasonCode) istead of an integer rc. An update to VERSION2 should be as simple as updating the callback functions on_connect and on_subscribe.

on_connect: https://github.com/mqtt-tools/pytest-mqtt/blob/de19691285cc823d953535ce1742e7c81a7b830b/pytest_mqtt/capmqtt.py#L71 would change to def on_connect(self, client, userdata, flags, reason_code, properties):

on_subscribe: https://github.com/mqtt-tools/pytest-mqtt/blob/de19691285cc823d953535ce1742e7c81a7b830b/pytest_mqtt/capmqtt.py#L74 would change to def on_subscribe(self, client, userdata, mid, reason_codes, properties):

As I see it this would be a minor change as rc granted_qos are not actually used in those callbacks.

Any reason why not to migrate to VERSION2 now?

parrotrueper commented 4 weeks ago

Would be great if the default was VERSION2 failing that an argument to set it.

amotl commented 3 weeks ago

Thanks for sharing your investigations. Would you be up for submitting a patch based on your observations, @hyperspacex2? It will be well appreciated.

hyperspacex2 commented 2 weeks ago

Thanks for sharing your investigations. Would you be up for submitting a patch based on your observations, @hyperspacex2? It will be well appreciated.

Sure. See PR #28