From acc3db17218d5a605402ba64b2283a0e892a0005 Mon Sep 17 00:00:00 2001 From: Vera Xia Date: Thu, 3 Mar 2022 10:34:15 -0800 Subject: [PATCH 1/2] added device advisor samples --- deviceadvisor/tests/da_test_utils.py | 33 +++++++++++++++++++++ deviceadvisor/tests/mqtt_connect.py | 28 ++++++++++++++++++ deviceadvisor/tests/mqtt_publish.py | 37 +++++++++++++++++++++++ deviceadvisor/tests/mqtt_subscribe.py | 35 ++++++++++++++++++++++ deviceadvisor/tests/shadow_update.py | 42 +++++++++++++++++++++++++++ 5 files changed, 175 insertions(+) create mode 100644 deviceadvisor/tests/da_test_utils.py create mode 100644 deviceadvisor/tests/mqtt_connect.py create mode 100644 deviceadvisor/tests/mqtt_publish.py create mode 100644 deviceadvisor/tests/mqtt_subscribe.py create mode 100644 deviceadvisor/tests/shadow_update.py diff --git a/deviceadvisor/tests/da_test_utils.py b/deviceadvisor/tests/da_test_utils.py new file mode 100644 index 00000000..1de0980b --- /dev/null +++ b/deviceadvisor/tests/da_test_utils.py @@ -0,0 +1,33 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0. +import os +from enum import Enum +from uuid import uuid4 + +class TestType(Enum): + CONNECT = 1 + SUB_PUB = 1 + SHADOW = 1 + +class DATestUtils: + endpoint = os.getenv('DA_ENDPOINT') + certificatePath = os.getenv('DA_CERTI') + keyPath = os.getenv('DA_KEY') + topic = os.getenv('DA_TOPIC') + thing_name = os.getenv('DA_THING_NAME') + shadowProperty = os.getenv('DA_SHADOW_PROPERTY') + shadowValue = os.getenv('DA_SHADOW_VALUE_SET') + client_id = "test-" + str(uuid4()) + + @classmethod + def valid(cls, test_type): + if (not (cls.endpoint and cls.certificatePath and cls.keyPath)): + return False + + if (not cls.topic and test_type == TestType.SUB_PUB): + return False + + if (not (cls.thing_name and cls.shadowProperty and cls.shadowValue) and test_type == TestType.SHADOW): + return False + + return True diff --git a/deviceadvisor/tests/mqtt_connect.py b/deviceadvisor/tests/mqtt_connect.py new file mode 100644 index 00000000..307d6a3d --- /dev/null +++ b/deviceadvisor/tests/mqtt_connect.py @@ -0,0 +1,28 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0. + +from awsiot import mqtt_connection_builder +from da_test_utils import DATestUtils, TestType + +# This sample used to test mqtt connection through device advisor + +if __name__ == '__main__': + # init variables + utils = DATestUtils.valid(TestType.CONNECT) + if not utils: + quit(-1) + + mqtt_connection = mqtt_connection_builder.mtls_from_path( + endpoint=DATestUtils.endpoint, + cert_filepath=DATestUtils.certificatePath, + pri_key_filepath=DATestUtils.keyPath, + client_id = DATestUtils.client_id) + + connect_future = mqtt_connection.connect() + + # Future.result() waits until a result is available + connect_future.result() + + disconnect_future = mqtt_connection.disconnect() + disconnect_future.result() + quit(0) \ No newline at end of file diff --git a/deviceadvisor/tests/mqtt_publish.py b/deviceadvisor/tests/mqtt_publish.py new file mode 100644 index 00000000..826fa164 --- /dev/null +++ b/deviceadvisor/tests/mqtt_publish.py @@ -0,0 +1,37 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0. +from awscrt import mqtt +from awsiot import mqtt_connection_builder +from da_test_utils import DATestUtils, TestType +import json + +if __name__ == '__main__': + # validate environment variables + utils = DATestUtils.valid(TestType.SUB_PUB) + if not utils: + quit(-1) + + mqtt_connection = mqtt_connection_builder.mtls_from_path( + endpoint=DATestUtils.endpoint, + cert_filepath=DATestUtils.certificatePath, + pri_key_filepath=DATestUtils.keyPath, + client_id=DATestUtils.client_id) + connect_future = mqtt_connection.connect() + + # Future.result() waits until a result is available + connect_future.result() + + message = "Hello World" + message_json = json.dumps(message) + # Device advisor test will not return PUBACK, therefore we use AT_MOST_ONCE so that + # we dont busy wait for PUBACK + publish_future, packet_id = mqtt_connection.publish( + topic=DATestUtils.topic, + payload=message_json, + qos=mqtt.QoS.AT_MOST_ONCE) + publish_future.result() + + # Disconnect + disconnect_future = mqtt_connection.disconnect() + disconnect_future.result() + quit(0) \ No newline at end of file diff --git a/deviceadvisor/tests/mqtt_subscribe.py b/deviceadvisor/tests/mqtt_subscribe.py new file mode 100644 index 00000000..d7ff3bd3 --- /dev/null +++ b/deviceadvisor/tests/mqtt_subscribe.py @@ -0,0 +1,35 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0. + +from awscrt import io, mqtt, auth, http +from awsiot import mqtt_connection_builder +from da_test_utils import DATestUtils, TestType + +if __name__ == '__main__': + # init variables + utils = DATestUtils.valid(TestType.SUB_PUB) + if not utils: + quit(-1) + + mqtt_connection = mqtt_connection_builder.mtls_from_path( + endpoint=DATestUtils.endpoint, + cert_filepath=DATestUtils.certificatePath, + pri_key_filepath=DATestUtils.keyPath, + client_id = DATestUtils.client_id) + + connect_future = mqtt_connection.connect() + + # Future.result() waits until a result is available + connect_future.result() + + # Subscribe + subscribe_future, packet_id = mqtt_connection.subscribe( + topic=DATestUtils.topic, + qos=mqtt.QoS.AT_LEAST_ONCE) + + subscribe_future.result() + + # Disconnect + disconnect_future = mqtt_connection.disconnect() + disconnect_future.result() + quit(0) diff --git a/deviceadvisor/tests/shadow_update.py b/deviceadvisor/tests/shadow_update.py new file mode 100644 index 00000000..47bfdd4a --- /dev/null +++ b/deviceadvisor/tests/shadow_update.py @@ -0,0 +1,42 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0. + +from awscrt import mqtt +from awsiot import iotshadow, mqtt_connection_builder +from concurrent.futures import Future +from da_test_utils import DATestUtils, TestType +from uuid import uuid4 + +if __name__ == '__main__': + # init variables + utils = DATestUtils.valid(TestType.SUB_PUB) + if not utils: + quit(-1) + + mqtt_connection = mqtt_connection_builder.mtls_from_path( + endpoint=DATestUtils.endpoint, + cert_filepath=DATestUtils.certificatePath, + pri_key_filepath=DATestUtils.keyPath, + client_id = DATestUtils.client_id) + + connect_future = mqtt_connection.connect() + connect_future.result() + shadow_client = iotshadow.IotShadowClient(mqtt_connection) + + + # Publish shadow value + request = iotshadow.UpdateShadowRequest( + thing_name=DATestUtils.thing_name, + state=iotshadow.ShadowState( + reported={ DATestUtils.shadowProperty: DATestUtils.shadowValue }, + desired={ DATestUtils.shadowProperty: DATestUtils.shadowValue }, + ) + ) + # Device advisor test will not return PUBACK, therefore we use AT_MOST_ONCE so that + # we dont busy wait for PUBACK + shadow_future = shadow_client.publish_update_shadow(request, mqtt.QoS.AT_MOST_ONCE) + shadow_future.result() + + disconnect_future = mqtt_connection.disconnect() + disconnect_future.result() + quit(0) From 0058835facbdbf71c0bb9181de5141af55a8d06a Mon Sep 17 00:00:00 2001 From: Vera Xia Date: Thu, 3 Mar 2022 10:52:40 -0800 Subject: [PATCH 2/2] add new line at end of file --- deviceadvisor/tests/mqtt_connect.py | 2 +- deviceadvisor/tests/mqtt_publish.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deviceadvisor/tests/mqtt_connect.py b/deviceadvisor/tests/mqtt_connect.py index 307d6a3d..b8a25159 100644 --- a/deviceadvisor/tests/mqtt_connect.py +++ b/deviceadvisor/tests/mqtt_connect.py @@ -25,4 +25,4 @@ disconnect_future = mqtt_connection.disconnect() disconnect_future.result() - quit(0) \ No newline at end of file + quit(0) diff --git a/deviceadvisor/tests/mqtt_publish.py b/deviceadvisor/tests/mqtt_publish.py index 826fa164..cf902428 100644 --- a/deviceadvisor/tests/mqtt_publish.py +++ b/deviceadvisor/tests/mqtt_publish.py @@ -34,4 +34,4 @@ # Disconnect disconnect_future = mqtt_connection.disconnect() disconnect_future.result() - quit(0) \ No newline at end of file + quit(0)