#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); }