blob: 1189dae7b21cec949aef91c5c8dd2de67f4c8f0f [file] [log] [blame]
Amin Shaikh972e2362016-12-07 14:08:09 -08001/*
2 * Copyright (C) 2012 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.server;
18
Jeremy Joslin36d4c482016-12-09 13:11:51 -080019import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT;
20import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE;
Jeremy Joslin823db052016-11-30 15:05:40 -080021import static android.net.NetworkScoreManager.CACHE_FILTER_NONE;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080022
Amin Shaikh972e2362016-12-07 14:08:09 -080023import static junit.framework.Assert.assertEquals;
24import static junit.framework.Assert.assertFalse;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080025import static junit.framework.Assert.assertNotNull;
Jeremy Joslind7670f62017-01-10 13:08:32 -080026import static junit.framework.Assert.assertNull;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080027import static junit.framework.Assert.assertTrue;
Amin Shaikh972e2362016-12-07 14:08:09 -080028import static junit.framework.Assert.fail;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080029
Amin Shaikh972e2362016-12-07 14:08:09 -080030import static org.mockito.Matchers.any;
31import static org.mockito.Matchers.anyInt;
32import static org.mockito.Matchers.anyListOf;
33import static org.mockito.Matchers.anyString;
34import static org.mockito.Matchers.eq;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080035import static org.mockito.Matchers.isA;
Jeremy Joslin823db052016-11-30 15:05:40 -080036import static org.mockito.Mockito.atLeastOnce;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080037import static org.mockito.Mockito.doAnswer;
Amin Shaikh972e2362016-12-07 14:08:09 -080038import static org.mockito.Mockito.doThrow;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080039import static org.mockito.Mockito.mock;
Amin Shaikh972e2362016-12-07 14:08:09 -080040import static org.mockito.Mockito.times;
41import static org.mockito.Mockito.verify;
42import static org.mockito.Mockito.verifyNoMoreInteractions;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080043import static org.mockito.Mockito.verifyZeroInteractions;
Amin Shaikh972e2362016-12-07 14:08:09 -080044import static org.mockito.Mockito.when;
45
46import android.Manifest.permission;
47import android.content.ComponentName;
48import android.content.ContentResolver;
49import android.content.Context;
50import android.content.Intent;
51import android.content.ServiceConnection;
52import android.content.pm.PackageManager;
53import android.content.res.Resources;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080054import android.net.INetworkRecommendationProvider;
Amin Shaikh972e2362016-12-07 14:08:09 -080055import android.net.INetworkScoreCache;
56import android.net.NetworkKey;
Jeremy Joslinb17a5ed2016-12-29 15:00:23 -080057import android.net.NetworkScoreManager;
Amin Shaikh972e2362016-12-07 14:08:09 -080058import android.net.NetworkScorerAppManager;
59import android.net.NetworkScorerAppManager.NetworkScorerAppData;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080060import android.net.RecommendationRequest;
61import android.net.RecommendationResult;
Amin Shaikh972e2362016-12-07 14:08:09 -080062import android.net.ScoredNetwork;
63import android.net.WifiKey;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080064import android.net.wifi.WifiConfiguration;
Jeremy Joslin9b442fa2017-01-09 16:22:20 -080065import android.os.Binder;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080066import android.os.Bundle;
Amin Shaikh972e2362016-12-07 14:08:09 -080067import android.os.IBinder;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080068import android.os.IRemoteCallback;
69import android.os.Looper;
Amin Shaikh972e2362016-12-07 14:08:09 -080070import android.os.RemoteException;
71import android.os.UserHandle;
Amin Shaikh972e2362016-12-07 14:08:09 -080072import android.support.test.InstrumentationRegistry;
73import android.support.test.filters.MediumTest;
74import android.support.test.runner.AndroidJUnit4;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080075
Amin Shaikh972e2362016-12-07 14:08:09 -080076import com.android.server.devicepolicy.MockUtils;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080077
Amin Shaikh972e2362016-12-07 14:08:09 -080078import org.junit.Before;
79import org.junit.Test;
80import org.junit.runner.RunWith;
81import org.mockito.ArgumentCaptor;
82import org.mockito.Captor;
83import org.mockito.Mock;
84import org.mockito.MockitoAnnotations;
Jeremy Joslin36d4c482016-12-09 13:11:51 -080085import org.mockito.invocation.InvocationOnMock;
86import org.mockito.stubbing.Answer;
87
88import java.io.FileDescriptor;
89import java.io.PrintWriter;
90import java.io.StringWriter;
91import java.util.List;
Amin Shaikh972e2362016-12-07 14:08:09 -080092
93/**
94 * Tests for {@link NetworkScoreService}.
95 */
96@RunWith(AndroidJUnit4.class)
97@MediumTest
98public class NetworkScoreServiceTest {
99 private static final ScoredNetwork SCORED_NETWORK =
100 new ScoredNetwork(new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00")),
101 null /* rssiCurve*/);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800102 private static final NetworkScorerAppData NEW_SCORER =
103 new NetworkScorerAppData("newPackageName", 1, "newScoringServiceClass");
Amin Shaikh972e2362016-12-07 14:08:09 -0800104
105 @Mock private PackageManager mPackageManager;
106 @Mock private NetworkScorerAppManager mNetworkScorerAppManager;
107 @Mock private Context mContext;
108 @Mock private Resources mResources;
109 @Mock private INetworkScoreCache.Stub mNetworkScoreCache, mNetworkScoreCache2;
110 @Mock private IBinder mIBinder, mIBinder2;
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800111 @Mock private INetworkRecommendationProvider mRecommendationProvider;
Amin Shaikh972e2362016-12-07 14:08:09 -0800112 @Captor private ArgumentCaptor<List<ScoredNetwork>> mScoredNetworkCaptor;
113
114 private ContentResolver mContentResolver;
115 private NetworkScoreService mNetworkScoreService;
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800116 private RecommendationRequest mRecommendationRequest;
Amin Shaikh972e2362016-12-07 14:08:09 -0800117
118 @Before
119 public void setUp() throws Exception {
120 MockitoAnnotations.initMocks(this);
121 when(mNetworkScoreCache.asBinder()).thenReturn(mIBinder);
122 when(mNetworkScoreCache2.asBinder()).thenReturn(mIBinder2);
123 mContentResolver = InstrumentationRegistry.getContext().getContentResolver();
124 when(mContext.getContentResolver()).thenReturn(mContentResolver);
125 when(mContext.getResources()).thenReturn(mResources);
126 mNetworkScoreService = new NetworkScoreService(mContext, mNetworkScorerAppManager);
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800127 WifiConfiguration configuration = new WifiConfiguration();
Jeremy Joslin29ed4a92016-12-20 14:36:20 -0800128 configuration.SSID = "NetworkScoreServiceTest_SSID";
129 configuration.BSSID = "NetworkScoreServiceTest_BSSID";
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800130 mRecommendationRequest = new RecommendationRequest.Builder()
131 .setCurrentRecommendedWifiConfig(configuration).build();
Amin Shaikh972e2362016-12-07 14:08:09 -0800132 }
133
134 @Test
Amin Shaikh972e2362016-12-07 14:08:09 -0800135 public void testSystemRunning() {
136 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
137
138 mNetworkScoreService.systemRunning();
139
Jeremy Joslinb17a5ed2016-12-29 15:00:23 -0800140 verify(mContext).bindServiceAsUser(MockUtils.checkIntent(
141 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
142 .setComponent(new ComponentName(NEW_SCORER.packageName,
143 NEW_SCORER.recommendationServiceClassName))),
Amin Shaikh972e2362016-12-07 14:08:09 -0800144 any(ServiceConnection.class),
145 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
146 eq(UserHandle.SYSTEM));
147 }
148
149 @Test
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800150 public void testRequestScores_noPermission() throws Exception {
151 doThrow(new SecurityException()).when(mContext)
Jeremy Joslin186f3332017-01-06 14:36:54 -0800152 .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES),
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800153 anyString());
154 try {
155 mNetworkScoreService.requestScores(null);
Jeremy Joslin186f3332017-01-06 14:36:54 -0800156 fail("REQUEST_NETWORK_SCORES not enforced.");
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800157 } catch (SecurityException e) {
158 // expected
159 }
160 }
161
162 @Test
163 public void testRequestScores_providerNotConnected() throws Exception {
164 assertFalse(mNetworkScoreService.requestScores(new NetworkKey[0]));
165 verifyZeroInteractions(mRecommendationProvider);
166 }
167
168 @Test
169 public void testRequestScores_providerThrowsRemoteException() throws Exception {
170 injectProvider();
171 doThrow(new RemoteException()).when(mRecommendationProvider)
172 .requestScores(any(NetworkKey[].class));
173
174 assertFalse(mNetworkScoreService.requestScores(new NetworkKey[0]));
175 }
176
177 @Test
178 public void testRequestScores_providerAvailable() throws Exception {
179 injectProvider();
180
181 final NetworkKey[] networks = new NetworkKey[0];
182 assertTrue(mNetworkScoreService.requestScores(networks));
183 verify(mRecommendationProvider).requestScores(networks);
184 }
185
186 @Test
187 public void testRequestRecommendation_noPermission() throws Exception {
188 doThrow(new SecurityException()).when(mContext)
Jeremy Joslin186f3332017-01-06 14:36:54 -0800189 .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES),
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800190 anyString());
191 try {
192 mNetworkScoreService.requestRecommendation(mRecommendationRequest);
Jeremy Joslin186f3332017-01-06 14:36:54 -0800193 fail("REQUEST_NETWORK_SCORES not enforced.");
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800194 } catch (SecurityException e) {
195 // expected
196 }
197 }
198
199 @Test
200 public void testRequestRecommendation_mainThread() throws Exception {
201 when(mContext.getMainLooper()).thenReturn(Looper.myLooper());
202 try {
203 mNetworkScoreService.requestRecommendation(mRecommendationRequest);
204 fail("requestRecommendation run on main thread.");
205 } catch (RuntimeException e) {
206 // expected
207 }
208 }
209
210 @Test
211 public void testRequestRecommendation_providerNotConnected() throws Exception {
212 when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
213
214 final RecommendationResult result =
215 mNetworkScoreService.requestRecommendation(mRecommendationRequest);
216 assertNotNull(result);
217 assertEquals(mRecommendationRequest.getCurrentSelectedConfig(),
218 result.getWifiConfiguration());
219 }
220
221 @Test
222 public void testRequestRecommendation_providerThrowsRemoteException() throws Exception {
223 injectProvider();
224 when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
225 doThrow(new RemoteException()).when(mRecommendationProvider)
226 .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class),
227 anyInt());
228
229 final RecommendationResult result =
230 mNetworkScoreService.requestRecommendation(mRecommendationRequest);
231 assertNotNull(result);
232 assertEquals(mRecommendationRequest.getCurrentSelectedConfig(),
233 result.getWifiConfiguration());
234 }
235
236 @Test
237 public void testRequestRecommendation_resultReturned() throws Exception {
238 injectProvider();
239 when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
240 final WifiConfiguration wifiConfiguration = new WifiConfiguration();
Amin Shaikh3d18c622016-12-09 17:11:50 -0800241 wifiConfiguration.SSID = "testRequestRecommendation_resultReturned_SSID";
242 wifiConfiguration.BSSID = "testRequestRecommendation_resultReturned_BSSID";
243 final RecommendationResult providerResult = RecommendationResult
244 .createConnectRecommendation(wifiConfiguration);
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800245 final Bundle bundle = new Bundle();
246 bundle.putParcelable(EXTRA_RECOMMENDATION_RESULT, providerResult);
247 doAnswer(invocation -> {
248 bundle.putInt(EXTRA_SEQUENCE, invocation.getArgumentAt(2, int.class));
249 invocation.getArgumentAt(1, IRemoteCallback.class).sendResult(bundle);
250 return null;
251 }).when(mRecommendationProvider)
252 .requestRecommendation(eq(mRecommendationRequest), isA(IRemoteCallback.class),
253 anyInt());
254
255 final RecommendationResult result =
256 mNetworkScoreService.requestRecommendation(mRecommendationRequest);
257 assertNotNull(result);
258 assertEquals(providerResult.getWifiConfiguration().SSID,
259 result.getWifiConfiguration().SSID);
Amin Shaikh3d18c622016-12-09 17:11:50 -0800260 assertEquals(providerResult.getWifiConfiguration().BSSID,
261 result.getWifiConfiguration().BSSID);
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800262 }
263
264 @Test
Amin Shaikh972e2362016-12-07 14:08:09 -0800265 public void testUpdateScores_notActiveScorer() {
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800266 bindToScorer(false /*callerIsScorer*/);
Amin Shaikh972e2362016-12-07 14:08:09 -0800267
268 try {
269 mNetworkScoreService.updateScores(new ScoredNetwork[0]);
270 fail("SecurityException expected");
271 } catch (SecurityException e) {
272 // expected
273 }
274 }
275
276 @Test
277 public void testUpdateScores_oneRegisteredCache() throws RemoteException {
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800278 bindToScorer(true /*callerIsScorer*/);
Amin Shaikh972e2362016-12-07 14:08:09 -0800279
Jeremy Joslin823db052016-11-30 15:05:40 -0800280 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
281 mNetworkScoreCache, CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800282
283 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
284
285 verify(mNetworkScoreCache).updateScores(mScoredNetworkCaptor.capture());
286
287 assertEquals(1, mScoredNetworkCaptor.getValue().size());
288 assertEquals(SCORED_NETWORK, mScoredNetworkCaptor.getValue().get(0));
289 }
290
291 @Test
292 public void testUpdateScores_twoRegisteredCaches() throws RemoteException {
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800293 bindToScorer(true /*callerIsScorer*/);
Amin Shaikh972e2362016-12-07 14:08:09 -0800294
Jeremy Joslin823db052016-11-30 15:05:40 -0800295 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
296 mNetworkScoreCache, CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800297 mNetworkScoreService.registerNetworkScoreCache(
Jeremy Joslin823db052016-11-30 15:05:40 -0800298 NetworkKey.TYPE_WIFI, mNetworkScoreCache2, CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800299
300 // updateScores should update both caches
301 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
302
303 verify(mNetworkScoreCache).updateScores(anyListOf(ScoredNetwork.class));
304 verify(mNetworkScoreCache2).updateScores(anyListOf(ScoredNetwork.class));
305
306 mNetworkScoreService.unregisterNetworkScoreCache(
307 NetworkKey.TYPE_WIFI, mNetworkScoreCache2);
308
309 // updateScores should only update the first cache since the 2nd has been unregistered
310 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
311
312 verify(mNetworkScoreCache, times(2)).updateScores(anyListOf(ScoredNetwork.class));
313
314 mNetworkScoreService.unregisterNetworkScoreCache(
315 NetworkKey.TYPE_WIFI, mNetworkScoreCache);
316
317 // updateScores should not update any caches since they are both unregistered
318 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
319
Jeremy Joslin823db052016-11-30 15:05:40 -0800320 // The register and unregister calls grab the binder from the score cache.
321 verify(mNetworkScoreCache, atLeastOnce()).asBinder();
322 verify(mNetworkScoreCache2, atLeastOnce()).asBinder();
Amin Shaikh972e2362016-12-07 14:08:09 -0800323 verifyNoMoreInteractions(mNetworkScoreCache, mNetworkScoreCache2);
324 }
325
326 @Test
Jeremy Joslin23f1fcd2017-01-10 08:53:02 -0800327 public void testClearScores_notActiveScorer_noRequestNetworkScoresPermission() {
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800328 bindToScorer(false /*callerIsScorer*/);
Jeremy Joslin186f3332017-01-06 14:36:54 -0800329 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
Amin Shaikh972e2362016-12-07 14:08:09 -0800330 .thenReturn(PackageManager.PERMISSION_DENIED);
331 try {
332 mNetworkScoreService.clearScores();
333 fail("SecurityException expected");
334 } catch (SecurityException e) {
335 // expected
336 }
337 }
338
339 @Test
Jeremy Joslin23f1fcd2017-01-10 08:53:02 -0800340 public void testClearScores_activeScorer_noRequestNetworkScoresPermission() {
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800341 bindToScorer(true /*callerIsScorer*/);
Jeremy Joslin186f3332017-01-06 14:36:54 -0800342 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
Amin Shaikh972e2362016-12-07 14:08:09 -0800343 .thenReturn(PackageManager.PERMISSION_DENIED);
344
345 mNetworkScoreService.clearScores();
346 }
347
348 @Test
349 public void testClearScores_activeScorer() throws RemoteException {
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800350 bindToScorer(true /*callerIsScorer*/);
Amin Shaikh972e2362016-12-07 14:08:09 -0800351
Jeremy Joslin823db052016-11-30 15:05:40 -0800352 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
353 CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800354 mNetworkScoreService.clearScores();
355
356 verify(mNetworkScoreCache).clearScores();
357 }
358
359 @Test
Jeremy Joslin23f1fcd2017-01-10 08:53:02 -0800360 public void testClearScores_notActiveScorer_hasRequestNetworkScoresPermission()
Amin Shaikh972e2362016-12-07 14:08:09 -0800361 throws RemoteException {
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800362 bindToScorer(false /*callerIsScorer*/);
Jeremy Joslin186f3332017-01-06 14:36:54 -0800363 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
Amin Shaikh972e2362016-12-07 14:08:09 -0800364 .thenReturn(PackageManager.PERMISSION_GRANTED);
365
Jeremy Joslin823db052016-11-30 15:05:40 -0800366 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
367 CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800368 mNetworkScoreService.clearScores();
369
370 verify(mNetworkScoreCache).clearScores();
371 }
372
373 @Test
374 public void testSetActiveScorer_noScoreNetworksPermission() {
375 doThrow(new SecurityException()).when(mContext)
376 .enforceCallingOrSelfPermission(eq(permission.SCORE_NETWORKS), anyString());
377
378 try {
379 mNetworkScoreService.setActiveScorer(null);
380 fail("SecurityException expected");
381 } catch (SecurityException e) {
382 // expected
383 }
384 }
385
386 @Test
Jeremy Joslin23f1fcd2017-01-10 08:53:02 -0800387 public void testDisableScoring_notActiveScorer_noRequestNetworkScoresPermission() {
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800388 bindToScorer(false /*callerIsScorer*/);
Jeremy Joslin186f3332017-01-06 14:36:54 -0800389 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
Amin Shaikh972e2362016-12-07 14:08:09 -0800390 .thenReturn(PackageManager.PERMISSION_DENIED);
391
392 try {
393 mNetworkScoreService.disableScoring();
394 fail("SecurityException expected");
395 } catch (SecurityException e) {
396 // expected
397 }
Amin Shaikh972e2362016-12-07 14:08:09 -0800398 }
399
400 @Test
Jeremy Joslin23f1fcd2017-01-10 08:53:02 -0800401 public void testRegisterNetworkScoreCache_noRequestNetworkScoresPermission() {
Amin Shaikh972e2362016-12-07 14:08:09 -0800402 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
Jeremy Joslin186f3332017-01-06 14:36:54 -0800403 eq(permission.REQUEST_NETWORK_SCORES), anyString());
Amin Shaikh972e2362016-12-07 14:08:09 -0800404
405 try {
406 mNetworkScoreService.registerNetworkScoreCache(
Jeremy Joslin823db052016-11-30 15:05:40 -0800407 NetworkKey.TYPE_WIFI, mNetworkScoreCache, CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800408 fail("SecurityException expected");
409 } catch (SecurityException e) {
410 // expected
411 }
412 }
413
414 @Test
Jeremy Joslin23f1fcd2017-01-10 08:53:02 -0800415 public void testUnregisterNetworkScoreCache_noRequestNetworkScoresPermission() {
Amin Shaikh972e2362016-12-07 14:08:09 -0800416 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
Jeremy Joslin186f3332017-01-06 14:36:54 -0800417 eq(permission.REQUEST_NETWORK_SCORES), anyString());
Amin Shaikh972e2362016-12-07 14:08:09 -0800418
419 try {
420 mNetworkScoreService.unregisterNetworkScoreCache(
421 NetworkKey.TYPE_WIFI, mNetworkScoreCache);
422 fail("SecurityException expected");
423 } catch (SecurityException e) {
424 // expected
425 }
426 }
427
428 @Test
429 public void testDump_noDumpPermission() {
430 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
431 eq(permission.DUMP), anyString());
432
433 try {
434 mNetworkScoreService.dump(
435 new FileDescriptor(), new PrintWriter(new StringWriter()), new String[0]);
436 fail("SecurityException expected");
437 } catch (SecurityException e) {
438 // expected
439 }
440 }
441
442 @Test
443 public void testDump_doesNotCrash() {
444 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
445 StringWriter stringWriter = new StringWriter();
446
447 mNetworkScoreService.dump(
448 new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
449
450 assertFalse(stringWriter.toString().isEmpty());
451 }
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800452
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800453 @Test
454 public void testIsCallerActiveScorer_noBoundService() throws Exception {
455 mNetworkScoreService.systemRunning();
456
457 assertFalse(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
458 }
459
460 @Test
461 public void testIsCallerActiveScorer_boundServiceIsNotCaller() throws Exception {
462 bindToScorer(false /*callerIsScorer*/);
463
464 assertFalse(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
465 }
466
467 @Test
468 public void testIsCallerActiveScorer_boundServiceIsCaller() throws Exception {
469 bindToScorer(true /*callerIsScorer*/);
470
471 assertTrue(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
472 }
473
Jeremy Joslind7670f62017-01-10 13:08:32 -0800474 @Test
475 public void testGetActiveScorerPackage_notActive() throws Exception {
476 mNetworkScoreService.systemRunning();
477
478 assertNull(mNetworkScoreService.getActiveScorerPackage());
479 }
480
481 @Test
482 public void testGetActiveScorerPackage_active() throws Exception {
483 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
484 mNetworkScoreService.systemRunning();
485
486 assertEquals(NEW_SCORER.packageName, mNetworkScoreService.getActiveScorerPackage());
487 }
488
Jeremy Joslin36d4c482016-12-09 13:11:51 -0800489 // "injects" the mock INetworkRecommendationProvider into the NetworkScoreService.
490 private void injectProvider() {
491 final ComponentName componentName = new ComponentName(NEW_SCORER.packageName,
492 NEW_SCORER.recommendationServiceClassName);
493 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
494 when(mContext.bindServiceAsUser(isA(Intent.class), isA(ServiceConnection.class), anyInt(),
495 isA(UserHandle.class))).thenAnswer(new Answer<Boolean>() {
496 @Override
497 public Boolean answer(InvocationOnMock invocation) throws Throwable {
498 IBinder mockBinder = mock(IBinder.class);
499 when(mockBinder.queryLocalInterface(anyString()))
500 .thenReturn(mRecommendationProvider);
501 invocation.getArgumentAt(1, ServiceConnection.class)
502 .onServiceConnected(componentName, mockBinder);
503 return true;
504 }
505 });
506 mNetworkScoreService.systemRunning();
507 }
Jeremy Joslin9b442fa2017-01-09 16:22:20 -0800508
509 private void bindToScorer(boolean callerIsScorer) {
510 final int callingUid = callerIsScorer ? Binder.getCallingUid() : 0;
511 NetworkScorerAppData appData = new NetworkScorerAppData(NEW_SCORER.packageName,
512 callingUid, NEW_SCORER.recommendationServiceClassName);
513 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(appData);
514 when(mContext.bindServiceAsUser(isA(Intent.class), isA(ServiceConnection.class), anyInt(),
515 isA(UserHandle.class))).thenReturn(true);
516 mNetworkScoreService.systemRunning();
517 }
Amin Shaikh972e2362016-12-07 14:08:09 -0800518}