ScanOnlyModeManagerTest.java revision d09f94469f1e130ba4b6a4b48976b13558267ed3
1eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein/*
2eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Copyright 2018 The Android Open Source Project
3eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein *
4eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Licensed under the Apache License, Version 2.0 (the "License");
5eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * you may not use this file except in compliance with the License.
6eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * You may obtain a copy of the License at
7eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein *
8eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein *      http://www.apache.org/licenses/LICENSE-2.0
9eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein *
10eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Unless required by applicable law or agreed to in writing, software
11eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * distributed under the License is distributed on an "AS IS" BASIS,
12eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * See the License for the specific language governing permissions and
14eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * limitations under the License.
15eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */
16eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
17eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinpackage com.android.server.wifi;
18eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
19d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.EXTRA_SCAN_AVAILABLE;
20d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.WIFI_SCAN_AVAILABLE;
21d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.WIFI_STATE_DISABLED;
22d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.WIFI_STATE_ENABLED;
23d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN;
24d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein
25d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport static org.junit.Assert.assertEquals;
2626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport static org.mockito.Mockito.*;
2726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
28d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport android.content.Context;
29d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport android.content.Intent;
3026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.net.wifi.IClientInterface;
3126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.os.IBinder;
32aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport android.os.INetworkManagementService;
3326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.os.RemoteException;
34d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silbersteinimport android.os.UserHandle;
35eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport android.os.test.TestLooper;
36eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport android.test.suitebuilder.annotation.SmallTest;
3726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.util.Pair;
38eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
39aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport com.android.server.net.BaseNetworkObserver;
40aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
41eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport org.junit.Before;
42eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport org.junit.Test;
43aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport org.mockito.ArgumentCaptor;
4426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport org.mockito.Mock;
4526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport org.mockito.MockitoAnnotations;
46eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
47eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein/**
48eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Unit tests for {@link ScanOnlyModeManager}.
49eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */
50eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein@SmallTest
51eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinpublic class ScanOnlyModeManagerTest {
52eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    private static final String TAG = "ScanOnlyModeManagerTest";
5326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    private static final String TEST_INTERFACE_NAME = "testif0";
54aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    private static final String OTHER_INTERFACE_NAME = "notTestIf";
55eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
56eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    TestLooper mLooper;
57eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
58eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    ScanOnlyModeManager mScanOnlyModeManager;
59aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    BaseNetworkObserver mNetworkObserver;
60eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
61d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein    @Mock Context mContext;
6226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Mock IClientInterface mClientInterface;
6326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Mock IBinder mClientInterfaceBinder;
6426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Mock WifiMetrics mWifiMetrics;
6526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Mock WifiNative mWifiNative;
66aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Mock INetworkManagementService mNmService;
679f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein    @Mock ScanOnlyModeManager.Listener mListener;
68d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein    @Mock WifiMonitor mWifiMonitor;
69aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
70aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    final ArgumentCaptor<BaseNetworkObserver> mNetworkObserverCaptor =
71aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein            ArgumentCaptor.forClass(BaseNetworkObserver.class);
7226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
73eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Before
74eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    public void setUp() {
7526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        MockitoAnnotations.initMocks(this);
76eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper = new TestLooper();
7726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mClientInterface.asBinder()).thenReturn(mClientInterfaceBinder);
7826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
79eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager = createScanOnlyModeManager();
8026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
81eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
82eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
83eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    private ScanOnlyModeManager createScanOnlyModeManager() {
849f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        return new ScanOnlyModeManager(mContext, mLooper.getLooper(), mWifiNative, mListener,
85d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein                mNmService, mWifiMetrics, mWifiMonitor);
8626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
8726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
8826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    private void startScanOnlyModeAndVerifyEnabled() throws Exception {
8926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
9026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
9126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
9226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
93d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        when(mWifiNative.enableSupplicant()).thenReturn(true);
9426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mScanOnlyModeManager.start();
9526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
9626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
97aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mWifiNative).setupForClientMode(eq(TEST_INTERFACE_NAME));
98aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService).registerObserver(mNetworkObserverCaptor.capture());
99aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver = (BaseNetworkObserver) mNetworkObserverCaptor.getValue();
100aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
101aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        // now mark the interface as up
102aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, true);
103aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
104aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
105d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
106d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext).sendStickyBroadcastAsUser(intentCaptor.capture(),
107d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein                eq(UserHandle.ALL));
108d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein
109d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_ENABLED);
1109f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_ENABLED);
111d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein    }
112d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein
113d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein    private void checkWifiScanStateChangedBroadcast(Intent intent, int expectedCurrentState) {
114d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        String action = intent.getAction();
115d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        assertEquals(WIFI_SCAN_AVAILABLE, action);
116d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        int currentState = intent.getIntExtra(EXTRA_SCAN_AVAILABLE, WIFI_STATE_UNKNOWN);
117d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        assertEquals(expectedCurrentState, currentState);
11826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
11926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
1209f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein    private void checkWifiStateChangeListenerUpdate(int expectedCurrentState) {
1219f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        verify(mListener).onStateChanged(eq(expectedCurrentState));
1229f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein    }
1239f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein
12426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
12526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode start sets up an interface in ClientMode for scanning.
12626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
12726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
12826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void scanModeStartCreatesClientInterface() throws Exception {
12926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
130eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
131eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
132eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    /**
13326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode increments failure metrics when failing to setup client mode interface due to hal
13426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * error.
135eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein     */
136eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Test
13726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void detectAndReportErrorWhenSetupForClientModeHalFailure() throws Exception {
13826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
13926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
14026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_FAILURE_HAL, null));
141eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.start();
142eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper.dispatchAll();
14326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
14426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        verify(mWifiMetrics).incrementNumWifiOnFailureDueToHal();
145d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
146d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(),
147d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein                eq(UserHandle.ALL));
148d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
1499f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN);
150eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
151eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
152eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    /**
15326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode increments failure metrics when failing to setup client mode interface due to
15426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * wificond error.
155eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein     */
156eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Test
15726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void detectAndReportErrorWhenSetupForClientModeWificondFailure() throws Exception {
15826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
15926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
16026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein              .thenReturn(Pair.create(WifiNative.SETUP_FAILURE_WIFICOND, null));
161eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.start();
16226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
16326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
16426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        verify(mWifiMetrics).incrementNumWifiOnFailureDueToWificond();
165d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
166d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(),
167d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein                eq(UserHandle.ALL));
168d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
1699f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN);
17026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
17126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
17226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
1739f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein     * ScanMode start does not report scan mode as available to WifiScanningService when
1749f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein     * interface creation reports success but returns a null interface.
17526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
17626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
1779f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein    public void scanModeStartDoesNotActivateScannerWhenClientInterfaceIsNull() throws Exception {
17826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
17926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
18026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, null));
181eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.start();
182eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper.dispatchAll();
1839f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein
184d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
185d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(),
186d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein                eq(UserHandle.ALL));
187d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
1889f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN);
189eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
190eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
191eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    /**
1929f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein     * ScanMode start does not report scan mode as available to WifiScanningService
1939f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein     * when the call to get the interface name throws a RemoteException.
194eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein     */
195eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Test
1969f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein    public void scanModeStartDoesNotActivateScannerWhenGetClientInterfaceNameThrowsException()
19726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein            throws Exception {
19826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
19926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        doThrow(new RemoteException()).when(mClientInterface).getInterfaceName();
20026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
20126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
202eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.start();
20326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
2049f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein
205d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
206d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(),
207d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein                eq(UserHandle.ALL));
208d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
2099f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN);
21026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
21126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
21226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
2139f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein     * ScanMode start does not report scan mode as available to WifiScanningService
2149f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein     * when the interface name is null.
21526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
21626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
2179f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein    public void scanModeStartDoesNotActivateScannerWhenClientInterfaceNameNull() throws Exception {
21826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
21926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mClientInterface.getInterfaceName()).thenReturn(null);
22026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
22126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
22226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mScanOnlyModeManager.start();
22326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
2249f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein
2259f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
2269f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(),
2279f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein                eq(UserHandle.ALL));
2289f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
2299f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN);
23026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
23126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
23226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
2339f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein     * ScanMode start does not indicate scanning is available when the interface name is empty.
23426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
23526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
2369f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein    public void scanModeStartDoesNotSendScanningActiveWhenClientInterfaceNameIsEmpty()
2379f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein            throws Exception {
23826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
23926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mClientInterface.getInterfaceName()).thenReturn("");
24026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
24126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
24226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mScanOnlyModeManager.start();
24326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
2449f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein
2459f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
2469f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(),
2479f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein                eq(UserHandle.ALL));
2489f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
2499f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN);
25026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
25126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
25226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
253aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Calling ScanOnlyModeManager.start twice does not crash or restart scan mode.
25426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
25526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
256aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanOnlyModeStartCalledTwice() throws Exception {
25726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
2589f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        reset(mWifiNative, mContext);
259aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.start();
260eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper.dispatchAll();
2619f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        verifyNoMoreInteractions(mWifiNative, mContext);
262eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
263eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
264eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    /**
265aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * ScanMode stop properly cleans up state
26626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
26726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
268aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeStopCleansUpState() throws Exception {
26926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
270d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        reset(mContext);
271aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.stop();
27226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
273aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService).unregisterObserver(eq(mNetworkObserver));
274d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
275d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(intentCaptor.capture(),
276d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein                eq(UserHandle.ALL));
277d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
2789f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_DISABLED);
27926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
28026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
28126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
2829f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein     * Calling stop when ScanMode is not started should not send scan state updates
283eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein     */
284eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Test
2859f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein    public void scanModeStopWhenNotStartedDoesNotUpdateScanStateUpdates() throws Exception {
286aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
287aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.stop();
288aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
2899f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        reset(mNmService, mContext, mListener);
290aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
291aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        // now call stop again
292eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.stop();
293eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper.dispatchAll();
294d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext, never()).sendStickyBroadcastAsUser(any(), any());
2959f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        verify(mListener, never()).onStateChanged(anyInt());
296aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
297aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
298aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
299aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Triggering interface down when ScanOnlyMode is active properly exits the active state.
300aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
301aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
302aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeStartedStopsWhenInterfaceDown() throws Exception {
303aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
304d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        reset(mContext);
305aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, false);
306aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
307aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService).unregisterObserver(eq(mNetworkObserver));
308d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
309d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext).sendStickyBroadcastAsUser(intentCaptor.capture(), eq(UserHandle.ALL));
310d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
3119f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_DISABLED);
312aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
313aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
314aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
315d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein     * Test that failing to start supplicant cleans up any set state and does not proceed to the
316d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein     * active state.
317d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein     */
318d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein    @Test
319d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein    public void startScanModeSupplicantStartFails() throws Exception {
320d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
321d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
322d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
323d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
324d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        when(mWifiNative.enableSupplicant()).thenReturn(false);
325d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein
326d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        mScanOnlyModeManager.start();
327d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        mLooper.dispatchAll();
328d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
329d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        verify(mContext).sendStickyBroadcastAsUser(intentCaptor.capture(), eq(UserHandle.ALL));
330d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
331d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN);
332d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein    }
333d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein
334d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein    /**
335aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * This is a basic test that will be enhanced as functionality is added to the class.
336aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Test that failing to register the Networkobserver for the interface does not crash.  Later
337aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * CLs will expand the test to verify proper failure reporting and other error signals.
338aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
339aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
340aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void startScanModeNetworkObserverFailureReportsError() throws Exception {
341aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
342aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
343aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
344aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
345d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        when(mWifiNative.enableSupplicant()).thenReturn(true);
346aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        doThrow(new RemoteException()).when(mNmService).registerObserver(any());
347aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
348aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.start();
349aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
350aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService).unregisterObserver(any());
351d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        verify(mWifiNative).disableSupplicant();
352d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
353d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        verify(mContext).sendStickyBroadcastAsUser(intentCaptor.capture(), eq(UserHandle.ALL));
354d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        checkWifiScanStateChangedBroadcast(intentCaptor.getValue(), WIFI_STATE_DISABLED);
355d09f94469f1e130ba4b6a4b48976b13558267ed3Rebecca Silberstein        checkWifiStateChangeListenerUpdate(WIFI_STATE_UNKNOWN);
356aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
357aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
358aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
359aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
360aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Triggering interface down for a different interface when ScanOnlyMode is active dows not exit
361aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * the active state.
362aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
363aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
364aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeStartedDoesNotStopForDifferentInterfaceDown() throws Exception {
365aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
3669f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        reset(mContext, mListener);
367aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver.interfaceLinkStateChanged(OTHER_INTERFACE_NAME, false);
368aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
369aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService, never()).unregisterObserver(eq(mNetworkObserver));
370d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext, never()).sendStickyBroadcastAsUser(any(), eq(UserHandle.ALL));
3719f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        verify(mListener, never()).onStateChanged(anyInt());
372aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
373aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
374aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
375aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Triggering an interface up for a different interface does not trigger a notification to
376aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Scanning service that ScanOnlyMode is ready.
377aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * This test will be enhanced when the broadcast is added.
378aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
379aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
380aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeStartDoesNotNotifyScanningServiceForDifferentInterfaceUp()
381aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein            throws Exception {
382aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
3839f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        reset(mContext, mListener);
384aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
385aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        // now mark a different interface as up
386aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver.interfaceLinkStateChanged(OTHER_INTERFACE_NAME, true);
387aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
388aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
389d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext, never()).sendStickyBroadcastAsUser(any(), any());
3909f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        verify(mListener, never()).onStateChanged(anyInt());
391aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
392aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
393aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
394aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Callbacks from an old NetworkObserver do not trigger changes with a current NetworkObserver.
395aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
396aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
397aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeNetworkObserverCallbacksOnlyForCurrentObserver() throws Exception {
398aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
399aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        BaseNetworkObserver firstObserver = mNetworkObserver;
4009f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein
401aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.stop();
402aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
4039f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein
4049f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        reset(mNmService, mWifiNative, mContext, mListener);
405aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
4069f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein
4079f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        // trigger ScanOnlyMode to repeat setup
4089f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        mScanOnlyModeManager.start();
4099f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        mLooper.dispatchAll();
4109f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        verify(mNmService).registerObserver(mNetworkObserverCaptor.capture());
4119f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        mNetworkObserver = (BaseNetworkObserver) mNetworkObserverCaptor.getValue();
4129f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        // now mark the interface as up
4139f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, true);
4149f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        mLooper.dispatchAll();
4159f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein
4169f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        reset(mNmService, mWifiNative, mContext, mListener);
417aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
418aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        firstObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, false);
419aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
420aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService, never()).unregisterObserver(eq(mNetworkObserver));
421d73ee2ef749ecc25bc9de791ecf4462c549ad417Rebecca Silberstein        verify(mContext, never()).sendStickyBroadcastAsUser(any(), any());
4229f82f5e706adffbad03a95cce8399c59898297bbRebecca Silberstein        verify(mListener, never()).onStateChanged(anyInt());
423eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
424eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein}
425