1e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu/*
2e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * Copyright (C) 2016 The Android Open Source Project
3e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu *
4e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
5e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * you may not use this file except in compliance with the License.
6e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * You may obtain a copy of the License at
7e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu *
8e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu *      http://www.apache.org/licenses/LICENSE-2.0
9e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu *
10e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * Unless required by applicable law or agreed to in writing, software
11e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
12e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * See the License for the specific language governing permissions and
14e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu * limitations under the License.
15e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu */
16e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
17e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiupackage com.android.server.wifi;
18e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
19e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.any;
20e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.anyInt;
21e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.eq;
22e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.inOrder;
23e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.never;
24e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.verify;
25e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport static org.mockito.Mockito.when;
26e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
27e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.content.BroadcastReceiver;
28e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.content.Context;
29e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.content.IntentFilter;
30e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.ConnectivityManager;
31e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.InterfaceConfiguration;
32e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.wifi.WifiConfiguration;
33e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.net.wifi.WifiManager;
34e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.os.INetworkManagementService;
35e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport android.test.suitebuilder.annotation.SmallTest;
36e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
37e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.junit.Before;
38e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.junit.Test;
39e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.ArgumentCaptor;
40e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.InOrder;
41e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.Mock;
42e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport org.mockito.MockitoAnnotations;
43e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
44e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport java.util.ArrayList;
45e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport java.util.Arrays;
46e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiuimport java.util.Locale;
47e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
48be40e20f6995d9d11c8270502120a07785dde270Daniel Erat/** Unit tests for {@link SoftApManager}. */
49e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu@SmallTest
50e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiupublic class SoftApManagerTest {
51e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
52e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    private static final String TAG = "SoftApManagerTest";
53e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
54e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    private static final String TEST_INTERFACE_NAME = "TestInterface";
55e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    private static final String TEST_COUNTRY_CODE = "TestCountry";
56e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    private static final Integer[] ALLOWED_2G_CHANNELS = {1, 2, 3, 4};
57e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    private static final String[] AVAILABLE_DEVICES = { TEST_INTERFACE_NAME };
58e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
59e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    private final ArrayList<Integer> mAllowed2GChannels =
60e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu            new ArrayList<Integer>(Arrays.asList(ALLOWED_2G_CHANNELS));
61e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
62e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    MockLooper mLooper;
63e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    @Mock Context mContext;
64e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    @Mock WifiNative mWifiNative;
65e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    @Mock INetworkManagementService mNmService;
66e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    @Mock ConnectivityManager mConnectivityManager;
67e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    @Mock SoftApManager.Listener mListener;
68be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    @Mock InterfaceConfiguration mInterfaceConfiguration;
69e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
70e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    SoftApManager mSoftApManager;
71e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
72be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    /** Sets up test. */
73e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    @Before
74e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    public void setUp() throws Exception {
75e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        MockitoAnnotations.initMocks(this);
76e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        mLooper = new MockLooper();
77e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
78e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        when(mWifiNative.getInterfaceName()).thenReturn(TEST_INTERFACE_NAME);
79be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        when(mNmService.getInterfaceConfig(TEST_INTERFACE_NAME))
80be40e20f6995d9d11c8270502120a07785dde270Daniel Erat                .thenReturn(mInterfaceConfiguration);
81be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        when(mConnectivityManager.getTetherableWifiRegexs())
82be40e20f6995d9d11c8270502120a07785dde270Daniel Erat                .thenReturn(AVAILABLE_DEVICES);
83be40e20f6995d9d11c8270502120a07785dde270Daniel Erat
84d9c55738e1bb2ff3faee24c5434453352a9e6611Christopher Wiley        mSoftApManager = new SoftApManager(mLooper.getLooper(),
85e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu                                           mWifiNative,
86e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu                                           mNmService,
87e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu                                           TEST_COUNTRY_CODE,
88e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu                                           mAllowed2GChannels,
89e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu                                           mListener);
90e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
91e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        mLooper.dispatchAll();
92e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    }
93e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
94be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    /** Verifies startSoftAp will fail if AP configuration is not provided. */
95e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    @Test
96e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    public void startSoftApWithoutConfig() throws Exception {
97e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        InOrder order = inOrder(mListener);
98e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
99e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        mSoftApManager.start(null);
100e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        mLooper.dispatchAll();
101e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
102e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_ENABLING, 0);
103e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        order.verify(mListener).onStateChanged(
104e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu                WifiManager.WIFI_AP_STATE_FAILED, WifiManager.SAP_START_FAILURE_GENERAL);
105e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    }
106e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
107be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    /** Tests the handling of stop command when soft AP is not started. */
108e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    @Test
109e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    public void stopWhenNotStarted() throws Exception {
110e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        mSoftApManager.stop();
111e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        mLooper.dispatchAll();
112e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        /* Verify no state changes. */
113e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        verify(mListener, never()).onStateChanged(anyInt(), anyInt());
114e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    }
115e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
116be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    /** Tests the handling of stop command when soft AP is started. */
117e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    @Test
118e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    public void stopWhenStarted() throws Exception {
119be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        startSoftApAndVerifyEnabled();
120e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
121e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        InOrder order = inOrder(mListener);
122e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
123e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        mSoftApManager.stop();
124e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        mLooper.dispatchAll();
125e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu
126e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        verify(mNmService).stopAccessPoint(TEST_INTERFACE_NAME);
127e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLING, 0);
128e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu        order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLED, 0);
129e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu    }
130be40e20f6995d9d11c8270502120a07785dde270Daniel Erat
131be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    /** Starts soft AP and verifies that it is enabled successfully. */
132be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    protected void startSoftApAndVerifyEnabled() throws Exception {
133be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        InOrder order = inOrder(mListener);
134be40e20f6995d9d11c8270502120a07785dde270Daniel Erat
135be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        /**
136be40e20f6995d9d11c8270502120a07785dde270Daniel Erat         *  Only test the default configuration. Testing for different configurations
137be40e20f6995d9d11c8270502120a07785dde270Daniel Erat         *  are taken care of by ApConfigUtilTest.
138be40e20f6995d9d11c8270502120a07785dde270Daniel Erat         */
139be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        WifiConfiguration config = new WifiConfiguration();
140be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        config.apBand = WifiConfiguration.AP_BAND_2GHZ;
141be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        when(mWifiNative.isHalStarted()).thenReturn(false);
142be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        when(mWifiNative.setCountryCodeHal(TEST_COUNTRY_CODE.toUpperCase(Locale.ROOT)))
143be40e20f6995d9d11c8270502120a07785dde270Daniel Erat                .thenReturn(true);
144be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        mSoftApManager.start(config);
145be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        mLooper.dispatchAll();
146be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        verify(mNmService).startAccessPoint(
147be40e20f6995d9d11c8270502120a07785dde270Daniel Erat                any(WifiConfiguration.class), eq(TEST_INTERFACE_NAME));
148be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_ENABLING, 0);
149be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        order.verify(mListener).onStateChanged(WifiManager.WIFI_AP_STATE_ENABLED, 0);
150be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    }
151be40e20f6995d9d11c8270502120a07785dde270Daniel Erat
152be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    /** Verifies that soft AP was not disabled. */
153be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    protected void verifySoftApNotDisabled() throws Exception {
154be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        verify(mListener, never()).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLING, 0);
155be40e20f6995d9d11c8270502120a07785dde270Daniel Erat        verify(mListener, never()).onStateChanged(WifiManager.WIFI_AP_STATE_DISABLED, 0);
156be40e20f6995d9d11c8270502120a07785dde270Daniel Erat    }
157e5b93fbfe451bc57c07b3f72191b52b6bd237d5bPeter Qiu}
158