diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2017-07-05 21:15:39 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-07-05 21:15:39 +0000 |
commit | fde238c66f81feccb1900ed182c7d859e8ec47ac (patch) | |
tree | 806a91cf91e6da1ff4cae9bca52d25fbff8e759c /tests | |
parent | cca4b57c80ceb087a0bd37fa2cbc0bcca483f3d0 (diff) | |
parent | 7a44d3fab050e1aca22317a604a68016c79f5925 (diff) |
Merge changes I30d7a841,Idbc526df,Ie90ec6e9,Ib0316663 into oc-dr1-dev
* changes:
[AWARE] Add metrics for data-path session duration
[AWARE] Add NDP (data-path) creation duration metrics
[AWARE] Add NAN data-path (NDP/NDI) metrics
[AWARE] Simplify Discovery Session metrics collection
Diffstat (limited to 'tests')
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java | 55 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/aware/WifiAwareMetricsTest.java | 115 |
2 files changed, 158 insertions, 12 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java index ceed26661..0ddf765d7 100644 --- a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareDataPathStateManagerTest.java @@ -24,6 +24,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyByte; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyShort; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; @@ -36,6 +37,7 @@ import android.Manifest; import android.app.test.TestAlarmManager; import android.content.Context; import android.content.pm.PackageManager; +import android.hardware.wifi.V1_0.NanStatusType; import android.net.ConnectivityManager; import android.net.NetworkCapabilities; import android.net.NetworkFactory; @@ -265,13 +267,14 @@ public class WifiAwareDataPathStateManagerTest { final byte[] peerDiscoveryMac = HexEncoding.decode("000102030405".toCharArray(), false); InOrder inOrder = inOrder(mMockNative, mMockCm, mMockCallback, mMockSessionCallback); + InOrder inOrderM = inOrder(mAwareMetricsMock); when(mPermissionsWrapperMock.getUidPermission(eq(Manifest.permission.CONNECTIVITY_INTERNAL), anyInt())).thenReturn(PackageManager.PERMISSION_DENIED); // (0) initialize Pair<Integer, Messenger> res = initDataPathEndPoint(clientId, pubSubId, peerHandle, - peerDiscoveryMac, inOrder, false); + peerDiscoveryMac, inOrder, inOrderM, false); // (1) request network NetworkRequest nr = getSessionNetworkRequest(clientId, res.first, peerHandle, pmk, null, @@ -285,7 +288,7 @@ public class WifiAwareDataPathStateManagerTest { mMockLooper.dispatchAll(); // failure: no interactions with connectivity manager or native manager - verifyNoMoreInteractions(mMockNative, mMockCm); + verifyNoMoreInteractions(mMockNative, mMockCm, mAwareMetricsMock); } /* @@ -503,10 +506,11 @@ public class WifiAwareDataPathStateManagerTest { final byte[] peerDiscoveryMac = HexEncoding.decode("000102030405".toCharArray(), false); InOrder inOrder = inOrder(mMockNative, mMockCm, mMockCallback, mMockSessionCallback); + InOrder inOrderM = inOrder(mAwareMetricsMock); // (0) initialize Pair<Integer, Messenger> res = initDataPathEndPoint(clientId, pubSubId, peerHandle, - peerDiscoveryMac, inOrder, doPublish); + peerDiscoveryMac, inOrder, inOrderM, doPublish); // (1) request network NetworkRequest nr = getSessionNetworkRequest(clientId, res.first, peerHandle, pmk, null, @@ -545,7 +549,7 @@ public class WifiAwareDataPathStateManagerTest { eq(ndpId), eq(""), eq(null), eq(null), anyBoolean(), any()); } - verifyNoMoreInteractions(mMockNative, mMockCm); + verifyNoMoreInteractions(mMockNative, mMockCm, mAwareMetricsMock); } private void testDataPathInitiatorResponderInvalidUidUtility(boolean doPublish, @@ -558,10 +562,11 @@ public class WifiAwareDataPathStateManagerTest { final byte[] peerDiscoveryMac = HexEncoding.decode("000102030405".toCharArray(), false); InOrder inOrder = inOrder(mMockNative, mMockCm, mMockCallback, mMockSessionCallback); + InOrder inOrderM = inOrder(mAwareMetricsMock); // (0) initialize Pair<Integer, Messenger> res = initDataPathEndPoint(clientId, pubSubId, peerHandle, - peerDiscoveryMac, inOrder, doPublish); + peerDiscoveryMac, inOrder, inOrderM, doPublish); // (1) create network request NetworkRequest nr = getSessionNetworkRequest(clientId, res.first, peerHandle, pmk, null, @@ -601,7 +606,7 @@ public class WifiAwareDataPathStateManagerTest { eq(ndpId), eq(""), eq(null), eq(null), anyBoolean(), any()); } - verifyNoMoreInteractions(mMockNative, mMockCm); + verifyNoMoreInteractions(mMockNative, mMockCm, mAwareMetricsMock); } private void testDataPathInitiatorUtility(boolean useDirect, boolean provideMac, @@ -620,6 +625,7 @@ public class WifiAwareDataPathStateManagerTest { ArgumentCaptor<Messenger> messengerCaptor = ArgumentCaptor.forClass(Messenger.class); ArgumentCaptor<Short> transactionId = ArgumentCaptor.forClass(Short.class); InOrder inOrder = inOrder(mMockNative, mMockCm, mMockCallback, mMockSessionCallback); + InOrder inOrderM = inOrder(mAwareMetricsMock); if (!providePmk) { when(mPermissionsWrapperMock.getUidPermission( @@ -635,7 +641,7 @@ public class WifiAwareDataPathStateManagerTest { // (0) initialize Pair<Integer, Messenger> res = initDataPathEndPoint(clientId, pubSubId, peerHandle, - peerDiscoveryMac, inOrder, false); + peerDiscoveryMac, inOrder, inOrderM, false); // (1) request network NetworkRequest nr; @@ -662,7 +668,9 @@ public class WifiAwareDataPathStateManagerTest { eq(providePassphrase ? passphrase : null), eq(useDirect), any()); if (immediateHalFailure) { // short-circuit the rest of this test - verifyNoMoreInteractions(mMockNative, mMockCm); + inOrderM.verify(mAwareMetricsMock).recordNdpStatus(eq(NanStatusType.INTERNAL_FAILURE), + eq(useDirect), anyLong()); + verifyNoMoreInteractions(mMockNative, mMockCm, mAwareMetricsMock); return; } @@ -676,6 +684,9 @@ public class WifiAwareDataPathStateManagerTest { mMockLooper.dispatchAll(); inOrder.verify(mMockCm).registerNetworkAgent(messengerCaptor.capture(), any(), any(), any(), anyInt(), any()); + inOrderM.verify(mAwareMetricsMock).recordNdpStatus(eq(NanStatusType.SUCCESS), + eq(useDirect), anyLong()); + inOrderM.verify(mAwareMetricsMock).recordNdpCreation(anyInt(), any()); } else { assertTrue(mAlarmManager.dispatch( WifiAwareStateManager.HAL_DATA_PATH_CONFIRM_TIMEOUT_TAG)); @@ -683,6 +694,8 @@ public class WifiAwareDataPathStateManagerTest { inOrder.verify(mMockNative).endDataPath(transactionId.capture(), eq(ndpId)); mDut.onEndDataPathResponse(transactionId.getValue(), true, 0); mMockLooper.dispatchAll(); + inOrderM.verify(mAwareMetricsMock).recordNdpStatus(eq(NanStatusType.INTERNAL_FAILURE), + eq(useDirect), anyLong()); } // (3) end data-path (unless didn't get confirmation) @@ -699,10 +712,12 @@ public class WifiAwareDataPathStateManagerTest { mMockLooper.dispatchAll(); inOrder.verify(mMockNative).endDataPath(transactionId.capture(), eq(ndpId)); mDut.onEndDataPathResponse(transactionId.getValue(), true, 0); + mDut.onDataPathEndNotification(ndpId); mMockLooper.dispatchAll(); + inOrderM.verify(mAwareMetricsMock).recordNdpSessionDuration(anyLong()); } - verifyNoMoreInteractions(mMockNative, mMockCm); + verifyNoMoreInteractions(mMockNative, mMockCm, mAwareMetricsMock); } private void testDataPathResponderUtility(boolean useDirect, boolean provideMac, @@ -721,6 +736,7 @@ public class WifiAwareDataPathStateManagerTest { ArgumentCaptor<Messenger> messengerCaptor = ArgumentCaptor.forClass(Messenger.class); ArgumentCaptor<Short> transactionId = ArgumentCaptor.forClass(Short.class); InOrder inOrder = inOrder(mMockNative, mMockCm, mMockCallback, mMockSessionCallback); + InOrder inOrderM = inOrder(mAwareMetricsMock); if (providePmk) { when(mPermissionsWrapperMock.getUidPermission( @@ -730,7 +746,7 @@ public class WifiAwareDataPathStateManagerTest { // (0) initialize Pair<Integer, Messenger> res = initDataPathEndPoint(clientId, pubSubId, peerHandle, - peerDiscoveryMac, inOrder, true); + peerDiscoveryMac, inOrder, inOrderM, true); // (1) request network NetworkRequest nr; @@ -767,6 +783,9 @@ public class WifiAwareDataPathStateManagerTest { mMockLooper.dispatchAll(); inOrder.verify(mMockCm).registerNetworkAgent(messengerCaptor.capture(), any(), any(), any(), anyInt(), any()); + inOrderM.verify(mAwareMetricsMock).recordNdpStatus(eq(NanStatusType.SUCCESS), + eq(useDirect), anyLong()); + inOrderM.verify(mAwareMetricsMock).recordNdpCreation(anyInt(), any()); } else { assertTrue(mAlarmManager.dispatch( WifiAwareStateManager.HAL_DATA_PATH_CONFIRM_TIMEOUT_TAG)); @@ -774,6 +793,8 @@ public class WifiAwareDataPathStateManagerTest { inOrder.verify(mMockNative).endDataPath(transactionId.capture(), eq(ndpId)); mDut.onEndDataPathResponse(transactionId.getValue(), true, 0); mMockLooper.dispatchAll(); + inOrderM.verify(mAwareMetricsMock).recordNdpStatus(eq(NanStatusType.INTERNAL_FAILURE), + eq(useDirect), anyLong()); } // (4) end data-path (unless didn't get confirmation) @@ -790,10 +811,12 @@ public class WifiAwareDataPathStateManagerTest { mMockLooper.dispatchAll(); inOrder.verify(mMockNative).endDataPath(transactionId.capture(), eq(ndpId)); mDut.onEndDataPathResponse(transactionId.getValue(), true, 0); + mDut.onDataPathEndNotification(ndpId); mMockLooper.dispatchAll(); + inOrderM.verify(mAwareMetricsMock).recordNdpSessionDuration(anyLong()); } - verifyNoMoreInteractions(mMockNative, mMockCm); + verifyNoMoreInteractions(mMockNative, mMockCm, mAwareMetricsMock); } private void installDataPathStateManagerMocks() throws Exception { @@ -922,7 +945,7 @@ public class WifiAwareDataPathStateManagerTest { } private Pair<Integer, Messenger> initDataPathEndPoint(int clientId, byte pubSubId, - PeerHandle peerHandle, byte[] peerDiscoveryMac, InOrder inOrder, + PeerHandle peerHandle, byte[] peerDiscoveryMac, InOrder inOrder, InOrder inOrderM, boolean doPublish) throws Exception { final int pid = 2000; @@ -955,6 +978,7 @@ public class WifiAwareDataPathStateManagerTest { // (2) enable usage mDut.enableUsage(); mMockLooper.dispatchAll(); + inOrderM.verify(mAwareMetricsMock).recordEnableUsage(); // (3) create client & session & rx message mDut.connect(clientId, Process.myUid(), pid, callingPackage, mMockCallback, configRequest, @@ -965,6 +989,8 @@ public class WifiAwareDataPathStateManagerTest { mDut.onConfigSuccessResponse(transactionId.getValue()); mMockLooper.dispatchAll(); inOrder.verify(mMockCallback).onConnectSuccess(clientId); + inOrderM.verify(mAwareMetricsMock).recordAttachSession(eq(Process.myUid()), eq(false), + any()); inOrder.verify(mMockNative).createAwareNetworkInterface(transactionId.capture(), strCaptor.capture()); @@ -989,6 +1015,11 @@ public class WifiAwareDataPathStateManagerTest { mDut.onSessionConfigSuccessResponse(transactionId.getValue(), doPublish, pubSubId); mMockLooper.dispatchAll(); inOrder.verify(mMockSessionCallback).onSessionStarted(sessionId.capture()); + inOrderM.verify(mAwareMetricsMock).recordDiscoverySession(eq(Process.myUid()), + eq(doPublish), any()); + inOrderM.verify(mAwareMetricsMock).recordDiscoveryStatus(Process.myUid(), + NanStatusType.SUCCESS, doPublish); + mDut.onMessageReceivedNotification(pubSubId, peerHandle.peerId, peerDiscoveryMac, someMsg.getBytes()); mMockLooper.dispatchAll(); diff --git a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareMetricsTest.java b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareMetricsTest.java index 470a1de3d..8cd1e1097 100644 --- a/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareMetricsTest.java +++ b/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareMetricsTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.when; import android.app.AppOpsManager; import android.content.Context; import android.hardware.wifi.V1_0.NanStatusType; +import android.net.wifi.aware.WifiAwareNetworkSpecifier; import android.util.Log; import android.util.SparseArray; import android.util.SparseIntArray; @@ -41,6 +42,8 @@ import org.mockito.MockitoAnnotations; import java.io.PrintWriter; import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; /** * Unit test harness for WifiAwareMetrics @@ -369,6 +372,100 @@ public class WifiAwareMetricsTest { } /** + * Validate the data-path (NDP & NDI) metrics. + */ + @Test + public void testDataPathMetrics() { + final int uid1 = 1005; + final int uid2 = 1006; + final String ndi0 = "aware_data0"; + final String ndi1 = "aware_data1"; + Map<WifiAwareNetworkSpecifier, WifiAwareDataPathStateManager.AwareNetworkRequestInformation> + networkRequestCache = new HashMap<>(); + WifiMetricsProto.WifiAwareLog log; + + setTime(5); + + // uid1: ndp (non-secure) on ndi0 + addNetworkInfoToCache(networkRequestCache, 10, uid1, ndi0, null); + mDut.recordNdpCreation(uid1, networkRequestCache); + setTime(7); // 2ms creation time + mDut.recordNdpStatus(NanStatusType.SUCCESS, false, 5); + + // uid2: ndp (non-secure) on ndi0 + WifiAwareNetworkSpecifier ns = addNetworkInfoToCache(networkRequestCache, 11, uid2, ndi0, + null); + mDut.recordNdpCreation(uid2, networkRequestCache); + setTime(10); // 3 ms creation time + mDut.recordNdpStatus(NanStatusType.SUCCESS, false, 7); + + // uid2: ndp (secure) on ndi1 (OOB) + addNetworkInfoToCache(networkRequestCache, 12, uid2, ndi1, "passphrase of some kind"); + mDut.recordNdpCreation(uid2, networkRequestCache); + setTime(25); // 15 ms creation time + mDut.recordNdpStatus(NanStatusType.SUCCESS, true, 10); + + // uid2: ndp (secure) on ndi0 (OOB) + addNetworkInfoToCache(networkRequestCache, 13, uid2, ndi0, "super secret password"); + mDut.recordNdpCreation(uid2, networkRequestCache); + setTime(36); // 11 ms creation time + mDut.recordNdpStatus(NanStatusType.SUCCESS, true, 25); + + // uid2: delete the first NDP + networkRequestCache.remove(ns); + + // uid2: ndp (non-secure) on ndi0 + addNetworkInfoToCache(networkRequestCache, 14, uid2, ndi0, null); + mDut.recordNdpCreation(uid2, networkRequestCache); + setTime(37); // 1 ms creation time! + mDut.recordNdpStatus(NanStatusType.SUCCESS, false, 36); + + // a few error codes + mDut.recordNdpStatus(NanStatusType.INTERNAL_FAILURE, false, 0); + mDut.recordNdpStatus(NanStatusType.INTERNAL_FAILURE, false, 0); + mDut.recordNdpStatus(NanStatusType.NO_RESOURCES_AVAILABLE, false, 0); + + // and some durations + setTime(150); + mDut.recordNdpSessionDuration(7); // 143ms + mDut.recordNdpSessionDuration(10); // 140ms + mDut.recordNdpSessionDuration(25); // 125ms + mDut.recordNdpSessionDuration(140); // 10ms + + //verify + log = mDut.consolidateProto(); + + collector.checkThat("maxConcurrentNdiInApp", log.maxConcurrentNdiInApp, equalTo(2)); + collector.checkThat("maxConcurrentNdiInSystem", log.maxConcurrentNdiInSystem, equalTo(2)); + collector.checkThat("maxConcurrentNdpInApp", log.maxConcurrentNdpInApp, equalTo(3)); + collector.checkThat("maxConcurrentNdpInSystem", log.maxConcurrentNdpInSystem, equalTo(4)); + collector.checkThat("maxConcurrentSecureNdpInApp", log.maxConcurrentSecureNdpInApp, + equalTo(2)); + collector.checkThat("maxConcurrentSecureNdpInSystem", log.maxConcurrentSecureNdpInSystem, + equalTo(2)); + collector.checkThat("maxConcurrentNdpPerNdi", log.maxConcurrentNdpPerNdi, equalTo(3)); + collector.checkThat("histogramRequestNdpStatus.length", + log.histogramRequestNdpStatus.length, equalTo(3)); + collector.checkThat("histogramRequestNdpOobStatus.length", + log.histogramRequestNdpOobStatus.length, equalTo(1)); + + collector.checkThat("ndpCreationTimeMsMin", log.ndpCreationTimeMsMin, equalTo(1L)); + collector.checkThat("ndpCreationTimeMsMax", log.ndpCreationTimeMsMax, equalTo(15L)); + collector.checkThat("ndpCreationTimeMsSum", log.ndpCreationTimeMsSum, equalTo(32L)); + collector.checkThat("ndpCreationTimeMsSumOfSq", log.ndpCreationTimeMsSumOfSq, + equalTo(360L)); + collector.checkThat("ndpCreationTimeMsNumSamples", log.ndpCreationTimeMsNumSamples, + equalTo(5L)); + validateProtoHistBucket("Creation[0]", log.histogramNdpCreationTimeMs[0], 1, 2, 1); + validateProtoHistBucket("Creation[1]", log.histogramNdpCreationTimeMs[1], 2, 3, 1); + validateProtoHistBucket("Creation[2]", log.histogramNdpCreationTimeMs[2], 3, 4, 1); + validateProtoHistBucket("Creation[3]", log.histogramNdpCreationTimeMs[3], 10, 20, 2); + + validateProtoHistBucket("Duration[0]", log.histogramNdpSessionDurationMs[0], 10, 20, 1); + validateProtoHistBucket("Duration[1]", log.histogramNdpSessionDurationMs[1], 100, 200, 3); + } + + /** * Validate that the histogram configuration is initialized correctly: bucket starting points * and sub-bucket widths. */ @@ -549,6 +646,24 @@ public class WifiAwareMetricsTest { collector.checkThat(logPrefix + ": count", bucket.count, equalTo(count)); } + private WifiAwareNetworkSpecifier addNetworkInfoToCache( + Map<WifiAwareNetworkSpecifier, WifiAwareDataPathStateManager + .AwareNetworkRequestInformation> networkRequestCache, + int index, int uid, String interfaceName, String passphrase) { + WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier(0, 0, 0, index, 0, null, null, + passphrase, 0); + WifiAwareDataPathStateManager.AwareNetworkRequestInformation anri = + new WifiAwareDataPathStateManager.AwareNetworkRequestInformation(); + anri.networkSpecifier = ns; + anri.state = WifiAwareDataPathStateManager.AwareNetworkRequestInformation + .STATE_RESPONDER_CONFIRMED; + anri.uid = uid; + anri.interfaceName = interfaceName; + + networkRequestCache.put(ns, anri); + return ns; + } + private void dumpDut(String prefix) { StringWriter sw = new StringWriter(); mDut.dump(null, new PrintWriter(sw), null); |