WakeupControllerTest.java revision 4f894bd0f4b378972d10f64390ab710da54d5cc6
1a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach/*
2a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Copyright 2017 The Android Open Source Project
3a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach *
4a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Licensed under the Apache License, Version 2.0 (the "License");
5a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * you may not use this file except in compliance with the License.
6a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * You may obtain a copy of the License at
7a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach *
8a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach *      http://www.apache.org/licenses/LICENSE-2.0
9a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach *
10a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Unless required by applicable law or agreed to in writing, software
11a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * distributed under the License is distributed on an "AS IS" BASIS,
12a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * See the License for the specific language governing permissions and
14a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * limitations under the License.
15a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach */
16a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
17a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachpackage com.android.server.wifi;
18a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
19a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport static org.junit.Assert.assertFalse;
20a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport static org.junit.Assert.assertTrue;
21a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbachimport static org.mockito.ArgumentMatchers.any;
2212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbachimport static org.mockito.ArgumentMatchers.anyBoolean;
2312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbachimport static org.mockito.ArgumentMatchers.anyInt;
24115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport static org.mockito.ArgumentMatchers.eq;
25115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport static org.mockito.Mockito.never;
26a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbachimport static org.mockito.Mockito.verify;
27a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport static org.mockito.Mockito.when;
28a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
29a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.content.Context;
30115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport android.net.wifi.ScanResult;
31115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport android.net.wifi.WifiConfiguration;
32115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport android.net.wifi.WifiScanner;
33a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.os.test.TestLooper;
34a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.provider.Settings;
35a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
36115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport com.android.server.wifi.util.ScanResultUtil;
37115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
38a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport org.junit.Before;
39a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport org.junit.Test;
40b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbachimport org.mockito.ArgumentCaptor;
41115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport org.mockito.InOrder;
42a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport org.mockito.Mock;
43115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport org.mockito.Mockito;
44a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport org.mockito.MockitoAnnotations;
45aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbachimport org.xmlpull.v1.XmlPullParserException;
46a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
4704263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbachimport java.io.ByteArrayOutputStream;
48aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbachimport java.io.IOException;
4904263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbachimport java.io.PrintWriter;
50115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport java.util.Arrays;
51115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport java.util.Collections;
524f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbachimport java.util.Set;
5304263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach
54a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach/**
55a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Unit tests for {@link WakeupController}.
56a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach */
57a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachpublic class WakeupControllerTest {
58a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
594f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    private static final int DFS_CHANNEL = 5540;
604f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
61a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Mock private Context mContext;
62a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    @Mock private WakeupLock mWakeupLock;
63b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    @Mock private WakeupEvaluator mWakeupEvaluator;
649d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    @Mock private WakeupOnboarding mWakeupOnboarding;
65a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    @Mock private WifiConfigStore mWifiConfigStore;
66115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Mock private WifiInjector mWifiInjector;
67115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Mock private WifiScanner mWifiScanner;
68115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Mock private WifiConfigManager mWifiConfigManager;
69a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Mock private FrameworkFacade mFrameworkFacade;
7032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    @Mock private WifiSettingsStore mWifiSettingsStore;
7112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    @Mock private WifiWakeMetrics mWifiWakeMetrics;
7212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    @Mock private WifiController mWifiController;
734f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    @Mock private WifiNative mWifiNative;
74a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
75a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    private TestLooper mLooper;
76a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    private WakeupController mWakeupController;
77aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private WakeupConfigStoreData mWakeupConfigStoreData;
78aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private WifiScanner.ScanData[] mTestScanDatas;
79aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private ScanResult mTestScanResult;
80a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
81a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    /** Initialize objects before each test run. */
82a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Before
83a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    public void setUp() {
84a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        MockitoAnnotations.initMocks(this);
85115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
86115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner);
8732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        when(mWifiInjector.getWifiSettingsStore()).thenReturn(mWifiSettingsStore);
8812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        when(mWifiInjector.getWifiController()).thenReturn(mWifiController);
894f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiInjector.getWifiNative()).thenReturn(mWifiNative);
904f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY))
914f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach                .thenReturn(new int[]{DFS_CHANNEL});
924f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
9312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        when(mWifiSettingsStore.handleWifiToggled(anyBoolean())).thenReturn(true);
9432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
95a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        mLooper = new TestLooper();
96aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
97aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // scanlistener input
98aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanResult = new ScanResult();
99aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanResult.SSID = "open ssid 1";
100aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanResult.capabilities = "";
1014f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        mTestScanResult.frequency = 2412;
102aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ScanResult[] scanResults = new ScanResult[1];
103aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanResults[0] = mTestScanResult;
104aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanDatas = new WifiScanner.ScanData[1];
105aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanDatas[0] = new WifiScanner.ScanData(0 /* id */, 0 /* flags */,
106aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach                0 /* bucketsScanned */, true /* allChannelsScanned */, scanResults);
107a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    }
108a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
109aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    /** Initializes the wakeupcontroller in the given {@code enabled} state. */
110115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    private void initializeWakeupController(boolean enabled) {
111aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        initializeWakeupController(enabled, true /* isRead */);
112aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    }
113aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
114aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private void initializeWakeupController(boolean enabled, boolean isRead) {
115115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        int settingsValue = enabled ? 1 : 0;
116115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mFrameworkFacade.getIntegerSetting(mContext,
117115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                Settings.Global.WIFI_WAKEUP_ENABLED, 0)).thenReturn(settingsValue);
1189d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        when(mWakeupOnboarding.isOnboarded()).thenReturn(true);
119115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController = new WakeupController(mContext,
120115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mLooper.getLooper(),
121115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWakeupLock,
122b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach                mWakeupEvaluator,
1239d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach                mWakeupOnboarding,
124115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWifiConfigManager,
125115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWifiConfigStore,
12612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach                mWifiWakeMetrics,
127115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWifiInjector,
128115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mFrameworkFacade);
129aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
130aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ArgumentCaptor<WakeupConfigStoreData> captor =
131aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach                ArgumentCaptor.forClass(WakeupConfigStoreData.class);
132aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWifiConfigStore).registerStoreData(captor.capture());
133aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mWakeupConfigStoreData = captor.getValue();
134aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        if (isRead) {
135aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach            readUserStore();
136aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        }
137aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    }
138aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
139aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private void readUserStore() {
140aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        try {
141aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach            mWakeupConfigStoreData.deserializeData(null, 0, false);
142aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        } catch (XmlPullParserException | IOException e) {
143aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach            // unreachable
144aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        }
145115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
146115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
147115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    private ScanResult createOpenScanResult(String ssid) {
148115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        ScanResult scanResult = new ScanResult();
149115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        scanResult.SSID = ssid;
150115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        scanResult.capabilities = "";
151115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        return scanResult;
152a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    }
153a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach
15432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    private void verifyDoesNotEnableWifi() {
15532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verify(mWifiSettingsStore, never()).handleWifiToggled(true /* wifiEnabled */);
15632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    }
15732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
158a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    /**
159a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     * Verify WakeupController is enabled when the settings toggle is true.
160a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     */
161a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Test
162a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    public void verifyEnabledWhenToggledOn() {
163115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
164a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
165a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        assertTrue(mWakeupController.isEnabled());
166a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    }
167a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
168a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    /**
169a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     * Verify WakeupController is disabled when the settings toggle is false.
170a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     */
171a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Test
172a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    public void verifyDisabledWhenToggledOff() {
173115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(false /* enabled */);
174a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
175a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        assertFalse(mWakeupController.isEnabled());
176a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    }
177a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach
178a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    /**
179a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach     * Verify WakeupController registers its store data with the WifiConfigStore on construction.
180a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach     */
181a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    @Test
182a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    public void registersWakeupConfigStoreData() {
183115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
184a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach        verify(mWifiConfigStore).registerStoreData(any(WakeupConfigStoreData.class));
185a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    }
18604263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach
18704263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    /**
18804263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach     * Verify that dump calls also dump the state of the WakeupLock.
18904263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach     */
19004263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    @Test
19104263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    public void dumpIncludesWakeupLock() {
192115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
19304263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        ByteArrayOutputStream stream = new ByteArrayOutputStream();
19404263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        PrintWriter writer = new PrintWriter(stream);
19504263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        mWakeupController.dump(null, writer, null);
19604263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach
19704263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        verify(mWakeupLock).dump(null, writer, null);
19804263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    }
199115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
200115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
2014f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start sets the wakeup lock.
202115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
203115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
2044f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startSetsWakeupLock() {
205115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
206115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2074f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).setLock(any());
20812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics).recordStartEvent(anyInt());
209115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
210115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
211115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
2124f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start does not set the wakeup lock when feature is disabled.
213115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
214115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
2154f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startDoesNotSetWakeupLockWhenDisabled() {
216115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(false /* enabled */);
217115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2184f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).setLock(any());
21912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics, never()).recordStartEvent(anyInt());
220115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
221115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
222115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
2234f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start does not set the wakeup lock if the controller is already active.
224115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
225115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
2264f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startDoesNotSetWakeupLockIfAlreadyActive() {
227115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
22812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder lockInOrder = Mockito.inOrder(mWakeupLock);
22912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder metricsInOrder = Mockito.inOrder(mWifiWakeMetrics);
230115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
231115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2324f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock).setLock(any());
23312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordStartEvent(anyInt());
234115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
235115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.stop();
236115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2374f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock, never()).setLock(any());
23812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics, never()).recordStartEvent(anyInt());
239115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
240115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
241115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
242115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that start registers the scan listener on the wifi scanner.
243115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
244115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
245115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void startRegistersScanListener() {
246115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
247115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
248115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(any());
249115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
250115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
251115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
252115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that stop deregisters the scan listener from the wifi scanner.
253115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
254115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
255115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void stopDeresgistersScanListener() {
256115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
257115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
258115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.stop();
259115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        verify(mWifiScanner).deregisterScanListener(any());
260115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
261115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
262115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
263115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that reset sets active to false.
264115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     *
265115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * <p>This is accomplished by initiating another call to start and verifying that the wakeup
2664f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * lock is re-set.
267115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
268115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
269115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void resetSetsActiveToFalse() {
270115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
27112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder lockInOrder = Mockito.inOrder(mWakeupLock);
27212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder metricsInOrder = Mockito.inOrder(mWifiWakeMetrics);
273115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
274115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2754f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock).setLock(any());
27612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordStartEvent(anyInt());
277115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
278115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.stop();
279115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.reset();
28012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordResetEvent(0 /* numScans */);
28112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
282115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2834f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock).setLock(any());
28412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordStartEvent(anyInt());
285115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
286115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
287115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
288115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that the wakeup lock is initialized with the intersection of ScanResults and saved
289115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * networks.
290115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
291115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
292115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void startInitializesWakeupLockWithSavedScanResults() {
293115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        String ssid1 = "ssid 1";
294115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        String ssid2 = "ssid 2";
295115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        String quotedSsid = ScanResultUtil.createQuotedSSID(ssid1);
296115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
297115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        // saved configs
298115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(quotedSsid);
299115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        openNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
300115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
301115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        wepNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
302115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mWifiConfigManager.getSavedNetworks())
303115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                .thenReturn(Arrays.asList(openNetwork, wepNetwork));
304115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
305115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        // scan results from most recent scan
306115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        ScanResult savedScanResult = createOpenScanResult(ssid1);
3074f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        savedScanResult.frequency = 2412;
308115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        ScanResult unsavedScanResult = createOpenScanResult(ssid2);
3094f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        savedScanResult.frequency = 2412;
3104f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
311115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mWifiScanner.getSingleScanResults())
312115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                .thenReturn(Arrays.asList(savedScanResult, unsavedScanResult));
313115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
314115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        // intersection of most recent scan + saved configs
3154f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        Set<ScanResultMatchInfo> expectedMatchInfos =
316115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                Collections.singleton(ScanResultMatchInfo.fromScanResult(savedScanResult));
317115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
318115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
319115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
3204f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).setLock(eq(expectedMatchInfos));
3214f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWifiWakeMetrics).recordStartEvent(expectedMatchInfos.size());
3224f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    }
3234f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3244f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    /**
3254f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start filters out DFS channels.
3264f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     */
3274f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    @Test
3284f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startFiltersOutDfsScanResults() {
3294f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        String ssid = "test_ssid";
3304f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        String quotedSsid = ScanResultUtil.createQuotedSSID(ssid);
3314f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3324f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // saved config
3334f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(quotedSsid);
3344f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        openNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
3354f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiConfigManager.getSavedNetworks())
3364f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach                .thenReturn(Collections.singletonList(openNetwork));
3374f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3384f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // scan result from most recent scan
3394f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        ScanResult scanResult = createOpenScanResult(ssid);
3404f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        scanResult.frequency = DFS_CHANNEL;
3414f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3424f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiScanner.getSingleScanResults()).thenReturn(Collections.singletonList(scanResult));
3434f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3444f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // intersection of most recent scan + saved configs
3454f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        Set<ScanResultMatchInfo> expectedMatchInfos = Collections.emptySet();
3464f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3474f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
3484f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        mWakeupController.start();
3494f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).setLock(eq(expectedMatchInfos));
35012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics).recordStartEvent(expectedMatchInfos.size());
351115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
352b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
353b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    /**
354b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     * Verify that onResults updates the WakeupLock.
355b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     */
356b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    @Test
357b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    public void onResultsUpdatesWakeupLock() {
358b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        initializeWakeupController(true /* enabled */);
359b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        mWakeupController.start();
360b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
361b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
362b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
363b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
364b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
365b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
366b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
367aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
368aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
369b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
370aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ScanResultMatchInfo expectedMatchInfo = ScanResultMatchInfo.fromScanResult(mTestScanResult);
371b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        verify(mWakeupLock).update(eq(Collections.singleton(expectedMatchInfo)));
372b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    }
373b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
374b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    /**
3754f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that onResults filters out DFS channels.
37612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach     */
37712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    @Test
3784f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void onResultsFiltersOutDfsScanResults() {
37912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
38012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        mWakeupController.start();
38112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
38212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
38312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
38412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
38512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
38612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
38712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
38812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        // incoming scan results
3894f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        mTestScanResult.frequency = DFS_CHANNEL;
39012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
39112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
3924f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).update(eq(Collections.emptySet()));
39312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    }
39412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
39512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    /**
396b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     * Verify that the controller searches for viable networks during onResults when WakeupLock is
3974f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * unlocked.
398b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     */
399b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    @Test
4004f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void onResultsSearchesForViableNetworkWhenWakeupLockIsUnlocked() {
4014f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // unlock wakeup lock
4024f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWakeupLock.isUnlocked()).thenReturn(true);
40332152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        // do not find viable network
40432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        when(mWakeupEvaluator.findViableNetwork(any(), any())).thenReturn(null);
40532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
406b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        initializeWakeupController(true /* enabled */);
407b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        mWakeupController.start();
408b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
409b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
410b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
411b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
412b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
413b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
414b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
415aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
416aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
41732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
418aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupEvaluator).findViableNetwork(any(), any());
41932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verifyDoesNotEnableWifi();
420b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    }
4219d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4229d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    /**
4239d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach     * Verify that the controller only updates the WakeupLock if the user is onboarded.
4249d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach     */
4259d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    @Test
4269d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    public void onResultsDoesNotUpdateIfNotOnboarded() {
4279d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
4289d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        when(mWakeupOnboarding.isOnboarded()).thenReturn(false);
4299d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        mWakeupController.start();
4309d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4319d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
4329d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
4339d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4349d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
4359d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
4369d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
437aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
438aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
4399d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4404f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).isUnlocked();
4419d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        verify(mWakeupLock, never()).update(any());
44232152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
44332152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verifyDoesNotEnableWifi();
44432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    }
44532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
44632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    /**
44732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach     * Verify that the controller enables wifi and notifies user when all criteria are met.
44832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach     */
44932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    @Test
45032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    public void onResultsEnablesWifi() {
4514f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // unlock wakeup lock
4524f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWakeupLock.isUnlocked()).thenReturn(true);
45332152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        // find viable network
454aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        when(mWakeupEvaluator.findViableNetwork(any(), any())).thenReturn(mTestScanResult);
45532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
45632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        initializeWakeupController(true /* enabled */);
45732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        mWakeupController.start();
45832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
45932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
46032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
46132152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
46232152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
46332152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
46432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
465aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
466aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
46732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
468aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupEvaluator).findViableNetwork(any(), any());
46932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verify(mWifiSettingsStore).handleWifiToggled(true /* wifiEnabled */);
47012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics).recordWakeupEvent(1 /* numScans */);
4719d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    }
472aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
473aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    /**
474aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach     * Verify that the controller will not do any work if the user store has not been read.
475aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach     */
476aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    @Test
477aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    public void controllerDoesNoWorkIfUserStoreIsNotRead() {
478aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        initializeWakeupController(true /* enabled */, false /* isRead */);
479aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mWakeupController.start();
480aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
481aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
482aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
483aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
484aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
485aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
486aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
487aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
488aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
489aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
4904f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).setLock(any());
491aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupLock, never()).update(any());
4924f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).isUnlocked();
493aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupOnboarding, never()).maybeShowNotification();
494aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupEvaluator, never()).findViableNetwork(any(), any());
495aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    }
496a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach}
497