11b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/* 21b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Copyright (C) 2016 The Android Open Source Project 31b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 41b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Licensed under the Apache License, Version 2.0 (the "License"); 51b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * you may not use this file except in compliance with the License. 61b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * You may obtain a copy of the License at 71b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 81b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * http://www.apache.org/licenses/LICENSE-2.0 91b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Unless required by applicable law or agreed to in writing, software 111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * distributed under the License is distributed on an "AS IS" BASIS, 121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * See the License for the specific language governing permissions and 141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * limitations under the License 151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepackage com.android.server.wifi; 171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport static org.junit.Assert.assertEquals; 191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport static org.junit.Assert.assertTrue; 20107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhneimport static org.mockito.Mockito.*; 211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 2222fcd83c560e45deaadb22795dd2683ebd923914Sohani Raoimport android.net.NetworkAgent; 23f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport android.net.wifi.ScanResult; 2446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.net.wifi.SupplicantState; 25f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport android.net.wifi.WifiConfiguration; 2644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silbersteinimport android.net.wifi.WifiManager; 2746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.net.wifi.WifiSsid; 2846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.os.Handler; 2946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.os.test.TestLooper; 3028345f81bf3f95e25946d398d594f39141c41442Mitchell Willsimport android.test.suitebuilder.annotation.SmallTest; 311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport android.util.Base64; 321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 3346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 34f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail; 35da94688198c864bb29be2e9603ebbe9ae6492a87Tamas Berghammerimport com.android.server.wifi.nano.WifiMetricsProto; 3646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent; 37f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport org.junit.Before; 391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport org.junit.Test; 40107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhneimport org.mockito.Mock; 41107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhneimport org.mockito.MockitoAnnotations; 421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.ByteArrayOutputStream; 44031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhneimport java.io.FileDescriptor; 451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter; 46031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhneimport java.io.StringWriter; 4759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport java.util.ArrayList; 4846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.BitSet; 4959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport java.util.List; 501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.regex.Matcher; 511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.regex.Pattern; 521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/** 541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Unit tests for {@link com.android.server.wifi.WifiMetrics}. 551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 5628345f81bf3f95e25946d398d594f39141c41442Mitchell Wills@SmallTest 571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetricsTest { 581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetrics mWifiMetrics; 601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetricsProto.WifiLog mDeserializedWifiMetrics; 6146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne TestLooper mTestLooper; 62107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne @Mock Clock mClock; 63f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne @Before 651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void setUp() throws Exception { 66107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne MockitoAnnotations.initMocks(this); 671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mDeserializedWifiMetrics = null; 68107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne when(mClock.getElapsedSinceBootMillis()).thenReturn((long) 0); 6946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mTestLooper = new TestLooper(); 7046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mWifiMetrics = new WifiMetrics(mClock, mTestLooper.getLooper()); 711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Test that startConnectionEvent and endConnectionEvent can be called repeatedly and out of 752532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * order. Only tests no exception occurs. Creates 3 ConnectionEvents. 761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne @Test 781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void startAndEndConnectionEventSucceeds() throws Exception { 791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //Start and end Connection event 8096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(null, "RED", 811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiMetrics.endConnectionEvent( 8396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_AUTHENTICATION_FAILURE, 842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_DHCP); 851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //end Connection event without starting one 862532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiMetrics.endConnectionEvent( 8796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_AUTHENTICATION_FAILURE, 882532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_DHCP); 891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //start two ConnectionEvents in a row 9096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(null, "BLUE", 911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 9296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(null, "GREEN", 931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 96107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private static final long TEST_RECORD_DURATION_SEC = 12 * 60 * 60; 97107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private static final long TEST_RECORD_DURATION_MILLIS = TEST_RECORD_DURATION_SEC * 1000; 98107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne 991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 100f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne * Simulate how dumpsys gets the proto from mWifiMetrics, filter the proto bytes out and 101f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne * deserialize them into mDeserializedWifiMetrics 102f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne */ 103f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne public void dumpProtoAndDeserialize() throws Exception { 104f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne ByteArrayOutputStream stream = new ByteArrayOutputStream(); 105f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne PrintWriter writer = new PrintWriter(stream); 106f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne String[] args = new String[0]; 107107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne 108107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne when(mClock.getElapsedSinceBootMillis()).thenReturn(TEST_RECORD_DURATION_MILLIS); 109f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Test proto dump, by passing in proto arg option 110f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne args = new String[]{WifiMetrics.PROTO_DUMP_ARG}; 111f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.dump(null, writer, args); 112f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne writer.flush(); 113f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne Pattern pattern = Pattern.compile( 114f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne "(?<=WifiMetrics:\\n)([\\s\\S]*)(?=EndWifiMetrics)"); 115f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne Matcher matcher = pattern.matcher(stream.toString()); 116f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne assertTrue("Proto Byte string found in WifiMetrics.dump():\n" + stream.toString(), 117f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne matcher.find()); 118f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne String protoByteString = matcher.group(1); 119f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne byte[] protoBytes = Base64.decode(protoByteString, Base64.DEFAULT); 120f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mDeserializedWifiMetrics = WifiMetricsProto.WifiLog.parseFrom(protoBytes); 121f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 122f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 1239ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne /** 1249ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne * Gets the 'clean dump' proto bytes from mWifiMetrics & deserializes it into 1259ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne * mDeserializedWifiMetrics 1269ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne */ 1279ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne public void cleanDumpProtoAndDeserialize() throws Exception { 1289ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne ByteArrayOutputStream stream = new ByteArrayOutputStream(); 1299ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne PrintWriter writer = new PrintWriter(stream); 1309ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne String[] args = new String[0]; 1319ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne 132eec380c6da5edae23582bdc85aa4317891c22cc0Glen Kuhne when(mClock.getElapsedSinceBootMillis()).thenReturn(TEST_RECORD_DURATION_MILLIS); 1339ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne //Test proto dump, by passing in proto arg option 1349ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne args = new String[]{WifiMetrics.PROTO_DUMP_ARG, WifiMetrics.CLEAN_DUMP_ARG}; 1359ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne mWifiMetrics.dump(null, writer, args); 1369ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne writer.flush(); 1379ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne String protoByteString = stream.toString(); 1389ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne byte[] protoBytes = Base64.decode(protoByteString, Base64.DEFAULT); 1399ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne mDeserializedWifiMetrics = WifiMetricsProto.WifiLog.parseFrom(protoBytes); 1409ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne } 1419ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne 142f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Verifies that dump() includes the expected header */ 1431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne @Test 144f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal public void stateDumpIncludesHeader() throws Exception { 145f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertStringContains(getStateDump(), "WifiMetrics"); 146f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 147f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 148f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Verifies that dump() includes correct alert count when there are no alerts. */ 149f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal @Test 150f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal public void stateDumpAlertCountIsCorrectWithNoAlerts() throws Exception { 151f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertStringContains(getStateDump(), "mWifiLogProto.alertReasonCounts=()"); 152f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 153f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 154f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Verifies that dump() includes correct alert count when there is one alert. */ 155f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal @Test 156f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal public void stateDumpAlertCountIsCorrectWithOneAlert() throws Exception { 157f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(1); 158f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertStringContains(getStateDump(), "mWifiLogProto.alertReasonCounts=(1,1)"); 159f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 160f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 161f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Verifies that dump() includes correct alert count when there are multiple alerts. */ 162f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal @Test 163f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal public void stateDumpAlertCountIsCorrectWithMultipleAlerts() throws Exception { 164f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(1); 165f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(1); 166f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(16); 167f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertStringContains(getStateDump(), "mWifiLogProto.alertReasonCounts=(1,2),(16,1)"); 1681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne @Test 171f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne public void testDumpProtoAndDeserialize() throws Exception { 1721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne setAndIncrementMetrics(); 173f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne dumpProtoAndDeserialize(); 1741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertDeserializedMetricsCorrect(); 1751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final int NUM_OPEN_NETWORKS = 2; 1781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final int NUM_PERSONAL_NETWORKS = 3; 1791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final int NUM_ENTERPRISE_NETWORKS = 5; 1803c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne private static final int NUM_SAVED_NETWORKS = NUM_OPEN_NETWORKS + NUM_PERSONAL_NETWORKS 1813c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne + NUM_ENTERPRISE_NETWORKS; 1823c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne private static final int NUM_HIDDEN_NETWORKS = NUM_OPEN_NETWORKS; 1833c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne private static final int NUM_PASSPOINT_NETWORKS = NUM_ENTERPRISE_NETWORKS; 1843c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne private static final int NUM_NETWORKS_ADDED_BY_USER = 1; 1853c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne private static final int NUM_NETWORKS_ADDED_BY_APPS = NUM_SAVED_NETWORKS 1863c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne - NUM_NETWORKS_ADDED_BY_USER; 1871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final boolean TEST_VAL_IS_LOCATION_ENABLED = true; 1881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final boolean IS_SCANNING_ALWAYS_ENABLED = true; 1891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final int NUM_EMPTY_SCAN_RESULTS = 19; 1901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final int NUM_NON_EMPTY_SCAN_RESULTS = 23; 191c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int NUM_SCAN_UNKNOWN = 1; 192c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int NUM_SCAN_SUCCESS = 2; 193c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int NUM_SCAN_FAILURE_INTERRUPTED = 3; 194c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int NUM_SCAN_FAILURE_INVALID_CONFIGURATION = 5; 195c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int NUM_WIFI_UNKNOWN_SCREEN_OFF = 3; 196c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int NUM_WIFI_UNKNOWN_SCREEN_ON = 5; 197c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int NUM_WIFI_ASSOCIATED_SCREEN_OFF = 7; 198c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int NUM_WIFI_ASSOCIATED_SCREEN_ON = 11; 199ce003b812aead64dcb36647180991150021b24c1Glen Kuhne private static final int NUM_CONNECTIVITY_WATCHDOG_PNO_GOOD = 11; 200ce003b812aead64dcb36647180991150021b24c1Glen Kuhne private static final int NUM_CONNECTIVITY_WATCHDOG_PNO_BAD = 12; 201ce003b812aead64dcb36647180991150021b24c1Glen Kuhne private static final int NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_GOOD = 13; 202ce003b812aead64dcb36647180991150021b24c1Glen Kuhne private static final int NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_BAD = 14; 2035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS = 1; 2045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_BAD_ASSOCIATION_NETWORKS_TOTAL = 2; 2055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_BAD_AUTHENTICATION_NETWORKS_TOTAL = 3; 2065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_BAD_DHCP_NETWORKS_TOTAL = 4; 2075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_BAD_OTHER_NETWORKS_TOTAL = 5; 2085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_AVAILABLE_NETWORKS_TOTAL = 6; 2095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_ASSOCIATION = 7; 2105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_AUTHENTICATION = 8; 2115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_DHCP = 9; 2125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_OTHER = 10; 213da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne private static final int NUM_LAST_RESORT_WATCHDOG_SUCCESSES = 5; 2147a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int NUM_RSSI_LEVELS_TO_INCREMENT = 20; 2157a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int FIRST_RSSI_LEVEL = -80; 21659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private static final int NUM_OPEN_NETWORK_SCAN_RESULTS = 1; 21759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private static final int NUM_PERSONAL_NETWORK_SCAN_RESULTS = 4; 21859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private static final int NUM_ENTERPRISE_NETWORK_SCAN_RESULTS = 3; 21959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private static final int NUM_HIDDEN_NETWORK_SCAN_RESULTS = 1; 22059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private static final int NUM_HOTSPOT2_R1_NETWORK_SCAN_RESULTS = 1; 22159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private static final int NUM_HOTSPOT2_R2_NETWORK_SCAN_RESULTS = 2; 22259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private static final int NUM_SCANS = 5; 22359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private static final int NUM_TOTAL_SCAN_RESULTS = 8; 22422fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao private static final int MIN_RSSI_LEVEL = -127; 22522fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao private static final int MAX_RSSI_LEVEL = 0; 22622fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao private static final int WIFI_SCORE_RANGE_MIN = 0; 22722fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao private static final int NUM_WIFI_SCORES_TO_INCREMENT = 20; 22822fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao private static final int WIFI_SCORE_RANGE_MAX = 60; 22922fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao private static final int NUM_OUT_OF_BOUND_ENTRIES = 10; 23044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein private static final int MAX_NUM_SOFTAP_RETURN_CODES = 3; 23144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein private static final int NUM_SOFTAP_START_SUCCESS = 3; 23244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein private static final int NUM_SOFTAP_FAILED_GENERAL_ERROR = 2; 23344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein private static final int NUM_SOFTAP_FAILED_NO_CHANNEL = 1; 2342a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius private static final int NUM_HAL_CRASHES = 11; 2352a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius private static final int NUM_WIFICOND_CRASHES = 12; 2362a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius private static final int NUM_WIFI_ON_FAILURE_DUE_TO_HAL = 13; 2372a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius private static final int NUM_WIFI_ON_FAILURE_DUE_TO_WIFICOND = 14; 23859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 23959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private ScanDetail buildMockScanDetail(boolean hidden, NetworkDetail.HSRelease hSRelease, 24059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne String capabilities) { 24159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne ScanDetail mockScanDetail = mock(ScanDetail.class); 24259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne NetworkDetail mockNetworkDetail = mock(NetworkDetail.class); 24359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne ScanResult mockScanResult = mock(ScanResult.class); 24459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne when(mockScanDetail.getNetworkDetail()).thenReturn(mockNetworkDetail); 24559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne when(mockScanDetail.getScanResult()).thenReturn(mockScanResult); 24659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne when(mockNetworkDetail.isHiddenBeaconFrame()).thenReturn(hidden); 24759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne when(mockNetworkDetail.getHSRelease()).thenReturn(hSRelease); 24859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mockScanResult.capabilities = capabilities; 24959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne return mockScanDetail; 25059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 25159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 25259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne private List<ScanDetail> buildMockScanDetailList() { 25359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne List<ScanDetail> mockScanDetails = new ArrayList<ScanDetail>(); 25459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mockScanDetails.add(buildMockScanDetail(true, null, "[ESS]")); 25559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mockScanDetails.add(buildMockScanDetail(false, null, "[WPA2-PSK-CCMP][ESS]")); 25659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mockScanDetails.add(buildMockScanDetail(false, null, "[WPA-PSK-CCMP]")); 25759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mockScanDetails.add(buildMockScanDetail(false, null, "[WPA-PSK-CCMP]")); 25859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mockScanDetails.add(buildMockScanDetail(false, null, "[WEP]")); 25959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mockScanDetails.add(buildMockScanDetail(false, NetworkDetail.HSRelease.R2, 26059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne "[WPA-EAP-CCMP]")); 26159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mockScanDetails.add(buildMockScanDetail(false, NetworkDetail.HSRelease.R2, 26259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne "[WPA2-EAP+FT/EAP-CCMP]")); 26359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mockScanDetails.add(buildMockScanDetail(false, NetworkDetail.HSRelease.R1, 26459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne "[WPA-EAP-CCMP]")); 26559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne return mockScanDetails; 26659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 26759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 2683c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne private List<WifiConfiguration> buildSavedNetworkList() { 2693c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne List<WifiConfiguration> testSavedNetworks = new ArrayList<WifiConfiguration>(); 2703c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne for (int i = 0; i < NUM_OPEN_NETWORKS; i++) { 2713c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne testSavedNetworks.add(WifiConfigurationTestUtil.createOpenHiddenNetwork()); 2723c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 2733c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne for (int i = 0; i < NUM_PERSONAL_NETWORKS; i++) { 2743c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne testSavedNetworks.add(WifiConfigurationTestUtil.createPskNetwork()); 2753c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 2763c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne for (int i = 0; i < NUM_ENTERPRISE_NETWORKS; i++) { 2773c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne // Passpoint networks are counted in both Passpoint and Enterprise counters 2783c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne testSavedNetworks.add(WifiConfigurationTestUtil.createPasspointNetwork()); 2793c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 2803c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne testSavedNetworks.get(0).selfAdded = true; 2813c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne return testSavedNetworks; 2823c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 2833c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne 2841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 2851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Set simple metrics, increment others 2861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 2871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void setAndIncrementMetrics() throws Exception { 2883c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiMetrics.updateSavedNetworks(buildSavedNetworkList()); 2891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiMetrics.setIsLocationEnabled(TEST_VAL_IS_LOCATION_ENABLED); 2901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiMetrics.setIsScanningAlwaysEnabled(IS_SCANNING_ALWAYS_ENABLED); 2911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 2921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (int i = 0; i < NUM_EMPTY_SCAN_RESULTS; i++) { 2931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiMetrics.incrementEmptyScanResultCount(); 2941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (int i = 0; i < NUM_NON_EMPTY_SCAN_RESULTS; i++) { 2961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiMetrics.incrementNonEmptyScanResultCount(); 2971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 298c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiMetrics.incrementScanReturnEntry(WifiMetricsProto.WifiLog.SCAN_UNKNOWN, 299c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_SCAN_UNKNOWN); 300c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiMetrics.incrementScanReturnEntry(WifiMetricsProto.WifiLog.SCAN_SUCCESS, 301c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_SCAN_SUCCESS); 302c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiMetrics.incrementScanReturnEntry( 303c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED, 304c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_SCAN_FAILURE_INTERRUPTED); 305c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiMetrics.incrementScanReturnEntry( 306c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION, 307c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_SCAN_FAILURE_INVALID_CONFIGURATION); 308c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < NUM_WIFI_UNKNOWN_SCREEN_OFF; i++) { 3091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiMetrics.incrementWifiSystemScanStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, 3101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne false); 311c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 312c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < NUM_WIFI_UNKNOWN_SCREEN_ON; i++) { 3131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiMetrics.incrementWifiSystemScanStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, 3141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne true); 315c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 316c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < NUM_WIFI_ASSOCIATED_SCREEN_OFF; i++) { 3171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiMetrics.incrementWifiSystemScanStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, 3181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne false); 319c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 320c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < NUM_WIFI_ASSOCIATED_SCREEN_ON; i++) { 3211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiMetrics.incrementWifiSystemScanStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, 3221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne true); 3231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 324ce003b812aead64dcb36647180991150021b24c1Glen Kuhne for (int i = 0; i < NUM_CONNECTIVITY_WATCHDOG_PNO_GOOD; i++) { 325ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiMetrics.incrementNumConnectivityWatchdogPnoGood(); 326ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 327ce003b812aead64dcb36647180991150021b24c1Glen Kuhne for (int i = 0; i < NUM_CONNECTIVITY_WATCHDOG_PNO_BAD; i++) { 328ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiMetrics.incrementNumConnectivityWatchdogPnoBad(); 329ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 330ce003b812aead64dcb36647180991150021b24c1Glen Kuhne for (int i = 0; i < NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_GOOD; i++) { 331ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiMetrics.incrementNumConnectivityWatchdogBackgroundGood(); 332ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 333ce003b812aead64dcb36647180991150021b24c1Glen Kuhne for (int i = 0; i < NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_BAD; i++) { 334ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiMetrics.incrementNumConnectivityWatchdogBackgroundBad(); 335ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 3365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS; i++) { 3375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.incrementNumLastResortWatchdogTriggers(); 3385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 3395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.addCountToNumLastResortWatchdogBadAssociationNetworksTotal( 3405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne NUM_LAST_RESORT_WATCHDOG_BAD_ASSOCIATION_NETWORKS_TOTAL); 3415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal( 3425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne NUM_LAST_RESORT_WATCHDOG_BAD_AUTHENTICATION_NETWORKS_TOTAL); 3435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.addCountToNumLastResortWatchdogBadDhcpNetworksTotal( 3445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne NUM_LAST_RESORT_WATCHDOG_BAD_DHCP_NETWORKS_TOTAL); 3455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.addCountToNumLastResortWatchdogBadOtherNetworksTotal( 3465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne NUM_LAST_RESORT_WATCHDOG_BAD_OTHER_NETWORKS_TOTAL); 3475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.addCountToNumLastResortWatchdogAvailableNetworksTotal( 3485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne NUM_LAST_RESORT_WATCHDOG_AVAILABLE_NETWORKS_TOTAL); 3495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_ASSOCIATION; i++) { 3505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.incrementNumLastResortWatchdogTriggersWithBadAssociation(); 3515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 3525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_AUTHENTICATION; i++) { 3535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.incrementNumLastResortWatchdogTriggersWithBadAuthentication(); 3545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 3555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_DHCP; i++) { 3565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.incrementNumLastResortWatchdogTriggersWithBadDhcp(); 3575f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 3585f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_OTHER; i++) { 3595f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiMetrics.incrementNumLastResortWatchdogTriggersWithBadOther(); 3605f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 361da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_SUCCESSES; i++) { 362da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne mWifiMetrics.incrementNumLastResortWatchdogSuccesses(); 363da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne } 3647a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = 0; i < NUM_RSSI_LEVELS_TO_INCREMENT; i++) { 3657a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int j = 0; j <= i; j++) { 36622fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao mWifiMetrics.incrementRssiPollRssiCount(MIN_RSSI_LEVEL + i); 3677a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 3687a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 36922fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao for (int i = 1; i < NUM_OUT_OF_BOUND_ENTRIES; i++) { 37022fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao mWifiMetrics.incrementRssiPollRssiCount(MIN_RSSI_LEVEL - i); 37122fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao } 37222fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao for (int i = 1; i < NUM_OUT_OF_BOUND_ENTRIES; i++) { 37322fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao mWifiMetrics.incrementRssiPollRssiCount(MAX_RSSI_LEVEL + i); 37422fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao } 375f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal // Test alert-reason clamping. 376f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(WifiLoggerHal.WIFI_ALERT_REASON_MIN - 1); 377f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(WifiLoggerHal.WIFI_ALERT_REASON_MAX + 1); 378f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal // Simple cases for alert reason. 379f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(1); 380f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(1); 381f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(1); 382f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.incrementAlertReasonCount(2); 38359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne List<ScanDetail> mockScanDetails = buildMockScanDetailList(); 38459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne for (int i = 0; i < NUM_SCANS; i++) { 38559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiMetrics.countScanResults(mockScanDetails); 38659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 38722fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao for (int score = WIFI_SCORE_RANGE_MIN; score < NUM_WIFI_SCORES_TO_INCREMENT; score++) { 38822fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao for (int offset = 0; offset <= score; offset++) { 38922fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao mWifiMetrics.incrementWifiScoreCount(WIFI_SCORE_RANGE_MIN + score); 39022fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao } 39122fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao } 39222fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao for (int i = 1; i < NUM_OUT_OF_BOUND_ENTRIES; i++) { 39322fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao mWifiMetrics.incrementWifiScoreCount(WIFI_SCORE_RANGE_MIN - i); 39422fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao } 39522fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao for (int i = 1; i < NUM_OUT_OF_BOUND_ENTRIES; i++) { 39622fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao mWifiMetrics.incrementWifiScoreCount(WIFI_SCORE_RANGE_MAX + i); 39722fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao } 39844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 39944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // increment soft ap start return codes 40044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein for (int i = 0; i < NUM_SOFTAP_START_SUCCESS; i++) { 40144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiMetrics.incrementSoftApStartResult(true, 0); 40244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 40344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein for (int i = 0; i < NUM_SOFTAP_FAILED_GENERAL_ERROR; i++) { 40444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiMetrics.incrementSoftApStartResult(false, WifiManager.SAP_START_FAILURE_GENERAL); 40544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 40644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein for (int i = 0; i < NUM_SOFTAP_FAILED_NO_CHANNEL; i++) { 40744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiMetrics.incrementSoftApStartResult(false, 40844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiManager.SAP_START_FAILURE_NO_CHANNEL); 40944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 4102a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius for (int i = 0; i < NUM_HAL_CRASHES; i++) { 4112a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius mWifiMetrics.incrementNumHalCrashes(); 4122a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius } 4132a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius for (int i = 0; i < NUM_WIFICOND_CRASHES; i++) { 4142a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius mWifiMetrics.incrementNumWificondCrashes(); 4152a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius } 4162a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius for (int i = 0; i < NUM_WIFI_ON_FAILURE_DUE_TO_HAL; i++) { 4172a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius mWifiMetrics.incrementNumWifiOnFailureDueToHal(); 4182a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius } 4192a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius for (int i = 0; i < NUM_WIFI_ON_FAILURE_DUE_TO_WIFICOND; i++) { 4202a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius mWifiMetrics.incrementNumWifiOnFailureDueToWificond(); 4212a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius } 4221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 4241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 4251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Assert that values in deserializedWifiMetrics match those set in 'setAndIncrementMetrics' 4261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 4271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void assertDeserializedMetricsCorrect() throws Exception { 4281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.numSavedNetworks == NUM_SAVED_NETWORKS", 4291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mDeserializedWifiMetrics.numSavedNetworks, NUM_SAVED_NETWORKS); 4301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.numOpenNetworks == NUM_OPEN_NETWORKS", 4311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mDeserializedWifiMetrics.numOpenNetworks, NUM_OPEN_NETWORKS); 4321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.numPersonalNetworks == NUM_PERSONAL_NETWORKS", 4331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mDeserializedWifiMetrics.numPersonalNetworks, NUM_PERSONAL_NETWORKS); 4341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.numEnterpriseNetworks " 4351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + "== NUM_ENTERPRISE_NETWORKS", 4361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mDeserializedWifiMetrics.numEnterpriseNetworks, NUM_ENTERPRISE_NETWORKS); 4371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.numNetworksAddedByUser " 4383c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne + "== NUM_NETWORKS_ADDED_BY_USER", 4393c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mDeserializedWifiMetrics.numNetworksAddedByUser, NUM_NETWORKS_ADDED_BY_USER); 44059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_HIDDEN_NETWORKS, mDeserializedWifiMetrics.numHiddenNetworks); 44159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_PASSPOINT_NETWORKS, mDeserializedWifiMetrics.numPasspointNetworks); 4421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.numNetworksAddedByApps " 4433c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne + "== NUM_NETWORKS_ADDED_BY_APPS", 4443c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mDeserializedWifiMetrics.numNetworksAddedByApps, NUM_NETWORKS_ADDED_BY_APPS); 4451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.isLocationEnabled == TEST_VAL_IS_LOCATION_ENABLED", 4461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mDeserializedWifiMetrics.isLocationEnabled, TEST_VAL_IS_LOCATION_ENABLED); 4471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.isScanningAlwaysEnabled " 4481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + "== IS_SCANNING_ALWAYS_ENABLED", 4491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mDeserializedWifiMetrics.isScanningAlwaysEnabled, IS_SCANNING_ALWAYS_ENABLED); 4501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.numEmptyScanResults == NUM_EMPTY_SCAN_RESULTS", 4511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mDeserializedWifiMetrics.numEmptyScanResults, NUM_EMPTY_SCAN_RESULTS); 4521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertEquals("mDeserializedWifiMetrics.numNonEmptyScanResults == " 4531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + "NUM_NON_EMPTY_SCAN_RESULTS", 4541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mDeserializedWifiMetrics.numNonEmptyScanResults, NUM_NON_EMPTY_SCAN_RESULTS); 455c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertScanReturnEntryEquals(WifiMetricsProto.WifiLog.SCAN_UNKNOWN, 456c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_SCAN_UNKNOWN); 457c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertScanReturnEntryEquals(WifiMetricsProto.WifiLog.SCAN_SUCCESS, 458c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_SCAN_SUCCESS); 459c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertScanReturnEntryEquals(WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED, 460c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_SCAN_FAILURE_INTERRUPTED); 461c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertScanReturnEntryEquals(WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION, 462c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_SCAN_FAILURE_INVALID_CONFIGURATION); 463c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertSystemStateEntryEquals(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false, 464c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_WIFI_UNKNOWN_SCREEN_OFF); 465c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertSystemStateEntryEquals(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true, 466c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_WIFI_UNKNOWN_SCREEN_ON); 467c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertSystemStateEntryEquals( 468c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false, NUM_WIFI_ASSOCIATED_SCREEN_OFF); 469c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertSystemStateEntryEquals(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true, 470c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne NUM_WIFI_ASSOCIATED_SCREEN_ON); 471ce003b812aead64dcb36647180991150021b24c1Glen Kuhne assertEquals(mDeserializedWifiMetrics.numConnectivityWatchdogPnoGood, 472ce003b812aead64dcb36647180991150021b24c1Glen Kuhne NUM_CONNECTIVITY_WATCHDOG_PNO_GOOD); 473ce003b812aead64dcb36647180991150021b24c1Glen Kuhne assertEquals(mDeserializedWifiMetrics.numConnectivityWatchdogPnoBad, 474ce003b812aead64dcb36647180991150021b24c1Glen Kuhne NUM_CONNECTIVITY_WATCHDOG_PNO_BAD); 475ce003b812aead64dcb36647180991150021b24c1Glen Kuhne assertEquals(mDeserializedWifiMetrics.numConnectivityWatchdogBackgroundGood, 476ce003b812aead64dcb36647180991150021b24c1Glen Kuhne NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_GOOD); 477ce003b812aead64dcb36647180991150021b24c1Glen Kuhne assertEquals(mDeserializedWifiMetrics.numConnectivityWatchdogBackgroundBad, 478ce003b812aead64dcb36647180991150021b24c1Glen Kuhne NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_BAD); 4795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS, 4805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogTriggers); 4815f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_BAD_ASSOCIATION_NETWORKS_TOTAL, 4825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogBadAssociationNetworksTotal); 4835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_BAD_AUTHENTICATION_NETWORKS_TOTAL, 4845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogBadAuthenticationNetworksTotal); 4855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_BAD_DHCP_NETWORKS_TOTAL, 4865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogBadDhcpNetworksTotal); 4875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_BAD_OTHER_NETWORKS_TOTAL, 4885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogBadOtherNetworksTotal); 4895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_AVAILABLE_NETWORKS_TOTAL, 4905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogAvailableNetworksTotal); 4915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_ASSOCIATION, 4925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogTriggersWithBadAssociation); 4935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_AUTHENTICATION, 4945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogTriggersWithBadAuthentication); 4955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_DHCP, 4965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogTriggersWithBadDhcp); 4975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_OTHER, 4985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogTriggersWithBadOther); 499da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne assertEquals(NUM_LAST_RESORT_WATCHDOG_SUCCESSES, 500da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne mDeserializedWifiMetrics.numLastResortWatchdogSuccesses); 501107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne assertEquals(TEST_RECORD_DURATION_SEC, 502107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mDeserializedWifiMetrics.recordDurationSec); 5037a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = 0; i < NUM_RSSI_LEVELS_TO_INCREMENT; i++) { 50422fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao assertEquals(MIN_RSSI_LEVEL + i, mDeserializedWifiMetrics.rssiPollRssiCount[i].rssi); 5057a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne assertEquals(i + 1, mDeserializedWifiMetrics.rssiPollRssiCount[i].count); 5067a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 50722fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao StringBuilder sb_rssi = new StringBuilder(); 50822fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao sb_rssi.append("Number of RSSIs = " + mDeserializedWifiMetrics.rssiPollRssiCount.length); 50922fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao assertTrue(sb_rssi.toString(), (mDeserializedWifiMetrics.rssiPollRssiCount.length 51022fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao <= (MAX_RSSI_LEVEL - MIN_RSSI_LEVEL + 1))); 511f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertEquals(2, mDeserializedWifiMetrics.alertReasonCount[0].count); // Clamped reasons. 512f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertEquals(3, mDeserializedWifiMetrics.alertReasonCount[1].count); 513f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertEquals(1, mDeserializedWifiMetrics.alertReasonCount[2].count); 514f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertEquals(3, mDeserializedWifiMetrics.alertReasonCount.length); 51559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_TOTAL_SCAN_RESULTS * NUM_SCANS, 51659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mDeserializedWifiMetrics.numTotalScanResults); 51759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_OPEN_NETWORK_SCAN_RESULTS * NUM_SCANS, 51859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mDeserializedWifiMetrics.numOpenNetworkScanResults); 51959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_PERSONAL_NETWORK_SCAN_RESULTS * NUM_SCANS, 52059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mDeserializedWifiMetrics.numPersonalNetworkScanResults); 52159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_ENTERPRISE_NETWORK_SCAN_RESULTS * NUM_SCANS, 52259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mDeserializedWifiMetrics.numEnterpriseNetworkScanResults); 52359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_HIDDEN_NETWORK_SCAN_RESULTS * NUM_SCANS, 52459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mDeserializedWifiMetrics.numHiddenNetworkScanResults); 52559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_HOTSPOT2_R1_NETWORK_SCAN_RESULTS * NUM_SCANS, 52659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mDeserializedWifiMetrics.numHotspot2R1NetworkScanResults); 52759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_HOTSPOT2_R2_NETWORK_SCAN_RESULTS * NUM_SCANS, 52859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mDeserializedWifiMetrics.numHotspot2R2NetworkScanResults); 52959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne assertEquals(NUM_SCANS, 53059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mDeserializedWifiMetrics.numScans); 53122fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao for (int score_index = 0; score_index < NUM_WIFI_SCORES_TO_INCREMENT; score_index++) { 53222fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao assertEquals(WIFI_SCORE_RANGE_MIN + score_index, 53322fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao mDeserializedWifiMetrics.wifiScoreCount[score_index].score); 53422fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao assertEquals(score_index + 1, 53522fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao mDeserializedWifiMetrics.wifiScoreCount[score_index].count); 53622fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao } 53722fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao StringBuilder sb_wifi_score = new StringBuilder(); 53822fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao sb_wifi_score.append("Number of wifi_scores = " 53922fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao + mDeserializedWifiMetrics.wifiScoreCount.length); 54022fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao assertTrue(sb_wifi_score.toString(), (mDeserializedWifiMetrics.wifiScoreCount.length 54122fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao <= (WIFI_SCORE_RANGE_MAX - WIFI_SCORE_RANGE_MIN + 1))); 54222fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao StringBuilder sb_wifi_limits = new StringBuilder(); 54322fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao sb_wifi_limits.append("Wifi Score limit is " + NetworkAgent.WIFI_BASE_SCORE 54422fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao + ">= " + WIFI_SCORE_RANGE_MAX); 54522fcd83c560e45deaadb22795dd2683ebd923914Sohani Rao assertTrue(sb_wifi_limits.toString(), NetworkAgent.WIFI_BASE_SCORE <= WIFI_SCORE_RANGE_MAX); 54644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein assertEquals(MAX_NUM_SOFTAP_RETURN_CODES, mDeserializedWifiMetrics.softApReturnCode.length); 54744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein assertEquals(WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY, 54844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mDeserializedWifiMetrics.softApReturnCode[0].startResult); 54944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein assertEquals(NUM_SOFTAP_START_SUCCESS, mDeserializedWifiMetrics.softApReturnCode[0].count); 55044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein assertEquals(WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR, 55144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mDeserializedWifiMetrics.softApReturnCode[1].startResult); 55244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein assertEquals(NUM_SOFTAP_FAILED_GENERAL_ERROR, 55344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mDeserializedWifiMetrics.softApReturnCode[1].count); 55444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein assertEquals(WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL, 55544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mDeserializedWifiMetrics.softApReturnCode[2].startResult); 55644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein assertEquals(NUM_SOFTAP_FAILED_NO_CHANNEL, 55744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mDeserializedWifiMetrics.softApReturnCode[2].count); 5582a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius assertEquals(NUM_HAL_CRASHES, mDeserializedWifiMetrics.numHalCrashes); 5592a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius assertEquals(NUM_WIFICOND_CRASHES, mDeserializedWifiMetrics.numWificondCrashes); 5602a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius assertEquals(NUM_WIFI_ON_FAILURE_DUE_TO_HAL, 5612a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius mDeserializedWifiMetrics.numWifiOnFailureDueToHal); 5622a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius assertEquals(NUM_WIFI_ON_FAILURE_DUE_TO_WIFICOND, 5632a0ad34fff0956b85afa702617a3322ca85c3dcaRoshan Pius mDeserializedWifiMetrics.numWifiOnFailureDueToWificond); 5641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 567c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Assert deserialized metrics Scan Return Entry equals count 568c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 569c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void assertScanReturnEntryEquals(int returnCode, int count) { 570c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mDeserializedWifiMetrics.scanReturnEntries.length; i++) { 571c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (mDeserializedWifiMetrics.scanReturnEntries[i].scanReturnCode == returnCode) { 572c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertEquals(mDeserializedWifiMetrics.scanReturnEntries[i].scanResultsCount, count); 573c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return; 574c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 575c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 576c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertEquals(null, count); 577c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 578c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 579c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 580c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Assert deserialized metrics SystemState entry equals count 581c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 582c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void assertSystemStateEntryEquals(int state, boolean screenOn, int count) { 583c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mDeserializedWifiMetrics.wifiSystemStateEntries.length; i++) { 584c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (mDeserializedWifiMetrics.wifiSystemStateEntries[i].wifiState == state 585c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne && mDeserializedWifiMetrics.wifiSystemStateEntries[i].isScreenOn == screenOn) { 586c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertEquals(mDeserializedWifiMetrics.wifiSystemStateEntries[i].wifiStateCount, 587c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne count); 588c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return; 589c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 590c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 591c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne assertEquals(null, count); 592c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 593c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 5941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Combination of all other WifiMetrics unit tests, an internal-integration test, or functional 5951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * test 5961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 5971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne @Test 5981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void setMetricsSerializeDeserializeAssertMetricsSame() throws Exception { 5991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne setAndIncrementMetrics(); 6001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne startAndEndConnectionEventSucceeds(); 601107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne dumpProtoAndDeserialize(); 6021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne assertDeserializedMetricsCorrect(); 6032532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne assertEquals("mDeserializedWifiMetrics.connectionEvent.length", 604107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne 2, mDeserializedWifiMetrics.connectionEvent.length); 6051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //<TODO> test individual connectionEvents for correctness, 6061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne // check scanReturnEntries & wifiSystemStateEntries counts and individual elements 6071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne // pending their implementation</TODO> 6081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 609f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 610f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne private static final String SSID = "red"; 611f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne private static final int CONFIG_DTIM = 3; 612f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne private static final int NETWORK_DETAIL_WIFIMODE = 5; 613f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne private static final int NETWORK_DETAIL_DTIM = 7; 614f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne private static final int SCAN_RESULT_LEVEL = -30; 615f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne /** 616f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne * Test that WifiMetrics is correctly getting data from ScanDetail and WifiConfiguration 617f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne */ 618f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne @Test 619f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne public void testScanDetailAndWifiConfigurationUsage() throws Exception { 620f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Setup mock configs and scan details 621f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne NetworkDetail networkDetail = mock(NetworkDetail.class); 622f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne when(networkDetail.getWifiMode()).thenReturn(NETWORK_DETAIL_WIFIMODE); 623f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne when(networkDetail.getSSID()).thenReturn(SSID); 624f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne when(networkDetail.getDtimInterval()).thenReturn(NETWORK_DETAIL_DTIM); 625f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne ScanResult scanResult = mock(ScanResult.class); 626f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne scanResult.level = SCAN_RESULT_LEVEL; 627f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiConfiguration config = mock(WifiConfiguration.class); 628f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne config.SSID = "\"" + SSID + "\""; 629f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne config.dtimInterval = CONFIG_DTIM; 630f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiConfiguration.NetworkSelectionStatus networkSelectionStat = 631f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mock(WifiConfiguration.NetworkSelectionStatus.class); 632f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne when(networkSelectionStat.getCandidate()).thenReturn(scanResult); 633f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne when(config.getNetworkSelectionStatus()).thenReturn(networkSelectionStat); 634f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne ScanDetail scanDetail = mock(ScanDetail.class); 635f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne when(scanDetail.getNetworkDetail()).thenReturn(networkDetail); 636f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne when(scanDetail.getScanResult()).thenReturn(scanResult); 637f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 638f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Create a connection event using only the config 63996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(config, "Red", 64096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_NONE); 641f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.endConnectionEvent( 64296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_NONE, 643f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 644f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 645f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Create a connection event using the config and a scan detail 64696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(config, "Green", 64796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_NONE); 648f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.setConnectionScanDetail(scanDetail); 649f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.endConnectionEvent( 65096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_NONE, 651f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 652f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 653f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Dump proto from mWifiMetrics and deserialize it to mDeserializedWifiMetrics 654f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne dumpProtoAndDeserialize(); 655f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 656f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Check that the correct values are being flowed through 657f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne assertEquals(mDeserializedWifiMetrics.connectionEvent.length, 2); 658f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne assertEquals(mDeserializedWifiMetrics.connectionEvent[0].routerFingerprint.dtim, 659f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne CONFIG_DTIM); 660f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne assertEquals(mDeserializedWifiMetrics.connectionEvent[0].signalStrength, SCAN_RESULT_LEVEL); 661f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne assertEquals(mDeserializedWifiMetrics.connectionEvent[1].routerFingerprint.dtim, 662f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne NETWORK_DETAIL_DTIM); 663f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne assertEquals(mDeserializedWifiMetrics.connectionEvent[1].signalStrength, 664f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne SCAN_RESULT_LEVEL); 665f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne assertEquals(mDeserializedWifiMetrics.connectionEvent[1].routerFingerprint.routerTechnology, 666f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne NETWORK_DETAIL_WIFIMODE); 667f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 668f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 669f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne /** 670f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne * Test that WifiMetrics is being cleared after dumping via proto 671f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne */ 672f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne @Test 673f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne public void testMetricsClearedAfterProtoRequested() throws Exception { 674f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne // Create 3 ConnectionEvents 67596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(null, "RED", 676f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 677f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.endConnectionEvent( 67896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_NONE, 679f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 68096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(null, "YELLOW", 681f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 682f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.endConnectionEvent( 68396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_NONE, 684f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 68596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(null, "GREEN", 686f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 687f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.endConnectionEvent( 68896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_NONE, 689f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 69096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(null, "ORANGE", 691f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 692f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.endConnectionEvent( 69396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_NONE, 694f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 695f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 696f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Dump proto and deserialize 697f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //This should clear all the metrics in mWifiMetrics, 698f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne dumpProtoAndDeserialize(); 699f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Check there are only 3 connection events 700f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne assertEquals(mDeserializedWifiMetrics.connectionEvent.length, 4); 701f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertEquals(mDeserializedWifiMetrics.rssiPollRssiCount.length, 0); 702f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertEquals(mDeserializedWifiMetrics.alertReasonCount.length, 0); 703f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 704f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne // Create 2 ConnectionEvents 70596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(null, "BLUE", 706f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 707f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.endConnectionEvent( 70896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_NONE, 709f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 71096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mWifiMetrics.startConnectionEvent(null, "RED", 711f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 712f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne mWifiMetrics.endConnectionEvent( 71396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetrics.ConnectionEvent.FAILURE_NONE, 714f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 715f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 716f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Dump proto and deserialize 717f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne dumpProtoAndDeserialize(); 718f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne //Check there are only 2 connection events 719f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne assertEquals(mDeserializedWifiMetrics.connectionEvent.length, 2); 720f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 721f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 7229ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne /** 7239ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne * Tests that after setting metrics values they can be serialized and deserialized with the 7249ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne * $ adb shell dumpsys wifi wifiMetricsProto clean 7259ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne */ 7269ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne @Test 7279ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne public void testClearMetricsDump() throws Exception { 7289ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne setAndIncrementMetrics(); 7299ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne startAndEndConnectionEventSucceeds(); 7309ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne cleanDumpProtoAndDeserialize(); 7319ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne assertDeserializedMetricsCorrect(); 7329ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne assertEquals("mDeserializedWifiMetrics.connectionEvent.length", 7339ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne 2, mDeserializedWifiMetrics.connectionEvent.length); 7349ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne } 7359ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne 7365cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private static final int NUM_REPEATED_DELTAS = 7; 7375cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private static final int REPEATED_DELTA = 0; 7385cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private static final int SINGLE_GOOD_DELTA = 1; 7395cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private static final int SINGLE_TIMEOUT_DELTA = 2; 7405cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private static final int NUM_REPEATED_BOUND_DELTAS = 2; 7415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private static final int MAX_DELTA_LEVEL = 127; 7425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private static final int MIN_DELTA_LEVEL = -127; 7435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private static final int ARBITRARY_DELTA_LEVEL = 20; 7445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 7455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 7465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Sunny day RSSI delta logging scenario. 7475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Logs one rssi delta value multiple times 7485cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Logs a different delta value a single time 7495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 7505cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne @Test 7515cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public void testRssiDeltasSuccessfulLogging() throws Exception { 7525cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Generate some repeated deltas 7535cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne for (int i = 0; i < NUM_REPEATED_DELTAS; i++) { 7545cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, REPEATED_DELTA, 7555cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS); 7565cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 7575cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Generate a single delta 7585cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, SINGLE_GOOD_DELTA, 7595cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS); 7605cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne dumpProtoAndDeserialize(); 7615cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(2, mDeserializedWifiMetrics.rssiPollDeltaCount.length); 7625cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Check the repeated deltas 7635cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(NUM_REPEATED_DELTAS, mDeserializedWifiMetrics.rssiPollDeltaCount[0].count); 7645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(REPEATED_DELTA, mDeserializedWifiMetrics.rssiPollDeltaCount[0].rssi); 7655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Check the single delta 7665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(1, mDeserializedWifiMetrics.rssiPollDeltaCount[1].count); 7675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(SINGLE_GOOD_DELTA, mDeserializedWifiMetrics.rssiPollDeltaCount[1].rssi); 7685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 7695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 7705cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 7715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Tests that Rssi Delta events whose scanResult and Rssi Poll come too far apart, timeout, 7725cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * and are not logged. 7735cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 7745cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne @Test 7755cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public void testRssiDeltasTimeout() throws Exception { 7765cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Create timed out rssi deltas 7775cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, REPEATED_DELTA, 7785cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS + 1); 7795cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, SINGLE_TIMEOUT_DELTA, 7805cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS + 1); 7815cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne dumpProtoAndDeserialize(); 7825cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(0, mDeserializedWifiMetrics.rssiPollDeltaCount.length); 7835cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 7845cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 7855cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 7865cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Tests the exact inclusive boundaries of RSSI delta logging. 7875cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 7885cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne @Test 7895cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public void testRssiDeltaSuccessfulLoggingExactBounds() throws Exception { 7905cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, MAX_DELTA_LEVEL, 7915cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS); 7925cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MAX_RSSI_LEVEL, MIN_DELTA_LEVEL, 7935cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS); 7945cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne dumpProtoAndDeserialize(); 7955cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(2, mDeserializedWifiMetrics.rssiPollDeltaCount.length); 7965cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(MIN_DELTA_LEVEL, mDeserializedWifiMetrics.rssiPollDeltaCount[0].rssi); 7975cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(1, mDeserializedWifiMetrics.rssiPollDeltaCount[0].count); 7985cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(MAX_DELTA_LEVEL, mDeserializedWifiMetrics.rssiPollDeltaCount[1].rssi); 7995cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(1, mDeserializedWifiMetrics.rssiPollDeltaCount[1].count); 8005cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8015cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 8025cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 8035cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Tests the exact exclusive boundaries of RSSI delta logging. 8045cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * This test ensures that too much data is not generated. 8055cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 8065cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne @Test 8075cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public void testRssiDeltaOutOfBounds() throws Exception { 8085cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, MAX_DELTA_LEVEL + 1, 8095cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS); 8105cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MAX_RSSI_LEVEL, MIN_DELTA_LEVEL - 1, 8115cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS); 8125cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne dumpProtoAndDeserialize(); 8135cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(0, mDeserializedWifiMetrics.rssiPollDeltaCount.length); 8145cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8155cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 8165cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 8175cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * This test ensures no rssi Delta is logged after an unsuccessful ConnectionEvent 8185cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 8195cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne @Test 8205cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public void testUnsuccesfulConnectionEventRssiDeltaIsNotLogged() throws Exception { 8215cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, ARBITRARY_DELTA_LEVEL, 8225cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS, 8235cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne false, // successfulConnectionEvent 8245cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true, // completeConnectionEvent 8255cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true, // useValidScanResult 8265cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true // dontDeserializeBeforePoll 8275cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne ); 8285cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 8295cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne dumpProtoAndDeserialize(); 8305cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(0, mDeserializedWifiMetrics.rssiPollDeltaCount.length); 8315cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8325cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 8335cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 8345cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * This test ensures rssi Deltas can be logged during a ConnectionEvent 8355cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 8365cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne @Test 8375cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public void testIncompleteConnectionEventRssiDeltaIsLogged() throws Exception { 8385cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, ARBITRARY_DELTA_LEVEL, 8395cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS, 8405cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true, // successfulConnectionEvent 8415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne false, // completeConnectionEvent 8425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true, // useValidScanResult 8435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true // dontDeserializeBeforePoll 8445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne ); 8455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne dumpProtoAndDeserialize(); 8465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(1, mDeserializedWifiMetrics.rssiPollDeltaCount.length); 8475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(ARBITRARY_DELTA_LEVEL, mDeserializedWifiMetrics.rssiPollDeltaCount[0].rssi); 8485cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(1, mDeserializedWifiMetrics.rssiPollDeltaCount[0].count); 8495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8505cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 8515cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 8525cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * This test ensures that no delta is logged for a null ScanResult Candidate 8535cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 8545cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne @Test 8555cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public void testRssiDeltaNotLoggedForNullCandidateScanResult() throws Exception { 8565cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, ARBITRARY_DELTA_LEVEL, 8575cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS, 8585cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true, // successfulConnectionEvent 8595cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true, // completeConnectionEvent 8605cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne false, // useValidScanResult 8615cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true // dontDeserializeBeforePoll 8625cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne ); 8635cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne dumpProtoAndDeserialize(); 8645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(0, mDeserializedWifiMetrics.rssiPollDeltaCount.length); 8655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 8675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 8685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * This test ensures that Rssi Deltas are not logged over a 'clear()' call (Metrics Serialized) 8695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 8705cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne @Test 8715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public void testMetricsSerializedDuringRssiDeltaEventLogsNothing() throws Exception { 8725cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(MIN_RSSI_LEVEL, ARBITRARY_DELTA_LEVEL, 8735cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS, 8745cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true, // successfulConnectionEvent 8755cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true, // completeConnectionEvent 8765cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne true, // useValidScanResult 8775cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne false // dontDeserializeBeforePoll 8785cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne ); 8795cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne dumpProtoAndDeserialize(); 8805cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne assertEquals(0, mDeserializedWifiMetrics.rssiPollDeltaCount.length); 8815cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8825cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 88346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int DEAUTH_REASON = 7; 88446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int ASSOC_STATUS = 11; 88546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int ASSOC_TIMEOUT = 1; 88646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int LOCAL_GEN = 1; 88746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int AUTH_FAILURE_REASON = WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD; 88846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int NUM_TEST_STA_EVENTS = 14; 88946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final String sSSID = "\"SomeTestSsid\""; 89046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final WifiSsid sWifiSsid = WifiSsid.createFromAsciiEncoded(sSSID); 89146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final String sBSSID = "01:02:03:04:05:06"; 89246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 89346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private final StateChangeResult mStateDisconnected = 89446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne new StateChangeResult(0, sWifiSsid, sBSSID, SupplicantState.DISCONNECTED); 89546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private final StateChangeResult mStateCompleted = 89646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne new StateChangeResult(0, sWifiSsid, sBSSID, SupplicantState.COMPLETED); 89746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // Test bitmasks of supplicant state changes 89846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private final int mSupBm1 = WifiMetrics.supplicantStateToBit(mStateDisconnected.state); 89946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private final int mSupBm2 = WifiMetrics.supplicantStateToBit(mStateDisconnected.state) 90046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne | WifiMetrics.supplicantStateToBit(mStateCompleted.state); 90146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // An invalid but interesting wifiConfiguration that exercises the StaEvent.ConfigInfo encoding 90246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private final WifiConfiguration mTestWifiConfig = createComplexWifiConfig(); 90346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // <msg.what> <msg.arg1> <msg.arg2> 90446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int[][] mTestStaMessageInts = { 90546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {WifiMonitor.ASSOCIATION_REJECTION_EVENT, ASSOC_TIMEOUT, ASSOC_STATUS}, 90646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {WifiMonitor.AUTHENTICATION_FAILURE_EVENT, 0, AUTH_FAILURE_REASON}, 90746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {WifiMonitor.NETWORK_CONNECTION_EVENT, 0, 0}, 90846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {WifiMonitor.NETWORK_DISCONNECTION_EVENT, LOCAL_GEN, DEAUTH_REASON}, 90946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, 0, 0}, 91046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {WifiStateMachine.CMD_ASSOCIATED_BSSID, 0, 0}, 91146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {WifiStateMachine.CMD_TARGET_BSSID, 0, 0}, 91246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, 0, 0}, 91346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, 0, 0} 91446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne }; 91546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private Object[] mTestStaMessageObjs = { 91646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne null, 91746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne null, 91846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne null, 91946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne null, 92046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mStateDisconnected, 92146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne null, 92246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne null, 92346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mStateDisconnected, 92446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mStateCompleted 92546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne }; 92646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // Values used to generate the StaEvent log calls from WifiStateMachine 92746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // <StaEvent.Type>, <StaEvent.FrameworkDisconnectReason>, <1|0>(testWifiConfiguration, null) 92846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int[][] mTestStaLogInts = { 92946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL, 0, 0}, 93046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST, 0, 0}, 93146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_IP_REACHABILITY_LOST, 0, 0}, 93246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_START_CONNECT, 0, 1}, 93346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_START_ROAM, 0, 1}, 93446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CONNECT_NETWORK, 0, 1}, 93546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK, 0, 0}, 93646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_FRAMEWORK_DISCONNECT, StaEvent.DISCONNECT_API, 0} 93746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne }; 93846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // Values used to generate the StaEvent log calls from WifiMonitor 93946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // <type>, <reason>, <status>, <local_gen>, 94046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // <auth_fail_reason>, <assoc_timed_out> <supplicantStateChangeBitmask> <1|0>(has ConfigInfo) 94146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int[][] mExpectedValues = { 94246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT, -1, ASSOC_STATUS, 0, 94346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, ASSOC_TIMEOUT, 0, 0}, /**/ 94446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT, -1, -1, 0, 94546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/StaEvent.AUTH_FAILURE_WRONG_PSWD, 0, 0, 0}, /**/ 94646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_NETWORK_CONNECTION_EVENT, -1, -1, 0, 94746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 0}, /**/ 94846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT, DEAUTH_REASON, -1, LOCAL_GEN, 94946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 0}, /**/ 95046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_ASSOCIATED_BSSID, -1, -1, 0, 95146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, mSupBm1, 0}, /**/ 95246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_TARGET_BSSID, -1, -1, 0, 95346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 0}, /**/ 95446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL, -1, -1, 0, 95546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, mSupBm2, 0}, /**/ 95646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST, -1, -1, 0, 95746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 0}, /**/ 95846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_IP_REACHABILITY_LOST, -1, -1, 0, 95946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 0}, /**/ 96046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_START_CONNECT, -1, -1, 0, 96146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 1}, /**/ 96246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CMD_START_ROAM, -1, -1, 0, 96346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 1}, /**/ 96446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_CONNECT_NETWORK, -1, -1, 0, 96546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 1}, /**/ 96646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK, -1, -1, 0, 96746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 0}, /**/ 96846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne {StaEvent.TYPE_FRAMEWORK_DISCONNECT, -1, -1, 0, 96946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /**/ 0, 0, 0, 0} /**/ 97046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne }; 97146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 97246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 97346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Generates events from all the rows in mTestStaMessageInts, and then mTestStaLogInts 97446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 97546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private void generateStaEvents(WifiMetrics wifiMetrics) { 97646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne Handler handler = wifiMetrics.getHandler(); 97746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne for (int i = 0; i < mTestStaMessageInts.length; i++) { 97846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int[] mia = mTestStaMessageInts[i]; 97946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne handler.sendMessage( 98046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne handler.obtainMessage(mia[0], mia[1], mia[2], mTestStaMessageObjs[i])); 98146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 98246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mTestLooper.dispatchAll(); 98346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne for (int i = 0; i < mTestStaLogInts.length; i++) { 98446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int[] lia = mTestStaLogInts[i]; 98546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne wifiMetrics.logStaEvent(lia[0], lia[1], lia[2] == 1 ? mTestWifiConfig : null); 98646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 98746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 98846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private void verifyDeserializedStaEvents(WifiMetricsProto.WifiLog wifiLog) { 98946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(NUM_TEST_STA_EVENTS, wifiLog.staEventList.length); 99046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int j = 0; // De-serialized event index 99146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne for (int i = 0; i < mTestStaMessageInts.length; i++) { 99246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StaEvent event = wifiLog.staEventList[j]; 99346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int[] mia = mTestStaMessageInts[i]; 99446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int[] evs = mExpectedValues[j]; 99546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (mia[0] != WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT) { 99646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(evs[0], event.type); 99746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(evs[1], event.reason); 99846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(evs[2], event.status); 99946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(evs[3] == 1 ? true : false, event.localGen); 100046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(evs[4], event.authFailureReason); 100146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(evs[5] == 1 ? true : false, event.associationTimedOut); 100246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(evs[6], event.supplicantStateChangesBitmask); 100346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertConfigInfoEqualsWifiConfig( 100446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne evs[7] == 1 ? mTestWifiConfig : null, event.configInfo); 100546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne j++; 100646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 100746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 100846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 100946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 101046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 101146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Generate StaEvents of each type, ensure all the different values are logged correctly, 101246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * and that they survive serialization & de-serialization 101346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 101446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne @Test 101546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void testStaEventsLogSerializeDeserialize() throws Exception { 101646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne generateStaEvents(mWifiMetrics); 101746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne dumpProtoAndDeserialize(); 101846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne verifyDeserializedStaEvents(mDeserializedWifiMetrics); 101946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 102046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 102146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 102246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Ensure the number of StaEvents does not exceed MAX_STA_EVENTS by generating lots of events 102346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * and checking how many are deserialized 102446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 102546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne @Test 102646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void testStaEventBounding() throws Exception { 102746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne for (int i = 0; i < (WifiMetrics.MAX_STA_EVENTS + 10); i++) { 102846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mWifiMetrics.logStaEvent(StaEvent.TYPE_CMD_START_CONNECT); 102946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 103046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne dumpProtoAndDeserialize(); 103146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(WifiMetrics.MAX_STA_EVENTS, mDeserializedWifiMetrics.staEventList.length); 103246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 1033031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne 1034031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne /** 1035031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne * Ensure WifiMetrics doesn't cause a null pointer exception when called with null args 1036031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne */ 1037031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne @Test 1038031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne public void testDumpNullArg() { 1039031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne mWifiMetrics.dump(new FileDescriptor(), new PrintWriter(new StringWriter()), null); 1040031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne } 1041031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne 10425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 10435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Generate an RSSI delta event by creating a connection event and an RSSI poll within 10445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * 'interArrivalTime' milliseconds of each other. 10455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Event will not be logged if interArrivalTime > mWifiMetrics.TIMEOUT_RSSI_DELTA_MILLIS 10465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * successfulConnectionEvent, completeConnectionEvent, useValidScanResult and 10475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * dontDeserializeBeforePoll 10485cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * each create an anomalous condition when set to false. 10495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 10505cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private void generateRssiDelta(int scanRssi, int rssiDelta, 10515cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne long interArrivalTime, boolean successfulConnectionEvent, 10525cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne boolean completeConnectionEvent, boolean useValidScanResult, 10535cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne boolean dontDeserializeBeforePoll) throws Exception { 10545cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne when(mClock.getElapsedSinceBootMillis()).thenReturn((long) 0); 10555cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne ScanResult scanResult = null; 10565cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (useValidScanResult) { 10575cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne scanResult = mock(ScanResult.class); 10585cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne scanResult.level = scanRssi; 10595cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 10605cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiConfiguration config = mock(WifiConfiguration.class); 10615cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiConfiguration.NetworkSelectionStatus networkSelectionStat = 10625cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mock(WifiConfiguration.NetworkSelectionStatus.class); 10635cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne when(networkSelectionStat.getCandidate()).thenReturn(scanResult); 10645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne when(config.getNetworkSelectionStatus()).thenReturn(networkSelectionStat); 10655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mWifiMetrics.startConnectionEvent(config, "TestNetwork", 10665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE); 10675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (completeConnectionEvent) { 10685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (successfulConnectionEvent) { 10695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mWifiMetrics.endConnectionEvent( 10705cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.ConnectionEvent.FAILURE_NONE, 10715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 10725cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } else { 10735cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mWifiMetrics.endConnectionEvent( 10745cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetrics.ConnectionEvent.FAILURE_AUTHENTICATION_FAILURE, 10755cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 10765cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 10775cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 10785cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne when(mClock.getElapsedSinceBootMillis()).thenReturn(interArrivalTime); 10795cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (!dontDeserializeBeforePoll) { 10805cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne dumpProtoAndDeserialize(); 10815cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 10825cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mWifiMetrics.incrementRssiPollRssiCount(scanRssi + rssiDelta); 10835cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 10845cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 10855cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Generate an RSSI delta event, with all extra conditions set to true. 10865cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 10875cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private void generateRssiDelta(int scanRssi, int rssiDelta, 10885cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne long interArrivalTime) throws Exception { 10895cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne generateRssiDelta(scanRssi, rssiDelta, interArrivalTime, true, true, true, true); 10905cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 10915cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 1092f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private void assertStringContains( 1093f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal String actualString, String expectedSubstring) { 1094f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal assertTrue("Expected text not found in: " + actualString, 1095f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal actualString.contains(expectedSubstring)); 1096f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1097f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 1098f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private String getStateDump() { 1099f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal ByteArrayOutputStream stream = new ByteArrayOutputStream(); 1100f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal PrintWriter writer = new PrintWriter(stream); 1101f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal String[] args = new String[0]; 1102f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiMetrics.dump(null, writer, args); 1103f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal writer.flush(); 1104f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal return stream.toString(); 1105f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 110646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 110746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int TEST_ALLOWED_KEY_MANAGEMENT = 83; 110846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int TEST_ALLOWED_PROTOCOLS = 22; 110946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int TEST_ALLOWED_AUTH_ALGORITHMS = 11; 111046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int TEST_ALLOWED_PAIRWISE_CIPHERS = 67; 111146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int TEST_ALLOWED_GROUP_CIPHERS = 231; 111246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int TEST_CANDIDATE_LEVEL = -80; 111346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static final int TEST_CANDIDATE_FREQ = 2345; 111446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 111546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private WifiConfiguration createComplexWifiConfig() { 111646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne WifiConfiguration config = new WifiConfiguration(); 111746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne config.allowedKeyManagement = intToBitSet(TEST_ALLOWED_KEY_MANAGEMENT); 111846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne config.allowedProtocols = intToBitSet(TEST_ALLOWED_PROTOCOLS); 111946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne config.allowedAuthAlgorithms = intToBitSet(TEST_ALLOWED_AUTH_ALGORITHMS); 112046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne config.allowedPairwiseCiphers = intToBitSet(TEST_ALLOWED_PAIRWISE_CIPHERS); 112146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne config.allowedGroupCiphers = intToBitSet(TEST_ALLOWED_GROUP_CIPHERS); 112246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne config.hiddenSSID = true; 112346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne config.ephemeral = true; 112446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne config.getNetworkSelectionStatus().setHasEverConnected(true); 112546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne ScanResult candidate = new ScanResult(); 112646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne candidate.level = TEST_CANDIDATE_LEVEL; 112746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne candidate.frequency = TEST_CANDIDATE_FREQ; 112846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne config.getNetworkSelectionStatus().setCandidate(candidate); 112946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return config; 113046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 113146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 113246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private void assertConfigInfoEqualsWifiConfig(WifiConfiguration config, 113346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StaEvent.ConfigInfo info) { 113446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (config == null && info == null) return; 113546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.allowedKeyManagement, intToBitSet(info.allowedKeyManagement)); 113646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.allowedProtocols, intToBitSet(info.allowedProtocols)); 113746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.allowedAuthAlgorithms, intToBitSet(info.allowedAuthAlgorithms)); 113846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.allowedPairwiseCiphers, intToBitSet(info.allowedPairwiseCiphers)); 113946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.allowedGroupCiphers, intToBitSet(info.allowedGroupCiphers)); 114046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.hiddenSSID, info.hiddenSsid); 114146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.ephemeral, info.isEphemeral); 114246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.getNetworkSelectionStatus().getHasEverConnected(), 114346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.hasEverConnected); 114446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.getNetworkSelectionStatus().getCandidate().level, info.scanRssi); 114546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne assertEquals(config.getNetworkSelectionStatus().getCandidate().frequency, info.scanFreq); 114646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 114746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 114846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 114946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Sets the values of bitSet to match an int mask 115046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 115146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static BitSet intToBitSet(int mask) { 115246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne BitSet bitSet = new BitSet(); 115346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne for (int bitIndex = 0; mask > 0; mask >>>= 1, bitIndex++) { 115446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & 1) != 0) bitSet.set(bitIndex); 115546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 115646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return bitSet; 115746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 11581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne} 1159