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