@@ -24,6 +24,7 @@ static uint8_t rx[255];
2424
2525static 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)
4344static 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+
7299static 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
130157static ZTEST_BMEM struct mqtt_sn_client mqtt_clients [NUM_TEST_CLIENTS ];
131158static 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 */
432498static 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