feat: add tests for MQTT notification

Edited by thomas Bousselin

Merge request reports

Loading
+89 −0
Changes for TP/NGSI-LD/ContextInformation/Subscription/SubscriptionNotificationBehaviour/MQTT/058_01.robot: 89 added lines, 0 removed lines.
Original line number Diff line number Diff line
*** Settings ***
Documentation       Check that the Mqtt Notification is received with different userInfo and port

Resource            ${EXECDIR}/resources/ApiUtils/ContextInformationSubscription.resource
Resource            ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource
Resource            ${EXECDIR}/resources/AssertionUtils.resource
Resource            ${EXECDIR}/resources/JsonUtils.resource
Resource            ${EXECDIR}/resources/NotificationUtils.resource
Resource            ${EXECDIR}/resources/mqttUtils/MqttUtils.resource

Test Teardown       After Test
Test Template       Receive MQTT Notification


*** Variables ***
${subscription_id_prefix}               urn:ngsi-ld:Subscription:
${subscription_payload_file_path}       subscriptions/subscription-building-entities-default.jsonld
${building_id_prefix}                   urn:ngsi-ld:Building:
${entity_building_filepath}             building-simple-attributes-sample.jsonld
${fragment_filename}                    airQualityLevel-fragment.jsonld
${topic}                                ngsild-test-suite/topic


*** Test Cases ***
058_01_01 Without User And Port
    [Tags]    sub-mqtt-notification    5_8_6
    mosquitto.conf    mqtt://127.0.0.1/${topic}
058_01_02 With Non Default Port
    [Tags]    sub-mqtt-notification    5_8_6
    mosquitto.conf    mqtt://127.0.0.1:2883/${topic}    port=2883
058_01_03 With User
    [Tags]    sub-mqtt-notification    5_8_6
    mosquitto.conf    mqtt://user@127.0.0.1/${topic}
058_01_04 With User And Password
    [Tags]    sub-mqtt-notification    5_8_6
    mosquitto_with_user.conf    mqtt://user_with_password:password@127.0.0.1/${topic}    username=user_with_password    password=password
058_01_05 With User Password And Non Default Port
    [Tags]    sub-mqtt-notification    5_8_6
    mosquitto_with_user.conf    mqtt://user_with_password:password@127.0.0.1:2883/${topic}    username=user_with_password    password=password    port=2883


*** Keywords ***
Receive MQTT Notification
    [Documentation]    Check that the broker uses the authentication information from the endpoint url
    [Arguments]    ${config_filename}    ${endpoint_uri}    ${port}=1883    ${username}=${None}    ${password}=${None}

    Start Mqtt Server    ${config_filename}    ${port}
    Setup Mqtt Subscription    ${endpoint_uri}

    Set Username And Password    ${username}    ${password}
    Connect    127.0.0.1    ${port}
    Subscribe    topic=${topic}    qos=1

    ${response}=    Update Entity Attributes    ${entity_id}    ${fragment_filename}    ${CONTENT_TYPE_LD_JSON}
    ${listenMessages}=    Listen    ${topic}
    Check Messages Contain One Instance    ${listenMessages}

After Test
    Delete Initial Subscriptions
    Delete Initial Entity
    Stop Mqtt Server
    Disconnect

Setup Mqtt Subscription
    [Arguments]    ${endpoint_uri}
    ${subscription_id}=    Generate Random Entity Id    ${subscription_id_prefix}
    ${entity_id}=    Generate Random Entity Id    ${building_id_prefix}

    ${subscription_payload}=    Load Subscription Sample With Reachable Endpoint
    ...    ${subscription_payload_file_path}
    ...    ${subscription_id}
    ...    ${endpoint_uri}
    ${subscription_payload}=    Set Entity Id In Subscription    ${subscription_payload}    ${entity_id}

    Set Suite Variable    ${subscription_id}
    Set Suite Variable    ${entity_id}

    ${response}=    Create Entity    ${entity_building_filepath}    ${entity_id}
    Check Response Status Code    201    ${response.status_code}
    Sleep    1s
    ${response}=    Create Subscription From Subscription Payload    ${subscription_payload}    ${CONTENT_TYPE_LD_JSON}
    Check Response Status Code    201    ${response.status_code}
    Sleep    1s

