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;
21d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport static org.mockito.Mockito.times;
22d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport static org.mockito.Mockito.verify;
23d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport static org.mockito.Mockito.when;
24d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
25d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport android.test.suitebuilder.annotation.SmallTest;
26d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
27d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport org.junit.Before;
28d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport org.junit.Test;
29d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport org.mockito.Mock;
30d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangimport org.mockito.MockitoAnnotations;
31d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
32d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang/**
33d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang * Unit tests for {@link com.android.server.wifi.WifiCountryCode}.
34d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang */
35d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang@SmallTest
36d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wangpublic class WifiCountryCodeTest {
37d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
38d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private static final String TAG = "WifiCountryCodeTest";
39d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private String mDefaultCountryCode = "US";
40d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private String mTelephonyCountryCode = "JP";
41d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private boolean mRevertCountryCodeOnCellularLoss = true;
42d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Mock WifiNative mWifiNative;
43d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    private WifiCountryCode mWifiCountryCode;
44d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
45d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
46d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Setup test.
47d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
48d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Before
49d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void setUp() throws Exception {
50d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        MockitoAnnotations.initMocks(this);
51d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
52d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        when(mWifiNative.setCountryCode(anyString())).thenReturn(true);
53d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
540091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang        mWifiCountryCode = new WifiCountryCode(
550091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang                mWifiNative,
560091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang                mDefaultCountryCode,
57d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang                mRevertCountryCodeOnCellularLoss);
58d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
59d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
60d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
61d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we do not receive country code from Telephony.
62d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
63d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
64d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
65d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void useDefaultCountryCode() throws Exception {
66d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant started.
67d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
68d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
69d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
70d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative).setCountryCode(anyString());
7137b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
72d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
73d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
74d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
75d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we receive country code from Telephony before supplicant starts.
76d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
77d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
78d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
79d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void useTelephonyCountryCode() throws Exception {
80586197ab0ed6d1c9d76c7b461a19ab8733ce9b3aNingyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode);
8137b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(null, mWifiCountryCode.getCountryCodeSentToDriver());
82d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant started.
83d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
84d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
85d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
86d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative).setCountryCode(anyString());
8737b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
88d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
89d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
90d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
91d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we receive country code from Telephony after supplicant starts.
92d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
93d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
94d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
95d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void setTelephonyCountryCodeAfterSupplicantStarts() throws Exception {
96d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant starts.
97d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
9837b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
99d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Telephony country code arrives.
100586197ab0ed6d1c9d76c7b461a19ab8733ce9b3aNingyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode);
101d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
102d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
103d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative, times(2)).setCountryCode(anyString());
10437b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
105d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
106d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
107d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
108d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we receive country code from Telephony after we get L2 connected.
109d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
110d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
111d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
112d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void setTelephonyCountryCodeAfterL2Connected() throws Exception {
113d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant starts.
114d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
115d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
116d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
117d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Telephony country code arrives.
118586197ab0ed6d1c9d76c7b461a19ab8733ce9b3aNingyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode);
119d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Telephony coutry code won't be applied at this time.
12037b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
121d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
122d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Telephony coutry is applied after supplicant is ready.
123d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative, times(2)).setCountryCode(anyString());
12437b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
125d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
126d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
127d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
128d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we can reset the country code upon sim card is removed.
129d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
130d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
131d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
132d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void resetCountryCodeWhenSIMCardRemoved() throws Exception {
133586197ab0ed6d1c9d76c7b461a19ab8733ce9b3aNingyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode);
134d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant started.
135d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
136d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
137d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
13837b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
139d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // SIM card is removed.
140d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.simCardRemoved();
141d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Country code restting is not applied yet.
14237b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
143d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
144d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Country code restting is applied when supplicant is ready.
145d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative, times(2)).setCountryCode(anyString());
14637b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
147d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
148d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang
149d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    /**
150d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * Test if we can reset the country code upon airplane mode is enabled.
151d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     * @throws Exception
152d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang     */
153d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    @Test
154d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    public void resetCountryCodeWhenAirplaneModeEnabled() throws Exception {
155586197ab0ed6d1c9d76c7b461a19ab8733ce9b3aNingyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode);
156d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Supplicant started.
157d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
158d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Wifi get L2 connected.
159d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(false);
16037b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
161d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Airplane mode is enabled.
162d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.simCardRemoved();
163d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Country code restting is not applied yet.
16437b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
165d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        mWifiCountryCode.setReadyForChange(true);
166d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        // Country code restting is applied when supplicant is ready.
167d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang        verify(mWifiNative, times(2)).setCountryCode(anyString());
16837b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCodeSentToDriver());
169d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang    }
1705353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang
1715353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang    /**
1725353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang     * Test if we can reset to the default country code when phone is out of service.
1735353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang     * Telephony service calls |setCountryCode| with an empty string when phone is out of service.
1745353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang     * In this case we should fall back to the default country code.
1755353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang     * @throws Exception
1765353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang     */
1775353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang    @Test
1785353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang    public void resetCountryCodeWhenOutOfService() throws Exception {
1795353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCode());
1805353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang        mWifiCountryCode.setCountryCode(mTelephonyCountryCode);
1815353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang        assertEquals(mTelephonyCountryCode, mWifiCountryCode.getCountryCode());
1825353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang        // Out of service.
1835353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang        mWifiCountryCode.setCountryCode("");
1845353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang        assertEquals(mDefaultCountryCode, mWifiCountryCode.getCountryCode());
1855353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang    }
1865353a4413684083df0e8ff2fbd6f5f256731bd28Ningyuan Wang
187d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang}
188