@@ -2240,6 +2240,111 @@ public void Op_DirectPacketBuilders() throws Exception {
22402240 CrtResource .waitForNoResources ();
22412241 }
22422242
2243+ /* Full Publish Packet Tests */
2244+ private void doPublishWithFullPacket () {
2245+ try (TlsContextOptions tlsOptions = TlsContextOptions .createWithMtlsFromPath (
2246+ AWS_TEST_MQTT5_IOT_CORE_RSA_CERT , AWS_TEST_MQTT5_IOT_CORE_RSA_KEY );
2247+ TlsContext tlsContext = new TlsContext (tlsOptions )) {
2248+
2249+ String testUUID = UUID .randomUUID ().toString ();
2250+ String testTopic = "test/MQTT5_Binding_Java_" + testUUID ;
2251+ String testResponseTopic = "test/MQTT5_Binding_Java_Response_" + testUUID ;
2252+ String testContentType = "application/json" ;
2253+ byte [] testPayload = "{\" message\" : \" Hello World\" }" .getBytes ();
2254+ byte [] testCorrelationData = "correlation-data-12345" .getBytes ();
2255+
2256+ Mqtt5ClientOptionsBuilder builder = new Mqtt5ClientOptionsBuilder (AWS_TEST_MQTT5_IOT_CORE_HOST , 8883l );
2257+ LifecycleEvents_Futured events = new LifecycleEvents_Futured ();
2258+ builder .withLifecycleEvents (events );
2259+ builder .withTlsContext (tlsContext );
2260+
2261+ PublishEvents_Futured publishEvents = new PublishEvents_Futured ();
2262+ builder .withPublishEvents (publishEvents );
2263+
2264+ // Build a publish packet with all available fields populated
2265+ PublishPacketBuilder publishPacketBuilder = new PublishPacketBuilder ();
2266+ publishPacketBuilder .withTopic (testTopic );
2267+ publishPacketBuilder .withQOS (QOS .AT_LEAST_ONCE );
2268+ publishPacketBuilder .withPayload (testPayload );
2269+ publishPacketBuilder .withRetain (false );
2270+ publishPacketBuilder .withPayloadFormat (PublishPacket .PayloadFormatIndicator .UTF8 );
2271+ publishPacketBuilder .withMessageExpiryIntervalSeconds (60L );
2272+ publishPacketBuilder .withResponseTopic (testResponseTopic );
2273+ publishPacketBuilder .withCorrelationData (testCorrelationData );
2274+ publishPacketBuilder .withContentType (testContentType );
2275+
2276+ ArrayList <UserProperty > userProperties = new ArrayList <UserProperty >();
2277+ userProperties .add (new UserProperty ("test-name-1" , "test-value-1" ));
2278+ userProperties .add (new UserProperty ("test-name-2" , "test-value-2" ));
2279+ publishPacketBuilder .withUserProperties (userProperties );
2280+
2281+ SubscribePacketBuilder subscribePacketBuilder = new SubscribePacketBuilder (testTopic , QOS .AT_LEAST_ONCE );
2282+
2283+ try (Mqtt5Client client = new Mqtt5Client (builder .build ())) {
2284+ client .start ();
2285+ events .connectedFuture .get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
2286+
2287+ // Subscribe to the topic first
2288+ client .subscribe (subscribePacketBuilder .build ()).get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
2289+
2290+ // Publish the message with all fields
2291+ client .publish (publishPacketBuilder .build ()).get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
2292+
2293+ // Wait for the publish to be received
2294+ publishEvents .publishReceivedFuture .get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
2295+
2296+ // Verify the received publish packet has the expected fields
2297+ PublishPacket receivedPacket = publishEvents .publishPacket ;
2298+ assertNotNull ("Received publish packet should not be null" , receivedPacket );
2299+
2300+ // Verify topic
2301+ assertEquals ("Topic should match" , testTopic , receivedPacket .getTopic ());
2302+
2303+ // Verify QoS
2304+ assertEquals ("QoS should match" , QOS .AT_LEAST_ONCE , receivedPacket .getQOS ());
2305+
2306+ // Verify payload
2307+ assertTrue ("Payload should match" , java .util .Arrays .equals (testPayload , receivedPacket .getPayload ()));
2308+
2309+ // Verify payload format indicator
2310+ assertEquals ("Payload format should match" ,
2311+ PublishPacket .PayloadFormatIndicator .UTF8 , receivedPacket .getPayloadFormat ());
2312+
2313+ // Verify response topic
2314+ assertEquals ("Response topic should match" , testResponseTopic , receivedPacket .getResponseTopic ());
2315+
2316+ // Verify correlation data
2317+ assertTrue ("Correlation data should match" ,
2318+ java .util .Arrays .equals (testCorrelationData , receivedPacket .getCorrelationData ()));
2319+
2320+ // Verify content type
2321+ assertEquals ("Content type should match" , testContentType , receivedPacket .getContentType ());
2322+
2323+ // Verify user properties
2324+ assertNotNull ("User properties should not be null" , receivedPacket .getUserProperties ());
2325+ assertEquals ("User properties count should match" , 2 , receivedPacket .getUserProperties ().size ());
2326+
2327+ client .stop ();
2328+ events .stopFuture .get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
2329+ }
2330+ } catch (Exception ex ) {
2331+ throw new RuntimeException (ex );
2332+ }
2333+ }
2334+
2335+ /* Publish with full packet - all fields populated */
2336+ @ Test
2337+ public void Op_PublishWithFullPacket () throws Exception {
2338+ skipIfNetworkUnavailable ();
2339+ Assume .assumeNotNull (AWS_TEST_MQTT5_IOT_CORE_HOST , AWS_TEST_MQTT5_IOT_CORE_RSA_CERT ,
2340+ AWS_TEST_MQTT5_IOT_CORE_RSA_KEY );
2341+
2342+ TestUtils .doRetryableTest (this ::doPublishWithFullPacket , TestUtils ::isRetryableTimeout , MAX_TEST_RETRIES ,
2343+ TEST_RETRY_SLEEP_MILLIS );
2344+
2345+ CrtResource .waitForNoResources ();
2346+ }
2347+
22432348 /**
22442349 * ============================================================
22452350 * Error Operation Tests
0 commit comments