summaryrefslogtreecommitdiff
path: root/test/unit/mqtt/test_mqtt.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/mqtt/test_mqtt.c')
-rw-r--r--test/unit/mqtt/test_mqtt.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/test/unit/mqtt/test_mqtt.c b/test/unit/mqtt/test_mqtt.c
new file mode 100644
index 00000000000..7cff13ea238
--- /dev/null
+++ b/test/unit/mqtt/test_mqtt.c
@@ -0,0 +1,115 @@
+#include "test_mqtt.h"
+
+#include "lwip/pbuf.h"
+#include "lwip/apps/mqtt.h"
+#include "lwip/apps/mqtt_priv.h"
+#include "lwip/netif.h"
+
+const ip_addr_t test_mqtt_local_ip = IPADDR4_INIT_BYTES(192, 168, 1, 1);
+const ip_addr_t test_mqtt_remote_ip = IPADDR4_INIT_BYTES(192, 168, 1, 2);
+const ip_addr_t test_mqtt_netmask = IPADDR4_INIT_BYTES(255, 255, 255, 0);
+
+static err_t test_mqtt_netif_output(struct netif *netif, struct pbuf *p,
+ const ip4_addr_t *ipaddr)
+{
+ LWIP_UNUSED_ARG(netif);
+ LWIP_UNUSED_ARG(ipaddr);
+ LWIP_UNUSED_ARG(p);
+ return ERR_OK;
+}
+
+static void
+test_mqtt_init_netif(struct netif *netif, const ip_addr_t *ip_addr, const ip_addr_t *netmask)
+{
+ struct netif *n;
+ memset(netif, 0, sizeof(struct netif));
+ netif->output = test_mqtt_netif_output;
+ netif->flags |= NETIF_FLAG_UP | NETIF_FLAG_LINK_UP;
+ ip_addr_copy_from_ip4(netif->netmask, *ip_2_ip4(netmask));
+ ip_addr_copy_from_ip4(netif->ip_addr, *ip_2_ip4(ip_addr));
+ for (n = netif_list; n != NULL; n = n->next) {
+ if (n == netif) {
+ return;
+ }
+ }
+ netif->next = NULL;
+ netif_list = netif;
+}
+
+/* Setups/teardown functions */
+static struct netif *old_netif_list;
+static struct netif *old_netif_default;
+
+static void
+mqtt_setup(void)
+{
+ old_netif_list = netif_list;
+ old_netif_default = netif_default;
+ netif_list = NULL;
+ netif_default = NULL;
+ lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+static void
+mqtt_teardown(void)
+{
+ netif_list = NULL;
+ netif_default = NULL;
+ /* restore netif_list for next tests (e.g. loopif) */
+ netif_list = old_netif_list;
+ netif_default = old_netif_default;
+ lwip_check_ensure_no_alloc(SKIP_POOL(MEMP_SYS_TIMEOUT));
+}
+
+static void test_mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status)
+{
+ LWIP_UNUSED_ARG(client);
+ LWIP_UNUSED_ARG(arg);
+ LWIP_UNUSED_ARG(status);
+}
+
+START_TEST(basic_connect)
+{
+ mqtt_client_t* client;
+ struct netif netif;
+ err_t err;
+ struct mqtt_connect_client_info_t client_info = {
+ "dumm",
+ NULL, NULL,
+ 10,
+ NULL, NULL, 0, 0
+ };
+ struct pbuf *p;
+ unsigned char rxbuf[] = {0x20, 0x02, 0x00, 0x00};
+ LWIP_UNUSED_ARG(_i);
+
+ test_mqtt_init_netif(&netif, &test_mqtt_local_ip, &test_mqtt_netmask);
+
+ client = mqtt_client_new();
+ fail_unless(client != NULL);
+ err = mqtt_client_connect(client, &test_mqtt_remote_ip, 1234, test_mqtt_connection_cb, NULL, &client_info);
+ fail_unless(err == ERR_OK);
+
+ client->conn->connected(client->conn->callback_arg, client->conn, ERR_OK);
+ p = pbuf_alloc(PBUF_RAW, sizeof(rxbuf), PBUF_REF);
+ fail_unless(p != NULL);
+ p->payload = rxbuf;
+ /* since we hack the rx path, we have to hack the rx window, too: */
+ client->conn->rcv_wnd -= p->tot_len;
+ if (client->conn->recv(client->conn->callback_arg, client->conn, p, ERR_OK) != ERR_OK) {
+ pbuf_free(p);
+ }
+
+ mqtt_disconnect(client);
+ /* fixme: mqtt_client_fre() is missing... */
+ mem_free(client);
+}
+END_TEST
+
+Suite* mqtt_suite(void)
+{
+ testfunc tests[] = {
+ TESTFUNC(basic_connect),
+ };
+ return create_suite("MQTT", tests, sizeof(tests)/sizeof(testfunc), mqtt_setup, mqtt_teardown);
+}