blob: be6a1a5d15b0472c813671242ba052b7efde31c4 [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() {
370 when(mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS))
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800371 .thenReturn(PackageManager.PERMISSION_DENIED);
Amin Shaikh972e2362016-12-07 14:08:09 -0800372
373 try {
374 mNetworkScoreService.setActiveScorer(null);
375 fail("SecurityException expected");
376 } catch (SecurityException e) {
377 // expected
378 }
379 }
380
381 @Test
Jeremy Joslin3bddadd2017-03-21 16:16:46 -0700382 public void testSetActiveScorer_requestNetworkScoresPermission() {
383 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
384 .thenReturn(PackageManager.PERMISSION_GRANTED);
385
386 mNetworkScoreService.setActiveScorer(null);
387 }
388
389 @Test
Jeremy Joslin06d1fd72017-01-10 08:53:02 -0800390 public void testDisableScoring_notActiveScorer_noRequestNetworkScoresPermission() {
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800391 bindToScorer(false /*callerIsScorer*/);
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800392 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
Amin Shaikh972e2362016-12-07 14:08:09 -0800393 .thenReturn(PackageManager.PERMISSION_DENIED);
394
395 try {
396 mNetworkScoreService.disableScoring();
397 fail("SecurityException expected");
398 } catch (SecurityException e) {
399 // expected
400 }
Amin Shaikh972e2362016-12-07 14:08:09 -0800401 }
402
403 @Test
Jeremy Joslin3bddadd2017-03-21 16:16:46 -0700404 public void testDisableScoring_activeScorer_noRequestNetworkScoresPermission() {
405 bindToScorer(true /*callerIsScorer*/);
406 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
407 .thenReturn(PackageManager.PERMISSION_DENIED);
408
409 mNetworkScoreService.disableScoring();
410 }
411
412 @Test
413 public void testGetAllValidScorer_noRequestNetworkScoresPermission() {
414 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
415 .thenReturn(PackageManager.PERMISSION_DENIED);
416
417 try {
418 mNetworkScoreService.getAllValidScorers();
419 fail("SecurityException expected");
420 } catch (SecurityException e) {
421 // expected
422 }
423 }
424
425 @Test
426 public void testGetAllValidScorer_requestNetworkScoresPermission() {
427 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
428 .thenReturn(PackageManager.PERMISSION_GRANTED);
429
430 mNetworkScoreService.getAllValidScorers();
431 }
432
433 @Test
Jeremy Joslin06d1fd72017-01-10 08:53:02 -0800434 public void testRegisterNetworkScoreCache_noRequestNetworkScoresPermission() {
Amin Shaikh972e2362016-12-07 14:08:09 -0800435 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800436 eq(permission.REQUEST_NETWORK_SCORES), anyString());
Amin Shaikh972e2362016-12-07 14:08:09 -0800437
438 try {
439 mNetworkScoreService.registerNetworkScoreCache(
Jeremy Joslinc5ac5872016-11-30 15:05:40 -0800440 NetworkKey.TYPE_WIFI, mNetworkScoreCache, CACHE_FILTER_NONE);
Amin Shaikh972e2362016-12-07 14:08:09 -0800441 fail("SecurityException expected");
442 } catch (SecurityException e) {
443 // expected
444 }
445 }
446
447 @Test
Jeremy Joslin06d1fd72017-01-10 08:53:02 -0800448 public void testUnregisterNetworkScoreCache_noRequestNetworkScoresPermission() {
Amin Shaikh972e2362016-12-07 14:08:09 -0800449 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
Jeremy Joslin5519d7c2017-01-06 14:36:54 -0800450 eq(permission.REQUEST_NETWORK_SCORES), anyString());
Amin Shaikh972e2362016-12-07 14:08:09 -0800451
452 try {
453 mNetworkScoreService.unregisterNetworkScoreCache(
454 NetworkKey.TYPE_WIFI, mNetworkScoreCache);
455 fail("SecurityException expected");
456 } catch (SecurityException e) {
457 // expected
458 }
459 }
460
461 @Test
Amin Shaikh972e2362016-12-07 14:08:09 -0800462 public void testDump_doesNotCrash() {
463 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
464 StringWriter stringWriter = new StringWriter();
465
466 mNetworkScoreService.dump(
467 new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
468
469 assertFalse(stringWriter.toString().isEmpty());
470 }
Jeremy Joslin145c3432016-12-09 13:11:51 -0800471
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800472 @Test
473 public void testIsCallerActiveScorer_noBoundService() throws Exception {
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700474 // No active scorer.
475 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(null);
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800476 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800477
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700478 mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid());
479
480 verify(mServiceConnection, never()).getAppData();
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800481 }
482
483 @Test
484 public void testIsCallerActiveScorer_boundServiceIsNotCaller() throws Exception {
485 bindToScorer(false /*callerIsScorer*/);
486
487 assertFalse(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
488 }
489
490 @Test
491 public void testIsCallerActiveScorer_boundServiceIsCaller() throws Exception {
492 bindToScorer(true /*callerIsScorer*/);
493
494 assertTrue(mNetworkScoreService.isCallerActiveScorer(Binder.getCallingUid()));
495 }
496
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800497 @Test
498 public void testGetActiveScorerPackage_notActive() throws Exception {
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700499 // No active scorer.
500 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(null);
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800501 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800502
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700503 mNetworkScoreService.getActiveScorerPackage();
504
505 verify(mServiceConnection, never()).getPackageName();
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800506 }
507
508 @Test
509 public void testGetActiveScorerPackage_active() throws Exception {
510 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800511 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800512
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700513 mNetworkScoreService.getActiveScorerPackage();
514
515 verify(mServiceConnection).getPackageName();
Jeremy Joslin6c1ca282017-01-10 13:08:32 -0800516 }
517
Jeremy Joslinba242732017-01-24 17:16:42 -0800518 @Test
Jeremy Joslin2d55b182017-07-11 15:54:14 -0700519 public void testGetActiveScorerPackage_missingRequiredPermissions() throws Exception {
520 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
521 .thenReturn(PackageManager.PERMISSION_DENIED);
522 when(mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS))
523 .thenReturn(PackageManager.PERMISSION_DENIED);
524
525 try {
526 mNetworkScoreService.getActiveScorerPackage();
527 fail("SecurityException expected");
528 } catch (SecurityException e) {
529 // expected
530 }
531 }
532
533 @Test
534 public void testGetActiveScorerPackage_noRequestScoresPermission() throws Exception {
535 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
536 .thenReturn(PackageManager.PERMISSION_DENIED);
537 when(mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS))
538 .thenReturn(PackageManager.PERMISSION_GRANTED);
539
540 try {
541 mNetworkScoreService.getActiveScorerPackage();
542 } catch (SecurityException e) {
543 fail("Unexpected SecurityException");
544 }
545 }
546
547 @Test
548 public void testGetActiveScorerPackage_noScoreNetworksPermission() throws Exception {
549 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
550 .thenReturn(PackageManager.PERMISSION_GRANTED);
551 when(mContext.checkCallingOrSelfPermission(permission.SCORE_NETWORKS))
552 .thenReturn(PackageManager.PERMISSION_DENIED);
553
554 try {
555 mNetworkScoreService.getActiveScorerPackage();
556 } catch (SecurityException e) {
557 fail("Unexpected SecurityException");
558 }
559 }
560
561 @Test
Jeremy Joslinba242732017-01-24 17:16:42 -0800562 public void testCacheUpdatingConsumer_nullFilter() throws Exception {
563 List<ScoredNetwork> scoredNetworkList = Lists.newArrayList(SCORED_NETWORK);
564 NetworkScoreService.FilteringCacheUpdatingConsumer consumer =
565 new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
566 new ArrayList<>(scoredNetworkList), NetworkKey.TYPE_WIFI,
567 mCurrentNetworkFilter, mScanResultsFilter);
568
569 consumer.accept(mNetworkScoreCache, null /*cookie*/);
570
571 verify(mNetworkScoreCache).updateScores(scoredNetworkList);
572 verifyZeroInteractions(mCurrentNetworkFilter, mScanResultsFilter);
573 }
574
575 @Test
576 public void testCacheUpdatingConsumer_noneFilter() throws Exception {
577 List<ScoredNetwork> scoredNetworkList = Lists.newArrayList(SCORED_NETWORK);
578 NetworkScoreService.FilteringCacheUpdatingConsumer
579 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
580 new ArrayList<>(scoredNetworkList),
581 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
582
583 consumer.accept(mNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_NONE);
584
585 verify(mNetworkScoreCache).updateScores(scoredNetworkList);
586 verifyZeroInteractions(mCurrentNetworkFilter, mScanResultsFilter);
587 }
588
589 @Test
590 public void testCacheUpdatingConsumer_unknownFilter() throws Exception {
591 List<ScoredNetwork> scoredNetworkList = Lists.newArrayList(SCORED_NETWORK);
592 NetworkScoreService.FilteringCacheUpdatingConsumer
593 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
594 new ArrayList<>(scoredNetworkList),
595 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
596
597 consumer.accept(mNetworkScoreCache, -1 /*cookie*/);
598
599 verify(mNetworkScoreCache).updateScores(scoredNetworkList);
600 verifyZeroInteractions(mCurrentNetworkFilter, mScanResultsFilter);
601 }
602
603 @Test
604 public void testCacheUpdatingConsumer_nonIntFilter() throws Exception {
605 List<ScoredNetwork> scoredNetworkList = Lists.newArrayList(SCORED_NETWORK);
606 NetworkScoreService.FilteringCacheUpdatingConsumer
607 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
608 new ArrayList<>(scoredNetworkList),
609 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
610
611 consumer.accept(mNetworkScoreCache, "not an int" /*cookie*/);
612
613 verify(mNetworkScoreCache).updateScores(scoredNetworkList);
614 verifyZeroInteractions(mCurrentNetworkFilter, mScanResultsFilter);
615 }
616
617 @Test
618 public void testCacheUpdatingConsumer_emptyScoreList() throws Exception {
619 NetworkScoreService.FilteringCacheUpdatingConsumer
620 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
621 Collections.emptyList(),
622 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
623
624 consumer.accept(mNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_NONE);
625
626 verifyZeroInteractions(mNetworkScoreCache, mCurrentNetworkFilter, mScanResultsFilter);
627 }
628
629 @Test
630 public void testCacheUpdatingConsumer_currentNetworkFilter() throws Exception {
631 List<ScoredNetwork> scoredNetworkList =
632 Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2);
633 NetworkScoreService.FilteringCacheUpdatingConsumer
634 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
635 new ArrayList<>(scoredNetworkList),
636 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
637
638 List<ScoredNetwork> filteredList = new ArrayList<>(scoredNetworkList);
639 filteredList.remove(SCORED_NETWORK);
640 when(mCurrentNetworkFilter.apply(scoredNetworkList)).thenReturn(filteredList);
641 consumer.accept(mNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_CURRENT_NETWORK);
642
643 verify(mNetworkScoreCache).updateScores(filteredList);
644 verifyZeroInteractions(mScanResultsFilter);
645 }
646
647 @Test
648 public void testCacheUpdatingConsumer_scanResultsFilter() throws Exception {
649 List<ScoredNetwork> scoredNetworkList =
650 Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2);
651 NetworkScoreService.FilteringCacheUpdatingConsumer
652 consumer = new NetworkScoreService.FilteringCacheUpdatingConsumer(mContext,
653 new ArrayList<>(scoredNetworkList),
654 NetworkKey.TYPE_WIFI, mCurrentNetworkFilter, mScanResultsFilter);
655
656 List<ScoredNetwork> filteredList = new ArrayList<>(scoredNetworkList);
657 filteredList.remove(SCORED_NETWORK);
658 when(mScanResultsFilter.apply(scoredNetworkList)).thenReturn(filteredList);
659 consumer.accept(mNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_SCAN_RESULTS);
660
661 verify(mNetworkScoreCache).updateScores(filteredList);
662 verifyZeroInteractions(mCurrentNetworkFilter);
663 }
664
665 @Test
666 public void testCurrentNetworkScoreCacheFilter_nullWifiInfo() throws Exception {
667 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
668 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> null /*WifiInfo*/);
669
670 List<ScoredNetwork> actualList =
671 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
672
673 assertTrue(actualList.isEmpty());
674 }
675
676 @Test
Stephen Chenfde900d2017-02-14 16:40:21 -0800677 public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_nullSsid() throws Exception {
678 when(mWifiInfo.getSSID()).thenReturn(null);
679 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
680 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
681
682 List<ScoredNetwork> actualList =
683 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
684
685 assertTrue(actualList.isEmpty());
686 }
687
688 @Test
689 public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_noneSsid() throws Exception {
690 when(mWifiInfo.getSSID()).thenReturn(WifiSsid.NONE);
691 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
692 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
693
694 List<ScoredNetwork> actualList =
695 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
696
697 assertTrue(actualList.isEmpty());
698 }
699
700 @Test
701 public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_emptySsid() throws Exception {
702 when(mWifiInfo.getSSID()).thenReturn("");
703 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
704 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
705
706 List<ScoredNetwork> actualList =
707 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
708
709 assertTrue(actualList.isEmpty());
710 }
711
712 @Test
713 public void testCurrentNetworkScoreCacheFilter_invalidWifiInfo_invalidBssid() throws Exception {
714 when(mWifiInfo.getBSSID()).thenReturn(INVALID_BSSID);
715 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
716 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
717
718 List<ScoredNetwork> actualList =
719 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
720
721 assertTrue(actualList.isEmpty());
722 }
723
724 @Test
Jeremy Joslinba242732017-01-24 17:16:42 -0800725 public void testCurrentNetworkScoreCacheFilter_scoreFiltered() throws Exception {
726 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
727 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
728
729 List<ScoredNetwork> actualList =
730 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
731
732 List<ScoredNetwork> expectedList = Collections.singletonList(SCORED_NETWORK);
733 assertEquals(expectedList, actualList);
734 }
735
736 @Test
737 public void testCurrentNetworkScoreCacheFilter_currentNetworkNotInList() throws Exception {
738 when(mWifiInfo.getSSID()).thenReturn("\"notInList\"");
739 NetworkScoreService.CurrentNetworkScoreCacheFilter cacheFilter =
740 new NetworkScoreService.CurrentNetworkScoreCacheFilter(() -> mWifiInfo);
741
742 List<ScoredNetwork> actualList =
743 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
744
745 assertTrue(actualList.isEmpty());
746 }
747
748 @Test
749 public void testScanResultsScoreCacheFilter_emptyScanResults() throws Exception {
750 NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =
751 new NetworkScoreService.ScanResultsScoreCacheFilter(Collections::emptyList);
752
753 List<ScoredNetwork> actualList =
754 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
755
756 assertTrue(actualList.isEmpty());
757 }
758
759 @Test
Stephen Chenfde900d2017-02-14 16:40:21 -0800760 public void testScanResultsScoreCacheFilter_invalidScanResults() throws Exception {
761 List<ScanResult> invalidScanResults = Lists.newArrayList(
762 new ScanResult(),
763 createScanResult("", SCORED_NETWORK.networkKey.wifiKey.bssid),
764 createScanResult(WifiSsid.NONE, SCORED_NETWORK.networkKey.wifiKey.bssid),
765 createScanResult(SSID, null),
766 createScanResult(SSID, INVALID_BSSID)
767 );
768 NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =
769 new NetworkScoreService.ScanResultsScoreCacheFilter(() -> invalidScanResults);
770
771 List<ScoredNetwork> actualList =
772 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2));
773
774 assertTrue(actualList.isEmpty());
775 }
776
777 @Test
Jeremy Joslinba242732017-01-24 17:16:42 -0800778 public void testScanResultsScoreCacheFilter_scoresFiltered() throws Exception {
779 NetworkScoreService.ScanResultsScoreCacheFilter cacheFilter =
780 new NetworkScoreService.ScanResultsScoreCacheFilter(() -> mScanResults);
781
782 ScoredNetwork unmatchedScore =
783 new ScoredNetwork(new NetworkKey(new WifiKey(quote("newSsid"),
784 "00:00:00:00:00:00")), null /* rssiCurve*/);
785
786 List<ScoredNetwork> actualList =
787 cacheFilter.apply(Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2,
788 unmatchedScore));
789
790 List<ScoredNetwork> expectedList = Lists.newArrayList(SCORED_NETWORK, SCORED_NETWORK_2);
791 assertEquals(expectedList, actualList);
792 }
793
Jeremy Joslina5172f62017-02-02 14:27:05 -0800794 @Test
795 public void testGetActiveScorer_notConnected_canRequestScores() throws Exception {
796 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
797 .thenReturn(PackageManager.PERMISSION_GRANTED);
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700798 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(null);
799 mNetworkScoreService.onUserUnlocked(0);
800
801 mNetworkScoreService.getActiveScorer();
802
803 verify(mServiceConnection, never()).getAppData();
Jeremy Joslina5172f62017-02-02 14:27:05 -0800804 }
805
806 @Test
807 public void testGetActiveScorer_notConnected_canNotRequestScores() throws Exception {
808 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
809 .thenReturn(PackageManager.PERMISSION_DENIED);
810 try {
811 mNetworkScoreService.getActiveScorer();
812 fail("SecurityException expected.");
813 } catch (SecurityException e) {
814 // expected
815 }
816 }
817
818 @Test
819 public void testGetActiveScorer_connected_canRequestScores()
820 throws Exception {
821 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
822 .thenReturn(PackageManager.PERMISSION_GRANTED);
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700823 mNetworkScoreService.onUserUnlocked(0);
824
825 mNetworkScoreService.getActiveScorer();
826
827 verify(mServiceConnection).getAppData();
Jeremy Joslina5172f62017-02-02 14:27:05 -0800828 }
829
830 @Test
831 public void testGetActiveScorer_connected_canNotRequestScores()
832 throws Exception {
833 when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
834 .thenReturn(PackageManager.PERMISSION_DENIED);
835 bindToScorer(false);
836 try {
837 mNetworkScoreService.getActiveScorer();
838 fail("SecurityException expected.");
839 } catch (SecurityException e) {
840 // expected
841 }
842 }
843
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700844 @Test
845 public void testServiceConnection_bind_notBound() throws Exception {
846 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
847 .ScoringServiceConnection(NEW_SCORER);
848 connection.bind(mContext);
849
850 verify(mContext).bindServiceAsUser(MockUtils.checkIntent(
851 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
852 .setComponent(RECOMMENDATION_SERVICE_COMP)),
853 eq(connection),
854 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
855 eq(UserHandle.SYSTEM));
856 }
857
858 @Test
859 public void testServiceConnection_bind_alreadyBound() throws Exception {
860 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
861 .ScoringServiceConnection(NEW_SCORER);
862
863 when(mContext.bindServiceAsUser(MockUtils.checkIntent(
864 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
865 .setComponent(RECOMMENDATION_SERVICE_COMP)),
866 eq(connection),
867 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
868 eq(UserHandle.SYSTEM))).thenReturn(true /*bound*/);
869
870 // Calling bind more than once should only result in 1 bindService call.
871 connection.bind(mContext);
872 connection.bind(mContext);
873
874 verify(mContext, times(1)).bindServiceAsUser(MockUtils.checkIntent(
875 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
876 .setComponent(RECOMMENDATION_SERVICE_COMP)),
877 eq(connection),
878 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
879 eq(UserHandle.SYSTEM));
880 }
881
882 @Test
883 public void testServiceConnection_bindFails() throws Exception {
884 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
885 .ScoringServiceConnection(NEW_SCORER);
886
887 when(mContext.bindServiceAsUser(MockUtils.checkIntent(
888 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
889 .setComponent(RECOMMENDATION_SERVICE_COMP)),
890 eq(connection),
891 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
892 eq(UserHandle.SYSTEM))).thenReturn(false /*bound*/);
893
894 connection.bind(mContext);
895
896 verify(mContext).unbindService(connection);
897 }
898
899 @Test
900 public void testServiceConnection_unbind_notBound() throws Exception {
901 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
902 .ScoringServiceConnection(NEW_SCORER);
903
904 connection.unbind(mContext);
905
906 verify(mContext, never()).unbindService(connection);
907 }
908
909 @Test
910 public void testServiceConnection_unbind_alreadyBound() throws Exception {
911 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
912 .ScoringServiceConnection(NEW_SCORER);
913
914 when(mContext.bindServiceAsUser(MockUtils.checkIntent(
915 new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS)
916 .setComponent(RECOMMENDATION_SERVICE_COMP)),
917 eq(connection),
918 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
919 eq(UserHandle.SYSTEM))).thenReturn(true /*bound*/);
920
921 connection.bind(mContext);
922 connection.unbind(mContext);
923
924 verify(mContext).unbindService(connection);
925 }
926
927 @Test
928 public void testServiceConnection_dump_doesNotCrash() throws Exception {
929 NetworkScoreService.ScoringServiceConnection connection = new NetworkScoreService
930 .ScoringServiceConnection(NEW_SCORER);
931 final StringWriter stringWriter = new StringWriter();
932
933 connection.dump(new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
934
935 assertFalse(stringWriter.toString().isEmpty());
Jeremy Joslin145c3432016-12-09 13:11:51 -0800936 }
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800937
938 private void bindToScorer(boolean callerIsScorer) {
Jeremy Joslina5172f62017-02-02 14:27:05 -0800939 final int callingUid = callerIsScorer ? Binder.getCallingUid() : Binder.getCallingUid() + 1;
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800940 NetworkScorerAppData appData = new NetworkScorerAppData(callingUid,
Stephen Chen8b1339a2017-02-28 18:11:34 -0800941 RECOMMENDATION_SERVICE_COMP, RECOMMENDATION_SERVICE_LABEL,
Amin Shaikhd6013602017-03-24 15:52:32 -0700942 USE_WIFI_ENABLE_ACTIVITY_COMP, NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID);
Jeremy Joslin1e2595d2017-04-05 14:50:32 -0700943 when(mServiceConnection.getAppData()).thenReturn(appData);
Jeremy Joslinee3fb5c2017-02-13 13:44:11 -0800944 mNetworkScoreService.onUserUnlocked(0);
Jeremy Joslin134c9d32017-01-09 16:22:20 -0800945 }
Jeremy Joslince73c6f2016-12-29 14:49:38 -0800946
Jeremy Joslincb594f32017-01-03 17:31:23 -0800947 private static class CountDownHandler extends Handler {
948 CountDownLatch latch = new CountDownLatch(1);
949 int receivedWhat;
950
951 CountDownHandler(Looper looper) {
952 super(looper);
953 }
954
955 @Override
956 public void handleMessage(Message msg) {
957 latch.countDown();
958 receivedWhat = msg.what;
959 }
960 }
Amin Shaikh972e2362016-12-07 14:08:09 -0800961}