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