Jack Hansdampf / mbed-mqtt-GSOE1

Dependents:   ESP8266MQTT

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mqtt_legacy.cpp Source File

mqtt_legacy.cpp

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 #include <MQTTNetwork.h>
00019 #include <MQTTNetworkTLS.h>
00020 #include "mqtt_tests.h"
00021 
00022 #include <MQTTClient.h>
00023 #include <MQTTmbed.h> // Countdown
00024 
00025 #define MQTT_LEGACY_API_INIT() \
00026     arrivedcount = 0; \
00027     NetworkInterface *net = NetworkInterface::get_default_instance(); \
00028     MQTTNetwork mqttNet(net); \
00029     MQTT::Client<MQTTNetwork, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE> client(mqttNet); \
00030     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, mqttNet.connect(mqtt_global::hostname, mqtt_global::port)); \
00031     MQTTPacket_connectData data = MQTTPacket_connectData_initializer; \
00032     MQTT_API_ATTACH_USERNAME_PASSWORD()\
00033     data.MQTTVersion = 3;
00034 
00035 #define MQTT_LEGACY_API_DEINIT() TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, mqttNet.disconnect());
00036 
00037 void MQTT_LEGACY_CONNECT()
00038 {
00039     MQTT_LEGACY_API_INIT();
00040     data.clientID.cstring = (char *)"MQTT_LEGACY_CONNECT";
00041     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00042     MQTT_LEGACY_API_DEINIT();
00043 }
00044 
00045 void MQTT_LEGACY_CONNECT_NOT_CONNECTED()
00046 {
00047     NetworkInterface *net = NetworkInterface::get_default_instance();
00048     MQTTNetwork mqttNet(net);
00049     MQTT::Client<MQTTNetwork, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE> client(mqttNet);
00050     TEST_ASSERT_EQUAL(NSAPI_ERROR_DNS_FAILURE, mqttNet.connect("i.dont.exist", mqtt_global::port));
00051     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
00052     TEST_ASSERT_EQUAL(-1, client.connect(data));
00053 }
00054 
00055 void MQTT_LEGACY_SUBSCRIBE()
00056 {
00057     MQTT_LEGACY_API_INIT();
00058     data.clientID.cstring = (char *)"MQTT_LEGACY_SUBSCRIBE";
00059     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00060     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(mqtt_global::topic, MQTT::QOS0, messageArrived));
00061     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(mqtt_global::topic, MQTT::QOS1, messageArrived));
00062     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(mqtt_global::topic, MQTT::QOS2, messageArrived));
00063     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(mqtt_global::topic));
00064     MQTT_LEGACY_API_DEINIT();
00065 
00066 }
00067 
00068 void MQTT_LEGACY_SUBSCRIBE_NETWORK_NOT_CONNECTED()
00069 {
00070     NetworkInterface *net = NetworkInterface::get_default_instance();
00071     MQTTNetwork mqttNet(net);
00072     MQTT::Client<MQTTNetwork, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE> client(mqttNet);
00073     TEST_ASSERT_EQUAL(NSAPI_ERROR_DNS_FAILURE, mqttNet.connect("i.dont.exist", mqtt_global::port));
00074     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
00075     data.MQTTVersion = 3;
00076     data.clientID.cstring = (char *)"MQTT_LEGACY_SUBSCRIBE_NETWORK_NOT_CONNECTED";
00077     TEST_ASSERT_EQUAL(-1, client.connect(data));
00078     TEST_ASSERT_EQUAL(-1, client.subscribe(mqtt_global::topic, MQTT::QOS0, messageArrived));
00079 }
00080 
00081 void MQTT_LEGACY_SUBSCRIBE_CLIENT_NOT_CONNECTED()
00082 {
00083     MQTT_LEGACY_API_INIT();
00084     // Intentionally skip connecting.
00085     TEST_ASSERT_EQUAL(-1, client.subscribe(mqtt_global::topic, MQTT::QOS0, messageArrived));
00086     MQTT_LEGACY_API_DEINIT();
00087 }
00088 
00089 void MQTT_LEGACY_SUBSCRIBE_TOPIC_TOO_LONG()
00090 {
00091     MQTT_LEGACY_API_INIT();
00092     data.clientID.cstring = (char *)"MQTT_LEGACY_SUBSCRIBE_TOPIC_TOO_LONG";
00093     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00094     TEST_ASSERT_EQUAL(-1, client.subscribe(mqtt_global::topic_too_long, MQTT::QOS0, messageArrived));
00095     MQTT_LEGACY_API_DEINIT();
00096 }
00097 
00098 void MQTT_LEGACY_SUBSCRIBE_INVALID_MESSAGE_HANDLER()
00099 {
00100     MQTT_LEGACY_API_INIT();
00101     data.clientID.cstring = (char *)"MQTT_LEGACY_SUBSCRIBE_INVALID_MESSAGE_HANDLER";
00102     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00103     TEST_ASSERT_EQUAL(-1, client.subscribe(mqtt_global::topic, MQTT::QOS0, NULL));
00104     MQTT_LEGACY_API_DEINIT();
00105 }
00106 
00107 void MQTT_LEGACY_SUBSCRIBE_RECEIVE()
00108 {
00109     MQTT_LEGACY_API_INIT();
00110     data.clientID.cstring = (char *)"MQTT_LEGACY_SUBSCRIBE_INVALID_MESSAGE_HANDLER";
00111     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00112     int arrivedCountBeforeSubscription = arrivedcount;
00113     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(mqtt_global::mbed_public_test_topic, MQTT::QOS0, messageArrived));
00114     while (arrivedCountBeforeSubscription == arrivedcount) {
00115         client.yield(100);
00116     }
00117     TEST_ASSERT_TRUE(arrivedCountBeforeSubscription < arrivedcount);
00118     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(mqtt_global::mbed_public_test_topic));
00119     MQTT_LEGACY_API_DEINIT();
00120 }
00121 
00122 void MQTT_LEGACY_UNSUBSCRIBE_WITHOUT_SUBSCRIBE()
00123 {
00124     MQTT_LEGACY_API_INIT();
00125     data.clientID.cstring = (char *)"MQTT_LEGACY_UNSUBSCRIBE_WITHOUT_SUBSCRIBE";
00126     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00127     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(mqtt_global::topic));
00128     MQTT_LEGACY_API_DEINIT();
00129 }
00130 
00131 void MQTT_LEGACY_UNSUBSCRIBE_INVALID()
00132 {
00133     MQTT_LEGACY_API_INIT();
00134     data.clientID.cstring = (char *)"MQTT_LEGACY_UNSUBSCRIBE_INVALID";
00135     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00136     TEST_ASSERT_EQUAL(-1, client.unsubscribe(""));
00137     TEST_ASSERT_EQUAL(-1, client.unsubscribe(mqtt_global::topic_too_long));
00138     MQTT_LEGACY_API_DEINIT();
00139 }
00140 
00141 void MQTT_LEGACY_PUBLISH()
00142 {
00143     MQTT_LEGACY_API_INIT();
00144     data.clientID.cstring = (char *)"MQTT_LEGACY_nnPUBLISH";
00145     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00146     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(mqtt_global::topic, mqtt_global::default_message));
00147     MQTT::Message msg = mqtt_global::default_message;
00148     msg.qos = MQTT::QOS1;
00149     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(mqtt_global::topic, msg));
00150     msg.qos = MQTT::QOS2;
00151     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(mqtt_global::topic, msg));
00152     MQTT_LEGACY_API_DEINIT();
00153 }
00154 
00155 void MQTT_LEGACY_PUBLISH_NOT_CONNECTED()
00156 {
00157     MQTT_LEGACY_API_INIT();
00158     TEST_ASSERT_EQUAL(-1, client.publish(mqtt_global::topic, mqtt_global::default_message));
00159     MQTT_LEGACY_API_DEINIT();
00160 }
00161 
00162 void MQTT_LEGACY_PUBLISH_TOPIC_TOO_LONG()
00163 {
00164     MQTT_LEGACY_API_INIT();
00165     data.clientID.cstring = (char *)"MQTT_LEGACY_PUBLISH";
00166     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00167     // TODO verify if this is passing intentionally or if this is a bug?
00168 //    TEST_ASSERT_EQUAL(-1, client.publish(mqtt_global::topic_too_long, mqtt_global::default_message));
00169     MQTT_LEGACY_API_DEINIT();
00170 }
00171 
00172 void MQTT_LEGACY_CONNECT_USER_PASSWORD_INCORRECT()
00173 {
00174     MQTT_LEGACY_API_INIT();
00175     data.MQTTVersion = 3;
00176     data.clientID.cstring = (char *)"MQTT_LEGACY_CONNECT_USER_PASSWORD_INCORRECT";
00177     data.username.cstring = (char *)"wronguser";
00178     data.password.cstring = (char *)"wrongpassword";
00179     TEST_ASSERT_NOT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
00180     // Sending works. The retval from MQTTDeserialize_connack (5) is returned... Bug?
00181     MQTT_LEGACY_API_DEINIT();
00182 }
00183 
00184 void MQTT_LEGACY_CONNECT_SUBSCRIBE_PUBLISH()
00185 {
00186     NetworkInterface *net = NetworkInterface::get_default_instance();
00187     MQTTNetwork mqttNet(net);
00188     MQTT::Client<MQTTNetwork, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE> client(mqttNet);
00189 
00190     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, mqttNet.connect(mqtt_global::hostname, mqtt_global::port));
00191 
00192     send_messages< MQTT::Client<MQTTNetwork, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE> >(client, "MQTT_LEGACY_CONNECT_SUBSCRIBE_PUBLISH");
00193 
00194     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, mqttNet.disconnect());
00195 }
00196 
00197 void MQTT_LEGACY_CONNECT_SUBSCRIBE_PUBLISH_USER_PASSWORD()
00198 {
00199     NetworkInterface *net = NetworkInterface::get_default_instance();
00200     MQTTNetwork mqttNet(net);
00201     MQTT::Client<MQTTNetwork, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE> client(mqttNet);
00202 
00203     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, mqttNet.connect(mqtt_global::hostname, mqtt_global::port));
00204 
00205     send_messages< MQTT::Client<MQTTNetwork, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE> >(client, "MQTT_LEGACY_CONNECT_SUBSCRIBE_PUBLISH_USER_PASSWORD", true);
00206 
00207     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, mqttNet.disconnect());
00208 }
00209 
00210 #if defined(MBEDTLS_SSL_CLI_C)
00211 void MQTT_LEGACY_TLS_CONNECT_SUBSCRIBE_PUBLISH()
00212 {
00213     NetworkInterface *net = NetworkInterface::get_default_instance();
00214     MQTTNetworkTLS mqttNet(net);
00215 
00216     MQTT::Client<MQTTNetworkTLS, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE> client(mqttNet);
00217 
00218     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, mqttNet.connect(mqtt_global::hostname, mqtt_global::port_tls,
00219                       mqtt_global::SSL_CA_PEM, mqtt_global::SSL_CLIENT_CERT_PEM, mqtt_global::SSL_CLIENT_PRIVATE_KEY_PEM));
00220 
00221     send_messages< MQTT::Client<MQTTNetworkTLS, Countdown, MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE> >(client, "MQTT_LEGACYTLS_CONNECT_SUBSCRIBE_PUBLISH");
00222 
00223     TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, mqttNet.disconnect());
00224 }
00225 #endif