diff options
author | Etan Cohen <etancohen@google.com> | 2016-05-04 12:39:21 -0700 |
---|---|---|
committer | Etan Cohen <etancohen@google.com> | 2016-05-23 12:52:21 -0700 |
commit | 1bf97ad103217a2e18370c382fe30abd88716d53 (patch) | |
tree | 399ce8ba011e453f112a01ee0d765590cbe73bc0 /tests | |
parent | 62f63a972ac410750d5de10424ebc9030118365d (diff) |
[NAN] Update send message flow to be (more) asynchronous
Bug: 27916698
Change-Id: Ie9741b73190e733e42dae63386557e6feb01eb54
Diffstat (limited to 'tests')
4 files changed, 163 insertions, 18 deletions
diff --git a/tests/wifitests/jni/wifi_nan_hal_mock.cpp b/tests/wifitests/jni/wifi_nan_hal_mock.cpp index 75e04e82d..4c0c41c7f 100644 --- a/tests/wifitests/jni/wifi_nan_hal_mock.cpp +++ b/tests/wifitests/jni/wifi_nan_hal_mock.cpp @@ -578,10 +578,35 @@ extern "C" void Java_com_android_server_wifi_nan_WifiNanHalMock_callDisabled( mCallbackHandlers.EventDisabled(&msg); } +extern "C" void Java_com_android_server_wifi_nan_WifiNanHalMock_callTransmitFollowup( + JNIEnv* env, jclass clazz, jstring json_args_jstring) { + ScopedUtfChars chars(env, json_args_jstring); + HalMockJsonReader jsonR(chars.c_str()); + bool error = false; + + ALOGD("Java_com_android_server_wifi_nan_WifiNanHalMock_callTransmitFollowup: '%s'", + chars.c_str()); + + NanTransmitFollowupInd msg; + msg.id = (transaction_id) jsonR.get_int("id", &error); + msg.reason = (NanStatusType) jsonR.get_int("reason", &error); + + if (error) { + ALOGE("Java_com_android_server_wifi_nan_WifiNanHalMock_callTransmitFollowup: " + "error parsing args"); + return; + } + + mCallbackHandlers.EventTransmitFollowup(&msg); +} + // TODO: Not currently used: add as needed -//void (*EventUnMatch) (NanUnmatchInd* event); +//void (*EventMatchExpired) (NanUnmatchInd* event); //void (*EventTca) (NanTCAInd* event); //void (*EventBeaconSdfPayload) (NanBeaconSdfPayloadInd* event); +//void (*EventDataRequest)(NanDataPathRequestInd* event); +//void (*EventDataConfirm)(NanDataPathConfirmInd* event); +//void (*EventDataEnd)(NanDataPathEndInd* event); int init_wifi_nan_hal_func_table_mock(wifi_hal_fn *hal_fn) { if (hal_fn == NULL) { diff --git a/tests/wifitests/src/com/android/server/wifi/nan/WifiNanHalMock.java b/tests/wifitests/src/com/android/server/wifi/nan/WifiNanHalMock.java index 2285de7bf..60fdd1e57 100644 --- a/tests/wifitests/src/com/android/server/wifi/nan/WifiNanHalMock.java +++ b/tests/wifitests/src/com/android/server/wifi/nan/WifiNanHalMock.java @@ -86,6 +86,8 @@ public class WifiNanHalMock { public static native void callDisabled(String jsonArgs); + public static native void callTransmitFollowup(String jsonArgs); + /** * initialize NAN mock */ diff --git a/tests/wifitests/src/com/android/server/wifi/nan/WifiNanHalTest.java b/tests/wifitests/src/com/android/server/wifi/nan/WifiNanHalTest.java index 5f2a2b6b1..465bc14e2 100644 --- a/tests/wifitests/src/com/android/server/wifi/nan/WifiNanHalTest.java +++ b/tests/wifitests/src/com/android/server/wifi/nan/WifiNanHalTest.java @@ -483,7 +483,7 @@ public class WifiNanHalTest { WifiNanHalMock.callNotifyResponse(transactionId, HalMockUtils.convertBundleToJson(args).toString()); - verify(mNanStateManager).onMessageSendSuccessResponse(transactionId); + verify(mNanStateManager).onMessageSendQueuedSuccessResponse(transactionId); verifyNoMoreInteractions(mNanStateManager); } @@ -499,7 +499,7 @@ public class WifiNanHalTest { WifiNanHalMock.callNotifyResponse(transactionId, HalMockUtils.convertBundleToJson(args).toString()); - verify(mNanStateManager).onMessageSendFailResponse(transactionId, + verify(mNanStateManager).onMessageSendQueuedFailResponse(transactionId, WifiNanSessionCallback.REASON_OTHER); verifyNoMoreInteractions(mNanStateManager); } @@ -651,6 +651,35 @@ public class WifiNanHalTest { verifyNoMoreInteractions(mNanStateManager); } + @Test + public void testTransmitFollowupSuccess() throws JSONException { + final short transactionId = 123; + + Bundle args = new Bundle(); + args.putInt("id", transactionId); + args.putInt("reason", WifiNanNative.NAN_STATUS_SUCCESS); + + WifiNanHalMock.callTransmitFollowup(HalMockUtils.convertBundleToJson(args).toString()); + + verify(mNanStateManager).onMessageSendSuccessNotification(transactionId); + verifyNoMoreInteractions(mNanStateManager); + } + + @Test + public void testTransmitFollowupFail() throws JSONException { + final short transactionId = 5689; + + Bundle args = new Bundle(); + args.putInt("id", transactionId); + args.putInt("reason", WifiNanNative.NAN_STATUS_TX_FAIL); + + WifiNanHalMock.callTransmitFollowup(HalMockUtils.convertBundleToJson(args).toString()); + + verify(mNanStateManager).onMessageSendFailNotification(transactionId, + WifiNanSessionCallback.REASON_TX_FAIL); + verifyNoMoreInteractions(mNanStateManager); + } + /* * Utilities */ diff --git a/tests/wifitests/src/com/android/server/wifi/nan/WifiNanStateManagerTest.java b/tests/wifitests/src/com/android/server/wifi/nan/WifiNanStateManagerTest.java index 65d36807d..e76038f6d 100644 --- a/tests/wifitests/src/com/android/server/wifi/nan/WifiNanStateManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/nan/WifiNanStateManagerTest.java @@ -137,7 +137,7 @@ public class WifiNanStateManagerTest { mDut.connect(clientId, mockCallback, configRequest); mMockLooper.dispatchAll(); - verifyNoMoreInteractions(mMockContext, mMockNative, mockCallback); + verifyNoMoreInteractions(mMockNative, mockCallback); } /** @@ -744,9 +744,9 @@ public class WifiNanStateManagerTest { } /** - * Validate (1) subscribe (success), (2) match (i.e. discovery), (3) message - * reception, (4) message transmission failed, (5) message transmission - * success. + * Validate (1) subscribe (success), (2) match (i.e. discovery), (3) message reception, (4) + * message queuing failed, (5) message transmission failed (after ok queuing), (6) message + * transmission success. */ @Test public void testMatchAndMessages() throws Exception { @@ -762,6 +762,7 @@ public class WifiNanStateManagerTest { final String peerMatchFilter = "filter binary array represented as string"; final String peerMsg = "some message from peer"; final int messageId = 6948; + final int messageId2 = 6949; ConfigRequest configRequest = new ConfigRequest.Builder().build(); SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().setServiceName(serviceName) @@ -806,25 +807,42 @@ public class WifiNanStateManagerTest { inOrder.verify(mockSessionCallback).onMessageReceived(requestorId, peerMsg.getBytes(), peerMsg.length()); - // (4) message Tx fail + // (4) message Tx queuing fail mDut.sendMessage(clientId, sessionId.getValue(), requestorId, ssi.getBytes(), ssi.length(), messageId); mMockLooper.dispatchAll(); inOrder.verify(mMockNative).sendMessage(transactionId.capture(), eq(subscribeId), eq(requestorId), eq(peerMac), eq(ssi.getBytes()), eq(ssi.length())); - mDut.onMessageSendFailResponse(transactionId.getValue(), reasonFail); + mDut.onMessageSendQueuedFailResponse(transactionId.getValue(), reasonFail); mMockLooper.dispatchAll(); inOrder.verify(mockSessionCallback).onMessageSendFail(messageId, reasonFail); - // (5) message Tx success + // (5) message Tx successful queuing mDut.sendMessage(clientId, sessionId.getValue(), requestorId, ssi.getBytes(), ssi.length(), messageId); mMockLooper.dispatchAll(); inOrder.verify(mMockNative).sendMessage(transactionId.capture(), eq(subscribeId), eq(requestorId), eq(peerMac), eq(ssi.getBytes()), eq(ssi.length())); - mDut.onMessageSendSuccessResponse(transactionId.getValue()); + short tid1 = transactionId.getValue(); + mDut.onMessageSendQueuedSuccessResponse(tid1); mMockLooper.dispatchAll(); - inOrder.verify(mockSessionCallback).onMessageSendSuccess(messageId); + + // (6) message Tx successful queuing + mDut.sendMessage(clientId, sessionId.getValue(), requestorId, ssi.getBytes(), ssi.length(), + messageId2); + mMockLooper.dispatchAll(); + inOrder.verify(mMockNative).sendMessage(transactionId.capture(), eq(subscribeId), + eq(requestorId), eq(peerMac), eq(ssi.getBytes()), eq(ssi.length())); + short tid2 = transactionId.getValue(); + mDut.onMessageSendQueuedSuccessResponse(tid2); + mMockLooper.dispatchAll(); + + // (5) and (6) final Tx results (on-air results) + mDut.onMessageSendFailNotification(tid1, reasonFail); + mDut.onMessageSendSuccessNotification(tid2); + mMockLooper.dispatchAll(); + inOrder.verify(mockSessionCallback).onMessageSendFail(messageId, reasonFail); + inOrder.verify(mockSessionCallback).onMessageSendSuccess(messageId2); verifyNoMoreInteractions(mockCallback, mockSessionCallback, mMockNative); } @@ -900,7 +918,8 @@ public class WifiNanStateManagerTest { inOrder.verify(mMockNative).sendMessage(transactionId.capture(), eq(publishId), eq(peerId2), eq(peerMac2), eq(msgToPeer2.getBytes()), eq(msgToPeer2.length())); short transactionIdVal = transactionId.getValue(); - mDut.onMessageSendSuccessResponse(transactionIdVal); + mDut.onMessageSendQueuedSuccessResponse(transactionIdVal); + mDut.onMessageSendSuccessNotification(transactionIdVal); mDut.sendMessage(clientId, sessionId.getValue(), peerId1, msgToPeer1.getBytes(), msgToPeer1.length(), msgToPeerId1); @@ -909,7 +928,8 @@ public class WifiNanStateManagerTest { inOrder.verify(mMockNative).sendMessage(transactionId.capture(), eq(publishId), eq(peerId1), eq(peerMac1), eq(msgToPeer1.getBytes()), eq(msgToPeer1.length())); transactionIdVal = transactionId.getValue(); - mDut.onMessageSendFailResponse(transactionIdVal, reason); + mDut.onMessageSendQueuedSuccessResponse(transactionIdVal); + mDut.onMessageSendFailNotification(transactionIdVal, reason); mMockLooper.dispatchAll(); inOrder.verify(mockSessionCallback).onMessageSendFail(msgToPeerId1, reason); @@ -976,7 +996,8 @@ public class WifiNanStateManagerTest { msgFromPeer1.length()); inOrder.verify(mMockNative).sendMessage(transactionId.capture(), eq(publishId), eq(peerId), eq(peerMacOrig), eq(msgToPeer1.getBytes()), eq(msgToPeer1.length())); - mDut.onMessageSendSuccessResponse(transactionId.getValue()); + mDut.onMessageSendQueuedSuccessResponse(transactionId.getValue()); + mDut.onMessageSendSuccessNotification(transactionId.getValue()); mMockLooper.dispatchAll(); inOrder.verify(mockSessionCallback).onMessageSendSuccess(msgToPeerId1); @@ -990,7 +1011,8 @@ public class WifiNanStateManagerTest { msgFromPeer2.length()); inOrder.verify(mMockNative).sendMessage(transactionId.capture(), eq(publishId), eq(peerId), eq(peerMacLater), eq(msgToPeer2.getBytes()), eq(msgToPeer2.length())); - mDut.onMessageSendSuccessResponse(transactionId.getValue()); + mDut.onMessageSendQueuedSuccessResponse(transactionId.getValue()); + mDut.onMessageSendSuccessNotification(transactionId.getValue()); mMockLooper.dispatchAll(); inOrder.verify(mockSessionCallback).onMessageSendSuccess(msgToPeerId2); @@ -1053,6 +1075,73 @@ public class WifiNanStateManagerTest { } /** + * Validate that on send message timeout correct callback is dispatched and that a later + * firmware notification is ignored. + */ + @Test + public void testSendMessageTimeout() throws Exception { + final int clientId = 1005; + final String ssi = "some much longer and more arbitrary data"; + final int subscribeId = 15; + final int requestorId = 22; + final byte[] peerMac = HexEncoding.decode("060708090A0B".toCharArray(), false); + final String peerSsi = "some peer ssi data"; + final String peerMatchFilter = "filter binary array represented as string"; + final int messageId = 6948; + + ConfigRequest configRequest = new ConfigRequest.Builder().build(); + SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().build(); + + IWifiNanEventCallback mockCallback = mock(IWifiNanEventCallback.class); + IWifiNanSessionCallback mockSessionCallback = mock(IWifiNanSessionCallback.class); + ArgumentCaptor<Short> transactionId = ArgumentCaptor.forClass(Short.class); + ArgumentCaptor<Integer> sessionId = ArgumentCaptor.forClass(Integer.class); + InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mMockNative); + + // (1) connect + mDut.connect(clientId, mockCallback, configRequest); + mMockLooper.dispatchAll(); + inOrder.verify(mMockNative).enableAndConfigure(transactionId.capture(), eq(configRequest), + eq(true)); + mDut.onConfigSuccessResponse(transactionId.getValue()); + mMockLooper.dispatchAll(); + inOrder.verify(mockCallback).onConnectSuccess(); + + // (2) subscribe & match + mDut.subscribe(clientId, subscribeConfig, mockSessionCallback); + mMockLooper.dispatchAll(); + inOrder.verify(mMockNative).subscribe(transactionId.capture(), eq(0), eq(subscribeConfig)); + mDut.onSessionConfigSuccessResponse(transactionId.getValue(), false, subscribeId); + mDut.onMatchNotification(subscribeId, requestorId, peerMac, peerSsi.getBytes(), + peerSsi.length(), peerMatchFilter.getBytes(), peerMatchFilter.length()); + mMockLooper.dispatchAll(); + inOrder.verify(mockSessionCallback).onSessionStarted(sessionId.capture()); + inOrder.verify(mockSessionCallback).onMatch(requestorId, peerSsi.getBytes(), + peerSsi.length(), peerMatchFilter.getBytes(), peerMatchFilter.length()); + + // (3) send message and enqueue successfully + mDut.sendMessage(clientId, sessionId.getValue(), requestorId, ssi.getBytes(), + ssi.length(), messageId); + mMockLooper.dispatchAll(); + inOrder.verify(mMockNative).sendMessage(transactionId.capture(), eq(subscribeId), + eq(requestorId), eq(peerMac), eq(ssi.getBytes()), eq(ssi.length())); + mDut.onMessageSendQueuedSuccessResponse(transactionId.getValue()); + mMockLooper.dispatchAll(); + + // (4) message send timeout + assertTrue(mAlarmManager.dispatch(WifiNanStateManager.HAL_SEND_MESSAGE_TIMEOUT_TAG)); + mMockLooper.dispatchAll(); + inOrder.verify(mockSessionCallback).onMessageSendFail(messageId, + WifiNanSessionCallback.REASON_TX_FAIL); + + // (5) firmware response (unlikely - but good to check) + mDut.onMessageSendSuccessNotification(transactionId.getValue()); + mMockLooper.dispatchAll(); + + verifyNoMoreInteractions(mockCallback, mockSessionCallback, mMockNative); + } + + /** * Validate that start ranging function fills-in correct MAC addresses for peer IDs and * passed along to RTT module. */ @@ -1381,8 +1470,8 @@ public class WifiNanStateManagerTest { mDut.onConfigSuccessResponse(transactionIdConfig); mDut.onConfigFailedResponse(transactionIdConfig, -1); mDut.onSessionConfigFailResponse(transactionIdConfig, true, -1); - mDut.onMessageSendSuccessResponse(transactionIdConfig); - mDut.onMessageSendFailResponse(transactionIdConfig, -1); + mDut.onMessageSendQueuedSuccessResponse(transactionIdConfig); + mDut.onMessageSendQueuedFailResponse(transactionIdConfig, -1); mDut.onSessionConfigFailResponse(transactionIdConfig, false, -1); mDut.onMatchNotification(-1, -1, new byte[0], new byte[0], 0, new byte[0], 0); mDut.onSessionTerminatedNotification(-1, -1, true); |