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;
2049410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhneimport static org.mockito.Mockito.*;
211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
22f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport android.net.wifi.ScanResult;
23f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport android.net.wifi.WifiConfiguration;
2428345f81bf3f95e25946d398d594f39141c41442Mitchell Willsimport android.test.suitebuilder.annotation.SmallTest;
251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport android.util.Base64;
261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
27f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail;
28f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport org.junit.Before;
301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport org.junit.Test;
3149410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhneimport org.mockito.Mock;
3249410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhneimport org.mockito.MockitoAnnotations;
331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.ByteArrayOutputStream;
351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter;
361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.regex.Matcher;
371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.regex.Pattern;
381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/**
401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Unit tests for {@link com.android.server.wifi.WifiMetrics}.
411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */
4228345f81bf3f95e25946d398d594f39141c41442Mitchell Wills@SmallTest
431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetricsTest {
441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    WifiMetrics mWifiMetrics;
461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    WifiMetricsProto.WifiLog mDeserializedWifiMetrics;
4749410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne    @Mock Clock mClock;
48f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    @Before
501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void setUp() throws Exception {
5149410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne        MockitoAnnotations.initMocks(this);
521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mDeserializedWifiMetrics = null;
5349410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne        when(mClock.elapsedRealtime()).thenReturn((long) 0);
5449410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne        mWifiMetrics = new WifiMetrics(mClock);
551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Test that startConnectionEvent and endConnectionEvent can be called repeatedly and out of
592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne     * order. Only tests no exception occurs. Creates 3 ConnectionEvents.
601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    @Test
621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void startAndEndConnectionEventSucceeds() throws Exception {
631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        //Start and end Connection event
6496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(null, "RED",
651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
662532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        mWifiMetrics.endConnectionEvent(
6796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_AUTHENTICATION_FAILURE,
682532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_DHCP);
691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        //end Connection event without starting one
702532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        mWifiMetrics.endConnectionEvent(
7196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_AUTHENTICATION_FAILURE,
722532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_DHCP);
731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        //start two ConnectionEvents in a row
7496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(null, "BLUE",
751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
7696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(null, "GREEN",
771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
8049410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne    private static final long TEST_RECORD_DURATION_SEC = 12 * 60 * 60;
8149410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne    private static final long TEST_RECORD_DURATION_MILLIS = TEST_RECORD_DURATION_SEC * 1000;
8249410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne
831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
84f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * Simulate how dumpsys gets the proto from mWifiMetrics, filter the proto bytes out and
85f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * deserialize them into mDeserializedWifiMetrics
86f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     */
87f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void dumpProtoAndDeserialize() throws Exception {
88f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        ByteArrayOutputStream stream = new ByteArrayOutputStream();
89f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        PrintWriter writer = new PrintWriter(stream);
90f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        String[] args = new String[0];
9149410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne
9249410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne        when(mClock.elapsedRealtime()).thenReturn(TEST_RECORD_DURATION_MILLIS);
93f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Test proto dump, by passing in proto arg option
94f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        args = new String[]{WifiMetrics.PROTO_DUMP_ARG};
95f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.dump(null, writer, args);
96f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        writer.flush();
97f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        Pattern pattern = Pattern.compile(
98f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                "(?<=WifiMetrics:\\n)([\\s\\S]*)(?=EndWifiMetrics)");
99f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        Matcher matcher = pattern.matcher(stream.toString());
100f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        assertTrue("Proto Byte string found in WifiMetrics.dump():\n" + stream.toString(),
101f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                matcher.find());
102f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        String protoByteString = matcher.group(1);
103f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        byte[] protoBytes = Base64.decode(protoByteString, Base64.DEFAULT);
104f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mDeserializedWifiMetrics = WifiMetricsProto.WifiLog.parseFrom(protoBytes);
105f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    }
106f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
1071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    @Test
1081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void dumpHumanReadable() throws Exception {
1091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        ByteArrayOutputStream stream = new ByteArrayOutputStream();
1101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        PrintWriter writer = new PrintWriter(stream);
1111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        String[] args = new String[0];
1121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiMetrics.dump(null, writer, args);
1131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        writer.flush();
1141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertTrue("stream.toString().contains(\"WifiMetrics\")",
1151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                stream.toString().contains("WifiMetrics"));
1161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
1171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
1181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    @Test
119f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void testDumpProtoAndDeserialize() throws Exception {
1201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        setAndIncrementMetrics();
121f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        dumpProtoAndDeserialize();
1221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertDeserializedMetricsCorrect();
1231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
1241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
1251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final int NUM_SAVED_NETWORKS = 1;
1261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final int NUM_OPEN_NETWORKS = 2;
1271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final int NUM_PERSONAL_NETWORKS = 3;
1281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final int NUM_ENTERPRISE_NETWORKS = 5;
1291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final boolean TEST_VAL_IS_LOCATION_ENABLED = true;
1301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final boolean IS_SCANNING_ALWAYS_ENABLED = true;
1311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final int NUM_NEWTORKS_ADDED_BY_USER = 13;
1321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final int NUM_NEWTORKS_ADDED_BY_APPS = 17;
1331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final int NUM_EMPTY_SCAN_RESULTS = 19;
1341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    private static final int NUM_NON_EMPTY_SCAN_RESULTS = 23;
135c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int NUM_SCAN_UNKNOWN = 1;
136c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int NUM_SCAN_SUCCESS = 2;
137c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int NUM_SCAN_FAILURE_INTERRUPTED = 3;
138c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int NUM_SCAN_FAILURE_INVALID_CONFIGURATION = 5;
139c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int NUM_WIFI_UNKNOWN_SCREEN_OFF = 3;
140c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int NUM_WIFI_UNKNOWN_SCREEN_ON = 5;
141c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int NUM_WIFI_ASSOCIATED_SCREEN_OFF = 7;
142c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    private static final int NUM_WIFI_ASSOCIATED_SCREEN_ON = 11;
143ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    private static final int NUM_CONNECTIVITY_WATCHDOG_PNO_GOOD = 11;
144ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    private static final int NUM_CONNECTIVITY_WATCHDOG_PNO_BAD = 12;
145ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    private static final int NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_GOOD = 13;
146ce003b812aead64dcb36647180991150021b24c1Glen Kuhne    private static final int NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_BAD = 14;
1475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS = 1;
1485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_BAD_ASSOCIATION_NETWORKS_TOTAL = 2;
1495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_BAD_AUTHENTICATION_NETWORKS_TOTAL = 3;
1505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_BAD_DHCP_NETWORKS_TOTAL = 4;
1515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_BAD_OTHER_NETWORKS_TOTAL = 5;
1525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_AVAILABLE_NETWORKS_TOTAL = 6;
1535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_ASSOCIATION = 7;
1545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_AUTHENTICATION = 8;
1555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_DHCP = 9;
1565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne    private static final int NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_OTHER = 10;
1571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
1581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Set simple metrics, increment others
1591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
1601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void setAndIncrementMetrics() throws Exception {
1611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiMetrics.setNumSavedNetworks(NUM_SAVED_NETWORKS);
1621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiMetrics.setNumOpenNetworks(NUM_OPEN_NETWORKS);
1631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiMetrics.setNumPersonalNetworks(NUM_PERSONAL_NETWORKS);
1641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiMetrics.setNumEnterpriseNetworks(NUM_ENTERPRISE_NETWORKS);
1651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiMetrics.setNumNetworksAddedByUser(NUM_NEWTORKS_ADDED_BY_USER);
1661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiMetrics.setNumNetworksAddedByApps(NUM_NEWTORKS_ADDED_BY_APPS);
1671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiMetrics.setIsLocationEnabled(TEST_VAL_IS_LOCATION_ENABLED);
1681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        mWifiMetrics.setIsScanningAlwaysEnabled(IS_SCANNING_ALWAYS_ENABLED);
1691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
1701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        for (int i = 0; i < NUM_EMPTY_SCAN_RESULTS; i++) {
1711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiMetrics.incrementEmptyScanResultCount();
1721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
1731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        for (int i = 0; i < NUM_NON_EMPTY_SCAN_RESULTS; i++) {
1741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiMetrics.incrementNonEmptyScanResultCount();
1751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
176c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        mWifiMetrics.incrementScanReturnEntry(WifiMetricsProto.WifiLog.SCAN_UNKNOWN,
177c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_SCAN_UNKNOWN);
178c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        mWifiMetrics.incrementScanReturnEntry(WifiMetricsProto.WifiLog.SCAN_SUCCESS,
179c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_SCAN_SUCCESS);
180c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        mWifiMetrics.incrementScanReturnEntry(
181c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED,
182c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_SCAN_FAILURE_INTERRUPTED);
183c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        mWifiMetrics.incrementScanReturnEntry(
184c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION,
185c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_SCAN_FAILURE_INVALID_CONFIGURATION);
186c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        for (int i = 0; i < NUM_WIFI_UNKNOWN_SCREEN_OFF; i++) {
1871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiMetrics.incrementWifiSystemScanStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN,
1881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    false);
189c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
190c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        for (int i = 0; i < NUM_WIFI_UNKNOWN_SCREEN_ON; i++) {
1911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiMetrics.incrementWifiSystemScanStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN,
1921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    true);
193c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
194c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        for (int i = 0; i < NUM_WIFI_ASSOCIATED_SCREEN_OFF; i++) {
1951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiMetrics.incrementWifiSystemScanStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED,
1961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    false);
197c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
198c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        for (int i = 0; i < NUM_WIFI_ASSOCIATED_SCREEN_ON; i++) {
1991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne            mWifiMetrics.incrementWifiSystemScanStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED,
2001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                    true);
2011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        }
202ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        for (int i = 0; i < NUM_CONNECTIVITY_WATCHDOG_PNO_GOOD; i++) {
203ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiMetrics.incrementNumConnectivityWatchdogPnoGood();
204ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
205ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        for (int i = 0; i < NUM_CONNECTIVITY_WATCHDOG_PNO_BAD; i++) {
206ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiMetrics.incrementNumConnectivityWatchdogPnoBad();
207ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
208ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        for (int i = 0; i < NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_GOOD; i++) {
209ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiMetrics.incrementNumConnectivityWatchdogBackgroundGood();
210ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
211ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        for (int i = 0; i < NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_BAD; i++) {
212ce003b812aead64dcb36647180991150021b24c1Glen Kuhne            mWifiMetrics.incrementNumConnectivityWatchdogBackgroundBad();
213ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        }
2145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS; i++) {
2155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiMetrics.incrementNumLastResortWatchdogTriggers();
2165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
2175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        mWifiMetrics.addCountToNumLastResortWatchdogBadAssociationNetworksTotal(
2185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                NUM_LAST_RESORT_WATCHDOG_BAD_ASSOCIATION_NETWORKS_TOTAL);
2195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        mWifiMetrics.addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(
2205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                NUM_LAST_RESORT_WATCHDOG_BAD_AUTHENTICATION_NETWORKS_TOTAL);
2215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        mWifiMetrics.addCountToNumLastResortWatchdogBadDhcpNetworksTotal(
2225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                NUM_LAST_RESORT_WATCHDOG_BAD_DHCP_NETWORKS_TOTAL);
2235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        mWifiMetrics.addCountToNumLastResortWatchdogBadOtherNetworksTotal(
2245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                NUM_LAST_RESORT_WATCHDOG_BAD_OTHER_NETWORKS_TOTAL);
2255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        mWifiMetrics.addCountToNumLastResortWatchdogAvailableNetworksTotal(
2265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                NUM_LAST_RESORT_WATCHDOG_AVAILABLE_NETWORKS_TOTAL);
2275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_ASSOCIATION; i++) {
2285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiMetrics.incrementNumLastResortWatchdogTriggersWithBadAssociation();
2295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
2305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_AUTHENTICATION; i++) {
2315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiMetrics.incrementNumLastResortWatchdogTriggersWithBadAuthentication();
2325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
2335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_DHCP; i++) {
2345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiMetrics.incrementNumLastResortWatchdogTriggersWithBadDhcp();
2355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
2365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        for (int i = 0; i < NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_OTHER; i++) {
2375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne            mWifiMetrics.incrementNumLastResortWatchdogTriggersWithBadOther();
2385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        }
2391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
2401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
2411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
2421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Assert that values in deserializedWifiMetrics match those set in 'setAndIncrementMetrics'
2431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
2441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void assertDeserializedMetricsCorrect() throws Exception {
2451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.numSavedNetworks == NUM_SAVED_NETWORKS",
2461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.numSavedNetworks, NUM_SAVED_NETWORKS);
2471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.numOpenNetworks == NUM_OPEN_NETWORKS",
2481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.numOpenNetworks, NUM_OPEN_NETWORKS);
2491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.numPersonalNetworks == NUM_PERSONAL_NETWORKS",
2501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.numPersonalNetworks, NUM_PERSONAL_NETWORKS);
2511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.numEnterpriseNetworks "
2521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + "== NUM_ENTERPRISE_NETWORKS",
2531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.numEnterpriseNetworks, NUM_ENTERPRISE_NETWORKS);
2541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.numNetworksAddedByUser "
2551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + "== NUM_NEWTORKS_ADDED_BY_USER",
2561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.numNetworksAddedByUser, NUM_NEWTORKS_ADDED_BY_USER);
2571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.numNetworksAddedByApps "
2581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + "== NUM_NEWTORKS_ADDED_BY_APPS",
2591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.numNetworksAddedByApps, NUM_NEWTORKS_ADDED_BY_APPS);
2601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.isLocationEnabled == TEST_VAL_IS_LOCATION_ENABLED",
2611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.isLocationEnabled, TEST_VAL_IS_LOCATION_ENABLED);
2621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.isScanningAlwaysEnabled "
2631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + "== IS_SCANNING_ALWAYS_ENABLED",
2641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.isScanningAlwaysEnabled, IS_SCANNING_ALWAYS_ENABLED);
2651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.numEmptyScanResults == NUM_EMPTY_SCAN_RESULTS",
2661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.numEmptyScanResults, NUM_EMPTY_SCAN_RESULTS);
2671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertEquals("mDeserializedWifiMetrics.numNonEmptyScanResults == "
2681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                        + "NUM_NON_EMPTY_SCAN_RESULTS",
2691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne                mDeserializedWifiMetrics.numNonEmptyScanResults, NUM_NON_EMPTY_SCAN_RESULTS);
270c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertScanReturnEntryEquals(WifiMetricsProto.WifiLog.SCAN_UNKNOWN,
271c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_SCAN_UNKNOWN);
272c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertScanReturnEntryEquals(WifiMetricsProto.WifiLog.SCAN_SUCCESS,
273c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_SCAN_SUCCESS);
274c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertScanReturnEntryEquals(WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED,
275c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_SCAN_FAILURE_INTERRUPTED);
276c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertScanReturnEntryEquals(WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION,
277c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_SCAN_FAILURE_INVALID_CONFIGURATION);
278c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertSystemStateEntryEquals(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false,
279c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_WIFI_UNKNOWN_SCREEN_OFF);
280c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertSystemStateEntryEquals(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true,
281c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_WIFI_UNKNOWN_SCREEN_ON);
282c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertSystemStateEntryEquals(
283c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false, NUM_WIFI_ASSOCIATED_SCREEN_OFF);
284c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertSystemStateEntryEquals(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true,
285c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                NUM_WIFI_ASSOCIATED_SCREEN_ON);
286ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        assertEquals(mDeserializedWifiMetrics.numConnectivityWatchdogPnoGood,
287ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                NUM_CONNECTIVITY_WATCHDOG_PNO_GOOD);
288ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        assertEquals(mDeserializedWifiMetrics.numConnectivityWatchdogPnoBad,
289ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                NUM_CONNECTIVITY_WATCHDOG_PNO_BAD);
290ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        assertEquals(mDeserializedWifiMetrics.numConnectivityWatchdogBackgroundGood,
291ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_GOOD);
292ce003b812aead64dcb36647180991150021b24c1Glen Kuhne        assertEquals(mDeserializedWifiMetrics.numConnectivityWatchdogBackgroundBad,
293ce003b812aead64dcb36647180991150021b24c1Glen Kuhne                NUM_CONNECTIVITY_WATCHDOG_BACKGROUND_BAD);
2945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS,
2955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogTriggers);
2965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_BAD_ASSOCIATION_NETWORKS_TOTAL,
2975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogBadAssociationNetworksTotal);
2985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_BAD_AUTHENTICATION_NETWORKS_TOTAL,
2995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogBadAuthenticationNetworksTotal);
3005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_BAD_DHCP_NETWORKS_TOTAL,
3015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogBadDhcpNetworksTotal);
3025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_BAD_OTHER_NETWORKS_TOTAL,
3035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogBadOtherNetworksTotal);
3045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_AVAILABLE_NETWORKS_TOTAL,
3055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogAvailableNetworksTotal);
3065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_ASSOCIATION,
3075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogTriggersWithBadAssociation);
3085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_AUTHENTICATION,
3095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogTriggersWithBadAuthentication);
3105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_DHCP,
3115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogTriggersWithBadDhcp);
3125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne        assertEquals(NUM_LAST_RESORT_WATCHDOG_TRIGGERS_WITH_BAD_OTHER,
3135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne                mDeserializedWifiMetrics.numLastResortWatchdogTriggersWithBadOther);
31449410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne        assertEquals(TEST_RECORD_DURATION_SEC,
31549410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne                mDeserializedWifiMetrics.recordDurationSec);
3161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
3171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
3181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    /**
319c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     *  Assert deserialized metrics Scan Return Entry equals count
320c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
321c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void assertScanReturnEntryEquals(int returnCode, int count) {
322c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        for (int i = 0; i < mDeserializedWifiMetrics.scanReturnEntries.length; i++) {
323c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (mDeserializedWifiMetrics.scanReturnEntries[i].scanReturnCode == returnCode) {
324c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                assertEquals(mDeserializedWifiMetrics.scanReturnEntries[i].scanResultsCount, count);
325c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return;
326c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
327c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
328c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertEquals(null, count);
329c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
330c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
331c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
332c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     *  Assert deserialized metrics SystemState entry equals count
333c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne     */
334c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    public void assertSystemStateEntryEquals(int state, boolean screenOn, int count) {
335c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        for (int i = 0; i < mDeserializedWifiMetrics.wifiSystemStateEntries.length; i++) {
336c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            if (mDeserializedWifiMetrics.wifiSystemStateEntries[i].wifiState == state
337c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                    && mDeserializedWifiMetrics.wifiSystemStateEntries[i].isScreenOn == screenOn) {
338c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                assertEquals(mDeserializedWifiMetrics.wifiSystemStateEntries[i].wifiStateCount,
339c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                        count);
340c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                return;
341c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
342c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
343c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        assertEquals(null, count);
344c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    }
345c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    /**
3461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * Combination of all other WifiMetrics unit tests, an internal-integration test, or functional
3471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     * test
3481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne     */
3491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    @Test
3501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    public void setMetricsSerializeDeserializeAssertMetricsSame() throws Exception {
3511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        setAndIncrementMetrics();
3521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        startAndEndConnectionEventSucceeds();
35349410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne        dumpProtoAndDeserialize();
3541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        assertDeserializedMetricsCorrect();
3552532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne        assertEquals("mDeserializedWifiMetrics.connectionEvent.length",
35649410c13ba2284fb7c836fd3527dc526ea5681a0Glen Kuhne                2, mDeserializedWifiMetrics.connectionEvent.length);
3571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        //<TODO> test individual connectionEvents for correctness,
3581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        // check scanReturnEntries & wifiSystemStateEntries counts and individual elements
3591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne        // pending their implementation</TODO>
3601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne    }
361f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
362f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    private static final String SSID = "red";
363f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    private static final int CONFIG_DTIM = 3;
364f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    private static final int NETWORK_DETAIL_WIFIMODE = 5;
365f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    private static final int NETWORK_DETAIL_DTIM = 7;
366f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    private static final int SCAN_RESULT_LEVEL = -30;
367f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    /**
368f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * Test that WifiMetrics is correctly getting data from ScanDetail and WifiConfiguration
369f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     */
370f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    @Test
371f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void testScanDetailAndWifiConfigurationUsage() throws Exception {
372f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Setup mock configs and scan details
373f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        NetworkDetail networkDetail = mock(NetworkDetail.class);
374f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        when(networkDetail.getWifiMode()).thenReturn(NETWORK_DETAIL_WIFIMODE);
375f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        when(networkDetail.getSSID()).thenReturn(SSID);
376f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        when(networkDetail.getDtimInterval()).thenReturn(NETWORK_DETAIL_DTIM);
377f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        ScanResult scanResult = mock(ScanResult.class);
378f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        scanResult.level = SCAN_RESULT_LEVEL;
379f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        WifiConfiguration config = mock(WifiConfiguration.class);
380f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        config.SSID = "\"" + SSID + "\"";
381f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        config.dtimInterval = CONFIG_DTIM;
382f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        WifiConfiguration.NetworkSelectionStatus networkSelectionStat =
383f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                mock(WifiConfiguration.NetworkSelectionStatus.class);
384f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        when(networkSelectionStat.getCandidate()).thenReturn(scanResult);
385f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        when(config.getNetworkSelectionStatus()).thenReturn(networkSelectionStat);
386f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        ScanDetail scanDetail = mock(ScanDetail.class);
387f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        when(scanDetail.getNetworkDetail()).thenReturn(networkDetail);
388f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        when(scanDetail.getScanResult()).thenReturn(scanResult);
389f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
390f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Create a connection event using only the config
39196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(config, "Red",
39296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_NONE);
393f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.endConnectionEvent(
39496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_NONE,
395f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_NONE);
396f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
397f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Create a connection event using the config and a scan detail
39896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(config, "Green",
39996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_NONE);
400f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.setConnectionScanDetail(scanDetail);
401f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.endConnectionEvent(
40296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_NONE,
403f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_NONE);
404f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
405f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Dump proto from mWifiMetrics and deserialize it to mDeserializedWifiMetrics
406f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        dumpProtoAndDeserialize();
407f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
408f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Check that the correct values are being flowed through
409f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        assertEquals(mDeserializedWifiMetrics.connectionEvent.length, 2);
410f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        assertEquals(mDeserializedWifiMetrics.connectionEvent[0].routerFingerprint.dtim,
411f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                CONFIG_DTIM);
412f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        assertEquals(mDeserializedWifiMetrics.connectionEvent[0].signalStrength, SCAN_RESULT_LEVEL);
413f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        assertEquals(mDeserializedWifiMetrics.connectionEvent[1].routerFingerprint.dtim,
414f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                NETWORK_DETAIL_DTIM);
415f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        assertEquals(mDeserializedWifiMetrics.connectionEvent[1].signalStrength,
416f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                SCAN_RESULT_LEVEL);
417f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        assertEquals(mDeserializedWifiMetrics.connectionEvent[1].routerFingerprint.routerTechnology,
418f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                NETWORK_DETAIL_WIFIMODE);
419f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    }
420f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
421f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    /**
422f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     * Test that WifiMetrics is being cleared after dumping via proto
423f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne     */
424f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    @Test
425f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    public void testMetricsClearedAfterProtoRequested() throws Exception {
426f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        // Create 3 ConnectionEvents
42796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(null, "RED",
428f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
429f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.endConnectionEvent(
43096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_NONE,
431f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_NONE);
43296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(null, "YELLOW",
433f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
434f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.endConnectionEvent(
43596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_NONE,
436f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_NONE);
43796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(null, "GREEN",
438f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
439f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.endConnectionEvent(
44096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_NONE,
441f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_NONE);
44296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(null, "ORANGE",
443f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
444f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.endConnectionEvent(
44596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_NONE,
446f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_NONE);
447f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
448f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Dump proto and deserialize
449f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //This should clear all the metrics in mWifiMetrics,
450f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        dumpProtoAndDeserialize();
451f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Check there are only 3 connection events
452f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        assertEquals(mDeserializedWifiMetrics.connectionEvent.length, 4);
453f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
454f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        // Create 2 ConnectionEvents
45596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(null,  "BLUE",
456f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
457f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.endConnectionEvent(
45896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_NONE,
459f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_NONE);
46096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne        mWifiMetrics.startConnectionEvent(null, "RED",
461f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE);
462f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        mWifiMetrics.endConnectionEvent(
46396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne                WifiMetrics.ConnectionEvent.FAILURE_NONE,
464f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne                WifiMetricsProto.ConnectionEvent.HLF_NONE);
465f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne
466f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Dump proto and deserialize
467f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        dumpProtoAndDeserialize();
468f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        //Check there are only 2 connection events
469f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne        assertEquals(mDeserializedWifiMetrics.connectionEvent.length, 2);
470f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne    }
4711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne}
472