Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mqtt-sn_new.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 "mqtt_tests.h" 00019 00020 #include <MQTTClientMbedOs.h> 00021 00022 #define MQTTSN_API_INIT() \ 00023 arrivedcountSN = 0; \ 00024 NetworkInterface *net = NetworkInterface::get_default_instance(); \ 00025 SocketAddress sockAddr; \ 00026 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, net->gethostbyname(mqtt_global::hostname, &sockAddr)); \ 00027 sockAddr.set_port(mqtt_global::port_udp); \ 00028 UDPSocket socket; \ 00029 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.open(net)); \ 00030 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.connect(sockAddr)); \ 00031 MQTTClient client(&socket); \ 00032 MQTTSNPacket_connectData data = MQTTSNPacket_connectData_initializer; 00033 00034 #define MQTTSN_API_DEINIT() \ 00035 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.close());\ 00036 00037 void MQTTSN_TEST_CONNECT() 00038 { 00039 MQTTSN_API_INIT(); 00040 data.clientID.cstring = (char *)"MQTTSN_CONNECT"; 00041 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00042 MQTTSN_API_DEINIT(); 00043 } 00044 00045 void MQTTSN_CONNECT_NOT_CONNECTED() 00046 { 00047 NetworkInterface *net = NetworkInterface::get_default_instance(); 00048 SocketAddress sockAddr("i.dont.exist", mqtt_global::port_udp); 00049 UDPSocket socket; 00050 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.open(net)); 00051 00052 //Connect in UDP is not real, it will return success... 00053 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.connect(sockAddr)); 00054 MQTTClient client(&socket); 00055 MQTTSNPacket_connectData data = MQTTSNPacket_connectData_initializer; 00056 00057 //... but we should not be able to connect to the server. 00058 TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, client.connect(data)); 00059 } 00060 00061 void MQTTSN_TEST_SUBSCRIBE() 00062 { 00063 MQTTSN_API_INIT(); 00064 data.clientID.cstring = (char *)"MQTTSN_TEST_SUBSCRIBE"; 00065 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00066 MQTTSN_topicid topic_sn; 00067 init_topic_sn(topic_sn); 00068 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(topic_sn, MQTTSN::QOS0, messageArrivedSN)); 00069 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(topic_sn)); 00070 init_topic_sn(topic_sn); 00071 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(topic_sn, MQTTSN::QOS1, messageArrivedSN)); 00072 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(topic_sn)); 00073 init_topic_sn(topic_sn); 00074 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(topic_sn, MQTTSN::QOS2, messageArrivedSN)); 00075 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(topic_sn)); 00076 MQTTSN_API_DEINIT(); 00077 00078 } 00079 00080 void MQTTSN_SUBSCRIBE_NETWORK_NOT_CONNECTED() 00081 { 00082 NetworkInterface *net = NetworkInterface::get_default_instance(); 00083 SocketAddress sockAddr("i.dont.exist", mqtt_global::port_udp); 00084 UDPSocket socket; 00085 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.open(net)); 00086 00087 //Connect in UDP is not real, it will return success... 00088 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.connect(sockAddr)); 00089 MQTTClient client(&socket); 00090 MQTTSNPacket_connectData data = MQTTSNPacket_connectData_initializer; 00091 data.clientID.cstring = (char *)"MQTTSN_SUBSCRIBE_NETWORK_NOT_CONNECTED"; 00092 // ... but the connect should fail ... 00093 TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, client.connect(data)); 00094 MQTTSN_topicid topic_sn; 00095 init_topic_sn(topic_sn); 00096 // ... and subscribe should also fail. 00097 TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, client.subscribe(topic_sn, MQTTSN::QOS0, messageArrivedSN)); 00098 } 00099 00100 void MQTTSN_SUBSCRIBE_CLIENT_NOT_CONNECTED() 00101 { 00102 MQTTSN_API_INIT(); 00103 data.clientID.cstring = (char *)"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"; 00104 MQTTSN_topicid topic_sn; 00105 init_topic_sn(topic_sn); 00106 TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, client.connect(data)); 00107 TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, client.subscribe(topic_sn, MQTTSN::QOS0, messageArrivedSN)); 00108 MQTTSN_API_DEINIT(); 00109 } 00110 00111 void MQTTSN_SUBSCRIBE_TOPIC_TOO_LONG() 00112 { 00113 MQTTSN_API_INIT(); 00114 data.clientID.cstring = (char *)"MQTTSN_SUBSCRIBE_TOPIC_TOO_LONG"; 00115 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00116 MQTTSN_topicid topic_sn; 00117 init_topic_sn_too_long(topic_sn); 00118 TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, client.subscribe(topic_sn, MQTTSN::QOS0, messageArrivedSN)); 00119 MQTTSN_API_DEINIT(); 00120 } 00121 00122 void MQTTSN_SUBSCRIBE_INVALID_MESSAGE_HANDLER() 00123 { 00124 MQTTSN_API_INIT(); 00125 data.clientID.cstring = (char *)"MQTTSN_SUBSCRIBE_INVALID_MESSAGE_HANDLER"; 00126 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00127 MQTTSN_topicid topic_sn; 00128 init_topic_sn(topic_sn); 00129 // There is no NULL check inside the subscribe function. 00130 // TEST_ASSERT_EQUAL(-1, client.subscribe(topic_sn, MQTTSN::QOS0, NULL)); 00131 MQTTSN_API_DEINIT(); 00132 } 00133 00134 void MQTTSN_SUBSCRIBE_RECEIVE() 00135 { 00136 MQTTSN_API_INIT(); 00137 data.clientID.cstring = (char *)"MQTTSN_SUBSCRIBE_INVALID_MESSAGE_HANDLER"; 00138 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00139 int arrivedCountBeforeSubscription = arrivedcountSN; 00140 MQTTSN_topicid topic_sn; 00141 topic_sn.type = MQTTSN_TOPIC_TYPE_NORMAL; 00142 topic_sn.data.long_.len = strlen(mqtt_global::mbed_public_test_topic); 00143 topic_sn.data.long_.name = const_cast<char *>(mqtt_global::mbed_public_test_topic); 00144 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(topic_sn, MQTTSN::QOS0, messageArrivedSN)); 00145 // TODO get the callbacks working for MQTT-SN 00146 while (arrivedCountBeforeSubscription == arrivedcountSN) { 00147 client.yield(100); 00148 } 00149 TEST_ASSERT_TRUE(arrivedCountBeforeSubscription < arrivedcountSN); 00150 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(topic_sn)); 00151 MQTTSN_API_DEINIT(); 00152 } 00153 00154 void MQTTSN_UNSUBSCRIBE_WITHOUT_SUBSCRIBE() 00155 { 00156 MQTTSN_API_INIT(); 00157 data.clientID.cstring = (char *)"MQTTSN_UNSUBSCRIBE_WITHOUT_SUBSCRIBE"; 00158 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00159 MQTTSN_topicid topic_sn; 00160 init_topic_sn(topic_sn); 00161 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(topic_sn)); 00162 MQTTSN_API_DEINIT(); 00163 } 00164 00165 void MQTTSN_UNSUBSCRIBE_INVALID() 00166 { 00167 MQTTSN_API_INIT(); 00168 data.clientID.cstring = (char *)"MQTTSN_UNSUBSCRIBE_INVALID"; 00169 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00170 MQTTSN_topicid topic_sn_too_long; 00171 init_topic_sn_too_long(topic_sn_too_long); 00172 TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, client.unsubscribe(topic_sn_too_long)); 00173 MQTTSN_API_DEINIT(); 00174 } 00175 00176 void MQTTSN_TEST_PUBLISH() 00177 { 00178 MQTTSN_API_INIT(); 00179 data.clientID.cstring = (char *)"MQTTSN_PUBLISH"; 00180 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00181 MQTTSN_topicid topic_sn; 00182 init_topic_sn(topic_sn); 00183 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(topic_sn, mqtt_global::default_message_sn)); 00184 MQTTSN::Message msg = mqtt_global::default_message_sn; 00185 msg.qos = MQTTSN::QOS1; 00186 // TODO: get QoS 1 and 2 working. Maybe we need to reconnect? 00187 // TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(topic_sn, msg)); 00188 // msg.qos = MQTTSN::QOS2; 00189 // TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(topic_sn, msg)); 00190 MQTTSN_API_DEINIT(); 00191 } 00192 00193 void MQTTSN_PUBLISH_NOT_CONNECTED() 00194 { 00195 MQTTSN_API_INIT(); 00196 MQTTSN_topicid topic_sn; 00197 init_topic_sn(topic_sn); 00198 TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, client.publish(topic_sn, mqtt_global::default_message_sn)); 00199 MQTTSN_API_DEINIT(); 00200 } 00201 00202 void MQTTSN_PUBLISH_TOPIC_TOO_LONG() 00203 { 00204 MQTTSN_API_INIT(); 00205 data.clientID.cstring = (char *)"MQTT_PUBLISH"; 00206 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00207 // TODO verify if this is passing intentionally or if this is a bug? 00208 // TEST_ASSERT_EQUAL(-1, client.publish(mqtt_global::topic_too_long, mqtt_global::default_message)); 00209 MQTTSN_API_DEINIT(); 00210 } 00211 00212 // QTT-SN does not provide the user/password functionality so 00213 // MQTT_CONNECT_USER_PASSWORD_INCORRECT and MQTT_CONNECT_SUBSCRIBE_PUBLISH_USER_PASSWORD 00214 // cannot be executed for MQTT-SN 00215 00216 void MQTTSN_IS_CONNECTED() 00217 { 00218 MQTTSN_API_INIT(); 00219 data.clientID.cstring = (char *)"MQTTSN_IS_CONNECTED"; 00220 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data)); 00221 TEST_ASSERT_TRUE(client.isConnected()); 00222 MQTTSN_API_DEINIT(); 00223 } 00224 00225 void MQTTSN_IS_CONNECTED_CLIENT_NOT_CONNECTED() 00226 { 00227 MQTTSN_API_INIT(); 00228 TEST_ASSERT_FALSE(client.isConnected()); 00229 MQTTSN_API_DEINIT(); 00230 } 00231 00232 void MQTTSN_IS_CONNECTED_NETWORK_NOT_CONNECTED() 00233 { 00234 NetworkInterface *net = NetworkInterface::get_default_instance(); 00235 SocketAddress sockAddr("i.dont.exist", mqtt_global::port_udp); 00236 UDPSocket socket; 00237 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.open(net)); 00238 00239 //Connect in UDP is not real, it will return success... 00240 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.connect(sockAddr)); 00241 MQTTClient client(&socket); 00242 MQTTSNPacket_connectData data = MQTTSNPacket_connectData_initializer; 00243 data.clientID.cstring = (char *)"MQTTSN_IS_CONNECTED_NETWORK_NOT_CONNECTED"; 00244 00245 TEST_ASSERT_FALSE(client.isConnected()); 00246 00247 // ... but the connect should fail ... 00248 TEST_ASSERT_EQUAL(NSAPI_ERROR_NO_CONNECTION, client.connect(data)); 00249 00250 TEST_ASSERT_FALSE(client.isConnected()); 00251 } 00252 00253 void MQTTSN_UDP_CONNECT_SUBSCRIBE_PUBLISH() 00254 { 00255 NetworkInterface *net = NetworkInterface::get_default_instance(); 00256 SocketAddress sockAddr(mqtt_global::hostname, mqtt_global::port_udp); 00257 UDPSocket socket; 00258 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, socket.open(net)); 00259 TEST_ASSERT(NSAPI_ERROR_OK == socket.connect(sockAddr)); 00260 MQTTClient client(&socket); 00261 00262 send_messages_sn< MQTTClient >(client, "MQTT_FULL_NEW_UDP"); 00263 00264 socket.close(); 00265 } 00266 00267 #if defined(MBEDTLS_SSL_CLI_C) 00268 void MQTTSN_DTLS_CONNECT_SUBSCRIBE_PUBLISH() 00269 { 00270 NetworkInterface *net = NetworkInterface::get_default_instance(); 00271 DTLSSocket *socket = new DTLSSocket; // Allocate on heap to avoid stack overflow. 00272 TEST_ASSERT(NSAPI_ERROR_OK == socket->open(net)); 00273 SocketAddress addr; 00274 TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, net->gethostbyname(mqtt_global::hostname, &addr)); 00275 addr.set_port(mqtt_global::port_udp); 00276 TEST_ASSERT(NSAPI_ERROR_OK == socket->set_root_ca_cert(mqtt_global::SSL_CA_PEM)); 00277 int ret = socket->connect(addr); 00278 TEST_ASSERT(NSAPI_ERROR_OK == ret); 00279 00280 MQTTClient client(socket); 00281 00282 send_messages_sn< MQTTClient >(client, "MQTTSN_DTLS_CONNECT_SUBSCRIBE_PUBLISH"); 00283 00284 socket->close(); 00285 delete socket; 00286 } 00287 #endif
Generated on Wed Jul 13 2022 10:46:02 by
1.7.2