Delete Initial Subscriptions
    Delete Subscription    ${subscription_id}

Delete Initial Entity
    Delete Entity by Id    ${entity_id}
+98 −0
Changes for TP/NGSI-LD/ContextInformation/Subscription/SubscriptionNotificationBehaviour/MQTT/058_02.robot: 98 added lines, 0 removed lines.
Original line number Diff line number Diff line
*** Settings ***
Documentation       Check that the mqtt notification is received with different qos

Resource            ${EXECDIR}/resources/ApiUtils/ContextInformationSubscription.resource
Resource            ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource
Resource            ${EXECDIR}/resources/AssertionUtils.resource
Resource            ${EXECDIR}/resources/JsonUtils.resource
Resource            ${EXECDIR}/resources/NotificationUtils.resource
Resource            ${EXECDIR}/resources/mqttUtils/MqttUtils.resource

Test Setup          Start Mqtt Server And Connect
Test Teardown       After Test
Test Template       Receive MQTT Notification


*** Variables ***
${subscription_id_prefix}               urn:ngsi-ld:Subscription:
${subscription_payload_file_path}       subscriptions/subscription-building-entities-default.jsonld
${building_id_prefix}                   urn:ngsi-ld:Building:
${entity_building_filepath}             building-simple-attributes-sample.jsonld
${fragment_filename}                    airQualityLevel-fragment.jsonld
${topic}                                ngsild-test-suite/topic
${endpoint}                             mqtt://127.0.0.1/${topic}
${config_filename}                      mosquitto.conf


*** Test Cases ***
058_02_01 With Default QoS
    [Tags]    sub-mqtt-notification    5_8_6
    qos=${None}
058_02_02 With QoS 1
    [Tags]    sub-mqtt-notification    5_8_6
    qos=1
058_02_03 With QoS 2
    [Tags]    sub-mqtt-notification    5_8_6
    qos=2


*** Keywords ***
Receive MQTT Notification
    [Documentation]    Check that the broker supports different quality of service (qos)
    [Arguments]    ${qos}

    Setup Mqtt Subscription    ${endpoint}    qos=${qos}
    ${response}=    Update Entity Attributes    ${entity_id}    ${fragment_filename}    ${CONTENT_TYPE_LD_JSON}

    ${listenMessages}=    Listen    ${topic}
    Check Messages Contain One Instance    ${listenMessages}

Start Mqtt Server And Connect
    Start Mqtt Server    ${config_filename}    1883
    Connect    127.0.0.1    1883
    Subscribe    topic=${topic}    qos=1

After Test
    Delete Initial Subscriptions
    Delete Initial Entity
    Stop Mqtt Server
    Disconnect

Setup Mqtt Subscription
    [Arguments]    ${endpoint_uri}    ${qos}=${None}
    ${subscription_id}=    Generate Random Entity Id    ${subscription_id_prefix}
    ${entity_id}=    Generate Random Entity Id    ${building_id_prefix}

    ${subscription_payload}=    Load Subscription Sample With Reachable Endpoint
    ...    ${subscription_payload_file_path}
    ...    ${subscription_id}
    ...    ${endpoint_uri}
    ${subscription_payload}=    Set Entity Id In Subscription    ${subscription_payload}    ${entity_id}
    IF    ${qos} != ${None}
        ${notifierInfo}=    Create Dictionary
        Set To Dictionary    ${notifierInfo}    key    MQTT-QoS
        Set To Dictionary    ${notifierInfo}    value    ${qos}
        ${notifierInfo}=    Create List    ${notifierInfo}
        ${subscription_payload}=    Add Object To Json
        ...    ${subscription_payload}
        ...    $.notification.endpoint.notifierInfo
        ...    ${notifierInfo}
    END

    Set Suite Variable    ${subscription_id}
    Set Suite Variable    ${entity_id}

    ${response}=    Create Entity    ${entity_building_filepath}    ${entity_id}
    Check Response Status Code    201    ${response.status_code}

    Sleep    1s
    ${response}=    Create Subscription From Subscription Payload    ${subscription_payload}    ${CONTENT_TYPE_LD_JSON}
    Check Response Status Code    201    ${response.status_code}

    Sleep    1s

