@@ -24,6 +24,7 @@ static uint8_t rx[255];
24
24
25
25
static struct msg_send_data {
26
26
int called ;
27
+ uint8_t msg_data [CONFIG_MQTT_SN_LIB_MAX_PAYLOAD_SIZE ];
27
28
size_t msg_sz ;
28
29
int ret ;
29
30
const void * dest_addr ;
@@ -43,12 +44,18 @@ int mqtt_sn_data_cmp(struct mqtt_sn_data data1, struct mqtt_sn_data data2)
43
44
static int msg_sendto (struct mqtt_sn_client * client , void * buf , size_t sz , const void * dest_addr ,
44
45
size_t addrlen )
45
46
{
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
+
46
51
msg_send_data .called ++ ;
47
52
msg_send_data .msg_sz = sz ;
48
53
msg_send_data .client = client ;
49
54
msg_send_data .dest_addr = dest_addr ;
50
55
msg_send_data .addrlen = addrlen ;
51
56
57
+ memcpy (msg_send_data .msg_data , buf , sz );
58
+
52
59
k_sem_give (& mqtt_sn_tx_sem );
53
60
54
61
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
69
76
memset (& msg_send_data , 0 , sizeof (msg_send_data ));
70
77
}
71
78
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
+
72
99
static struct {
73
100
uint8_t data [CONFIG_MQTT_SN_LIB_MAX_PAYLOAD_SIZE ];
74
101
struct mqtt_sn_evt last_evt ;
@@ -126,7 +153,7 @@ int tp_poll(struct mqtt_sn_client *client)
126
153
return recvfrom_data .sz ;
127
154
}
128
155
129
- #define NUM_TEST_CLIENTS 11
156
+ #define NUM_TEST_CLIENTS 13
130
157
static ZTEST_BMEM struct mqtt_sn_client mqtt_clients [NUM_TEST_CLIENTS ];
131
158
static ZTEST_BMEM struct mqtt_sn_client * mqtt_client ;
132
159
@@ -428,6 +455,45 @@ static ZTEST(mqtt_sn_client, test_mqtt_sn_publish_event_qos0)
428
455
zassert_mem_equal (evt_cb_data .last_evt .param .publish .data .data , data .data , data .size );
429
456
}
430
457
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
+
431
497
/* Test a simple PUBLISH message */
432
498
static ZTEST (mqtt_sn_client , test_mqtt_sn_publish_qos0 )
433
499
{
@@ -467,6 +533,44 @@ static ZTEST(mqtt_sn_client, test_mqtt_sn_publish_qos0)
467
533
zassert_false (sys_slist_is_empty (& mqtt_client -> topic ), "Topic empty" );
468
534
}
469
535
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
+
470
574
/*
471
575
* Test two PUBLISH messages
472
576
*
0 commit comments