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