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