Commit b9e0561a authored by thomas Bousselin's avatar thomas Bousselin Committed by Benoit Orihuela
Browse files

feat: add tests for MQTT notification

parent eec2faf1
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -148,6 +148,9 @@ test launch command followed by the file name.
> > .venv\scripts\deactivate.bat
> ```

###  Specific test requirements
- Mqtt tests (058) launch a mosquitto container with docker, thus it requires docker to be installed and running

## Test Suite Management (tsm)

The `tsm` script is designed to facilitate the selection and execution of the Test Suite, especially if not all the 
@@ -352,7 +355,7 @@ In these cases, it is needed to provide the corresponding information in the Pyt
    in `self.description` to reference the method that pretty print the operation, and add the method that pretty prints
    the operation)
- When a new permutation is added in an existing Test Case, run the documentation generation script 
  (`python doc/generateDocumentationData.py {tc_id}`) for the Test Case and copy the generated JSON file in the 
  (`python doc/analysis/generateDocumentationData.py {tc_id}`) for the Test Case and copy the generated JSON file in the 
  folder containing all files for the given group and subgroup (`cp doc/results/{tc_id}.json doc/files/{group}/{subgroup}`)
- When a new directory containing Test Cases is created, it has to be declared in `doc/generaterobotdata.py` along with
  its acronym
+89 −0
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
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
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
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}
Loading