33import org .junit .Assume ;
44import org .junit .Test ;
55import static org .junit .Assert .assertNotNull ;
6+ import static org .junit .Assert .assertNull ;
67import static org .junit .Assert .assertTrue ;
78import static org .junit .Assert .assertEquals ;
89import static org .junit .Assert .fail ;
@@ -2870,7 +2871,7 @@ public void ManualPuback_AcquireDoubleCallRaises() throws Exception {
28702871 CrtResource .waitForNoResources ();
28712872 }
28722873
2873- private void doManualPublishAcknowledgement_AcquirePostCallbackRaisesTest () {
2874+ private void doManualPublishAcknowledgement_AcquirePostCallbackReturnsNullTest () {
28742875 try (TlsContextOptions tlsOptions = TlsContextOptions .createWithMtlsFromPath (
28752876 AWS_TEST_MQTT5_IOT_CORE_RSA_CERT , AWS_TEST_MQTT5_IOT_CORE_RSA_KEY );
28762877 TlsContext tlsContext = new TlsContext (tlsOptions )) {
@@ -2890,7 +2891,8 @@ private void doManualPublishAcknowledgement_AcquirePostCallbackRaisesTest() {
28902891 builder .withPublishEvents (new Mqtt5ClientOptions .PublishEvents () {
28912892 @ Override
28922893 public void onMessageReceived (Mqtt5Client client , PublishReturn publishReturn ) {
2893- // Save the PublishReturn but do NOT call acquirePublishAcknowledgementControl() within the callback
2894+ // Save the PublishReturn but do NOT call acquirePublishAcknowledgementControl() within the callback.
2895+ // Native code will call it after the callback returns (auto-invoking the PUBACK), zeroing controlId.
28942896 savedPublishReturnHolder [0 ] = publishReturn ;
28952897 callbackDoneFuture .complete (null );
28962898 }
@@ -2909,16 +2911,13 @@ public void onMessageReceived(Mqtt5Client client, PublishReturn publishReturn) {
29092911 // Wait for the callback to complete
29102912 callbackDoneFuture .get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
29112913
2912- // Call acquirePublishAcknowledgementControl() after the callback has returned, this should throw IllegalStateException
2914+ // Call acquirePublishAcknowledgementControl() after the callback has returned.
2915+ // Native code already called it (zeroing controlId), so this returns null due to wrong thread or controlID being zero.
29132916 assertNotNull ("savedPublishReturn should have been set" , savedPublishReturnHolder [0 ]);
2914- boolean exceptionThrown = false ;
2915- try {
2916- savedPublishReturnHolder [0 ].acquirePublishAcknowledgementControl ();
2917- } catch (IllegalStateException ex ) {
2918- exceptionThrown = true ;
2919- }
2920- assertTrue ("acquirePublishAcknowledgementControl() should throw IllegalStateException after callback returns" ,
2921- exceptionThrown );
2917+ Mqtt5PublishAcknowledgementControlHandle handle =
2918+ savedPublishReturnHolder [0 ].acquirePublishAcknowledgementControl ();
2919+ assertNull ("acquirePublishAcknowledgementControl() should return null after callback returns" ,
2920+ handle );
29222921
29232922 client .stop ();
29242923 events .stopFuture .get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
@@ -2928,18 +2927,18 @@ public void onMessageReceived(Mqtt5Client client, PublishReturn publishReturn) {
29282927 }
29292928 }
29302929
2931- /* Manual publish acknowledgement post-callback test: calling acquirePublishAcknowledgementControl() after callback returns raises IllegalStateException */
2930+ /* Manual publish acknowledgement post-callback test: calling acquirePublishAcknowledgementControl() after callback returns returns null */
29322931 @ Test
2933- public void ManualPuback_AcquirePostCallbackRaises () throws Exception {
2932+ public void ManualPuback_AcquirePostCallbackReturnsNull () throws Exception {
29342933 skipIfNetworkUnavailable ();
29352934 Assume .assumeNotNull (AWS_TEST_MQTT5_IOT_CORE_HOST , AWS_TEST_MQTT5_IOT_CORE_RSA_CERT , AWS_TEST_MQTT5_IOT_CORE_RSA_KEY );
29362935
2937- TestUtils .doRetryableTest (this ::doManualPublishAcknowledgement_AcquirePostCallbackRaisesTest , TestUtils ::isRetryableTimeout , MAX_TEST_RETRIES , TEST_RETRY_SLEEP_MILLIS );
2936+ TestUtils .doRetryableTest (this ::doManualPublishAcknowledgement_AcquirePostCallbackReturnsNullTest , TestUtils ::isRetryableTimeout , MAX_TEST_RETRIES , TEST_RETRY_SLEEP_MILLIS );
29382937
29392938 CrtResource .waitForNoResources ();
29402939 }
29412940
2942- private void doManualPuback_Qos0AcquireThrowsTest () {
2941+ private void doManualPuback_Qos0AcquireReturnsNullTest () {
29432942 try (TlsContextOptions tlsOptions = TlsContextOptions .createWithMtlsFromPath (
29442943 AWS_TEST_MQTT5_IOT_CORE_RSA_CERT , AWS_TEST_MQTT5_IOT_CORE_RSA_KEY );
29452944 TlsContext tlsContext = new TlsContext (tlsOptions )) {
@@ -2948,7 +2947,7 @@ private void doManualPuback_Qos0AcquireThrowsTest() {
29482947 String testTopic = "test/MQTT5_Binding_Java_" + testUUID ;
29492948 byte [] payload = testUUID .getBytes ();
29502949
2951- CompletableFuture <String > resultFuture = new CompletableFuture <>();
2950+ CompletableFuture <Mqtt5PublishAcknowledgementControlHandle > resultFuture = new CompletableFuture <>();
29522951
29532952 Mqtt5ClientOptionsBuilder builder = new Mqtt5ClientOptionsBuilder (AWS_TEST_MQTT5_IOT_CORE_HOST , 8883l );
29542953 LifecycleEvents_Futured events = new LifecycleEvents_Futured ();
@@ -2958,16 +2957,10 @@ private void doManualPuback_Qos0AcquireThrowsTest() {
29582957 builder .withPublishEvents (new Mqtt5ClientOptions .PublishEvents () {
29592958 @ Override
29602959 public void onMessageReceived (Mqtt5Client client , PublishReturn publishReturn ) {
2961- // For QoS 0, acquirePublishAcknowledgementControl() should throw IllegalStateException
2962- // because the native layer passes a null context pointer for QoS 0 publishes.
2963- try {
2964- publishReturn .acquirePublishAcknowledgementControl ();
2965- resultFuture .complete ("no_error" ); // Should not reach here
2966- } catch (IllegalStateException ex ) {
2967- resultFuture .complete ("threw_illegal_state" );
2968- } catch (Exception ex ) {
2969- resultFuture .complete ("unexpected_error: " + ex .getMessage ());
2970- }
2960+ // For QoS 0, controlId is 0, so acquirePublishAcknowledgementControl() returns null.
2961+ Mqtt5PublishAcknowledgementControlHandle handle =
2962+ publishReturn .acquirePublishAcknowledgementControl ();
2963+ resultFuture .complete (handle );
29712964 }
29722965 });
29732966
@@ -2983,9 +2976,10 @@ public void onMessageReceived(Mqtt5Client client, PublishReturn publishReturn) {
29832976 PublishPacketBuilder publishBuilder = new PublishPacketBuilder (testTopic , QOS .AT_MOST_ONCE , payload );
29842977 client .publish (publishBuilder .build ()).get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
29852978
2986- String result = resultFuture .get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
2987- assertEquals ("acquirePublishAcknowledgementControl() should throw IllegalStateException for QoS 0 messages, got: " + result ,
2988- "threw_illegal_state" , result );
2979+ Mqtt5PublishAcknowledgementControlHandle handle =
2980+ resultFuture .get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
2981+ assertNull ("acquirePublishAcknowledgementControl() should return null for QoS 0 messages" ,
2982+ handle );
29892983
29902984 client .stop ();
29912985 events .stopFuture .get (OPERATION_TIMEOUT_TIME , TimeUnit .SECONDS );
@@ -2995,13 +2989,13 @@ public void onMessageReceived(Mqtt5Client client, PublishReturn publishReturn) {
29952989 }
29962990 }
29972991
2998- /* Manual publish acknowledgement QoS 0 test: acquirePublishAcknowledgementControl() throws IllegalStateException for QoS 0 messages */
2992+ /* Manual publish acknowledgement QoS 0 test: acquirePublishAcknowledgementControl() returns null for QoS 0 messages */
29992993 @ Test
3000- public void ManualPuback_Qos0AcquireThrows () throws Exception {
2994+ public void ManualPuback_Qos0AcquireReturnsNull () throws Exception {
30012995 skipIfNetworkUnavailable ();
30022996 Assume .assumeNotNull (AWS_TEST_MQTT5_IOT_CORE_HOST , AWS_TEST_MQTT5_IOT_CORE_RSA_CERT , AWS_TEST_MQTT5_IOT_CORE_RSA_KEY );
30032997
3004- TestUtils .doRetryableTest (this ::doManualPuback_Qos0AcquireThrowsTest , TestUtils ::isRetryableTimeout , MAX_TEST_RETRIES , TEST_RETRY_SLEEP_MILLIS );
2998+ TestUtils .doRetryableTest (this ::doManualPuback_Qos0AcquireReturnsNullTest , TestUtils ::isRetryableTimeout , MAX_TEST_RETRIES , TEST_RETRY_SLEEP_MILLIS );
30052999
30063000 CrtResource .waitForNoResources ();
30073001 }
0 commit comments