Delete Initial Subscriptions
    Delete Subscription    ${subscription_id}

Delete Initial Entity
    Delete Entity by Id    ${entity_id}
+98 −0
Changes for TP/NGSI-LD/ContextInformation/Subscription/SubscriptionNotificationBehaviour/MQTT/058_03.robot: 98 added lines, 0 removed lines.
Original line number Diff line number Diff line
*** Settings ***
Documentation       Check that mqtt notification is received with different mqtt version

Resource            ${EXECDIR}/resources/ApiUtils/ContextInformationSubscription.resource
Resource            ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource
Resource            ${EXECDIR}/resources/AssertionUtils.resource
Resource            ${EXECDIR}/resources/JsonUtils.resource
Resource            ${EXECDIR}/resources/NotificationUtils.resource
Resource            ${EXECDIR}/resources/mqttUtils/MqttUtils.resource

Test Setup          Start Mqtt Server And Connect
Test Teardown       After Test
Test Template       Receive Mqtt Notification


*** Variables ***
${subscription_id_prefix}               urn:ngsi-ld:Subscription:
${subscription_payload_file_path}       subscriptions/subscription-building-entities-default.jsonld
${building_id_prefix}                   urn:ngsi-ld:Building:
${entity_building_filepath}             building-simple-attributes-sample.jsonld
${fragment_filename}                    airQualityLevel-fragment.jsonld
${topic}                                ngsild-test-suite/topic
${endpoint}                             mqtt://127.0.0.1/${topic}
${config_filename}                      mosquitto.conf


*** Test Cases ***
058_03_01 With Default Protocol
    [Tags]    sub-mqtt-notification    5_8_6
    version=${None}
058_03_02 With MQTT 3.1.1 Protocol
    [Tags]    sub-mqtt-notification    5_8_6
    version=mqtt3.1.1
058_03_03 With MQTT 5.0 Protocol
    [Tags]    sub-mqtt-notification    5_8_6
    version=mqtt5.0


*** Keywords ***
Receive Mqtt Notification
    [Documentation]    Check that the broker support different mqtt version
    [Arguments]    ${version}

    Setup Mqtt Subscription    ${endpoint}    ${version}
    Subscribe    topic=${topic}    qos=1

    ${response}=    Update Entity Attributes    ${entity_id}    ${fragment_filename}    ${CONTENT_TYPE_LD_JSON}

    ${listenMessages}=    Listen    ${topic}
    Check Messages Contain One Instance    ${listenMessages}

Start Mqtt Server And Connect
    Start Mqtt Server    ${config_filename}    1883
    Connect    127.0.0.1    1883
    Subscribe    topic=${topic}    qos=1

After Test
    Delete Initial Subscriptions
    Delete Initial Entity
    Stop Mqtt Server
    Disconnect

