blob: 3b7db9f7301032a3af12d10c4656d994799cd304 [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 Joslinc5ac5872016-11-30 15:05:40 -080019import static android.net.NetworkScoreManager.CACHE_FILTER_NONE;
Jeremy Joslin145c3432016-12-09 13:11:51 -080020
Amin Shaikh972e2362016-12-07 14:08:09 -080021import static junit.framework.Assert.assertEquals;
22import static junit.framework.Assert.assertFalse;
Jeremy Joslin145c3432016-12-09 13:11:51 -080023import static junit.framework.Assert.assertTrue;
Amin Shaikh972e2362016-12-07 14:08:09 -080024import static junit.framework.Assert.fail;
Jeremy Joslin145c3432016-12-09 13:11:51 -080025
Amin Shaikh972e2362016-12-07 14:08:09 -080026import static org.mockito.Matchers.any;
Amin Shaikh972e2362016-12-07 14:08:09 -080027import static org.mockito.Matchers.anyListOf;
28import static org.mockito.Matchers.anyString;
29import static org.mockito.Matchers.eq;
Jeremy Joslinc5ac5872016-11-30 15:05:40 -080030import static org.mockito.Mockito.atLeastOnce;
Amin Shaikh972e2362016-12-07 14:08:09 -080031import static org.mockito.Mockito.doThrow;
Jeremy Joslin1e2595d2017-04-05 14:50:32 -070032import static org.mockito.Mockito.never;
Amin Shaikh972e2362016-12-07 14:08:09 -080033import static org.mockito.Mockito.times;
34import static org.mockito.Mockito.verify;
35import static org.mockito.Mockito.verifyNoMoreInteractions;
Jeremy Joslin145c3432016-12-09 13:11:51 -080036import static org.mockito.Mockito.verifyZeroInteractions;
Amin Shaikh972e2362016-12-07 14:08:09 -080037import static org.mockito.Mockito.when;
38
39import android.Manifest.permission;
40import android.content.ComponentName;
41import android.content.ContentResolver;
42import android.content.Context;
43import android.content.Intent;
Amin Shaikh972e2362016-12-07 14:08:09 -080044import android.content.pm.PackageManager;
45import android.content.res.Resources;
Jeremy Joslin145c3432016-12-09 13:11:51 -080046import android.net.INetworkRecommendationProvider;
Amin Shaikh972e2362016-12-07 14:08:09 -080047import android.net.INetworkScoreCache;
48import android.net.NetworkKey;
Jeremy Joslin586d36e2016-12-29 15:00:23 -080049import android.net.NetworkScoreManager;
Jeremy Joslinf621bc92017-02-16 11:11:57 -080050import android.net.NetworkScorerAppData;
Amin Shaikh972e2362016-12-07 14:08:09 -080051import android.net.ScoredNetwork;
Jeremy Joslincb594f32017-01-03 17:31:23 -080052import android.net.Uri;
Amin Shaikh972e2362016-12-07 14:08:09 -080053import android.net.WifiKey;
Jeremy Joslinba242732017-01-24 17:16:42 -080054import android.net.wifi.ScanResult;
Jeremy Joslin145c3432016-12-09 13:11:51 -080055import android.net.wifi.WifiConfiguration;
Jeremy Joslinba242732017-01-24 17:16:42 -080056import android.net.wifi.WifiInfo;
57import android.net.wifi.WifiSsid;
Jeremy Joslin134c9d32017-01-09 16:22:20 -080058import android.os.Binder;
Jeremy Joslincb594f32017-01-03 17:31:23 -080059import android.os.Handler;
Jeremy Joslince73c6f2016-12-29 14:49:38 -080060import android.os.HandlerThread;
Amin Shaikh972e2362016-12-07 14:08:09 -080061import android.os.IBinder;
Jeremy Joslin145c3432016-12-09 13:11:51 -080062import android.os.Looper;
Jeremy Joslincb594f32017-01-03 17:31:23 -080063import android.os.Message;
Amin Shaikh972e2362016-12-07 14:08:09 -080064import android.os.RemoteException;
65import android.os.UserHandle;
Amin Shaikh972e2362016-12-07 14:08:09 -080066import android.support.test.InstrumentationRegistry;
67import android.support.test.filters.MediumTest;
68import android.support.test.runner.AndroidJUnit4;
Jeremy Joslin145c3432016-12-09 13:11:51 -080069
Amin Shaikh972e2362016-12-07 14:08:09 -080070import com.android.server.devicepolicy.MockUtils;
Jeremy Joslin145c3432016-12-09 13:11:51 -080071
Jeremy Joslinba242732017-01-24 17:16:42 -080072import com.google.android.collect.Lists;
73
Jeremy Joslince73c6f2016-12-29 14:49:38 -080074import org.junit.After;
Amin Shaikh972e2362016-12-07 14:08:09 -080075import org.junit.Before;
76import org.junit.Test;
77import org.junit.runner.RunWith;
78import org.mockito.ArgumentCaptor;
79import org.mockito.Captor;
80import org.mockito.Mock;
81import org.mockito.MockitoAnnotations;
Jeremy Joslin145c3432016-12-09 13:11:51 -080082
83import java.io.FileDescriptor;
84import java.io.PrintWriter;
85import java.io.StringWriter;
Jeremy Joslinba242732017-01-24 17:16:42 -080086import java.util.ArrayList;
87import java.util.Collections;
Jeremy Joslin145c3432016-12-09 13:11:51 -080088import java.util.List;
Jeremy Joslince73c6f2016-12-29 14:49:38 -080089import java.util.concurrent.CountDownLatch;
90import java.util.concurrent.TimeUnit;
Jeremy Josline71fe2b2017-01-25 11:40:08 -080091import java.util.function.UnaryOperator;
Amin Shaikh972e2362016-12-07 14:08:09 -080092
93/**
94 * Tests for {@link NetworkScoreService}.
95 */
96@RunWith(AndroidJUnit4.class)
97@MediumTest
98public class NetworkScoreServiceTest {
Jeremy Joslinba242732017-01-24 17:16:42 -080099 private static final String SSID = "ssid";
100 private static final String SSID_2 = "ssid_2";
101 private static final String SSID_3 = "ssid_3";
Stephen Chenfde900d2017-02-14 16:40:21 -0800102 private static final String INVALID_BSSID = "invalid_bssid";
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800103 private static final ComponentName RECOMMENDATION_SERVICE_COMP =
104 new ComponentName("newPackageName", "newScoringServiceClass");
Stephen Chen8b1339a2017-02-28 18:11:34 -0800105 private static final String RECOMMENDATION_SERVICE_LABEL = "Test Recommendation Service";
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800106 private static final ComponentName USE_WIFI_ENABLE_ACTIVITY_COMP =
107 new ComponentName("useWifiPackageName", "enableUseWifiActivityClass");
Amin Shaikh972e2362016-12-07 14:08:09 -0800108 private static final ScoredNetwork SCORED_NETWORK =
Jeremy Joslinba242732017-01-24 17:16:42 -0800109 new ScoredNetwork(new NetworkKey(new WifiKey(quote(SSID), "00:00:00:00:00:00")),
110 null /* rssiCurve*/);
111 private static final ScoredNetwork SCORED_NETWORK_2 =
112 new ScoredNetwork(new NetworkKey(new WifiKey(quote(SSID_2), "00:00:00:00:00:00")),
Amin Shaikh972e2362016-12-07 14:08:09 -0800113 null /* rssiCurve*/);
Amin Shaikhd6013602017-03-24 15:52:32 -0700114 private static final String NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID =
115 "networkAvailableNotificationChannelId";
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800116 private static final NetworkScorerAppData NEW_SCORER = new NetworkScorerAppData(
Stephen Chen8b1339a2017-02-28 18:11:34 -0800117 1, RECOMMENDATION_SERVICE_COMP, RECOMMENDATION_SERVICE_LABEL,
Amin Shaikhd6013602017-03-24 15:52:32 -0700118 USE_WIFI_ENABLE_ACTIVITY_COMP, NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID);
Amin Shaikh972e2362016-12-07 14:08:09 -0800119
Amin Shaikh972e2362016-12-07 14:08:09 -0800120 @Mock private NetworkScorerAppManager mNetworkScorerAppManager;
121 @Mock private Context mContext;
122 @Mock private Resources mResources;
123 @Mock private INetworkScoreCache.Stub mNetworkScoreCache, mNetworkScoreCache2;
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700124 @Mock private IBinder mScoreCacheIBinder, mScoreCacheIBinder2;
125 @Mock private IBinder mServiceConnectionIBinder;
Jeremy Joslin145c3432016-12-09 13:11:51 -0800126 @Mock private INetworkRecommendationProvider mRecommendationProvider;
Jeremy Josline71fe2b2017-01-25 11:40:08 -0800127 @Mock private UnaryOperator<List<ScoredNetwork>> mCurrentNetworkFilter;
128 @Mock private UnaryOperator<List<ScoredNetwork>> mScanResultsFilter;
Jeremy Joslinba242732017-01-24 17:16:42 -0800129 @Mock private WifiInfo mWifiInfo;
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700130 @Mock private NetworkScoreService.ScoringServiceConnection mServiceConnection;
Amin Shaikh972e2362016-12-07 14:08:09 -0800131 @Captor private ArgumentCaptor<List<ScoredNetwork>> mScoredNetworkCaptor;
132
133 private ContentResolver mContentResolver;
134 private NetworkScoreService mNetworkScoreService;
Jeremy Joslince73c6f2016-12-29 14:49:38 -0800135 private HandlerThread mHandlerThread;
Jeremy Joslinba242732017-01-24 17:16:42 -0800136 private List<ScanResult> mScanResults;
137
138 private static String quote(String str) {
139 return String.format("\"%s\"", str);
140 }
Amin Shaikh972e2362016-12-07 14:08:09 -0800141
142 @Before
143 public void setUp() throws Exception {
144 MockitoAnnotations.initMocks(this);
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700145 when(mNetworkScoreCache.asBinder()).thenReturn(mScoreCacheIBinder);
146 when(mNetworkScoreCache2.asBinder()).thenReturn(mScoreCacheIBinder2);
147 when(mServiceConnectionIBinder.queryLocalInterface(anyString()))
148 .thenReturn(mRecommendationProvider);
Amin Shaikh972e2362016-12-07 14:08:09 -0800149 mContentResolver = InstrumentationRegistry.getContext().getContentResolver();
150 when(mContext.getContentResolver()).thenReturn(mContentResolver);
151 when(mContext.getResources()).thenReturn(mResources);
Jeremy Joslinba242732017-01-24 17:16:42 -0800152 when(mWifiInfo.getSSID()).thenReturn(SCORED_NETWORK.networkKey.wifiKey.ssid);
153 when(mWifiInfo.getBSSID()).thenReturn(SCORED_NETWORK.networkKey.wifiKey.bssid);
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700154 when(mServiceConnection.getAppData()).thenReturn(NEW_SCORER);
155 when(mServiceConnection.getRecommendationProvider()).thenReturn(mRecommendationProvider);
156 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
Jeremy Joslince73c6f2016-12-29 14:49:38 -0800157 mHandlerThread = new HandlerThread("NetworkScoreServiceTest");
158 mHandlerThread.start();
159 mNetworkScoreService = new NetworkScoreService(mContext, mNetworkScorerAppManager,
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700160 networkScorerAppData -> mServiceConnection, mHandlerThread.getLooper());
Jeremy Joslin145c3432016-12-09 13:11:51 -0800161 WifiConfiguration configuration = new WifiConfiguration();
Jeremy Joslin8f5521a2016-12-20 14:36:20 -0800162 configuration.SSID = "NetworkScoreServiceTest_SSID";
163 configuration.BSSID = "NetworkScoreServiceTest_BSSID";
Jeremy Joslinba242732017-01-24 17:16:42 -0800164 populateScanResults();
165 }
166
167 private void populateScanResults() {
168 mScanResults = new ArrayList<>();
169 mScanResults.add(createScanResult(SSID, SCORED_NETWORK.networkKey.wifiKey.bssid));
170 mScanResults.add(createScanResult(SSID_2, SCORED_NETWORK_2.networkKey.wifiKey.bssid));
171 mScanResults.add(createScanResult(SSID_3, "10:10:00:00:10:10"));
172 }
173
174 private ScanResult createScanResult(String ssid, String bssid) {
175 ScanResult result = new ScanResult();
176 result.wifiSsid = WifiSsid.createFromAsciiEncoded(ssid);
177 result.BSSID = bssid;
178 return result;
Jeremy Joslince73c6f2016-12-29 14:49:38 -0800179 }
180
181 @After
182 public void tearDown() throws Exception {
183 mHandlerThread.quitSafely();
Amin Shaikh972e2362016-12-07 14:08:09 -0800184 }
185
186 @Test
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800187 public void testOnUserUnlocked() {
Amin Shaikh972e2362016-12-07 14:08:09 -0800188 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
189
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800190 mNetworkScoreService.onUserUnlocked(0);
Amin Shaikh972e2362016-12-07 14:08:09 -0800191
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700192 verify(mNetworkScorerAppManager).updateState();
193 verify(mNetworkScorerAppManager).migrateNetworkScorerAppSettingIfNeeded();
194 verify(mServiceConnection).bind(mContext);
Amin Shaikh972e2362016-12-07 14:08:09 -0800195 }
196
197 @Test
Jeremy Joslin145c3432016-12-09 13:11:51 -0800198 public void testRequestScores_noPermission() throws Exception {
199 doThrow(new SecurityException()).when(mContext)
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800200 .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES),
Jeremy Joslin145c3432016-12-09 13:11:51 -0800201 anyString());
202 try {
203 mNetworkScoreService.requestScores(null);
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800204 fail("REQUEST_NETWORK_SCORES not enforced.");
Jeremy Joslin145c3432016-12-09 13:11:51 -0800205 } catch (SecurityException e) {
206 // expected
207 }
208 }
209
210 @Test
211 public void testRequestScores_providerNotConnected() throws Exception {
212 assertFalse(mNetworkScoreService.requestScores(new NetworkKey[0]));
213 verifyZeroInteractions(mRecommendationProvider);
214 }
215
216 @Test
217 public void testRequestScores_providerThrowsRemoteException() throws Exception {
Jeremy Joslin145c3432016-12-09 13:11:51 -0800218 doThrow(new RemoteException()).when(mRecommendationProvider)
219 .requestScores(any(NetworkKey[].class));
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700220 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin145c3432016-12-09 13:11:51 -0800221
222 assertFalse(mNetworkScoreService.requestScores(new NetworkKey[0]));
223 }
224
225 @Test
226 public void testRequestScores_providerAvailable() throws Exception {
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700227 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin145c3432016-12-09 13:11:51 -0800228
229 final NetworkKey[] networks = new NetworkKey[0];
230 assertTrue(mNetworkScoreService.requestScores(networks));
231 verify(mRecommendationProvider).requestScores(networks);
232 }
233
234 @Test
Jeremy Joslincb594f32017-01-03 17:31:23 -0800235 public void dispatchingContentObserver_nullUri() throws Exception {
236 NetworkScoreService.DispatchingContentObserver observer =
237 new NetworkScoreService.DispatchingContentObserver(mContext, null /*handler*/);
238
239 observer.onChange(false, null);
240 // nothing to assert or verify but since we passed in a null handler we'd see a NPE
241 // if it were interacted with.
242 }
243
244 @Test
245 public void dispatchingContentObserver_dispatchUri() throws Exception {
246 final CountDownHandler handler = new CountDownHandler(mHandlerThread.getLooper());
247 NetworkScoreService.DispatchingContentObserver observer =
248 new NetworkScoreService.DispatchingContentObserver(mContext, handler);
249 Uri uri = Uri.parse("content://settings/global/network_score_service_test");
250 int expectedWhat = 24;
251 observer.observe(uri, expectedWhat);
252
253 observer.onChange(false, uri);
254 final boolean msgHandled = handler.latch.await(3, TimeUnit.SECONDS);
255 assertTrue(msgHandled);
256 assertEquals(expectedWhat, handler.receivedWhat);
257 }
258
259 @Test
Amin Shaikh972e2362016-12-07 14:08:09 -0800260 public void testUpdateScores_notActiveScorer() {
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800261 bindToScorer(false /*callerIsScorer*/);
Amin Shaikh972e2362016-12-07 14:08:09 -0800262
263 try {
264 mNetworkScoreService.updateScores(new ScoredNetwork[0]);
265 fail("SecurityException expected");
266 } catch (SecurityException e) {
267 // expected
268 }
269 }
270
271 @Test
272 public void testUpdateScores_oneRegisteredCache() throws RemoteException {
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800273 bindToScorer(true /*callerIsScorer*/);
Amin Shaikh972e2362016-12-07 14:08:09 -0800274
Jeremy Joslinc5ac5872016-11-30 15:05:40 -0800275 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
276 mNetworkScoreCache, CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800277
278 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
279
280 verify(mNetworkScoreCache).updateScores(mScoredNetworkCaptor.capture());
281
282 assertEquals(1, mScoredNetworkCaptor.getValue().size());
283 assertEquals(SCORED_NETWORK, mScoredNetworkCaptor.getValue().get(0));
284 }
285
286 @Test
287 public void testUpdateScores_twoRegisteredCaches() throws RemoteException {
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800288 bindToScorer(true /*callerIsScorer*/);
Amin Shaikh972e2362016-12-07 14:08:09 -0800289
Jeremy Joslinc5ac5872016-11-30 15:05:40 -0800290 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
291 mNetworkScoreCache, CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800292 mNetworkScoreService.registerNetworkScoreCache(
Jeremy Joslinc5ac5872016-11-30 15:05:40 -0800293 NetworkKey.TYPE_WIFI, mNetworkScoreCache2, CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800294
295 // updateScores should update both caches
296 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
297
298 verify(mNetworkScoreCache).updateScores(anyListOf(ScoredNetwork.class));
299 verify(mNetworkScoreCache2).updateScores(anyListOf(ScoredNetwork.class));
300
301 mNetworkScoreService.unregisterNetworkScoreCache(
302 NetworkKey.TYPE_WIFI, mNetworkScoreCache2);
303
304 // updateScores should only update the first cache since the 2nd has been unregistered
305 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
306
307 verify(mNetworkScoreCache, times(2)).updateScores(anyListOf(ScoredNetwork.class));
308
309 mNetworkScoreService.unregisterNetworkScoreCache(
310 NetworkKey.TYPE_WIFI, mNetworkScoreCache);
311
312 // updateScores should not update any caches since they are both unregistered
313 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK});
314
Jeremy Joslinc5ac5872016-11-30 15:05:40 -0800315 // The register and unregister calls grab the binder from the score cache.
316 verify(mNetworkScoreCache, atLeastOnce()).asBinder();
317 verify(mNetworkScoreCache2, atLeastOnce()).asBinder();
Amin Shaikh972e2362016-12-07 14:08:09 -0800318 verifyNoMoreInteractions(mNetworkScoreCache, mNetworkScoreCache2);
319 }
320
321 @Test
Jeremy Joslin06d1fd72017-01-10 08:53:02 -0800322 public void testClearScores_notActiveScorer_noRequestNetworkScoresPermission() {
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800323 bindToScorer(false /*callerIsScorer*/);
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800324 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
Amin Shaikh972e2362016-12-07 14:08:09 -0800325 .thenReturn(PackageManager.PERMISSION_DENIED);
326 try {
327 mNetworkScoreService.clearScores();
328 fail("SecurityException expected");
329 } catch (SecurityException e) {
330 // expected
331 }
332 }
333
334 @Test
Jeremy Joslin06d1fd72017-01-10 08:53:02 -0800335 public void testClearScores_activeScorer_noRequestNetworkScoresPermission() {
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800336 bindToScorer(true /*callerIsScorer*/);
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800337 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
Amin Shaikh972e2362016-12-07 14:08:09 -0800338 .thenReturn(PackageManager.PERMISSION_DENIED);
339
340 mNetworkScoreService.clearScores();
341 }
342
343 @Test
344 public void testClearScores_activeScorer() throws RemoteException {
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800345 bindToScorer(true /*callerIsScorer*/);
Amin Shaikh972e2362016-12-07 14:08:09 -0800346
Jeremy Joslinc5ac5872016-11-30 15:05:40 -0800347 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
348 CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800349 mNetworkScoreService.clearScores();
350
351 verify(mNetworkScoreCache).clearScores();
352 }
353
354 @Test
Jeremy Joslin06d1fd72017-01-10 08:53:02 -0800355 public void testClearScores_notActiveScorer_hasRequestNetworkScoresPermission()
Amin Shaikh972e2362016-12-07 14:08:09 -0800356 throws RemoteException {
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800357 bindToScorer(false /*callerIsScorer*/);
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800358 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
Amin Shaikh972e2362016-12-07 14:08:09 -0800359 .thenReturn(PackageManager.PERMISSION_GRANTED);
360
Jeremy Joslinc5ac5872016-11-30 15:05:40 -0800361 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache,
362 CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800363 mNetworkScoreService.clearScores();
364
365 verify(mNetworkScoreCache).clearScores();
366 }
367
368 @Test
Jeremy Joslina9f933e2017-04-28 13:08:17 -0700369 public void testSetActiveScorer_noScoreNetworksPermission() {
Jeremy Joslin1588b3b2017-08-11 15:35:12 -0700370 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
371 .thenReturn(PackageManager.PERMISSION_DENIED);
Jeremy Joslina9f933e2017-04-28 13:08:17 -0700372 when(mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS))
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800373 .thenReturn(PackageManager.PERMISSION_DENIED);
Amin Shaikh972e2362016-12-07 14:08:09 -0800374
375 try {
376 mNetworkScoreService.setActiveScorer(null);
377 fail("SecurityException expected");
378 } catch (SecurityException e) {
379 // expected
380 }
381 }
382
383 @Test
Jeremy Joslin3bddadd2017-03-21 16:16:46 -0700384 public void testSetActiveScorer_requestNetworkScoresPermission() {
385 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
386 .thenReturn(PackageManager.PERMISSION_GRANTED);
387
388 mNetworkScoreService.setActiveScorer(null);
389 }
390
391 @Test
Jeremy Joslin06d1fd72017-01-10 08:53:02 -0800392 public void testDisableScoring_notActiveScorer_noRequestNetworkScoresPermission() {
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800393 bindToScorer(false /*callerIsScorer*/);
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800394 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
Amin Shaikh972e2362016-12-07 14:08:09 -0800395 .thenReturn(PackageManager.PERMISSION_DENIED);
396
397 try {
398 mNetworkScoreService.disableScoring();
399 fail("SecurityException expected");
400 } catch (SecurityException e) {
401 // expected
402 }
Amin Shaikh972e2362016-12-07 14:08:09 -0800403 }
404
405 @Test
Jeremy Joslin3bddadd2017-03-21 16:16:46 -0700406 public void testDisableScoring_activeScorer_noRequestNetworkScoresPermission() {
407 bindToScorer(true /*callerIsScorer*/);
408 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
409 .thenReturn(PackageManager.PERMISSION_DENIED);
410
411 mNetworkScoreService.disableScoring();
412 }
413
414 @Test
415 public void testGetAllValidScorer_noRequestNetworkScoresPermission() {
Jeremy Joslin1588b3b2017-08-11 15:35:12 -0700416 doThrow(new SecurityException()).when(mContext)
417 .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), anyString());
Jeremy Joslin3bddadd2017-03-21 16:16:46 -0700418
419 try {
420 mNetworkScoreService.getAllValidScorers();
421 fail("SecurityException expected");
422 } catch (SecurityException e) {
423 // expected
424 }
425 }
426
427 @Test
428 public void testGetAllValidScorer_requestNetworkScoresPermission() {
429 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
430 .thenReturn(PackageManager.PERMISSION_GRANTED);
431
432 mNetworkScoreService.getAllValidScorers();
433 }
434
435 @Test
Jeremy Joslin06d1fd72017-01-10 08:53:02 -0800436 public void testRegisterNetworkScoreCache_noRequestNetworkScoresPermission() {
Amin Shaikh972e2362016-12-07 14:08:09 -0800437 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800438 eq(permission.REQUEST_NETWORK_SCORES), anyString());
Amin Shaikh972e2362016-12-07 14:08:09 -0800439
440 try {
441 mNetworkScoreService.registerNetworkScoreCache(
Jeremy Joslinc5ac5872016-11-30 15:05:40 -0800442 NetworkKey.TYPE_WIFI, mNetworkScoreCache, CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800443 fail("SecurityException expected");
444 } catch (SecurityException e) {
445 // expected
446 }
447 }
448
449 @Test
Jeremy Joslin06d1fd72017-01-10 08:53:02 -0800450 public void testUnregisterNetworkScoreCache_noRequestNetworkScoresPermission() {
Amin Shaikh972e2362016-12-07 14:08:09 -0800451 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800452 eq(permission.REQUEST_NETWORK_SCORES), anyString());
Amin Shaikh972e2362016-12-07 14:08:09 -0800453
454 try {
455 mNetworkScoreService.unregisterNetworkScoreCache(
456 NetworkKey.TYPE_WIFI, mNetworkScoreCache);
457 fail("SecurityException expected");
458 } catch (SecurityException e) {
459 // expected
460 }
461 }
462
463 @Test
Amin Shaikh972e2362016-12-07 14:08:09 -0800464 public void testDump_doesNotCrash() {
465 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
466 StringWriter stringWriter = new StringWriter();
467
468 mNetworkScoreService.dump(
469 new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
470
471 assertFalse(stringWriter.toString().isEmpty());
472 }
Jeremy Joslin145c3432016-12-09 13:11:51 -0800473
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800474 @Test
475 public void testIsCallerActiveScorer_noBoundService() throws Exception {
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700476 // No active scorer.
477 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(null);
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800478 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800479
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700480 mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid());
481
482 verify(mServiceConnection, never()).getAppData();
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800483 }
484
485 @Test
486 public void testIsCallerActiveScorer_boundServiceIsNotCaller() throws Exception {
487 bindToScorer(false /*callerIsScorer*/);
488
489 assertFalse(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
490 }
491
492 @Test
493 public void testIsCallerActiveScorer_boundServiceIsCaller() throws Exception {
494 bindToScorer(true /*callerIsScorer*/);
495
496 assertTrue(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
497 }
498
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800499 @Test
500 public void testGetActiveScorerPackage_notActive() throws Exception {
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700501 // No active scorer.
502 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(null);
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800503 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800504
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700505 mNetworkScoreService.getActiveScorerPackage();
506
507 verify(mServiceConnection, never()).getPackageName();
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800508 }
509
510 @Test
511 public void testGetActiveScorerPackage_active() throws Exception {
512 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800513 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800514
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700515 mNetworkScoreService.getActiveScorerPackage();
516
517 verify(mServiceConnection).getPackageName();
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800518 }
519
Jeremy Joslinba242732017-01-24 17:16:42 -0800520 @Test
Jeremy Joslin2d55b182017-07-11 15:54:14 -0700521 public void testGetActiveScorerPackage_missingRequiredPermissions() throws Exception {
522 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
523 .thenReturn(PackageManager.PERMISSION_DENIED);
524 when(mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS))
525 .thenReturn(PackageManager.PERMISSION_DENIED);
526
527 try {
528 mNetworkScoreService.getActiveScorerPackage();
529 fail("SecurityException expected");
530 } catch (SecurityException e) {
531 // expected
532 }
533 }
534
535 @Test
536 public void testGetActiveScorerPackage_noRequestScoresPermission() throws Exception {
537 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
538 .thenReturn(PackageManager.PERMISSION_DENIED);
539 when(mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS))
540 .thenReturn(PackageManager.PERMISSION_GRANTED);
541
542 try {
543 mNetworkScoreService.getActiveScorerPackage();
544 } catch (SecurityException e) {
545 fail("Unexpected SecurityException");
546 }
547 }
548
549 @Test
550 public void testGetActiveScorerPackage_noScoreNetworksPermission() throws Exception {
551 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
552 .thenReturn(PackageManager.PERMISSION_GRANTED);
553 when(mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS))
554 .thenReturn(PackageManager.PERMISSION_DENIED);
555
556 try {
557 mNetworkScoreService.getActiveScorerPackage();
558 } catch (SecurityException e) {
559 fail("Unexpected SecurityException");
560 }
561 }
562
563 @Test
Jeremy Joslinba242732017-01-24 17:16:42 -0800564 public void testCacheUpdatingConsumer_nullFilter() throws Exception {
565 List<ScoredNetwork> scoredNetworkList = Lists.newArrayList(SCORED_NETWORK);
566 NetworkScoreService.FilteringCacheUpdatingConsumer consumer =
567 new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
568 new ArrayList<>(scoredNetworkList), NetworkKey.TYPE_WIFI,
569 mCurrentNetworkFilter, mScanResultsFilter);
570
571 consumer.accept(mNetworkScoreCache, null /*cookie*/);
572
573 verify(mNetworkScoreCache).updateScores(scoredNetworkList);
574 verifyZeroInteractions(mCurrentNetworkFilter, mScanResultsFilter);
575 }
576
577 @Test
578 public void testCacheUpdatingConsumer_noneFilter() throws Exception {
579 List<ScoredNetwork> scoredNetworkList = Lists.newArrayList(SCORED_NETWORK);
580 NetworkScoreService.FilteringCacheUpdatingConsumer
581 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
582 new ArrayList<>(scoredNetworkList),
583 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
584
585 consumer.accept(mNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_NONE);
586
587 verify(mNetworkScoreCache).updateScores(scoredNetworkList);
588 verifyZeroInteractions(mCurrentNetworkFilter, mScanResultsFilter);
589 }
590
591 @Test
592 public void testCacheUpdatingConsumer_unknownFilter() throws Exception {
593 List<ScoredNetwork> scoredNetworkList = Lists.newArrayList(SCORED_NETWORK);
594 NetworkScoreService.FilteringCacheUpdatingConsumer
595 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
596 new ArrayList<>(scoredNetworkList),
597 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
598
599 consumer.accept(mNetworkScoreCache, -1 /*cookie*/);
600
601 verify(mNetworkScoreCache).updateScores(scoredNetworkList);
602 verifyZeroInteractions(mCurrentNetworkFilter, mScanResultsFilter);
603 }
604
605 @Test
606 public void testCacheUpdatingConsumer_nonIntFilter() throws Exception {
607 List<ScoredNetwork> scoredNetworkList = Lists.newArrayList(SCORED_NETWORK);
608 NetworkScoreService.FilteringCacheUpdatingConsumer
609 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
610 new ArrayList<>(scoredNetworkList),
611 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
612
613 consumer.accept(mNetworkScoreCache, "not an int" /*cookie*/);
614
615 verify(mNetworkScoreCache).updateScores(scoredNetworkList);
616 verifyZeroInteractions(mCurrentNetworkFilter, mScanResultsFilter);
617 }
618
619 @Test
620 public void testCacheUpdatingConsumer_emptyScoreList() throws Exception {
621 NetworkScoreService.FilteringCacheUpdatingConsumer
622 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
623 Collections.emptyList(),
624 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
625
626 consumer.accept(mNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_NONE);
627
628 verifyZeroInteractions(mNetworkScoreCache, mCurrentNetworkFilter, mScanResultsFilter);
629 }
630
631 @Test
632 public void testCacheUpdatingConsumer_currentNetworkFilter() throws Exception {
633 List<ScoredNetwork> scoredNetworkList =
634 Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2);
635 NetworkScoreService.FilteringCacheUpdatingConsumer
636 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
637 new ArrayList<>(scoredNetworkList),
638 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
639
640 List<ScoredNetwork> filteredList = new ArrayList<>(scoredNetworkList);
641 filteredList.remove(SCORED_NETWORK);
642 when(mCurrentNetworkFilter.apply(scoredNetworkList)).thenReturn(filteredList);
643 consumer.accept(mNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_CURRENT_NETWORK);
644
645 verify(mNetworkScoreCache).updateScores(filteredList);
646 verifyZeroInteractions(mScanResultsFilter);
647 }
648
649 @Test
650 public void testCacheUpdatingConsumer_scanResultsFilter() throws Exception {
651 List<ScoredNetwork> scoredNetworkList =
652 Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2);
653 NetworkScoreService.FilteringCacheUpdatingConsumer
654 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
655 new ArrayList<>(scoredNetworkList),
656 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
657
658 List<ScoredNetwork> filteredList = new ArrayList<>(scoredNetworkList);
659 filteredList.remove(SCORED_NETWORK);
660 when(mScanResultsFilter.apply(scoredNetworkList)).thenReturn(filteredList);
661 consumer.accept(mNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_SCAN_RESULTS);
662
663 verify(mNetworkScoreCache).updateScores(filteredList);
664 verifyZeroInteractions(mCurrentNetworkFilter);
665 }
666
667 @Test
668 public void testCurrentNetworkScoreCacheFilter_nullWifiInfo() throws Exception {
669 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
670 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> null /*WifiInfo*/);
671
672 List<ScoredNetwork> actualList =
673 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
674
675 assertTrue(actualList.isEmpty());
676 }
677
678 @Test
Stephen Chenfde900d2017-02-14 16:40:21 -0800679 public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_nullSsid() throws Exception {
680 when(mWifiInfo.getSSID()).thenReturn(null);
681 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
682 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
683
684 List<ScoredNetwork> actualList =
685 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
686
687 assertTrue(actualList.isEmpty());
688 }
689
690 @Test
691 public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_noneSsid() throws Exception {
692 when(mWifiInfo.getSSID()).thenReturn(WifiSsid.NONE);
693 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
694 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
695
696 List<ScoredNetwork> actualList =
697 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
698
699 assertTrue(actualList.isEmpty());
700 }
701
702 @Test
703 public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_emptySsid() throws Exception {
704 when(mWifiInfo.getSSID()).thenReturn("");
705 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
706 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
707
708 List<ScoredNetwork> actualList =
709 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
710
711 assertTrue(actualList.isEmpty());
712 }
713
714 @Test
715 public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_invalidBssid() throws Exception {
716 when(mWifiInfo.getBSSID()).thenReturn(INVALID_BSSID);
717 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
718 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
719
720 List<ScoredNetwork> actualList =
721 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
722
723 assertTrue(actualList.isEmpty());
724 }
725
726 @Test
Jeremy Joslinba242732017-01-24 17:16:42 -0800727 public void testCurrentNetworkScoreCacheFilter_scoreFiltered() throws Exception {
728 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
729 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
730
731 List<ScoredNetwork> actualList =
732 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
733
734 List<ScoredNetwork> expectedList = Collections.singletonList(SCORED_NETWORK);
735 assertEquals(expectedList, actualList);
736 }
737
738 @Test
739 public void testCurrentNetworkScoreCacheFilter_currentNetworkNotInList() throws Exception {
740 when(mWifiInfo.getSSID()).thenReturn("\"notInList\"");
741 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
742 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
743
744 List<ScoredNetwork> actualList =
745 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
746
747 assertTrue(actualList.isEmpty());
748 }
749
750 @Test
751 public void testScanResultsScoreCacheFilter_emptyScanResults() throws Exception {
752 NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =
753 new NetworkScoreService.ScanResultsScoreCacheFilter(Collections::emptyList);
754
755 List<ScoredNetwork> actualList =
756 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
757
758 assertTrue(actualList.isEmpty());
759 }
760
761 @Test
Stephen Chenfde900d2017-02-14 16:40:21 -0800762 public void testScanResultsScoreCacheFilter_invalidScanResults() throws Exception {
763 List<ScanResult> invalidScanResults = Lists.newArrayList(
764 new ScanResult(),
765 createScanResult("", SCORED_NETWORK.networkKey.wifiKey.bssid),
766 createScanResult(WifiSsid.NONE, SCORED_NETWORK.networkKey.wifiKey.bssid),
767 createScanResult(SSID, null),
768 createScanResult(SSID, INVALID_BSSID)
769 );
770 NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =
771 new NetworkScoreService.ScanResultsScoreCacheFilter(() -> invalidScanResults);
772
773 List<ScoredNetwork> actualList =
774 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
775
776 assertTrue(actualList.isEmpty());
777 }
778
779 @Test
Jeremy Joslinba242732017-01-24 17:16:42 -0800780 public void testScanResultsScoreCacheFilter_scoresFiltered() throws Exception {
781 NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =
782 new NetworkScoreService.ScanResultsScoreCacheFilter(() -> mScanResults);
783
784 ScoredNetwork unmatchedScore =
785 new ScoredNetwork(new NetworkKey(new WifiKey(quote("newSsid"),
786 "00:00:00:00:00:00")), null /* rssiCurve*/);
787
788 List<ScoredNetwork> actualList =
789 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2,
790 unmatchedScore));
791
792 List<ScoredNetwork> expectedList = Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2);
793 assertEquals(expectedList, actualList);
794 }
795
Jeremy Joslina5172f62017-02-02 14:27:05 -0800796 @Test
797 public void testGetActiveScorer_notConnected_canRequestScores() throws Exception {
798 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
799 .thenReturn(PackageManager.PERMISSION_GRANTED);
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700800 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(null);
801 mNetworkScoreService.onUserUnlocked(0);
802
803 mNetworkScoreService.getActiveScorer();
804
805 verify(mServiceConnection, never()).getAppData();
Jeremy Joslina5172f62017-02-02 14:27:05 -0800806 }
807
808 @Test
809 public void testGetActiveScorer_notConnected_canNotRequestScores() throws Exception {
Jeremy Joslin1588b3b2017-08-11 15:35:12 -0700810 doThrow(new SecurityException()).when(mContext)
811 .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), anyString());
Jeremy Joslina5172f62017-02-02 14:27:05 -0800812 try {
813 mNetworkScoreService.getActiveScorer();
814 fail("SecurityException expected.");
815 } catch (SecurityException e) {
816 // expected
817 }
818 }
819
820 @Test
821 public void testGetActiveScorer_connected_canRequestScores()
822 throws Exception {
823 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
824 .thenReturn(PackageManager.PERMISSION_GRANTED);
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700825 mNetworkScoreService.onUserUnlocked(0);
826
827 mNetworkScoreService.getActiveScorer();
828
829 verify(mServiceConnection).getAppData();
Jeremy Joslina5172f62017-02-02 14:27:05 -0800830 }
831
832 @Test
833 public void testGetActiveScorer_connected_canNotRequestScores()
834 throws Exception {
Jeremy Joslin1588b3b2017-08-11 15:35:12 -0700835 doThrow(new SecurityException()).when(mContext)
836 .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), anyString());
Jeremy Joslina5172f62017-02-02 14:27:05 -0800837 bindToScorer(false);
838 try {
839 mNetworkScoreService.getActiveScorer();
840 fail("SecurityException expected.");
841 } catch (SecurityException e) {
842 // expected
843 }
844 }
845
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700846 @Test
847 public void testServiceConnection_bind_notBound() throws Exception {
848 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
849 .ScoringServiceConnection(NEW_SCORER);
850 connection.bind(mContext);
851
852 verify(mContext).bindServiceAsUser(MockUtils.checkIntent(
853 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
854 .setComponent(RECOMMENDATION_SERVICE_COMP)),
855 eq(connection),
856 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
857 eq(UserHandle.SYSTEM));
858 }
859
860 @Test
861 public void testServiceConnection_bind_alreadyBound() throws Exception {
862 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
863 .ScoringServiceConnection(NEW_SCORER);
864
865 when(mContext.bindServiceAsUser(MockUtils.checkIntent(
866 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
867 .setComponent(RECOMMENDATION_SERVICE_COMP)),
868 eq(connection),
869 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
870 eq(UserHandle.SYSTEM))).thenReturn(true /*bound*/);
871
872 // Calling bind more than once should only result in 1 bindService call.
873 connection.bind(mContext);
874 connection.bind(mContext);
875
876 verify(mContext, times(1)).bindServiceAsUser(MockUtils.checkIntent(
877 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
878 .setComponent(RECOMMENDATION_SERVICE_COMP)),
879 eq(connection),
880 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
881 eq(UserHandle.SYSTEM));
882 }
883
884 @Test
885 public void testServiceConnection_bindFails() throws Exception {
886 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
887 .ScoringServiceConnection(NEW_SCORER);
888
889 when(mContext.bindServiceAsUser(MockUtils.checkIntent(
890 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
891 .setComponent(RECOMMENDATION_SERVICE_COMP)),
892 eq(connection),
893 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
894 eq(UserHandle.SYSTEM))).thenReturn(false /*bound*/);
895
896 connection.bind(mContext);
897
898 verify(mContext).unbindService(connection);
899 }
900
901 @Test
902 public void testServiceConnection_unbind_notBound() throws Exception {
903 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
904 .ScoringServiceConnection(NEW_SCORER);
905
906 connection.unbind(mContext);
907
908 verify(mContext, never()).unbindService(connection);
909 }
910
911 @Test
912 public void testServiceConnection_unbind_alreadyBound() throws Exception {
913 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
914 .ScoringServiceConnection(NEW_SCORER);
915
916 when(mContext.bindServiceAsUser(MockUtils.checkIntent(
917 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
918 .setComponent(RECOMMENDATION_SERVICE_COMP)),
919 eq(connection),
920 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
921 eq(UserHandle.SYSTEM))).thenReturn(true /*bound*/);
922
923 connection.bind(mContext);
924 connection.unbind(mContext);
925
926 verify(mContext).unbindService(connection);
927 }
928
929 @Test
930 public void testServiceConnection_dump_doesNotCrash() throws Exception {
931 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
932 .ScoringServiceConnection(NEW_SCORER);
933 final StringWriter stringWriter = new StringWriter();
934
935 connection.dump(new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
936
937 assertFalse(stringWriter.toString().isEmpty());
Jeremy Joslin145c3432016-12-09 13:11:51 -0800938 }
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800939
940 private void bindToScorer(boolean callerIsScorer) {
Jeremy Joslina5172f62017-02-02 14:27:05 -0800941 final int callingUid = callerIsScorer ? Binder.getCallingUid() : Binder.getCallingUid() + 1;
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800942 NetworkScorerAppData appData = new NetworkScorerAppData(callingUid,
Stephen Chen8b1339a2017-02-28 18:11:34 -0800943 RECOMMENDATION_SERVICE_COMP, RECOMMENDATION_SERVICE_LABEL,
Amin Shaikhd6013602017-03-24 15:52:32 -0700944 USE_WIFI_ENABLE_ACTIVITY_COMP, NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID);
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700945 when(mServiceConnection.getAppData()).thenReturn(appData);
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800946 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800947 }
Jeremy Joslince73c6f2016-12-29 14:49:38 -0800948
Jeremy Joslincb594f32017-01-03 17:31:23 -0800949 private static class CountDownHandler extends Handler {
950 CountDownLatch latch = new CountDownLatch(1);
951 int receivedWhat;
952
953 CountDownHandler(Looper looper) {
954 super(looper);
955 }
956
957 @Override
958 public void handleMessage(Message msg) {
959 latch.countDown();
960 receivedWhat = msg.what;
961 }
962 }
Amin Shaikh972e2362016-12-07 14:08:09 -0800963}