Jack Hansdampf / mbed-mqtt-GSOE1

Dependents:   ESP8266MQTT

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mqtt_tests.h Source File

mqtt_tests.h

00001 /*
00002  * Copyright (c) 2019, ARM Limited, All Rights Reserved
00003  * SPDX-License-Identifier: Apache-2.0
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License"); you may
00006  * not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  * http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
00013  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 
00018 #ifndef MQTT_TESTS_H
00019 #define MQTT_TESTS_H
00020 
00021 #include <MQTTClientMbedOs.h>
00022 
00023 #include "unity/unity.h"
00024 
00025 namespace mqtt_global {
00026 // For TLS hostname must match the "Common Name" set in the server certificate
00027 //const char* hostname = "test.mosquitto.org";
00028 static const char *hostname = MBED_CONF_MBED_MQTT_TESTS_BROKER_HOSTNAME;
00029 static const char *topic = MBED_CONF_MBED_MQTT_TESTS_TOPIC;
00030 static const char *mbed_public_test_topic = MBED_CONF_MBED_MQTT_TESTS_PUBLIC_TOPIC_NAME;
00031 static char topic_too_long[MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE + 1];
00032 static MQTTSN_topicid mbed_public_test_topic_sn;
00033 static const int port = 1883;
00034 static const int port_tls = 8883;
00035 static const int port_udp = 10000;
00036 extern const char *SSL_CA_PEM;
00037 extern const char *SSL_CLIENT_CERT_PEM;
00038 extern const char *SSL_CLIENT_PRIVATE_KEY_PEM;
00039 extern MQTT::Message default_message;
00040 extern MQTTSN::Message default_message_sn;
00041 static char message_buffer[100];
00042 }
00043 
00044 #if MBED_CONF_MBED_MQTT_TESTS_USERNAME_ALWAYS
00045 #define MQTT_API_ATTACH_USERNAME_PASSWORD() \
00046     data.username.cstring = (char*)MBED_CONF_MBED_MQTT_TESTS_USERNAME; \
00047     data.password.cstring = (char*)MBED_CONF_MBED_MQTT_TESTS_PASSWORD;
00048 #else
00049 #define MQTT_API_ATTACH_USERNAME_PASSWORD() // Just to nothing
00050 #endif
00051 
00052 extern int arrivedcount;
00053 extern int arrivedcountSN;
00054 void messageArrived(MQTT::MessageData &md);
00055 void messageArrivedSN(MQTTSN::MessageData &md);
00056 
00057 /*
00058  * Test cases
00059  */
00060 void MQTT_LEGACY_CONNECT_NOT_CONNECTED();
00061 void MQTT_LEGACY_CONNECT();
00062 void MQTT_LEGACY_SUBSCRIBE();
00063 void MQTT_LEGACY_SUBSCRIBE_NETWORK_NOT_CONNECTED();
00064 void MQTT_LEGACY_SUBSCRIBE_CLIENT_NOT_CONNECTED();
00065 void MQTT_LEGACY_SUBSCRIBE_TOPIC_TOO_LONG();
00066 void MQTT_LEGACY_SUBSCRIBE_INVALID_MESSAGE_HANDLER();
00067 void MQTT_LEGACY_SUBSCRIBE_RECEIVE();
00068 void MQTT_LEGACY_UNSUBSCRIBE_WITHOUT_SUBSCRIBE();
00069 void MQTT_LEGACY_UNSUBSCRIBE_INVALID();
00070 void MQTT_LEGACY_PUBLISH();
00071 void MQTT_LEGACY_PUBLISH_NOT_CONNECTED();
00072 void MQTT_LEGACY_PUBLISH_TOPIC_TOO_LONG();
00073 void MQTT_LEGACY_CONNECT_USER_PASSWORD_INCORRECT();
00074 void MQTT_LEGACY_CONNECT_SUBSCRIBE_PUBLISH();
00075 void MQTT_LEGACY_CONNECT_SUBSCRIBE_PUBLISH_USER_PASSWORD();
00076 void MQTT_LEGACY_TLS_CONNECT_SUBSCRIBE_PUBLISH();
00077 
00078 void MQTTSN_LEGACY_CONNECT_NOT_CONNECTED();
00079 void MQTTSN_LEGACY_CONNECT();
00080 void MQTTSN_LEGACY_SUBSCRIBE();
00081 void MQTTSN_LEGACY_SUBSCRIBE_NETWORK_NOT_CONNECTED();
00082 void MQTTSN_LEGACY_SUBSCRIBE_CLIENT_NOT_CONNECTED();
00083 void MQTTSN_LEGACY_SUBSCRIBE_TOPIC_TOO_LONG();
00084 void MQTTSN_LEGACY_SUBSCRIBE_INVALID_MESSAGE_HANDLER();
00085 void MQTTSN_LEGACY_SUBSCRIBE_RECEIVE();
00086 void MQTTSN_LEGACY_UNSUBSCRIBE_WITHOUT_SUBSCRIBE();
00087 void MQTTSN_LEGACY_UNSUBSCRIBE_INVALID();
00088 void MQTTSN_LEGACY_PUBLISH();
00089 void MQTTSN_LEGACY_PUBLISH_NOT_CONNECTED();
00090 void MQTTSN_LEGACY_PUBLISH_TOPIC_TOO_LONG();
00091 void MQTTSN_LEGACY_IS_CONNECTED();
00092 void MQTTSN_LEGACY_IS_CONNECTED_CLIENT_NOT_CONNECTED();
00093 void MQTTSN_LEGACY_IS_CONNECTED_NETWORK_NOT_CONNECTED();
00094 void MQTTSN_LEGACY_UDP_CONNECT_SUBSCRIBE_PUBLISH();
00095 
00096 // New API:
00097 void MQTT_CONNECT_NOT_CONNECTED();
00098 void MQTT_CONNECT();
00099 void MQTT_SUBSCRIBE();
00100 void MQTT_SUBSCRIBE_NETWORK_NOT_CONNECTED();
00101 void MQTT_SUBSCRIBE_CLIENT_NOT_CONNECTED();
00102 void MQTT_SUBSCRIBE_TOPIC_TOO_LONG();
00103 void MQTT_SUBSCRIBE_INVALID_MESSAGE_HANDLER();
00104 void MQTT_SUBSCRIBE_RECEIVE();
00105 void MQTT_UNSUBSCRIBE_WITHOUT_SUBSCRIBE();
00106 void MQTT_UNSUBSCRIBE_INVALID();
00107 void MQTT_PUBLISH();
00108 void MQTT_PUBLISH_NOT_CONNECTED();
00109 void MQTT_PUBLISH_TOPIC_TOO_LONG();
00110 void MQTT_CONNECT_USER_PASSWORD_INCORRECT();
00111 void MQTT_CONNECT_SUBSCRIBE_PUBLISH();
00112 void MQTT_CONNECT_SUBSCRIBE_PUBLISH_USER_PASSWORD();
00113 void MQTT_TLS_CONNECT_SUBSCRIBE_PUBLISH();
00114 
00115 
00116 void MQTTSN_CONNECT_NOT_CONNECTED();
00117 void MQTTSN_TEST_CONNECT(); // Avoid clash with MQTTSN enum.
00118 void MQTTSN_TEST_SUBSCRIBE(); // Avoid clash with MQTTSN enum.
00119 void MQTTSN_SUBSCRIBE_NETWORK_NOT_CONNECTED();
00120 void MQTTSN_SUBSCRIBE_CLIENT_NOT_CONNECTED();
00121 void MQTTSN_SUBSCRIBE_TOPIC_TOO_LONG();
00122 void MQTTSN_SUBSCRIBE_INVALID_MESSAGE_HANDLER();
00123 void MQTTSN_SUBSCRIBE_RECEIVE();
00124 void MQTTSN_UNSUBSCRIBE_WITHOUT_SUBSCRIBE();
00125 void MQTTSN_UNSUBSCRIBE_INVALID();
00126 void MQTTSN_TEST_PUBLISH();
00127 void MQTTSN_PUBLISH_NOT_CONNECTED();
00128 void MQTTSN_PUBLISH_TOPIC_TOO_LONG();
00129 void MQTTSN_IS_CONNECTED();
00130 void MQTTSN_IS_CONNECTED_CLIENT_NOT_CONNECTED();
00131 void MQTTSN_IS_CONNECTED_NETWORK_NOT_CONNECTED();
00132 void MQTTSN_UDP_CONNECT_SUBSCRIBE_PUBLISH();
00133 void MQTTSN_DTLS_CONNECT_SUBSCRIBE_PUBLISH();
00134 
00135 template <class Client> void send_messages(Client &client, char *clientID, bool user_password = false)
00136 {
00137     arrivedcount = 0;
00138     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
00139     data.MQTTVersion = 3;
00140     data.clientID.cstring = (char *)clientID;
00141     if (user_password || MBED_CONF_MBED_MQTT_TESTS_USERNAME_ALWAYS) {
00142         data.username.cstring = (char *)MBED_CONF_MBED_MQTT_TESTS_USERNAME;
00143         data.password.cstring = (char *)MBED_CONF_MBED_MQTT_TESTS_PASSWORD;
00144     }
00145     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00146     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(mqtt_global::topic, MQTT::QOS2, messageArrived));
00147 
00148     MQTT::Message message = mqtt_global::default_message;
00149 
00150     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(mqtt_global::topic, message));
00151 
00152     while (arrivedcount < 1) {
00153         printf(".");
00154         client.yield(10);
00155     }
00156 
00157     // QoS 1
00158     char buf[100];
00159     sprintf(buf, "QoS 1 %s\n", clientID);
00160     message.qos = MQTT::QOS1;
00161     message.payloadlen = strlen(buf) + 1;
00162     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(mqtt_global::topic, message));
00163 
00164     while (arrivedcount < 2) {
00165         printf(".");
00166         client.yield(10);
00167     }
00168 
00169     // QoS 2
00170 #if MQTTCLIENT_QOS2
00171     sprintf(buf, "QoS 2 %s\n", clientID);
00172     message.qos = MQTT::QOS2;
00173     message.payloadlen = strlen(buf) + 1;
00174     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(mqtt_global::topic, message));
00175     while (arrivedcount < 3) {
00176         client.yield(100);
00177     }
00178 #endif
00179 
00180     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(mqtt_global::topic));
00181     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.disconnect() != 0);
00182 }
00183 
00184 /**
00185  * @brief Initialize the topic with default values.
00186  *
00187  * MQTT-SN subscribe() might modify the topic, so we can't use a predefined global variable.
00188  */
00189 void init_topic_sn(MQTTSN_topicid &topic_sn);
00190 void init_topic_sn_too_long(MQTTSN_topicid &topic_sn);
00191 
00192 template <class Client> void send_messages_sn(Client &client, char *clientID)
00193 {
00194     arrivedcountSN = 0;
00195     MQTTSNPacket_connectData data = MQTTSNPacket_connectData_initializer;
00196     data.clientID.cstring = clientID;
00197     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00198     MQTTSN_topicid topic;
00199     init_topic_sn(topic);
00200     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(topic, MQTTSN::QOS2, messageArrivedSN));
00201 
00202     // QoS 0
00203     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(topic, mqtt_global::default_message_sn));
00204     while (arrivedcountSN < 1) {
00205         client.yield(10);
00206     }
00207 
00208     // QoS 1
00209     MQTTSN::Message message;
00210     char buf[100];
00211     sprintf(buf, "QoS 1 %s\n", clientID);
00212     message.qos = MQTTSN::QOS0;
00213     message.retained = false;
00214     message.dup = false;
00215     message.payload = (void *)buf;
00216     message.payloadlen = strlen(buf) + 1;
00217     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(topic, message));
00218     while (arrivedcountSN < 2) {
00219         client.yield(10);
00220     }
00221 
00222 #if MQTTCLIENT_QOS2
00223     // QoS 2
00224     sprintf(buf, "QoS 2 %s\n", clientID);
00225     message.qos = MQTTSN::QOS2;
00226     message.payloadlen = strlen(buf) + 1;
00227     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(topic, message));
00228     while (arrivedcountSN < 3) {
00229         client.yield(10);
00230     }
00231 #endif
00232 
00233     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(topic)); //mqtt_global::topic_sn
00234     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.disconnect() != 0);
00235 }
00236 
00237 #endif //MQTT_TESTS_H