Library for MQTT

mbed-mqtt-master/TESTS/mqtt/mqtt/mqtt_tests.h

Committer:
pavleradojkovic
Date:
2022-06-20
Revision:
0:ba7e439238ab

File content as of revision 0:ba7e439238ab:

/*
 * Copyright (c) 2019, ARM Limited, All Rights Reserved
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef MQTT_TESTS_H
#define MQTT_TESTS_H

#include <MQTTClientMbedOs.h>

#include "unity/unity.h"

namespace mqtt_global {
// For TLS hostname must match the "Common Name" set in the server certificate
//const char* hostname = "test.mosquitto.org";
static const char *hostname = MBED_CONF_MBED_MQTT_TESTS_BROKER_HOSTNAME;
static const char *topic = MBED_CONF_MBED_MQTT_TESTS_TOPIC;
static const char *mbed_public_test_topic = MBED_CONF_MBED_MQTT_TESTS_PUBLIC_TOPIC_NAME;
static char topic_too_long[MBED_CONF_MBED_MQTT_MAX_PACKET_SIZE + 1];
static MQTTSN_topicid mbed_public_test_topic_sn;
static const int port = 1883;
static const int port_tls = 8883;
static const int port_udp = 10000;
extern const char *SSL_CA_PEM;
extern const char *SSL_CLIENT_CERT_PEM;
extern const char *SSL_CLIENT_PRIVATE_KEY_PEM;
extern MQTT::Message default_message;
extern MQTTSN::Message default_message_sn;
static char message_buffer[100];
}

#if MBED_CONF_MBED_MQTT_TESTS_USERNAME_ALWAYS
#define MQTT_API_ATTACH_USERNAME_PASSWORD() \
    data.username.cstring = (char*)MBED_CONF_MBED_MQTT_TESTS_USERNAME; \
    data.password.cstring = (char*)MBED_CONF_MBED_MQTT_TESTS_PASSWORD;
#else
#define MQTT_API_ATTACH_USERNAME_PASSWORD() // Just to nothing
#endif

extern int arrivedcount;
extern int arrivedcountSN;
void messageArrived(MQTT::MessageData &md);
void messageArrivedSN(MQTTSN::MessageData &md);

/*
 * Test cases
 */
void MQTT_LEGACY_CONNECT_NOT_CONNECTED();
void MQTT_LEGACY_CONNECT();
void MQTT_LEGACY_SUBSCRIBE();
void MQTT_LEGACY_SUBSCRIBE_NETWORK_NOT_CONNECTED();
void MQTT_LEGACY_SUBSCRIBE_CLIENT_NOT_CONNECTED();
void MQTT_LEGACY_SUBSCRIBE_TOPIC_TOO_LONG();
void MQTT_LEGACY_SUBSCRIBE_INVALID_MESSAGE_HANDLER();
void MQTT_LEGACY_SUBSCRIBE_RECEIVE();
void MQTT_LEGACY_UNSUBSCRIBE_WITHOUT_SUBSCRIBE();
void MQTT_LEGACY_UNSUBSCRIBE_INVALID();
void MQTT_LEGACY_PUBLISH();
void MQTT_LEGACY_PUBLISH_NOT_CONNECTED();
void MQTT_LEGACY_PUBLISH_TOPIC_TOO_LONG();
void MQTT_LEGACY_CONNECT_USER_PASSWORD_INCORRECT();
void MQTT_LEGACY_CONNECT_SUBSCRIBE_PUBLISH();
void MQTT_LEGACY_CONNECT_SUBSCRIBE_PUBLISH_USER_PASSWORD();
void MQTT_LEGACY_TLS_CONNECT_SUBSCRIBE_PUBLISH();

void MQTTSN_LEGACY_CONNECT_NOT_CONNECTED();
void MQTTSN_LEGACY_CONNECT();
void MQTTSN_LEGACY_SUBSCRIBE();
void MQTTSN_LEGACY_SUBSCRIBE_NETWORK_NOT_CONNECTED();
void MQTTSN_LEGACY_SUBSCRIBE_CLIENT_NOT_CONNECTED();
void MQTTSN_LEGACY_SUBSCRIBE_TOPIC_TOO_LONG();
void MQTTSN_LEGACY_SUBSCRIBE_INVALID_MESSAGE_HANDLER();
void MQTTSN_LEGACY_SUBSCRIBE_RECEIVE();
void MQTTSN_LEGACY_UNSUBSCRIBE_WITHOUT_SUBSCRIBE();
void MQTTSN_LEGACY_UNSUBSCRIBE_INVALID();
void MQTTSN_LEGACY_PUBLISH();
void MQTTSN_LEGACY_PUBLISH_NOT_CONNECTED();
void MQTTSN_LEGACY_PUBLISH_TOPIC_TOO_LONG();
void MQTTSN_LEGACY_IS_CONNECTED();
void MQTTSN_LEGACY_IS_CONNECTED_CLIENT_NOT_CONNECTED();
void MQTTSN_LEGACY_IS_CONNECTED_NETWORK_NOT_CONNECTED();
void MQTTSN_LEGACY_UDP_CONNECT_SUBSCRIBE_PUBLISH();