Setup Mqtt Subscription
    [Arguments]    ${endpoint_uri}    ${version}=${None}
    ${subscription_id}=    Generate Random Entity Id    ${subscription_id_prefix}
    ${entity_id}=    Generate Random Entity Id    ${building_id_prefix}

    ${subscription_payload}=    Load Subscription Sample With Reachable Endpoint
    ...    ${subscription_payload_file_path}
    ...    ${subscription_id}
    ...    ${endpoint_uri}
    ${subscription_payload}=    Set Entity Id In Subscription    ${subscription_payload}    ${entity_id}
    ${notifierInfo}=    Create Dictionary
    IF    $version != $None
        Set To Dictionary    ${notifierInfo}    key    MQTT-Version
        Set To Dictionary    ${notifierInfo}    value    ${version}
        ${notifierInfo}=    Create List    ${notifierInfo}
        ${subscription_payload}=    Add Object To Json
        ...    ${subscription_payload}
        ...    $.notification.endpoint.notifierInfo
        ...    ${notifierInfo}
    END
    Set Suite Variable    ${subscription_id}
    Set Suite Variable    ${entity_id}

    ${response}=    Create Entity    ${entity_building_filepath}    ${entity_id}
    Check Response Status Code    201    ${response.status_code}
    Sleep    1s

    ${response}=    Create Subscription From Subscription Payload    ${subscription_payload}    ${CONTENT_TYPE_LD_JSON}
    Check Response Status Code    201    ${response.status_code}
    Sleep    1s

Delete Initial Subscriptions
    Delete Subscription    ${subscription_id}

Delete Initial Entity
    Delete Entity by Id    ${entity_id}
+101 −0
Changes for TP/NGSI-LD/ContextInformation/Subscription/SubscriptionNotificationBehaviour/MQTT/058_04.robot: 101 added lines, 0 removed lines.
Original line number Diff line number Diff line
*** Settings ***
Documentation       Check that the mqtt notification payload is well formed

Resource            ${EXECDIR}/resources/ApiUtils/ContextInformationSubscription.resource
Resource            ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource
Resource            ${EXECDIR}/resources/AssertionUtils.resource
Resource            ${EXECDIR}/resources/JsonUtils.resource
Resource            ${EXECDIR}/resources/NotificationUtils.resource
Resource            ${EXECDIR}/resources/mqttUtils/MqttUtils.resource

Test Setup          Start Mqtt Server And Connect
Test Teardown       After Test
Test Template       Receive Mqtt Notification


*** Variables ***
${subscription_id_prefix}               urn:ngsi-ld:Subscription:
${subscription_payload_file_path}       subscriptions/subscription-building-entities-default.jsonld
${building_id_prefix}                   urn:ngsi-ld:Building:
${entity_building_filepath}             building-simple-attributes-sample.jsonld
${fragment_filename}                    airQualityLevel-fragment.jsonld
${topic}                                ngsild-test-suite/topic
${endpoint}                             mqtt://127.0.0.1/${topic}
${config_filename}                      mosquitto.conf


*** Test Cases ***
058_04_01 Basic Subscription
    [Tags]    sub-mqtt-notification    5_8_6
    ${EMPTY}


*** Keywords ***
Receive Mqtt Notification
    [Documentation]    Check that the broker send well formed data
    [Arguments]    ${arg}

    ${response}=    Update Entity Attributes    ${entity_id}    ${fragment_filename}    ${CONTENT_TYPE_LD_JSON}
    ${listenMessages}=    Listen    ${topic}
    ${firstmessage}=    Set Variable    ${listenMessages}[0]
    ${message}=    Convert String To Json    ${firstmessage}

    Check Message Contain Key    ${message}    metadata
    Check Message Contain Key    ${message}    body
    Check Message Contain Key    ${message}[metadata]    Content-Type
    Check Message Contain Key    ${message}[metadata]    Link
    Check Message Field Equal    ${message}[metadata][test-receiver-key]    test-receiver-info
    Check Message Field Equal    ${message}[body][type]    Notification
    Check Message Contain Key    ${message}[body]    data
    Check Message Contain Key    ${message}[body][data][0]    id
    Check Message Contain Key    ${message}[body][data][0]    type

Start Mqtt Server And Connect
    Start Mqtt Server    ${config_filename}    1883
    Setup Mqtt Subscription    ${endpoint}

    Connect    127.0.0.1    1883
    Subscribe    topic=${topic}    qos=1

After Test
    Delete Initial Subscriptions
    Delete Initial Entity
    Stop Mqtt Server
    Disconnect

