1f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein/* 2f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * Copyright (C) 2016 The Android Open Source Project 3f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * 4f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * Licensed under the Apache License, Version 2.0 (the "License"); 5f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * you may not use this file except in compliance with the License. 6f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * You may obtain a copy of the License at 7f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * 8f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * http://www.apache.org/licenses/LICENSE-2.0 9f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * 10f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * Unless required by applicable law or agreed to in writing, software 11f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * distributed under the License is distributed on an "AS IS" BASIS, 12f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * See the License for the specific language governing permissions and 14f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * limitations under the License. 15f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein */ 16f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 17f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinpackage com.android.settings; 18f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 19f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static org.junit.Assert.*; 20f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static org.mockito.Matchers.*; 21f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static org.mockito.Mockito.verify; 22f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static org.mockito.Mockito.when; 23f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.EXTRA_ADD_TETHER_TYPE; 24f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.EXTRA_PROVISION_CALLBACK; 25f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.EXTRA_REM_TETHER_TYPE; 26f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.EXTRA_RUN_PROVISION; 27f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.EXTRA_SET_ALARM; 28f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.TETHERING_BLUETOOTH; 29f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.TETHERING_INVALID; 30f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.TETHERING_USB; 31f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.TETHERING_WIFI; 32f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR; 33f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport static android.net.ConnectivityManager.TETHER_ERROR_PROVISION_FAILED; 34f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 35f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.app.Activity; 36f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.app.AlarmManager; 37f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.app.PendingIntent; 38f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.content.BroadcastReceiver; 39f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.content.Context; 40f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.content.ContextWrapper; 41f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.content.Intent; 42f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.content.IntentFilter; 43f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.content.SharedPreferences; 44f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.content.SharedPreferences.Editor; 45f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.content.res.Resources; 46f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.net.ConnectivityManager; 47f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.net.wifi.WifiConfiguration; 48f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.net.wifi.WifiManager; 49f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.os.Bundle; 50f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.os.ResultReceiver; 51f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.os.SystemClock; 52f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.test.ServiceTestCase; 53f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.test.mock.MockResources; 54f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport android.util.Log; 55f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 56f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport com.android.settings.TetherService; 57f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 58f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport org.mockito.ArgumentCaptor; 59f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport org.mockito.Captor; 60f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport org.mockito.Mock; 61f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport org.mockito.MockitoAnnotations; 62f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 63f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinimport java.lang.ref.WeakReference; 64f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 65f6b6713d7717998a60f767b274386f701cde1593Jeremy Kleinpublic class TetherServiceTest extends ServiceTestCase<TetherService> { 66f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 67f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static final String TAG = "TetherServiceTest"; 68f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static final String TEST_RESPONSE_ACTION = "testProvisioningResponseAction"; 69f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static final String TEST_NO_UI_ACTION = "testNoUiProvisioningRequestAction"; 70f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static final int BOGUS_RECEIVER_RESULT = -5; 71f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static final int TEST_CHECK_PERIOD = 100; 72f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static final int MS_PER_HOUR = 60 * 60 * 1000; 73f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static final int SHORT_TIMEOUT = 100; 74f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static final int PROVISION_TIMEOUT = 1000; 75f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 76f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private TetherService mService; 77f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private MockResources mResources; 78f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein int mLastReceiverResultCode = BOGUS_RECEIVER_RESULT; 79f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private int mLastTetherRequestType = TETHERING_INVALID; 80f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private int mProvisionResponse = BOGUS_RECEIVER_RESULT; 81f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private ProvisionReceiver mProvisionReceiver; 82f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private Receiver mResultReceiver; 83f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 84f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Mock private AlarmManager mAlarmManager; 85f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Mock private ConnectivityManager mConnectivityManager; 86f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Mock private WifiManager mWifiManager; 87f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Mock private SharedPreferences mPrefs; 88f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Mock private Editor mPrefEditor; 89f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Captor private ArgumentCaptor<PendingIntent> mPiCaptor; 90f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Captor private ArgumentCaptor<String> mStoredTypes; 91f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 92f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public TetherServiceTest() { 93f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein super(TetherService.class); 94f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 95f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 96f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Override 97f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein protected void setUp() throws Exception { 98f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein super.setUp(); 99f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein MockitoAnnotations.initMocks(this); 100f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 101f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mResources = new MockResources(); 102f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mContext = new TestContextWrapper(getContext()); 103f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein setContext(mContext); 104f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 105f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mResultReceiver = new Receiver(this); 106f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mLastReceiverResultCode = BOGUS_RECEIVER_RESULT; 107f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mProvisionResponse = Activity.RESULT_OK; 108f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mProvisionReceiver = new ProvisionReceiver(); 109f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein IntentFilter filter = new IntentFilter(TEST_NO_UI_ACTION); 110f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein filter.addCategory(Intent.CATEGORY_DEFAULT); 111f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mContext.registerReceiver(mProvisionReceiver, filter); 112f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 113f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein final String CURRENT_TYPES = "currentTethers"; 114f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein when(mPrefs.getString(CURRENT_TYPES, "")).thenReturn(""); 115f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein when(mPrefs.edit()).thenReturn(mPrefEditor); 116f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein when(mPrefEditor.putString(eq(CURRENT_TYPES), mStoredTypes.capture())).thenReturn( 117f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mPrefEditor); 118f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 119f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 120f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Override 121f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein protected void tearDown() throws Exception { 122f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mContext.unregisterReceiver(mProvisionReceiver); 123f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein super.tearDown(); 124f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 125f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 126f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private void cancelAllProvisioning() { 127f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein int[] types = new int[]{TETHERING_BLUETOOTH, TETHERING_WIFI, TETHERING_USB}; 128f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein for (int type : types) { 129f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein Intent intent = new Intent(); 130f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein intent.putExtra(EXTRA_REM_TETHER_TYPE, type); 131f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein startService(intent); 132f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 133f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 134f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 135f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public void testStartForProvision() { 136f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein runProvisioningForType(TETHERING_WIFI); 137f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 138f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionRequest(TETHERING_WIFI)); 139f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionResponse(TETHER_ERROR_NO_ERROR)); 140f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 141f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 142f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public void testScheduleRechecks() { 143f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein Intent intent = new Intent(); 144f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein intent.putExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_WIFI); 145f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein intent.putExtra(EXTRA_SET_ALARM, true); 146f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein startService(intent); 147f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 148f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein long period = TEST_CHECK_PERIOD * MS_PER_HOUR; 149f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein verify(mAlarmManager).setRepeating(eq(AlarmManager.ELAPSED_REALTIME), anyLong(), 150f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein eq(period), mPiCaptor.capture()); 151f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein PendingIntent pi = mPiCaptor.getValue(); 152f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertEquals(TetherService.class.getName(), pi.getIntent().getComponent().getClassName()); 153f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 154f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 155f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public void testStartMultiple() { 156f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein runProvisioningForType(TETHERING_WIFI); 157f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 158f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionRequest(TETHERING_WIFI)); 159f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionResponse(TETHER_ERROR_NO_ERROR)); 160f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 161f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein runProvisioningForType(TETHERING_USB); 162f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 163f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionRequest(TETHERING_USB)); 164f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionResponse(TETHER_ERROR_NO_ERROR)); 165f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 166f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein runProvisioningForType(TETHERING_BLUETOOTH); 167f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 168f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionRequest(TETHERING_BLUETOOTH)); 169f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionResponse(TETHER_ERROR_NO_ERROR)); 170f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 171f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 172f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public void testPersistTypes() { 173f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein runProvisioningForType(TETHERING_WIFI); 174f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 175f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein waitForProvisionRequest(TETHERING_WIFI); 176f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein waitForProvisionResponse(TETHER_ERROR_NO_ERROR); 177f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 178f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein runProvisioningForType(TETHERING_BLUETOOTH); 179f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 180f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein waitForProvisionRequest(TETHERING_BLUETOOTH); 181f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein waitForProvisionResponse(TETHER_ERROR_NO_ERROR); 182f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 183f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein shutdownService(); 184f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertEquals(TETHERING_WIFI + "," + TETHERING_BLUETOOTH, mStoredTypes.getValue()); 185f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 186f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 187f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public void testFailureStopsTethering_Wifi() { 188f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mProvisionResponse = Activity.RESULT_CANCELED; 189f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 190f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein runProvisioningForType(TETHERING_WIFI); 191f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 192f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionRequest(TETHERING_WIFI)); 193f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionResponse(TETHER_ERROR_PROVISION_FAILED)); 194f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 195f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein verify(mWifiManager).setWifiApEnabled(isNull(WifiConfiguration.class), eq(false)); 196f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 197f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 198f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public void testFailureStopsTethering_Usb() { 199f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mProvisionResponse = Activity.RESULT_CANCELED; 200f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 201f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein runProvisioningForType(TETHERING_USB); 202f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 203f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionRequest(TETHERING_USB)); 204f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionResponse(TETHER_ERROR_PROVISION_FAILED)); 205f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 206f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein verify(mConnectivityManager).setUsbTethering(eq(false)); 207f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 208f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 209f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public void testCancelAlarm() { 210f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein runProvisioningForType(TETHERING_WIFI); 211f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 212f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionRequest(TETHERING_WIFI)); 213f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertTrue(waitForProvisionResponse(TETHER_ERROR_NO_ERROR)); 214f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 215f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein Intent intent = new Intent(); 216f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein intent.putExtra(EXTRA_REM_TETHER_TYPE, TETHERING_WIFI); 217f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein startService(intent); 218f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 219f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein verify(mAlarmManager).cancel(mPiCaptor.capture()); 220f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein PendingIntent pi = mPiCaptor.getValue(); 221f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein assertEquals(TetherService.class.getName(), pi.getIntent().getComponent().getClassName()); 222f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 223f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 224f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private void runProvisioningForType(int type) { 225f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein Intent intent = new Intent(); 226f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein intent.putExtra(EXTRA_ADD_TETHER_TYPE, type); 227f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein intent.putExtra(EXTRA_RUN_PROVISION, true); 228f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein intent.putExtra(EXTRA_PROVISION_CALLBACK, mResultReceiver); 229f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein startService(intent); 230f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 231f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 232f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private boolean waitForProvisionRequest(int expectedType) { 233f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein long startTime = SystemClock.uptimeMillis(); 234f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein while (true) { 235f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein if (mLastTetherRequestType == expectedType) { 236f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mLastTetherRequestType = -1; 237f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return true; 238f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 239f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein if ((SystemClock.uptimeMillis() - startTime) > PROVISION_TIMEOUT) { 240f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein Log.v(TAG, String.format( 241f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein "waitForProvisionRequest timeout: expected=%d, actual=%d", 242f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein expectedType, mLastTetherRequestType)); 243f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return false; 244f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 245f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein SystemClock.sleep(SHORT_TIMEOUT); 246f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 247f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 248f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 249f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private boolean waitForProvisionResponse(int expectedValue) { 250f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein long startTime = SystemClock.uptimeMillis(); 251f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein while (true) { 252f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein if (mLastReceiverResultCode == expectedValue) { 253f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mLastReceiverResultCode = BOGUS_RECEIVER_RESULT; 254f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return true; 255f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 256f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein if ((SystemClock.uptimeMillis() - startTime) > PROVISION_TIMEOUT) { 257f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein Log.v(TAG, String.format( 258f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein "waitForProvisionResponse timeout: expected=%d, actual=%d", 259f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein expectedValue, mLastReceiverResultCode)); 260f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return false; 261f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 262f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein SystemClock.sleep(SHORT_TIMEOUT); 263f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 264f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 265f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 266f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static class MockResources extends android.test.mock.MockResources { 267f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Override 268f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public int getInteger(int id) { 269f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein switch(id) { 270f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein case com.android.internal.R.integer.config_mobile_hotspot_provision_check_period: 271f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return TEST_CHECK_PERIOD; 272f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein default: 273f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return 0; 274f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 275f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 276f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 277f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Override 278f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public String getString(int id) { 279f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein switch(id) { 280f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein case com.android.internal.R.string.config_mobile_hotspot_provision_response: 281f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return TEST_RESPONSE_ACTION; 282f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein case com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui: 283f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return TEST_NO_UI_ACTION; 284f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein default: 285f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return null; 286f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 287f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 288f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 289f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 290f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private class TestContextWrapper extends ContextWrapper { 291f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 292f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public TestContextWrapper(Context base) { 293f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein super(base); 294f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 295f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 296f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Override 297f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public Resources getResources() { 298f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return mResources; 299f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 300f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 301f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Override 302f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public SharedPreferences getSharedPreferences(String name, int mode) { 303f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein // Stub out prefs to control the persisted tether type list. 304f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein if (name == "tetherPrefs") { 305f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return mPrefs; 306f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 307f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return super.getSharedPreferences(name, mode); 308f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 309f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 310f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Override 311f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public Object getSystemService(String name) { 312f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein if (ALARM_SERVICE.equals(name)) { 313f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return mAlarmManager; 314f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } else if (CONNECTIVITY_SERVICE.equals(name)) { 315f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return mConnectivityManager; 316f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } else if (WIFI_SERVICE.equals(name)) { 317f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return mWifiManager; 318f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 319f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 320f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein return super.getSystemService(name); 321f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 322f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 323f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 324f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private static final class Receiver extends ResultReceiver { 325f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein final WeakReference<TetherServiceTest> mTest; 326f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 327f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein Receiver(TetherServiceTest test) { 328f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein super(null); 329f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mTest = new WeakReference<TetherServiceTest>(test); 330f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 331f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 332f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Override 333f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein protected void onReceiveResult(int resultCode, Bundle resultData) { 334f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein TetherServiceTest test = mTest.get(); 335f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein if (test != null) { 336f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein test.mLastReceiverResultCode = resultCode; 337f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 338f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 339f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein }; 340f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 341f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein /** 342f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein * Stubs out the provisioning app receiver. 343f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein */ 344f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private class ProvisionReceiver extends BroadcastReceiver { 345f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein @Override 346f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein public void onReceive(Context context, Intent intent) { 347f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein mLastTetherRequestType = intent.getIntExtra("TETHER_TYPE", TETHERING_INVALID); 348f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein sendResponse(mProvisionResponse, context); 349f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 350f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein 351f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein private void sendResponse(int response, Context context) { 352f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein Intent responseIntent = new Intent(TEST_RESPONSE_ACTION); 353f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein responseIntent.putExtra(TetherService.EXTRA_RESULT, response); 354f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein context.sendBroadcast( 355f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein responseIntent, android.Manifest.permission.CONNECTIVITY_INTERNAL); 356f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 357f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein } 358f6b6713d7717998a60f767b274386f701cde1593Jeremy Klein} 359