// New API:
void MQTT_CONNECT_NOT_CONNECTED();
void MQTT_CONNECT();
void MQTT_SUBSCRIBE();
void MQTT_SUBSCRIBE_NETWORK_NOT_CONNECTED();
void MQTT_SUBSCRIBE_CLIENT_NOT_CONNECTED();
void MQTT_SUBSCRIBE_TOPIC_TOO_LONG();
void MQTT_SUBSCRIBE_INVALID_MESSAGE_HANDLER();
void MQTT_SUBSCRIBE_RECEIVE();
void MQTT_UNSUBSCRIBE_WITHOUT_SUBSCRIBE();
void MQTT_UNSUBSCRIBE_INVALID();
void MQTT_PUBLISH();
void MQTT_PUBLISH_NOT_CONNECTED();
void MQTT_PUBLISH_TOPIC_TOO_LONG();
void MQTT_CONNECT_USER_PASSWORD_INCORRECT();
void MQTT_CONNECT_SUBSCRIBE_PUBLISH();
void MQTT_CONNECT_SUBSCRIBE_PUBLISH_USER_PASSWORD();
void MQTT_TLS_CONNECT_SUBSCRIBE_PUBLISH();


void MQTTSN_CONNECT_NOT_CONNECTED();
void MQTTSN_TEST_CONNECT(); // Avoid clash with MQTTSN enum.
void MQTTSN_TEST_SUBSCRIBE(); // Avoid clash with MQTTSN enum.
void MQTTSN_SUBSCRIBE_NETWORK_NOT_CONNECTED();
void MQTTSN_SUBSCRIBE_CLIENT_NOT_CONNECTED();
void MQTTSN_SUBSCRIBE_TOPIC_TOO_LONG();
void MQTTSN_SUBSCRIBE_INVALID_MESSAGE_HANDLER();
void MQTTSN_SUBSCRIBE_RECEIVE();
void MQTTSN_UNSUBSCRIBE_WITHOUT_SUBSCRIBE();
void MQTTSN_UNSUBSCRIBE_INVALID();
void MQTTSN_TEST_PUBLISH();
void MQTTSN_PUBLISH_NOT_CONNECTED();
void MQTTSN_PUBLISH_TOPIC_TOO_LONG();
void MQTTSN_IS_CONNECTED();
void MQTTSN_IS_CONNECTED_CLIENT_NOT_CONNECTED();
void MQTTSN_IS_CONNECTED_NETWORK_NOT_CONNECTED();
void MQTTSN_UDP_CONNECT_SUBSCRIBE_PUBLISH();
void MQTTSN_DTLS_CONNECT_SUBSCRIBE_PUBLISH();

template <class Client> void send_messages(Client &client, char *clientID, bool user_password = false)
{
    arrivedcount = 0;
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.MQTTVersion = 3;
    data.clientID.cstring = (char *)clientID;
    if (user_password || MBED_CONF_MBED_MQTT_TESTS_USERNAME_ALWAYS) {
        data.username.cstring = (char *)MBED_CONF_MBED_MQTT_TESTS_USERNAME;
        data.password.cstring = (char *)MBED_CONF_MBED_MQTT_TESTS_PASSWORD;
    }
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(mqtt_global::topic, MQTT::QOS2, messageArrived));

    MQTT::Message message = mqtt_global::default_message;

    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(mqtt_global::topic, message));

    while (arrivedcount < 1) {
        printf(".");
        client.yield(10);
    }

    // QoS 1
    char buf[100];
    sprintf(buf, "QoS 1 %s\n", clientID);
    message.qos = MQTT::QOS1;
    message.payloadlen = strlen(buf) + 1;
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(mqtt_global::topic, message));

    while (arrivedcount < 2) {
        printf(".");
        client.yield(10);
    }

    // QoS 2
#if MQTTCLIENT_QOS2
    sprintf(buf, "QoS 2 %s\n", clientID);
    message.qos = MQTT::QOS2;
    message.payloadlen = strlen(buf) + 1;
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(mqtt_global::topic, message));
    while (arrivedcount < 3) {
        client.yield(100);
    }
#endif

    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(mqtt_global::topic));
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.disconnect() != 0);
}

/**
 * @brief Initialize the topic with default values.
 *
 * MQTT-SN subscribe() might modify the topic, so we can't use a predefined global variable.
 */
void init_topic_sn(MQTTSN_topicid &topic_sn);
void init_topic_sn_too_long(MQTTSN_topicid &topic_sn);

template <class Client> void send_messages_sn(Client &client, char *clientID)
{
    arrivedcountSN = 0;
    MQTTSNPacket_connectData data = MQTTSNPacket_connectData_initializer;
    data.clientID.cstring = clientID;
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.connect(data));
    MQTTSN_topicid topic;
    init_topic_sn(topic);
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.subscribe(topic, MQTTSN::QOS2, messageArrivedSN));

    // QoS 0
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(topic, mqtt_global::default_message_sn));
    while (arrivedcountSN < 1) {
        client.yield(10);
    }

    // QoS 1
    MQTTSN::Message message;
    char buf[100];
    sprintf(buf, "QoS 1 %s\n", clientID);
    message.qos = MQTTSN::QOS0;
    message.retained = false;
    message.dup = false;
    message.payload = (void *)buf;
    message.payloadlen = strlen(buf) + 1;
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(topic, message));
    while (arrivedcountSN < 2) {
        client.yield(10);
    }

#if MQTTCLIENT_QOS2
    // QoS 2
    sprintf(buf, "QoS 2 %s\n", clientID);
    message.qos = MQTTSN::QOS2;
    message.payloadlen = strlen(buf) + 1;
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.publish(topic, message));
    while (arrivedcountSN < 3) {
        client.yield(10);
    }
#endif

    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.unsubscribe(topic)); //mqtt_global::topic_sn
    TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, client.disconnect() != 0);
}

#endif //MQTT_TESTS_H