Setup Mqtt Subscription
    [Arguments]    ${endpoint_uri}
    ${subscription_id}=    Generate Random Entity Id    ${subscription_id_prefix}
    ${entity_id}=    Generate Random Entity Id    ${building_id_prefix}

    ${subscription_payload}=    Load Subscription Sample With Reachable Endpoint
    ...    ${subscription_payload_file_path}
    ...    ${subscription_id}
    ...    ${endpoint_uri}
    ${subscription_payload}=    Set Entity Id In Subscription    ${subscription_payload}    ${entity_id}

    Set Suite Variable    ${subscription_id}

    Set Suite Variable    ${entity_id}
    ${receiverInfo}=    Create Dictionary
    Set To Dictionary    ${receiverInfo}    key    test-receiver-key
    Set To Dictionary    ${receiverInfo}    value    test-receiver-info
    ${receiverInfo}=    Create List    ${receiverInfo}
    ${subscription_payload}=    Add Object To Json
    ...    ${subscription_payload}
    ...    $.notification.endpoint.receiverInfo
    ...    ${receiverInfo}

    ${response}=    Create Entity    ${entity_building_filepath}    ${entity_id}
    Check Response Status Code    201    ${response.status_code}
    Sleep    1s

    ${response}=    Create Subscription From Subscription Payload    ${subscription_payload}    ${CONTENT_TYPE_LD_JSON}
    Check Response Status Code    201    ${response.status_code}
    Sleep    1s

Delete Initial Subscriptions
    Delete Subscription    ${subscription_id}

Delete Initial Entity
    Delete Entity by Id    ${entity_id}
+44 −0
Changes for doc/analysis/checks.py: 44 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -138,6 +138,12 @@ class Checks:
                Checks.check_response_headers_link_set_to,
            'Check Response Headers Containing NGSILD-Results-Count Equals To' :
                Checks.check_response_header_contains_ngsild_results_count_equals_to,
            'Check Messages Contain One Instance' :
                Checks.check_messages_contain_one_instance,
            'Check Message Contain Key':
                Checks.check_message_contain_key,
            'Check Message Field Equal':
                Checks.check_message_field_equal
            }

        self.args = {
@@ -399,6 +405,18 @@ class Checks:
            'Check Response Headers Containing NGSILD-Results-Count Equals To': {
                'params': ['expected_result_count' , 'response_headers'],
                'position': [0, 1]
            },
            'Check Messages Contain One Instance': {
                'params': ['messages'],
                'position': [0]
            },
            'Check Message Contain Key': {
                'params': ['message', 'key'],
                'position': [0,1]
            },
            'Check Message Field Equal': {
                'params': ['expected_field', 'field'],
                'position': [0,1]
            }
        }

@@ -1106,6 +1124,32 @@ class Checks:
        else:
            raise Exception(f"ERROR, Expected 'expected_result_count' but received: '{kwargs}'")

    @staticmethod
    def check_messages_contain_one_instance(kwargs: list) -> str:
        if 'messages' in kwargs:
            messages = kwargs['messages']
            return f'Received messages {messages}'
        else:
            raise Exception(f"ERROR, Expected 1 message but received: '{kwargs}'")

    @staticmethod
    def check_message_contain_key(kwargs: list) -> str:
        if 'message' in kwargs and 'key' in kwargs:
            message = kwargs['message']
            key = kwargs['key']
            return f'Received message {message} with key {key}'
        else:
            raise Exception(f"ERROR, Expected a message containing the key but received: '{kwargs}'")

    @staticmethod
    def check_message_field_equal(kwargs: list) -> str:
        if 'expected_field' in kwargs and 'field' in kwargs:
            field = kwargs['field']
            expected_field = kwargs['expected_field']
            return f'expected field {expected_field} equals field {field}'
        else:
            raise Exception(f"ERROR, Expected the field to be equal 'expected_field' but received: '{kwargs}'")

    def get_checks(self, **kwargs) -> str:
        checking = None

Loading
Loading