Skip to content

Commit a039bab

Browse files
M1chacfriedt
authored andcommitted
tests: net: mqtt_sn_client: test predefined topics
This add tests for both outgoing and incoming publishes on predefined topics. Signed-off-by: Michael Zimmermann <[email protected]>
1 parent e79315d commit a039bab

File tree

1 file changed

+105
-1
lines changed

1 file changed

+105
-1
lines changed

tests/net/lib/mqtt_sn_client/src/mqtt_sn_client.c

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ static uint8_t rx[255];
2424

2525
static struct msg_send_data {
2626
int called;
27+
uint8_t msg_data[CONFIG_MQTT_SN_LIB_MAX_PAYLOAD_SIZE];
2728
size_t msg_sz;
2829
int ret;
2930
const void *dest_addr;
@@ -43,12 +44,18 @@ int mqtt_sn_data_cmp(struct mqtt_sn_data data1, struct mqtt_sn_data data2)
4344
static int msg_sendto(struct mqtt_sn_client *client, void *buf, size_t sz, const void *dest_addr,
4445
size_t addrlen)
4546
{
47+
zassert_not_null(buf);
48+
zassert_true(sz <= sizeof(msg_send_data.msg_data),
49+
"buffer is bigger than supported by the test: %zu", sz);
50+
4651
msg_send_data.called++;
4752
msg_send_data.msg_sz = sz;
4853
msg_send_data.client = client;
4954
msg_send_data.dest_addr = dest_addr;
5055
msg_send_data.addrlen = addrlen;
5156

57+
memcpy(msg_send_data.msg_data, buf, sz);
58+
5259
k_sem_give(&mqtt_sn_tx_sem);
5360

5461
return msg_send_data.ret;
@@ -69,6 +76,26 @@ static void assert_msg_send(int called, size_t msg_sz, const struct mqtt_sn_data
6976
memset(&msg_send_data, 0, sizeof(msg_send_data));
7077
}
7178

79+
static void assert_msg_send_data(int called, const void *msg_data, size_t msg_sz,
80+
const struct mqtt_sn_data *dest_addr)
81+
{
82+
zassert_equal(msg_send_data.called, called, "msg_send called %d times instead of %d",
83+
msg_send_data.called, called);
84+
if (msg_send_data.msg_sz != msg_sz || memcmp(msg_send_data.msg_data, msg_data, msg_sz)) {
85+
LOG_ERR("Unexpected msg_data");
86+
LOG_HEXDUMP_ERR(msg_send_data.msg_data, msg_send_data.msg_sz, "actual");
87+
LOG_HEXDUMP_ERR(msg_data, msg_sz, "expected");
88+
zassert_true(false);
89+
}
90+
if (dest_addr != NULL) {
91+
zassert_equal(mqtt_sn_data_cmp(*dest_addr,
92+
*((struct mqtt_sn_data *)msg_send_data.dest_addr)),
93+
0, "Addresses incorrect");
94+
}
95+
96+
memset(&msg_send_data, 0, sizeof(msg_send_data));
97+
}
98+
7299
static struct {
73100
uint8_t data[CONFIG_MQTT_SN_LIB_MAX_PAYLOAD_SIZE];
74101
struct mqtt_sn_evt last_evt;
@@ -126,7 +153,7 @@ int tp_poll(struct mqtt_sn_client *client)
126153
return recvfrom_data.sz;
127154
}
128155

129-
#define NUM_TEST_CLIENTS 11
156+
#define NUM_TEST_CLIENTS 13
130157
static ZTEST_BMEM struct mqtt_sn_client mqtt_clients[NUM_TEST_CLIENTS];
131158
static ZTEST_BMEM struct mqtt_sn_client *mqtt_client;
132159

@@ -428,6 +455,45 @@ static ZTEST(mqtt_sn_client, test_mqtt_sn_publish_event_qos0)
428455
zassert_mem_equal(evt_cb_data.last_evt.param.publish.data.data, data.data, data.size);
429456
}
430457

458+
/* Test a simple incoming PUBLISH event on a predefined topic */
459+
static ZTEST(mqtt_sn_client, test_mqtt_sn_publish_event_qos0_predefined)
460+
{
461+
struct mqtt_sn_data data = MQTT_SN_DATA_STRING_LITERAL("Hello.");
462+
struct mqtt_sn_data topic = MQTT_SN_DATA_STRING_LITERAL("zephyr");
463+
uint8_t suback[] = {8, 0x13, 0, 0x1B, 0x1B, 0x00, 0x01, 0};
464+
static const uint8_t pubmsg[] = {0x0d, 0x0c, 0x01, 0x00, 0x2a, 0x00, 0x00,
465+
'H', 'e', 'l', 'l', 'o', '.'};
466+
int err;
467+
468+
mqtt_sn_connect_no_will(mqtt_client);
469+
err = k_sem_take(&mqtt_sn_tx_sem, K_NO_WAIT);
470+
471+
err = mqtt_sn_predefine_topic(mqtt_client, 42, &topic);
472+
zassert_equal(err, 0, "unexpected error %d", err);
473+
474+
err = mqtt_sn_predefine_topic(mqtt_client, 42, &topic);
475+
zassert_equal(err, -EALREADY, "unexpected error %d", err);
476+
477+
err = mqtt_sn_subscribe(mqtt_client, MQTT_SN_QOS_0, &topic);
478+
zassert_ok(err, "Unexpected error %d", err);
479+
err = k_sem_take(&mqtt_sn_tx_sem, K_SECONDS(1));
480+
/* Expect a SUBSCRIBE message */
481+
assert_msg_send(1, 7, &gw_addr);
482+
483+
err = input(mqtt_client, suback, sizeof(suback), &gw_addr);
484+
zassert_ok(err, "unexpected error %d", err);
485+
486+
/* Send PUBLISH */
487+
err = input(mqtt_client, pubmsg, sizeof(pubmsg), &gw_addr);
488+
zassert_equal(err, 0, "unexpected error %d", err);
489+
zassert_equal(evt_cb_data.called, 2, "NO event");
490+
zassert_equal(evt_cb_data.last_evt.type, MQTT_SN_EVT_PUBLISH, "Wrong event");
491+
zassert_equal(evt_cb_data.last_evt.param.publish.data.size, data.size,
492+
"Unexpected publish data size: %zu",
493+
evt_cb_data.last_evt.param.publish.data.size);
494+
zassert_mem_equal(evt_cb_data.last_evt.param.publish.data.data, data.data, data.size);
495+
}
496+
431497
/* Test a simple PUBLISH message */
432498
static ZTEST(mqtt_sn_client, test_mqtt_sn_publish_qos0)
433499
{
@@ -467,6 +533,44 @@ static ZTEST(mqtt_sn_client, test_mqtt_sn_publish_qos0)
467533
zassert_false(sys_slist_is_empty(&mqtt_client->topic), "Topic empty");
468534
}
469535

536+
/* Test a simple PUBLISH message on a predefined topic */
537+
static ZTEST(mqtt_sn_client, test_mqtt_sn_publish_qos0_predefined)
538+
{
539+
struct mqtt_sn_data data = MQTT_SN_DATA_STRING_LITERAL("Hello");
540+
struct mqtt_sn_data topic = MQTT_SN_DATA_STRING_LITERAL("zephyr");
541+
static const uint8_t msg_data_pub[] = {0x0c, 0x0c, 0x01, 0x00, 0x2a, 0x00,
542+
0x00, 'H', 'e', 'l', 'l', 'o'};
543+
int err;
544+
545+
mqtt_sn_connect_no_will(mqtt_client);
546+
err = k_sem_take(&mqtt_sn_tx_sem, K_NO_WAIT);
547+
548+
err = mqtt_sn_predefine_topic(mqtt_client, 42, &topic);
549+
zassert_equal(err, 0, "unexpected error %d", err);
550+
551+
err = mqtt_sn_predefine_topic(mqtt_client, 42, &topic);
552+
zassert_equal(err, -EALREADY, "unexpected error %d", err);
553+
554+
/* Expect topics not to be empty, because we just predefined one */
555+
zassert_false(sys_slist_is_empty(&mqtt_client->topic), "Topic empty");
556+
557+
err = mqtt_sn_publish(mqtt_client, MQTT_SN_QOS_0, &topic, false, &data);
558+
zassert_equal(err, 0, "Unexpected error %d", err);
559+
560+
assert_msg_send(0, 0, NULL);
561+
562+
/* Expect PUBLISH to be sent */
563+
err = k_sem_take(&mqtt_sn_tx_sem, K_SECONDS(10));
564+
zassert_equal(err, 0, "Timed out waiting for callback.");
565+
assert_msg_send_data(1, msg_data_pub, sizeof(msg_data_pub), &gw_addr);
566+
567+
/* Expect publishes to be empty - all done */
568+
zassert_true(sys_slist_is_empty(&mqtt_client->publish), "Publish not empty");
569+
570+
/* Expect topics not to be empty - should be remembered */
571+
zassert_false(sys_slist_is_empty(&mqtt_client->topic), "Topic empty");
572+
}
573+
470574
/*
471575
* Test two PUBLISH messages
472576
*

0 commit comments

Comments
 (0)