WakeupControllerTest.java revision 5aad8ece7e38a80db917d49b5245f6b8c6dca273
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;
305aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbachimport android.database.ContentObserver;
31115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport android.net.wifi.ScanResult;
32115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport android.net.wifi.WifiConfiguration;
33115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport android.net.wifi.WifiScanner;
34a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.os.test.TestLooper;
35a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.provider.Settings;
36a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
37115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport com.android.server.wifi.util.ScanResultUtil;
38115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
39a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport org.junit.Before;
40a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport org.junit.Test;
41b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbachimport org.mockito.ArgumentCaptor;
42115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport org.mockito.InOrder;
43a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport org.mockito.Mock;
44115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport org.mockito.Mockito;
45a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport org.mockito.MockitoAnnotations;
46aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbachimport org.xmlpull.v1.XmlPullParserException;
47a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
4804263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbachimport java.io.ByteArrayOutputStream;
49aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbachimport java.io.IOException;
5004263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbachimport java.io.PrintWriter;
51115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport java.util.Arrays;
52115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbachimport java.util.Collections;
534f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbachimport java.util.Set;
5404263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach
55a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach/**
56a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Unit tests for {@link WakeupController}.
57a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach */
58a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachpublic class WakeupControllerTest {
59a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
604f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    private static final int DFS_CHANNEL = 5540;
614f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
62a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Mock private Context mContext;
63a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    @Mock private WakeupLock mWakeupLock;
64b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    @Mock private WakeupEvaluator mWakeupEvaluator;
659d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    @Mock private WakeupOnboarding mWakeupOnboarding;
66a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    @Mock private WifiConfigStore mWifiConfigStore;
67115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Mock private WifiInjector mWifiInjector;
68115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Mock private WifiScanner mWifiScanner;
69115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Mock private WifiConfigManager mWifiConfigManager;
70a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Mock private FrameworkFacade mFrameworkFacade;
7132152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    @Mock private WifiSettingsStore mWifiSettingsStore;
7212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    @Mock private WifiWakeMetrics mWifiWakeMetrics;
7312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    @Mock private WifiController mWifiController;
744f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    @Mock private WifiNative mWifiNative;
75a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
76a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    private TestLooper mLooper;
77a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    private WakeupController mWakeupController;
78aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private WakeupConfigStoreData mWakeupConfigStoreData;
79aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private WifiScanner.ScanData[] mTestScanDatas;
80aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private ScanResult mTestScanResult;
81a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
82a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    /** Initialize objects before each test run. */
83a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Before
84a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    public void setUp() {
85a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        MockitoAnnotations.initMocks(this);
86115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
87115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner);
8832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        when(mWifiInjector.getWifiSettingsStore()).thenReturn(mWifiSettingsStore);
8912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        when(mWifiInjector.getWifiController()).thenReturn(mWifiController);
904f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiInjector.getWifiNative()).thenReturn(mWifiNative);
914f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY))
924f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach                .thenReturn(new int[]{DFS_CHANNEL});
934f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
9412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        when(mWifiSettingsStore.handleWifiToggled(anyBoolean())).thenReturn(true);
9532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
96a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        mLooper = new TestLooper();
97aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
98aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // scanlistener input
99aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanResult = new ScanResult();
100aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanResult.SSID = "open ssid 1";
101aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanResult.capabilities = "";
1024f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        mTestScanResult.frequency = 2412;
103aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ScanResult[] scanResults = new ScanResult[1];
104aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanResults[0] = mTestScanResult;
105aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanDatas = new WifiScanner.ScanData[1];
106aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanDatas[0] = new WifiScanner.ScanData(0 /* id */, 0 /* flags */,
107aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach                0 /* bucketsScanned */, true /* allChannelsScanned */, scanResults);
108a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    }
109a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
110aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    /** Initializes the wakeupcontroller in the given {@code enabled} state. */
111115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    private void initializeWakeupController(boolean enabled) {
112aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        initializeWakeupController(enabled, true /* isRead */);
113aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    }
114aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
115aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private void initializeWakeupController(boolean enabled, boolean isRead) {
116115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        int settingsValue = enabled ? 1 : 0;
117115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mFrameworkFacade.getIntegerSetting(mContext,
118115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                Settings.Global.WIFI_WAKEUP_ENABLED, 0)).thenReturn(settingsValue);
1199d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        when(mWakeupOnboarding.isOnboarded()).thenReturn(true);
120115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController = new WakeupController(mContext,
121115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mLooper.getLooper(),
122115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWakeupLock,
123b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach                mWakeupEvaluator,
1249d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach                mWakeupOnboarding,
125115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWifiConfigManager,
126115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWifiConfigStore,
12712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach                mWifiWakeMetrics,
128115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWifiInjector,
129115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mFrameworkFacade);
130aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
131aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ArgumentCaptor<WakeupConfigStoreData> captor =
132aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach                ArgumentCaptor.forClass(WakeupConfigStoreData.class);
133aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWifiConfigStore).registerStoreData(captor.capture());
134aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mWakeupConfigStoreData = captor.getValue();
135aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        if (isRead) {
136aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach            readUserStore();
137aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        }
138aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    }
139aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
140aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private void readUserStore() {
141aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        try {
142aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach            mWakeupConfigStoreData.deserializeData(null, 0, false);
143aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        } catch (XmlPullParserException | IOException e) {
144aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach            // unreachable
145aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        }
146115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
147115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
148115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    private ScanResult createOpenScanResult(String ssid) {
149115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        ScanResult scanResult = new ScanResult();
150115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        scanResult.SSID = ssid;
151115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        scanResult.capabilities = "";
152115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        return scanResult;
153a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    }
154a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach
15532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    private void verifyDoesNotEnableWifi() {
15632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verify(mWifiSettingsStore, never()).handleWifiToggled(true /* wifiEnabled */);
15732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    }
15832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
159a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    /**
160a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     * Verify WakeupController is enabled when the settings toggle is true.
161a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     */
162a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Test
163a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    public void verifyEnabledWhenToggledOn() {
164115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
165a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
166a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        assertTrue(mWakeupController.isEnabled());
167a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    }
168a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
169a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    /**
170a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     * Verify WakeupController is disabled when the settings toggle is false.
171a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     */
172a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Test
173a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    public void verifyDisabledWhenToggledOff() {
174115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(false /* enabled */);
175a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
176a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        assertFalse(mWakeupController.isEnabled());
177a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    }
178a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach
179a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    /**
180a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach     * Verify WakeupController registers its store data with the WifiConfigStore on construction.
181a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach     */
182a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    @Test
183a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    public void registersWakeupConfigStoreData() {
184115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
185a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach        verify(mWifiConfigStore).registerStoreData(any(WakeupConfigStoreData.class));
186a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    }
18704263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach
18804263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    /**
18904263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach     * Verify that dump calls also dump the state of the WakeupLock.
19004263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach     */
19104263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    @Test
19204263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    public void dumpIncludesWakeupLock() {
193115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
19404263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        ByteArrayOutputStream stream = new ByteArrayOutputStream();
19504263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        PrintWriter writer = new PrintWriter(stream);
19604263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        mWakeupController.dump(null, writer, null);
19704263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach
19804263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        verify(mWakeupLock).dump(null, writer, null);
19904263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    }
200115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
201115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
2024f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start sets the wakeup lock.
203115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
204115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
2054f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startSetsWakeupLock() {
206115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
207115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2084f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).setLock(any());
20912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics).recordStartEvent(anyInt());
210115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
211115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
212115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
2134f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start does not set the wakeup lock when feature is disabled.
214115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
215115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
2164f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startDoesNotSetWakeupLockWhenDisabled() {
217115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(false /* enabled */);
218115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2194f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).setLock(any());
22012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics, never()).recordStartEvent(anyInt());
221115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
222115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
223115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
2244f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start does not set the wakeup lock if the controller is already active.
225115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
226115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
2274f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startDoesNotSetWakeupLockIfAlreadyActive() {
228115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
22912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder lockInOrder = Mockito.inOrder(mWakeupLock);
23012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder metricsInOrder = Mockito.inOrder(mWifiWakeMetrics);
231115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
232115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2334f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock).setLock(any());
23412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordStartEvent(anyInt());
235115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
236115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.stop();
237115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2384f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock, never()).setLock(any());
23912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics, never()).recordStartEvent(anyInt());
240115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
241115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
242115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
243115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that start registers the scan listener on the wifi scanner.
244115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
245115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
246115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void startRegistersScanListener() {
247115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
248115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
249115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(any());
250115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
251115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
252115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
253115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that stop deregisters the scan listener from the wifi scanner.
254115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
255115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
256115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void stopDeresgistersScanListener() {
257115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
258115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
259115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.stop();
260115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        verify(mWifiScanner).deregisterScanListener(any());
261115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
262115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
263115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
264115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that reset sets active to false.
265115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     *
266115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * <p>This is accomplished by initiating another call to start and verifying that the wakeup
2674f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * lock is re-set.
268115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
269115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
270115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void resetSetsActiveToFalse() {
271115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
27212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder lockInOrder = Mockito.inOrder(mWakeupLock);
27312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder metricsInOrder = Mockito.inOrder(mWifiWakeMetrics);
274115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
275115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2764f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock).setLock(any());
27712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordStartEvent(anyInt());
278115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
279115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.stop();
280115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.reset();
28112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordResetEvent(0 /* numScans */);
28212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
283115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2844f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock).setLock(any());
28512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordStartEvent(anyInt());
286115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
287115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
288115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
289115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that the wakeup lock is initialized with the intersection of ScanResults and saved
290115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * networks.
291115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
292115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
293115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void startInitializesWakeupLockWithSavedScanResults() {
294115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        String ssid1 = "ssid 1";
295115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        String ssid2 = "ssid 2";
296115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        String quotedSsid = ScanResultUtil.createQuotedSSID(ssid1);
297115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
298115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        // saved configs
299115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(quotedSsid);
300115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        openNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
301115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
302115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        wepNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
303115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mWifiConfigManager.getSavedNetworks())
304115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                .thenReturn(Arrays.asList(openNetwork, wepNetwork));
305115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
306115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        // scan results from most recent scan
307115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        ScanResult savedScanResult = createOpenScanResult(ssid1);
3084f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        savedScanResult.frequency = 2412;
309115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        ScanResult unsavedScanResult = createOpenScanResult(ssid2);
3104f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        savedScanResult.frequency = 2412;
3114f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
312115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mWifiScanner.getSingleScanResults())
313115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                .thenReturn(Arrays.asList(savedScanResult, unsavedScanResult));
314115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
315115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        // intersection of most recent scan + saved configs
3164f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        Set<ScanResultMatchInfo> expectedMatchInfos =
317115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                Collections.singleton(ScanResultMatchInfo.fromScanResult(savedScanResult));
318115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
319115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
320115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
3214f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).setLock(eq(expectedMatchInfos));
3224f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWifiWakeMetrics).recordStartEvent(expectedMatchInfos.size());
3234f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    }
3244f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3254f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    /**
3264f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start filters out DFS channels.
3274f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     */
3284f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    @Test
3294f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startFiltersOutDfsScanResults() {
3304f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        String ssid = "test_ssid";
3314f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        String quotedSsid = ScanResultUtil.createQuotedSSID(ssid);
3324f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3334f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // saved config
3344f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(quotedSsid);
3354f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        openNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
3364f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiConfigManager.getSavedNetworks())
3374f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach                .thenReturn(Collections.singletonList(openNetwork));
3384f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3394f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // scan result from most recent scan
3404f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        ScanResult scanResult = createOpenScanResult(ssid);
3414f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        scanResult.frequency = DFS_CHANNEL;
3424f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3434f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiScanner.getSingleScanResults()).thenReturn(Collections.singletonList(scanResult));
3444f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3454f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // intersection of most recent scan + saved configs
3464f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        Set<ScanResultMatchInfo> expectedMatchInfos = Collections.emptySet();
3474f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3484f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
3494f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        mWakeupController.start();
3504f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).setLock(eq(expectedMatchInfos));
35112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics).recordStartEvent(expectedMatchInfos.size());
352115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
353b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
354b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    /**
355b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     * Verify that onResults updates the WakeupLock.
356b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     */
357b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    @Test
358b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    public void onResultsUpdatesWakeupLock() {
359b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        initializeWakeupController(true /* enabled */);
360b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        mWakeupController.start();
361b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
362b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
363b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
364b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
365b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
366b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
367b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
368aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
369aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
370b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
371aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ScanResultMatchInfo expectedMatchInfo = ScanResultMatchInfo.fromScanResult(mTestScanResult);
372b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        verify(mWakeupLock).update(eq(Collections.singleton(expectedMatchInfo)));
373b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    }
374b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
375b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    /**
3764f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that onResults filters out DFS channels.
37712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach     */
37812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    @Test
3794f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void onResultsFiltersOutDfsScanResults() {
38012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
38112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        mWakeupController.start();
38212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
38312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
38412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
38512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
38612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
38712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
38812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
38912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        // incoming scan results
3904f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        mTestScanResult.frequency = DFS_CHANNEL;
39112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
39212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
3934f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).update(eq(Collections.emptySet()));
39412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    }
39512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
39612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    /**
397b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     * Verify that the controller searches for viable networks during onResults when WakeupLock is
3984f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * unlocked.
399b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     */
400b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    @Test
4014f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void onResultsSearchesForViableNetworkWhenWakeupLockIsUnlocked() {
4024f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // unlock wakeup lock
4034f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWakeupLock.isUnlocked()).thenReturn(true);
40432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        // do not find viable network
40532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        when(mWakeupEvaluator.findViableNetwork(any(), any())).thenReturn(null);
40632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
407b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        initializeWakeupController(true /* enabled */);
408b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        mWakeupController.start();
409b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
410b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
411b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
412b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
413b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
414b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
415b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
416aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
417aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
41832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
419aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupEvaluator).findViableNetwork(any(), any());
42032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verifyDoesNotEnableWifi();
421b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    }
4229d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4239d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    /**
4245aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach     * Verify that the controller updates the WakeupLock even if the user is not onboarded.
4259d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach     */
4269d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    @Test
4275aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    public void onResultsUpdatesIfNotOnboarded() {
4289d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
4299d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        when(mWakeupOnboarding.isOnboarded()).thenReturn(false);
4305aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        when(mWakeupLock.isUnlocked()).thenReturn(false);
4319d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        mWakeupController.start();
4329d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4339d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
4349d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
4359d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4369d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
4379d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
4389d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
439aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
440aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
4419d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4425aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mWakeupLock).update(any());
4435aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mWakeupLock).isUnlocked();
44432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verifyDoesNotEnableWifi();
44532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    }
44632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
44732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    /**
44832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach     * Verify that the controller enables wifi and notifies user when all criteria are met.
44932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach     */
45032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    @Test
45132152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    public void onResultsEnablesWifi() {
4524f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // unlock wakeup lock
4534f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWakeupLock.isUnlocked()).thenReturn(true);
45432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        // find viable network
455aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        when(mWakeupEvaluator.findViableNetwork(any(), any())).thenReturn(mTestScanResult);
45632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
45732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        initializeWakeupController(true /* enabled */);
45832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        mWakeupController.start();
45932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
46032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
46132152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
46232152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
46332152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
46432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
46532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
466aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
467aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
46832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
469aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupEvaluator).findViableNetwork(any(), any());
47032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verify(mWifiSettingsStore).handleWifiToggled(true /* wifiEnabled */);
47112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics).recordWakeupEvent(1 /* numScans */);
4729d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    }
473aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
474aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    /**
475aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach     * Verify that the controller will not do any work if the user store has not been read.
476aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach     */
477aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    @Test
478aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    public void controllerDoesNoWorkIfUserStoreIsNotRead() {
479aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        initializeWakeupController(true /* enabled */, false /* isRead */);
480aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mWakeupController.start();
481aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
482aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
483aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
484aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
485aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
486aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
487aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
488aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
489aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
490aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
4914f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).setLock(any());
492aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupLock, never()).update(any());
4934f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).isUnlocked();
494aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupOnboarding, never()).maybeShowNotification();
495aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupEvaluator, never()).findViableNetwork(any(), any());
496aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    }
4975aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach
4985aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    @Test
4995aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    public void userIsNotOnboardedByInitialization() {
5005aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
5015aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mWakeupOnboarding, never()).setOnboarded();
5025aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    }
5035aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach
5045aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    @Test
5055aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    public void userIsOnboardedBySettingChange() {
5065aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
5075aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        ArgumentCaptor<ContentObserver> argumentCaptor =
5085aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach                ArgumentCaptor.forClass(ContentObserver.class);
5095aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mFrameworkFacade).registerContentObserver(any(), any(), eq(true),
5105aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach                argumentCaptor.capture());
5115aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        ContentObserver contentObserver = argumentCaptor.getValue();
5125aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        contentObserver.onChange(false /* selfChange */);
5135aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mWakeupOnboarding).setOnboarded();
5145aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    }
515a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach}
516