ScanOnlyModeManagerTest.java revision aba32c6808bc33bb9164bdc9bc13461abb0fc9e6
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
1926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport static org.mockito.Mockito.*;
2026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
2126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.net.wifi.IClientInterface;
2226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.os.IBinder;
23aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport android.os.INetworkManagementService;
2426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.os.RemoteException;
25eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport android.os.test.TestLooper;
26eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport android.test.suitebuilder.annotation.SmallTest;
2726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport android.util.Pair;
28eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
29aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport com.android.server.net.BaseNetworkObserver;
30aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
31eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport org.junit.Before;
32eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinimport org.junit.Test;
33aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silbersteinimport org.mockito.ArgumentCaptor;
3426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport org.mockito.Mock;
3526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silbersteinimport org.mockito.MockitoAnnotations;
36eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
37eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein/**
38eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein * Unit tests for {@link ScanOnlyModeManager}.
39eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein */
40eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein@SmallTest
41eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silbersteinpublic class ScanOnlyModeManagerTest {
42eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    private static final String TAG = "ScanOnlyModeManagerTest";
4326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    private static final String TEST_INTERFACE_NAME = "testif0";
44aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    private static final String OTHER_INTERFACE_NAME = "notTestIf";
45eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
46eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    TestLooper mLooper;
47eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
48eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    ScanOnlyModeManager mScanOnlyModeManager;
49aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    BaseNetworkObserver mNetworkObserver;
50eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
5126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Mock IClientInterface mClientInterface;
5226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Mock IBinder mClientInterfaceBinder;
5326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Mock WifiMetrics mWifiMetrics;
5426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Mock WifiNative mWifiNative;
55aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Mock INetworkManagementService mNmService;
56aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
57aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    final ArgumentCaptor<BaseNetworkObserver> mNetworkObserverCaptor =
58aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein            ArgumentCaptor.forClass(BaseNetworkObserver.class);
5926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
60eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Before
61eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    public void setUp() {
6226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        MockitoAnnotations.initMocks(this);
63eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper = new TestLooper();
6426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mClientInterface.asBinder()).thenReturn(mClientInterfaceBinder);
6526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
66eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager = createScanOnlyModeManager();
6726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
68eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
69eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
70eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    private ScanOnlyModeManager createScanOnlyModeManager() {
71aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        return new ScanOnlyModeManager(mLooper.getLooper(), mWifiNative, mNmService, mWifiMetrics);
7226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
7326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
7426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    private void startScanOnlyModeAndVerifyEnabled() throws Exception {
7526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
7626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
7726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
7826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
7926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mScanOnlyModeManager.start();
8026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
8126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
82aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mWifiNative).setupForClientMode(eq(TEST_INTERFACE_NAME));
83aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService).registerObserver(mNetworkObserverCaptor.capture());
84aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver = (BaseNetworkObserver) mNetworkObserverCaptor.getValue();
85aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
86aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        // now mark the interface as up
87aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, true);
88aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
89aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
90aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        // TODO: verify WifiScanner is notified about scan mode being ready
9126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
9226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
9326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
9426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode start sets up an interface in ClientMode for scanning.
9526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
9626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
9726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void scanModeStartCreatesClientInterface() throws Exception {
9826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
99eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
100eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
101eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    /**
10226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode increments failure metrics when failing to setup client mode interface due to hal
10326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * error.
104eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein     */
105eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Test
10626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void detectAndReportErrorWhenSetupForClientModeHalFailure() throws Exception {
10726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
10826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
10926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_FAILURE_HAL, null));
110eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.start();
111eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper.dispatchAll();
11226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
11326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        verify(mWifiMetrics).incrementNumWifiOnFailureDueToHal();
114eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
115eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
116eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    /**
11726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode increments failure metrics when failing to setup client mode interface due to
11826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * wificond error.
119eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein     */
120eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Test
12126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void detectAndReportErrorWhenSetupForClientModeWificondFailure() throws Exception {
12226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
12326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
12426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein              .thenReturn(Pair.create(WifiNative.SETUP_FAILURE_WIFICOND, null));
125eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.start();
12626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
12726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
12826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        verify(mWifiMetrics).incrementNumWifiOnFailureDueToWificond();
12926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
13026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
13126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
13226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode start does not crash when interface creation reports success but returns a null
13326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * interface.
13426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
13526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
13626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void scanModeStartDoesNotCrashWhenClientInterfaceIsNull() throws Exception {
13726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
13826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
13926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, null));
140eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.start();
141eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper.dispatchAll();
142eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
143eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
144eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    /**
14526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode start does not crash when the call to get the interface name throws a
14626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * RemoteException.
147eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein     */
148eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Test
14926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void scanModeStartDoesNotCrashWhenGetClientInterfaceNameThrowsException()
15026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein            throws Exception {
15126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
15226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        doThrow(new RemoteException()).when(mClientInterface).getInterfaceName();
15326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
15426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
155eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.start();
15626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
15726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
15826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
15926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
16026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode start does not crash when the interface name is null.
16126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
16226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
16326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void scanModeStartDoesNotCrashWhenClientInterfaceNameNull() throws Exception {
16426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
16526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mClientInterface.getInterfaceName()).thenReturn(null);
16626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
16726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
16826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mScanOnlyModeManager.start();
16926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
17026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
17126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
17226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
17326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     * ScanMode start does not crash when the interface name is empty.
17426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
17526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
17626db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void scanModeStartDoesNotCrashWhenClientInterfaceNameIsEmpty() throws Exception {
17726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
17826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mClientInterface.getInterfaceName()).thenReturn("");
17926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
18026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
18126db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mScanOnlyModeManager.start();
18226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
18326db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
18426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
18526db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
186aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Calling ScanOnlyModeManager.start twice does not crash or restart scan mode.
18726db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
18826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
189aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanOnlyModeStartCalledTwice() throws Exception {
19026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
191aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        reset(mWifiNative);
192aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.start();
193eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper.dispatchAll();
194aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verifyNoMoreInteractions(mWifiNative);
195eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
196eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein
197eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    /**
198aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * ScanMode stop properly cleans up state
19926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein     */
20026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    @Test
201aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeStopCleansUpState() throws Exception {
20226db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
203aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.stop();
20426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein        mLooper.dispatchAll();
205aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService).unregisterObserver(eq(mNetworkObserver));
206aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
207aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        //TODO: verify proper notification is sent to WifiScanning service
20826db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    }
20926db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein
21026db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    /**
211eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein     * Calling stop when ScanMode is not started should not crash.
212eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein     */
213eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    @Test
21426db2f08784c3a9b48c63110dded3581d65e4b4eRebecca Silberstein    public void scanModeStopWhenNotStartedDoesNotCrash() throws Exception {
215aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
216aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.stop();
217aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
218aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        reset(mNmService);
219aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
220aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        // now call stop again
221eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mScanOnlyModeManager.stop();
222eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein        mLooper.dispatchAll();
223aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        //TODO: add checks for broadcasts indicating scanning is disabled in a follow-on CL
224aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        //TODO: confirm callback is triggered with the scan mode failure.
225aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
226aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
227aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
228aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Triggering interface down when ScanOnlyMode is active properly exits the active state.
229aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
230aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
231aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeStartedStopsWhenInterfaceDown() throws Exception {
232aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
233aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, false);
234aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
235aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService).unregisterObserver(eq(mNetworkObserver));
236aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
237aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
238aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
239aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * This is a basic test that will be enhanced as functionality is added to the class.
240aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Test that failing to register the Networkobserver for the interface does not crash.  Later
241aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * CLs will expand the test to verify proper failure reporting and other error signals.
242aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
243aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
244aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void startScanModeNetworkObserverFailureReportsError() throws Exception {
245aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
246aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        when(mClientInterface.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
247aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        when(mWifiNative.setupForClientMode(eq(TEST_INTERFACE_NAME)))
248aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein                .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface));
249aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        doThrow(new RemoteException()).when(mNmService).registerObserver(any());
250aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
251aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.start();
252aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
253aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService).unregisterObserver(any());
254aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
255aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
256aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
257aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
258aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Triggering interface down for a different interface when ScanOnlyMode is active dows not exit
259aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * the active state.
260aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
261aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
262aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeStartedDoesNotStopForDifferentInterfaceDown() throws Exception {
263aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
264aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver.interfaceLinkStateChanged(OTHER_INTERFACE_NAME, false);
265aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
266aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService, never()).unregisterObserver(eq(mNetworkObserver));
267aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
268aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
269aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
270aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Triggering an interface up for a different interface does not trigger a notification to
271aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Scanning service that ScanOnlyMode is ready.
272aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * This test will be enhanced when the broadcast is added.
273aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
274aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
275aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeStartDoesNotNotifyScanningServiceForDifferentInterfaceUp()
276aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein            throws Exception {
277aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
278aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
279aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        // now mark a different interface as up
280aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mNetworkObserver.interfaceLinkStateChanged(OTHER_INTERFACE_NAME, true);
281aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
282aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
283aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        // TODO: verify WifiScanner is not notified until the proper interface is up
284aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
285aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    }
286aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
287aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    /**
288aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     * Callbacks from an old NetworkObserver do not trigger changes with a current NetworkObserver.
289aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein     */
290aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    @Test
291aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein    public void scanModeNetworkObserverCallbacksOnlyForCurrentObserver() throws Exception {
292aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
293aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        BaseNetworkObserver firstObserver = mNetworkObserver;
294aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mScanOnlyModeManager.stop();
295aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
296aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        reset(mNmService, mClientInterfaceBinder, mWifiNative);
297aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        startScanOnlyModeAndVerifyEnabled();
298aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein
299aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        firstObserver.interfaceLinkStateChanged(TEST_INTERFACE_NAME, false);
300aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        mLooper.dispatchAll();
301aba32c6808bc33bb9164bdc9bc13461abb0fc9e6Rebecca Silberstein        verify(mNmService, never()).unregisterObserver(eq(mNetworkObserver));
302eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein    }
303eb5ac1b8b78b5a7cfd6f37f8183a548b0e98df90Rebecca Silberstein}
304