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