1/* 2 * Copyright 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.internal.telephony; 18 19import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; 20 21import static org.junit.Assert.assertEquals; 22import static org.mockito.Matchers.isNull; 23import static org.mockito.Mockito.doReturn; 24import static org.mockito.Mockito.times; 25import static org.mockito.Mockito.verify; 26 27import android.content.Context; 28import android.net.wifi.WifiManager; 29import android.os.AsyncResult; 30import android.os.HandlerThread; 31import android.telephony.CellIdentityGsm; 32import android.telephony.CellInfoGsm; 33import android.telephony.ServiceState; 34import android.test.suitebuilder.annotation.SmallTest; 35 36import org.junit.After; 37import org.junit.Before; 38import org.junit.Test; 39 40import java.util.Arrays; 41 42public class LocaleTrackerTest extends TelephonyTest { 43 44 private static final String US_MCC = "310"; 45 private static final String FAKE_MNC = "123"; 46 private static final String US_COUNTRY_CODE = "us"; 47 private static final String COUNTRY_CODE_UNAVAILABLE = ""; 48 49 private LocaleTracker mLocaleTracker; 50 private LocaleTrackerTestHandler mLocaleTrackerTestHandler; 51 52 private CellInfoGsm mCellInfo; 53 private WifiManager mWifiManager; 54 55 private class LocaleTrackerTestHandler extends HandlerThread { 56 57 private LocaleTrackerTestHandler(String name) { 58 super(name); 59 } 60 61 @Override 62 public void onLooperPrepared() { 63 mLocaleTracker = new LocaleTracker(mPhone, this.getLooper()); 64 setReady(true); 65 } 66 } 67 68 @Before 69 public void setUp() throws Exception { 70 logd("LocaleTrackerTest +Setup!"); 71 super.setUp(getClass().getSimpleName()); 72 73 // This is a workaround to bypass setting system properties, which causes access violation. 74 doReturn(-1).when(mPhone).getPhoneId(); 75 mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); 76 77 mCellInfo = new CellInfoGsm(); 78 mCellInfo.setCellIdentity(new CellIdentityGsm(Integer.parseInt(US_MCC), 79 Integer.parseInt(FAKE_MNC), 0, 0)); 80 doReturn(Arrays.asList(mCellInfo)).when(mPhone).getAllCellInfo(isNull()); 81 doReturn(true).when(mSST).getDesiredPowerState(); 82 83 mLocaleTrackerTestHandler = new LocaleTrackerTestHandler(getClass().getSimpleName()); 84 mLocaleTrackerTestHandler.start(); 85 waitUntilReady(); 86 logd("LocaleTrackerTest -Setup!"); 87 } 88 89 @After 90 public void tearDown() throws Exception { 91 mLocaleTracker.removeCallbacksAndMessages(null); 92 mLocaleTrackerTestHandler.quit(); 93 super.tearDown(); 94 } 95 96 @Test 97 @SmallTest 98 public void testUpdateOperatorNumericSync() throws Exception { 99 mLocaleTracker.updateOperatorNumericSync(US_MCC + FAKE_MNC); 100 assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); 101 verify(mWifiManager).setCountryCode(US_COUNTRY_CODE); 102 } 103 104 @Test 105 @SmallTest 106 public void testUpdateOperatorNumericAsync() throws Exception { 107 mLocaleTracker.updateOperatorNumericAsync(US_MCC + FAKE_MNC); 108 waitForMs(100); 109 assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); 110 verify(mWifiManager).setCountryCode(US_COUNTRY_CODE); 111 } 112 113 @Test 114 @SmallTest 115 public void testNoSim() throws Exception { 116 mLocaleTracker.updateOperatorNumericAsync(""); 117 waitForHandlerAction(mLocaleTracker, 100); 118 assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); 119 verify(mWifiManager).setCountryCode(US_COUNTRY_CODE); 120 } 121 122 @Test 123 @SmallTest 124 public void testBootupInAirplaneModeOn() throws Exception { 125 doReturn(false).when(mSST).getDesiredPowerState(); 126 mLocaleTracker.updateOperatorNumericAsync(""); 127 waitForHandlerAction(mLocaleTracker, 100); 128 assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); 129 verify(mWifiManager).setCountryCode(COUNTRY_CODE_UNAVAILABLE); 130 } 131 132 @Test 133 @SmallTest 134 public void testTogglingAirplaneMode() throws Exception { 135 mLocaleTracker.updateOperatorNumericSync(US_MCC + FAKE_MNC); 136 assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); 137 verify(mWifiManager).setCountryCode(US_COUNTRY_CODE); 138 139 doReturn(false).when(mSST).getDesiredPowerState(); 140 mLocaleTracker.updateOperatorNumericAsync(""); 141 waitForHandlerAction(mLocaleTracker, 100); 142 assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); 143 verify(mWifiManager).setCountryCode(COUNTRY_CODE_UNAVAILABLE); 144 145 doReturn(true).when(mSST).getDesiredPowerState(); 146 mLocaleTracker.updateOperatorNumericSync(US_MCC + FAKE_MNC); 147 assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); 148 verify(mWifiManager, times(2)).setCountryCode(US_COUNTRY_CODE); 149 } 150 151 @Test 152 @SmallTest 153 public void testCellInfoUnavailableRetry() throws Exception { 154 doReturn(null).when(mPhone).getAllCellInfo(isNull()); 155 mLocaleTracker.updateOperatorNumericAsync(""); 156 waitForHandlerAction(mLocaleTracker, 100); 157 assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); 158 verify(mWifiManager).setCountryCode(COUNTRY_CODE_UNAVAILABLE); 159 160 doReturn(Arrays.asList(mCellInfo)).when(mPhone).getAllCellInfo(isNull()); 161 waitForHandlerActionDelayed(mLocaleTracker, 100, 2500); 162 assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); 163 verify(mWifiManager).setCountryCode(US_COUNTRY_CODE); 164 } 165 166 @Test 167 @SmallTest 168 public void testOutOfAirplaneMode() throws Exception { 169 doReturn(null).when(mPhone).getAllCellInfo(isNull()); 170 mLocaleTracker.updateOperatorNumericAsync(""); 171 waitForHandlerAction(mLocaleTracker, 100); 172 assertEquals(COUNTRY_CODE_UNAVAILABLE, mLocaleTracker.getCurrentCountry()); 173 verify(mWifiManager).setCountryCode(COUNTRY_CODE_UNAVAILABLE); 174 175 doReturn(Arrays.asList(mCellInfo)).when(mPhone).getAllCellInfo(isNull()); 176 ServiceState ss = new ServiceState(); 177 ss.setState(ServiceState.STATE_IN_SERVICE); 178 AsyncResult ar = new AsyncResult(null, ss, null); 179 mLocaleTracker.sendMessage(mLocaleTracker.obtainMessage(3, ar)); 180 waitForHandlerAction(mLocaleTracker, 100); 181 assertEquals(US_COUNTRY_CODE, mLocaleTracker.getCurrentCountry()); 182 verify(mWifiManager).setCountryCode(US_COUNTRY_CODE); 183 } 184} 185