1d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang/*
2d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * Copyright (C) 2016 The Android Open Source Project
3d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang *
4d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * Licensed under the Apache License, Version 2.0 (the "License");
5d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * you may not use this file except in compliance with the License.
6d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * You may obtain a copy of the License at
7d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang *
8d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang *      http://www.apache.org/licenses/LICENSE-2.0
9d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang *
10d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * Unless required by applicable law or agreed to in writing, software
11d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * distributed under the License is distributed on an "AS IS" BASIS,
12d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * See the License for the specific language governing permissions and
14d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * limitations under the License.
15d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang */
16d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
17d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangpackage com.android.server.wifi;
18d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
19d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport static org.junit.Assert.assertEquals;
20d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport static org.mockito.Mockito.anyString;
210091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wangimport static org.mockito.Mockito.mock;
22d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport static org.mockito.Mockito.times;
23d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport static org.mockito.Mockito.verify;
24d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport static org.mockito.Mockito.when;
25d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
26d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport android.test.suitebuilder.annotation.SmallTest;
27d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
28d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport org.junit.Before;
29d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport org.junit.Test;
30d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport org.mockito.Mock;
31d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport org.mockito.MockitoAnnotations;
32d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
33d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang/**
34d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * Unit tests for {@link com.android.server.wifi.WifiCountryCode}.
35d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang */
36d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang@SmallTest
37d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangpublic class WifiCountryCodeTest {
38d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
39d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private static final String TAG = "WifiCountryCodeTest";
40d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private String mDefaultCountryCode = "US";
41d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private String mTelephonyCountryCode = "JP";
420091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang    private String mPersistCountryCode = "";
43d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private boolean mRevertCountryCodeOnCellularLoss = true;
44d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Mock WifiNative mWifiNative;
45d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private WifiCountryCode mWifiCountryCode;
46d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
47d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
48d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Setup test.
49d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
50d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Before
51d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void setUp() throws Exception {
52d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        MockitoAnnotations.initMocks(this);
53d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
54d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        when(mWifiNative.setCountryCode(anyString())).thenReturn(true);
55d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
560091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode = new WifiCountryCode(
570091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang                mWifiNative,
580091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang                mDefaultCountryCode,
590091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang                mPersistCountryCode,
60d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang                mRevertCountryCodeOnCellularLoss);
61d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
62d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
63d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
64d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we do not receive country code from Telephony.
65d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
66d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
67d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
68d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void useDefaultCountryCode() throws Exception {
69d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant started.
70d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
71d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
72d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
73d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative).setCountryCode(anyString());
7437b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
75d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
76d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
77d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
78d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we receive country code from Telephony before supplicant starts.
79d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
80d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
81d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
82d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void useTelephonyCountryCode() throws Exception {
830091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode, false);
8437b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(null, mWifiCountryCode.getCountryCodeSentToDriver());
85d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant started.
86d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
87d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
88d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
89d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative).setCountryCode(anyString());
9037b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
91d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
92d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
93d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
94d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we receive country code from Telephony after supplicant starts.
95d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
96d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
97d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
98d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void setTelephonyCountryCodeAfterSupplicantStarts() throws Exception {
99d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant starts.
100d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
10137b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
102d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Telephony country code arrives.
1030091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode, false);
104d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
105d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
106d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative, times(2)).setCountryCode(anyString());
10737b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
108d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
109d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
110d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
111d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we receive country code from Telephony after we get L2 connected.
112d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
113d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
114d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
115d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void setTelephonyCountryCodeAfterL2Connected() throws Exception {
116d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant starts.
117d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
118d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
119d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
120d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Telephony country code arrives.
1210091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode, false);
122d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Telephony coutry code won't be applied at this time.
12337b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
124d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
125d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Telephony coutry is applied after supplicant is ready.
126d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative, times(2)).setCountryCode(anyString());
12737b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
128d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
129d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
130d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
131d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we can reset the country code upon sim card is removed.
132d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
133d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
134d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
135d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void resetCountryCodeWhenSIMCardRemoved() throws Exception {
1360091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode, false);
137d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant started.
138d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
139d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
140d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
14137b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
142d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // SIM card is removed.
143d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.simCardRemoved();
144d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Country code restting is not applied yet.
14537b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
146d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
147d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Country code restting is applied when supplicant is ready.
148d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative, times(2)).setCountryCode(anyString());
14937b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
150d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
151d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
152d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
153d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we can reset the country code upon airplane mode is enabled.
154d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
155d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
156d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
157d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void resetCountryCodeWhenAirplaneModeEnabled() throws Exception {
1580091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode, false);
159d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant started.
160d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
161d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
162d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
16337b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
164d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Airplane mode is enabled.
165d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.simCardRemoved();
166d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Country code restting is not applied yet.
16737b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
168d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
169d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Country code restting is applied when supplicant is ready.
170d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative, times(2)).setCountryCode(anyString());
17137b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
172d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
1730091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang
1740091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang    /**
1750091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang     * Test if we will set the persistent country code if it is not empty.
1760091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang     * @throws Exception
1770091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang     */
1780091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang    @Test
1790091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang    public void usePersistentCountryCode() throws Exception {
1800091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        String persistentCountryCode = "CH";
1810091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode = new WifiCountryCode(
1820091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang                mWifiNative,
1830091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang                mDefaultCountryCode,
1840091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang                persistentCountryCode,
1850091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang                mRevertCountryCodeOnCellularLoss);
1860091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        // Supplicant started.
1870091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
1880091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        // Wifi get L2 connected.
1890091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
1900091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        verify(mWifiNative).setCountryCode(anyString());
19137b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(persistentCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
1920091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang    }
193d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang}
194