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
60f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach    private static final String SAVED_SSID = "test scan ssid";
61f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach    private static final int DFS_CHANNEL_FREQ = 5540;
624f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
63a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Mock private Context mContext;
64a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    @Mock private WakeupLock mWakeupLock;
65b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    @Mock private WakeupEvaluator mWakeupEvaluator;
669d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    @Mock private WakeupOnboarding mWakeupOnboarding;
67a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    @Mock private WifiConfigStore mWifiConfigStore;
68115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Mock private WifiInjector mWifiInjector;
69115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Mock private WifiScanner mWifiScanner;
70115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Mock private WifiConfigManager mWifiConfigManager;
71a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Mock private FrameworkFacade mFrameworkFacade;
7232152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    @Mock private WifiSettingsStore mWifiSettingsStore;
7312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    @Mock private WifiWakeMetrics mWifiWakeMetrics;
7412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    @Mock private WifiController mWifiController;
754f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    @Mock private WifiNative mWifiNative;
76a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
77a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    private TestLooper mLooper;
78a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    private WakeupController mWakeupController;
79aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private WakeupConfigStoreData mWakeupConfigStoreData;
80aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private WifiScanner.ScanData[] mTestScanDatas;
81aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private ScanResult mTestScanResult;
82a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
83a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    /** Initialize objects before each test run. */
84a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Before
85a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    public void setUp() {
86a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        MockitoAnnotations.initMocks(this);
87115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
88115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mWifiInjector.getWifiScanner()).thenReturn(mWifiScanner);
8932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        when(mWifiInjector.getWifiSettingsStore()).thenReturn(mWifiSettingsStore);
9012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        when(mWifiInjector.getWifiController()).thenReturn(mWifiController);
914f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiInjector.getWifiNative()).thenReturn(mWifiNative);
924f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY))
93f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach                .thenReturn(new int[]{DFS_CHANNEL_FREQ});
944f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
9512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        when(mWifiSettingsStore.handleWifiToggled(anyBoolean())).thenReturn(true);
9632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
97a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        mLooper = new TestLooper();
98aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
99aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // scanlistener input
100aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanResult = new ScanResult();
101f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        mTestScanResult.SSID = SAVED_SSID;
102aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanResult.capabilities = "";
1034f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        mTestScanResult.frequency = 2412;
104aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ScanResult[] scanResults = new ScanResult[1];
105aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanResults[0] = mTestScanResult;
106aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanDatas = new WifiScanner.ScanData[1];
107aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mTestScanDatas[0] = new WifiScanner.ScanData(0 /* id */, 0 /* flags */,
108aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach                0 /* bucketsScanned */, true /* allChannelsScanned */, scanResults);
109a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    }
110a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
111aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    /** Initializes the wakeupcontroller in the given {@code enabled} state. */
112115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    private void initializeWakeupController(boolean enabled) {
113aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        initializeWakeupController(enabled, true /* isRead */);
114aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    }
115aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
116aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private void initializeWakeupController(boolean enabled, boolean isRead) {
117115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        int settingsValue = enabled ? 1 : 0;
118115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mFrameworkFacade.getIntegerSetting(mContext,
119115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                Settings.Global.WIFI_WAKEUP_ENABLED, 0)).thenReturn(settingsValue);
1209d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        when(mWakeupOnboarding.isOnboarded()).thenReturn(true);
121115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController = new WakeupController(mContext,
122115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mLooper.getLooper(),
123115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWakeupLock,
124b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach                mWakeupEvaluator,
1259d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach                mWakeupOnboarding,
126115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWifiConfigManager,
127115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWifiConfigStore,
12812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach                mWifiWakeMetrics,
129115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mWifiInjector,
130115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                mFrameworkFacade);
131aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
132aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ArgumentCaptor<WakeupConfigStoreData> captor =
133aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach                ArgumentCaptor.forClass(WakeupConfigStoreData.class);
134aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWifiConfigStore).registerStoreData(captor.capture());
135aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mWakeupConfigStoreData = captor.getValue();
136aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        if (isRead) {
137aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach            readUserStore();
138aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        }
139aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    }
140aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
141aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    private void readUserStore() {
142aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        try {
143aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach            mWakeupConfigStoreData.deserializeData(null, 0, false);
144aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        } catch (XmlPullParserException | IOException e) {
145aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach            // unreachable
146aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        }
147115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
148115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
149f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach    private ScanResult createOpenScanResult(String ssid, int frequency) {
150115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        ScanResult scanResult = new ScanResult();
151115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        scanResult.SSID = ssid;
152115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        scanResult.capabilities = "";
153f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        scanResult.frequency = frequency;
154115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        return scanResult;
155a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    }
156a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach
15732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    private void verifyDoesNotEnableWifi() {
15832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verify(mWifiSettingsStore, never()).handleWifiToggled(true /* wifiEnabled */);
15932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    }
16032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
161a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    /**
162a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     * Verify WakeupController is enabled when the settings toggle is true.
163a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     */
164a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Test
165a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    public void verifyEnabledWhenToggledOn() {
166115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
167a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
168a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        assertTrue(mWakeupController.isEnabled());
169a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    }
170a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
171a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    /**
172a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     * Verify WakeupController is disabled when the settings toggle is false.
173a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach     */
174a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    @Test
175a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    public void verifyDisabledWhenToggledOff() {
176115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(false /* enabled */);
177a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach
178a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach        assertFalse(mWakeupController.isEnabled());
179a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach    }
180a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach
181a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    /**
182a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach     * Verify WakeupController registers its store data with the WifiConfigStore on construction.
183a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach     */
184a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    @Test
185a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    public void registersWakeupConfigStoreData() {
186115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
187a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach        verify(mWifiConfigStore).registerStoreData(any(WakeupConfigStoreData.class));
188a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach    }
18904263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach
19004263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    /**
19104263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach     * Verify that dump calls also dump the state of the WakeupLock.
19204263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach     */
19304263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    @Test
19404263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    public void dumpIncludesWakeupLock() {
195115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
19604263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        ByteArrayOutputStream stream = new ByteArrayOutputStream();
19704263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        PrintWriter writer = new PrintWriter(stream);
19804263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        mWakeupController.dump(null, writer, null);
19904263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach
20004263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach        verify(mWakeupLock).dump(null, writer, null);
20104263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach    }
202115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
203115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
2044f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start sets the wakeup lock.
205115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
206115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
2074f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startSetsWakeupLock() {
208115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
209115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2104f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).setLock(any());
21112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics).recordStartEvent(anyInt());
212115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
213115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
214115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
215dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach     * Verify that start does not record an ignored start call if the controller is not yet active.
216dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach     */
217dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach    @Test
218dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach    public void startDoesNotRecordIgnoredStart() {
219dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach        initializeWakeupController(true /* enabled */);
220dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach        mWakeupController.start();
221dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach        verify(mWifiWakeMetrics, never()).recordIgnoredStart();
222dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach    }
223dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach
224dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach    /**
2254f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start does not set the wakeup lock when feature is disabled.
226115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
227115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
2284f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startDoesNotSetWakeupLockWhenDisabled() {
229115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(false /* enabled */);
230115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2314f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).setLock(any());
23212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics, never()).recordStartEvent(anyInt());
233115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
234115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
235115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
236dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach     * If the controller is already active, verify that start() is ignored and no setup is done.
237115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
238115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
239dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach    public void startIsIgnoredIfAlreadyActive() {
240115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
24112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder lockInOrder = Mockito.inOrder(mWakeupLock);
24212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder metricsInOrder = Mockito.inOrder(mWifiWakeMetrics);
243115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
244115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2454f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock).setLock(any());
24612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordStartEvent(anyInt());
247115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
248115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.stop();
249115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
250dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordIgnoredStart();
25112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics, never()).recordStartEvent(anyInt());
252dca47232ea69a4501318b4dfb69db69e1216694fEric Schwarzenbach        lockInOrder.verify(mWakeupLock, never()).setLock(any());
253115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
254115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
255115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
256115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that start registers the scan listener on the wifi scanner.
257115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
258115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
259115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void startRegistersScanListener() {
260115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
261115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
262115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(any());
263115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
264115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
265115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
266115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that stop deregisters the scan listener from the wifi scanner.
267115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
268115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
269115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void stopDeresgistersScanListener() {
270115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
271115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
272115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.stop();
273115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        verify(mWifiScanner).deregisterScanListener(any());
274115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
275115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
276115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
277115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that reset sets active to false.
278115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     *
279115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * <p>This is accomplished by initiating another call to start and verifying that the wakeup
2804f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * lock is re-set.
281115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
282115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
283115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void resetSetsActiveToFalse() {
284115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
28512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder lockInOrder = Mockito.inOrder(mWakeupLock);
28612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        InOrder metricsInOrder = Mockito.inOrder(mWifiWakeMetrics);
287115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
288115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2894f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock).setLock(any());
29012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordStartEvent(anyInt());
291115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
292115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.stop();
293115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.reset();
29412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordResetEvent(0 /* numScans */);
29512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
296115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
2974f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        lockInOrder.verify(mWakeupLock).setLock(any());
29812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        metricsInOrder.verify(mWifiWakeMetrics).recordStartEvent(anyInt());
299115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
300115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
301115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    /**
302115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * Verify that the wakeup lock is initialized with the intersection of ScanResults and saved
303115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     * networks.
304115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach     */
305115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    @Test
306115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    public void startInitializesWakeupLockWithSavedScanResults() {
307115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        String ssid1 = "ssid 1";
308115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        String ssid2 = "ssid 2";
309115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        String quotedSsid = ScanResultUtil.createQuotedSSID(ssid1);
310115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
311115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        // saved configs
312115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(quotedSsid);
313115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        openNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
314115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
315115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        wepNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
316115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mWifiConfigManager.getSavedNetworks())
317115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                .thenReturn(Arrays.asList(openNetwork, wepNetwork));
318115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
319115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        // scan results from most recent scan
320f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        ScanResult savedScanResult = createOpenScanResult(ssid1, 2412 /* frequency */);
321f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        ScanResult unsavedScanResult = createOpenScanResult(ssid2, 2412 /* frequency */);
3224f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
323115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        when(mWifiScanner.getSingleScanResults())
324115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                .thenReturn(Arrays.asList(savedScanResult, unsavedScanResult));
325115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
326115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        // intersection of most recent scan + saved configs
3274f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        Set<ScanResultMatchInfo> expectedMatchInfos =
328115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach                Collections.singleton(ScanResultMatchInfo.fromScanResult(savedScanResult));
329115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach
330115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
331115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach        mWakeupController.start();
3324f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).setLock(eq(expectedMatchInfos));
3334f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWifiWakeMetrics).recordStartEvent(expectedMatchInfos.size());
3344f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    }
3354f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3364f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    /**
3374f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that start filters out DFS channels.
3384f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     */
3394f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    @Test
3404f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void startFiltersOutDfsScanResults() {
341f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        String ssidDfs = "DFS scan";
342f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        String ssid24 = "2.4 scan";
343f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach
344f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        // saved configs
345f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        WifiConfiguration openNetworkDfs = WifiConfigurationTestUtil
346f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach                .createOpenNetwork(ScanResultUtil.createQuotedSSID(ssidDfs));
347f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        openNetworkDfs.getNetworkSelectionStatus().setHasEverConnected(true);
348f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        WifiConfiguration openNetwork24 = WifiConfigurationTestUtil
349f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach                .createOpenNetwork(ScanResultUtil.createQuotedSSID(ssid24));
350f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        openNetwork24.getNetworkSelectionStatus().setHasEverConnected(true);
3514f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3524f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWifiConfigManager.getSavedNetworks())
353f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach                .thenReturn(Arrays.asList(openNetworkDfs, openNetwork24));
3544f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
355f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        // scan results from most recent scan
356f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        ScanResult scanResultDfs = createOpenScanResult(ssidDfs, DFS_CHANNEL_FREQ);
357f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        ScanResult scanResult24 = createOpenScanResult(ssid24, 2412 /* frequency */);
3584f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
359f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        when(mWifiScanner.getSingleScanResults())
360f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach                .thenReturn(Arrays.asList(scanResultDfs, scanResult24));
3614f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
362f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        // should filter out scanResultDfs
363f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        Set<ScanResultMatchInfo> expectedMatchInfos =
364f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach                Collections.singleton(ScanResultMatchInfo.fromScanResult(scanResult24));
3654f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach
3664f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
3674f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        mWakeupController.start();
3684f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).setLock(eq(expectedMatchInfos));
36912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics).recordStartEvent(expectedMatchInfos.size());
370115c8923f9cfee8052c03eb5c92359d4156a86b2Eric Schwarzenbach    }
371b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
372b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    /**
373b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     * Verify that onResults updates the WakeupLock.
374b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     */
375b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    @Test
376b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    public void onResultsUpdatesWakeupLock() {
377f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        // saved config
378f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        WifiConfiguration openNetwork = WifiConfigurationTestUtil
379f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach                .createOpenNetwork(ScanResultUtil.createQuotedSSID(SAVED_SSID));
380f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        openNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
381f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        when(mWifiConfigManager.getSavedNetworks())
382f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach                .thenReturn(Collections.singletonList(openNetwork));
383f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach
384b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        initializeWakeupController(true /* enabled */);
385b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        mWakeupController.start();
386b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
387b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
388b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
389b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
390b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
391b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
392b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
393aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
394aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
395b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
396aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ScanResultMatchInfo expectedMatchInfo = ScanResultMatchInfo.fromScanResult(mTestScanResult);
397b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        verify(mWakeupLock).update(eq(Collections.singleton(expectedMatchInfo)));
398b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    }
399b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
400f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach
401f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach    /**
402f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach     * Verify that onResults filters out unsaved networks when updating the WakeupLock.
403f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach     */
404f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach    @Test
405f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach    public void onResultsUpdatesWakeupLockWithOnlySavedNetworks() {
406f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        // no saved configs
407f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        when(mWifiConfigManager.getSavedNetworks()).thenReturn(Collections.emptyList());
408f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach
409f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        initializeWakeupController(true /* enabled */);
410f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        mWakeupController.start();
411f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach
412f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
413f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
414f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach
415f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
416f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
417f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach
418f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        // incoming scan results
419f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        scanListener.onResults(mTestScanDatas);
420f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach
421f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        verify(mWakeupLock).update(eq(Collections.emptySet()));
422f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach    }
423f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach
424b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    /**
4254f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * Verify that onResults filters out DFS channels.
42612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach     */
42712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    @Test
4284f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void onResultsFiltersOutDfsScanResults() {
42912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
43012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        mWakeupController.start();
43112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
43212d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
43312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
43412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
43512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
43612d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
43712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
43812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        // incoming scan results
439f18cd43a78de639b3680a0e881d90d02ae57decdEric Schwarzenbach        mTestScanResult.frequency = DFS_CHANNEL_FREQ;
44012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
44112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
4424f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock).update(eq(Collections.emptySet()));
44312d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    }
44412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach
44512d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach    /**
446b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     * Verify that the controller searches for viable networks during onResults when WakeupLock is
4474f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach     * unlocked.
448b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach     */
449b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    @Test
4504f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach    public void onResultsSearchesForViableNetworkWhenWakeupLockIsUnlocked() {
4514f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // unlock wakeup lock
4524f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWakeupLock.isUnlocked()).thenReturn(true);
45332152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        // do not find viable network
45432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        when(mWakeupEvaluator.findViableNetwork(any(), any())).thenReturn(null);
45532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
456b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        initializeWakeupController(true /* enabled */);
457b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        mWakeupController.start();
458b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
459b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
460b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
461b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
462b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
463b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
464b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach
465aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
466aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
46732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
468aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupEvaluator).findViableNetwork(any(), any());
46932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verifyDoesNotEnableWifi();
470b6b9c915c200d71da56026d8c3aeec9c243a933aEric Schwarzenbach    }
4719d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4729d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    /**
4735aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach     * Verify that the controller updates the WakeupLock even if the user is not onboarded.
4749d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach     */
4759d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    @Test
4765aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    public void onResultsUpdatesIfNotOnboarded() {
4779d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
4789d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        when(mWakeupOnboarding.isOnboarded()).thenReturn(false);
4795aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        when(mWakeupLock.isUnlocked()).thenReturn(false);
4809d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        mWakeupController.start();
4819d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4829d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
4839d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
4849d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4859d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
4869d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
4879d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
488aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
489aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
4909d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach
4915aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mWakeupLock).update(any());
4925aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mWakeupLock).isUnlocked();
49332152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verifyDoesNotEnableWifi();
49432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    }
49532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
49632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    /**
49732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach     * Verify that the controller enables wifi and notifies user when all criteria are met.
49832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach     */
49932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    @Test
50032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach    public void onResultsEnablesWifi() {
5014f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        // unlock wakeup lock
5024f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        when(mWakeupLock.isUnlocked()).thenReturn(true);
50332152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        // find viable network
504aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        when(mWakeupEvaluator.findViableNetwork(any(), any())).thenReturn(mTestScanResult);
50532152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
50632152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        initializeWakeupController(true /* enabled */);
50732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        mWakeupController.start();
50832152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
50932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
51032152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
51132152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
51232152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
51332152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
51432152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
515aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
516aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
51732152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach
518aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupEvaluator).findViableNetwork(any(), any());
51932152cdeeefb4d8cc9a1137232892e5360ae1f5bEric Schwarzenbach        verify(mWifiSettingsStore).handleWifiToggled(true /* wifiEnabled */);
52012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach        verify(mWifiWakeMetrics).recordWakeupEvent(1 /* numScans */);
5219d60c0ff94757e8862f167f6de54789fe2e1bab2Eric Schwarzenbach    }
522aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
523aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    /**
524aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach     * Verify that the controller will not do any work if the user store has not been read.
525aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach     */
526aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    @Test
527aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    public void controllerDoesNoWorkIfUserStoreIsNotRead() {
528aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        initializeWakeupController(true /* enabled */, false /* isRead */);
529aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        mWakeupController.start();
530aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
531aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        ArgumentCaptor<WifiScanner.ScanListener> scanListenerArgumentCaptor =
532aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach                ArgumentCaptor.forClass(WifiScanner.ScanListener.class);
533aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
534aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWifiScanner).registerScanListener(scanListenerArgumentCaptor.capture());
535aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        WifiScanner.ScanListener scanListener = scanListenerArgumentCaptor.getValue();
536aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
537aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        // incoming scan results
538aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        scanListener.onResults(mTestScanDatas);
539aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach
5404f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).setLock(any());
541aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupLock, never()).update(any());
5424f894bd0f4b378972d10f64390ab710da54d5cc6Eric Schwarzenbach        verify(mWakeupLock, never()).isUnlocked();
543aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupOnboarding, never()).maybeShowNotification();
544aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach        verify(mWakeupEvaluator, never()).findViableNetwork(any(), any());
545aa872c243eb5b27beaefe1360b69a46ceb016b56Eric Schwarzenbach    }
5465aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach
5475aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    @Test
5485aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    public void userIsNotOnboardedByInitialization() {
5495aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
5505aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mWakeupOnboarding, never()).setOnboarded();
5515aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    }
5525aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach
5535aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    @Test
5545aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    public void userIsOnboardedBySettingChange() {
5555aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        initializeWakeupController(true /* enabled */);
5565aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        ArgumentCaptor<ContentObserver> argumentCaptor =
5575aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach                ArgumentCaptor.forClass(ContentObserver.class);
5585aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mFrameworkFacade).registerContentObserver(any(), any(), eq(true),
5595aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach                argumentCaptor.capture());
5605aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        ContentObserver contentObserver = argumentCaptor.getValue();
5615aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        contentObserver.onChange(false /* selfChange */);
5625aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach        verify(mWakeupOnboarding).setOnboarded();
5635aad8ece7e38a80db917d49b5245f6b8c6dca273Eric Schwarzenbach    }
564a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach}
565