@@ -789,6 +789,115 @@ TEST(encode_connect_fixed_header_flags)
789789 ASSERT_EQ (0 , (int )MQTT_PACKET_FLAGS_GET (tx_buf [0 ]));
790790}
791791
792+ /* [MQTT-3.1.2] CONNECT variable header flags byte encodes credential and
793+ * clean-session bits. The flags byte sits at offset 7 inside the variable
794+ * header (after 2-byte protocol length, 4-byte "MQTT", 1-byte protocol
795+ * level). With a remaining length < 128 the fixed header is 2 bytes, so the
796+ * flags byte is tx_buf[9]. */
797+ TEST (encode_connect_flags_username_password_clean )
798+ {
799+ byte tx_buf [256 ];
800+ MqttConnect conn ;
801+ int rc ;
802+ byte flags ;
803+
804+ XMEMSET (& conn , 0 , sizeof (conn ));
805+ conn .client_id = "test_client" ;
806+ conn .username = "user" ;
807+ conn .password = "pass" ;
808+ conn .clean_session = 1 ;
809+ rc = MqttEncode_Connect (tx_buf , (int )sizeof (tx_buf ), & conn );
810+ ASSERT_TRUE (rc > 0 );
811+ flags = tx_buf [9 ];
812+ ASSERT_EQ (MQTT_CONNECT_FLAG_USERNAME ,
813+ flags & MQTT_CONNECT_FLAG_USERNAME );
814+ ASSERT_EQ (MQTT_CONNECT_FLAG_PASSWORD ,
815+ flags & MQTT_CONNECT_FLAG_PASSWORD );
816+ ASSERT_EQ (MQTT_CONNECT_FLAG_CLEAN_SESSION ,
817+ flags & MQTT_CONNECT_FLAG_CLEAN_SESSION );
818+ ASSERT_EQ (0 , flags & MQTT_CONNECT_FLAG_WILL_FLAG );
819+ ASSERT_EQ (0 , flags & MQTT_CONNECT_FLAG_WILL_RETAIN );
820+ ASSERT_EQ (0 , flags & MQTT_CONNECT_FLAG_WILL_QOS_MASK );
821+ ASSERT_EQ (0 , flags & MQTT_CONNECT_FLAG_RESERVED );
822+ }
823+
824+ TEST (encode_connect_flags_none )
825+ {
826+ byte tx_buf [256 ];
827+ MqttConnect conn ;
828+ int rc ;
829+
830+ XMEMSET (& conn , 0 , sizeof (conn ));
831+ conn .client_id = "test_client" ;
832+ rc = MqttEncode_Connect (tx_buf , (int )sizeof (tx_buf ), & conn );
833+ ASSERT_TRUE (rc > 0 );
834+ ASSERT_EQ (0 , (int )tx_buf [9 ]);
835+ }
836+
837+ TEST (encode_connect_flags_clean_session_only )
838+ {
839+ byte tx_buf [256 ];
840+ MqttConnect conn ;
841+ int rc ;
842+
843+ XMEMSET (& conn , 0 , sizeof (conn ));
844+ conn .client_id = "test_client" ;
845+ conn .clean_session = 1 ;
846+ rc = MqttEncode_Connect (tx_buf , (int )sizeof (tx_buf ), & conn );
847+ ASSERT_TRUE (rc > 0 );
848+ ASSERT_EQ (MQTT_CONNECT_FLAG_CLEAN_SESSION , (int )tx_buf [9 ]);
849+ }
850+
851+ TEST (encode_connect_flags_username_only )
852+ {
853+ byte tx_buf [256 ];
854+ MqttConnect conn ;
855+ int rc ;
856+
857+ XMEMSET (& conn , 0 , sizeof (conn ));
858+ conn .client_id = "test_client" ;
859+ conn .username = "user" ;
860+ rc = MqttEncode_Connect (tx_buf , (int )sizeof (tx_buf ), & conn );
861+ ASSERT_TRUE (rc > 0 );
862+ ASSERT_EQ (MQTT_CONNECT_FLAG_USERNAME ,
863+ tx_buf [9 ] & MQTT_CONNECT_FLAG_USERNAME );
864+ ASSERT_EQ (0 , tx_buf [9 ] & MQTT_CONNECT_FLAG_PASSWORD );
865+ }
866+
867+ TEST (encode_connect_flags_lwt_qos1_retain )
868+ {
869+ byte tx_buf [256 ];
870+ byte lwt_payload [] = {'b' , 'y' , 'e' };
871+ MqttConnect conn ;
872+ MqttMessage lwt ;
873+ int rc ;
874+ byte flags ;
875+
876+ XMEMSET (& conn , 0 , sizeof (conn ));
877+ XMEMSET (& lwt , 0 , sizeof (lwt ));
878+ lwt .topic_name = "will/topic" ;
879+ lwt .buffer = lwt_payload ;
880+ lwt .total_len = (word32 )sizeof (lwt_payload );
881+ lwt .qos = MQTT_QOS_1 ;
882+ lwt .retain = 1 ;
883+
884+ conn .client_id = "test_client" ;
885+ conn .enable_lwt = 1 ;
886+ conn .lwt_msg = & lwt ;
887+ rc = MqttEncode_Connect (tx_buf , (int )sizeof (tx_buf ), & conn );
888+ ASSERT_TRUE (rc > 0 );
889+ flags = tx_buf [9 ];
890+ ASSERT_EQ (MQTT_CONNECT_FLAG_WILL_FLAG ,
891+ flags & MQTT_CONNECT_FLAG_WILL_FLAG );
892+ ASSERT_EQ (MQTT_CONNECT_FLAG_WILL_RETAIN ,
893+ flags & MQTT_CONNECT_FLAG_WILL_RETAIN );
894+ ASSERT_EQ ((int )MQTT_QOS_1 ,
895+ (int )MQTT_CONNECT_FLAG_GET_QOS (flags ));
896+ ASSERT_EQ (0 , flags & MQTT_CONNECT_FLAG_USERNAME );
897+ ASSERT_EQ (0 , flags & MQTT_CONNECT_FLAG_PASSWORD );
898+ ASSERT_EQ (0 , flags & MQTT_CONNECT_FLAG_CLEAN_SESSION );
899+ }
900+
792901/* ============================================================================
793902 * QoS 2 next-ack arithmetic (PUBLISH_REC -> REL -> COMP)
794903 * ============================================================================ */
@@ -1117,6 +1226,11 @@ void run_mqtt_packet_tests(void)
11171226 RUN_TEST (encode_connect_username_only );
11181227 RUN_TEST (encode_connect_no_credentials );
11191228 RUN_TEST (encode_connect_fixed_header_flags );
1229+ RUN_TEST (encode_connect_flags_username_password_clean );
1230+ RUN_TEST (encode_connect_flags_none );
1231+ RUN_TEST (encode_connect_flags_clean_session_only );
1232+ RUN_TEST (encode_connect_flags_username_only );
1233+ RUN_TEST (encode_connect_flags_lwt_qos1_retain );
11201234
11211235 /* QoS 2 ack arithmetic */
11221236 RUN_TEST (qos2_ack_arithmetic );
0 commit comments