NetworkScoreServiceTest.java revision 823db059e44811f7306d3afad884d2dabf6d3c4b
1/* 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 19import static android.net.NetworkScoreManager.CACHE_FILTER_NONE; 20 21import static junit.framework.Assert.assertEquals; 22import static junit.framework.Assert.assertFalse; 23import static junit.framework.Assert.assertTrue; 24import static junit.framework.Assert.fail; 25 26import static org.mockito.Matchers.any; 27import static org.mockito.Matchers.anyInt; 28import static org.mockito.Matchers.anyListOf; 29import static org.mockito.Matchers.anyString; 30import static org.mockito.Matchers.eq; 31import static org.mockito.Mockito.atLeastOnce; 32import static org.mockito.Mockito.doThrow; 33import static org.mockito.Mockito.never; 34import static org.mockito.Mockito.times; 35import static org.mockito.Mockito.verify; 36import static org.mockito.Mockito.verifyNoMoreInteractions; 37import 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; 44import android.content.ServiceConnection; 45import android.content.pm.PackageManager; 46import android.content.res.Resources; 47import android.net.INetworkScoreCache; 48import android.net.NetworkKey; 49import android.net.NetworkScoreManager; 50import android.net.NetworkScorerAppManager; 51import android.net.NetworkScorerAppManager.NetworkScorerAppData; 52import android.net.ScoredNetwork; 53import android.net.WifiKey; 54import android.os.IBinder; 55import android.os.RemoteException; 56import android.os.UserHandle; 57import android.provider.Settings; 58import android.provider.Settings.Global; 59import android.support.test.InstrumentationRegistry; 60import android.support.test.filters.MediumTest; 61import android.support.test.runner.AndroidJUnit4; 62 63import com.android.internal.R; 64import com.android.server.devicepolicy.MockUtils; 65 66import java.io.FileDescriptor; 67import java.io.PrintWriter; 68import java.io.StringWriter; 69import java.util.List; 70import org.junit.Before; 71import org.junit.Test; 72import org.junit.runner.RunWith; 73import org.mockito.ArgumentCaptor; 74import org.mockito.Captor; 75import org.mockito.Mock; 76import org.mockito.Mockito; 77import org.mockito.MockitoAnnotations; 78 79/** 80 * Tests for {@link NetworkScoreService}. 81 */ 82@RunWith(AndroidJUnit4.class) 83@MediumTest 84public class NetworkScoreServiceTest { 85 private static final ScoredNetwork SCORED_NETWORK = 86 new ScoredNetwork(new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00")), 87 null /* rssiCurve*/); 88 private static final NetworkScorerAppData PREV_SCORER = new NetworkScorerAppData( 89 "prevPackageName", 0, "prevScorerName", null /* configurationActivityClassName */, 90 "prevScoringServiceClass"); 91 private static final NetworkScorerAppData NEW_SCORER = new NetworkScorerAppData( 92 "newPackageName", 1, "newScorerName", null /* configurationActivityClassName */, 93 "newScoringServiceClass"); 94 95 @Mock private PackageManager mPackageManager; 96 @Mock private NetworkScorerAppManager mNetworkScorerAppManager; 97 @Mock private Context mContext; 98 @Mock private Resources mResources; 99 @Mock private INetworkScoreCache.Stub mNetworkScoreCache, mNetworkScoreCache2; 100 @Mock private IBinder mIBinder, mIBinder2; 101 @Captor private ArgumentCaptor<List<ScoredNetwork>> mScoredNetworkCaptor; 102 103 private ContentResolver mContentResolver; 104 private NetworkScoreService mNetworkScoreService; 105 106 @Before 107 public void setUp() throws Exception { 108 MockitoAnnotations.initMocks(this); 109 when(mNetworkScoreCache.asBinder()).thenReturn(mIBinder); 110 when(mNetworkScoreCache2.asBinder()).thenReturn(mIBinder2); 111 mContentResolver = InstrumentationRegistry.getContext().getContentResolver(); 112 when(mContext.getContentResolver()).thenReturn(mContentResolver); 113 when(mContext.getResources()).thenReturn(mResources); 114 mNetworkScoreService = new NetworkScoreService(mContext, mNetworkScorerAppManager); 115 } 116 117 @Test 118 public void testSystemReady_networkScorerProvisioned() throws Exception { 119 Settings.Global.putInt(mContentResolver, Global.NETWORK_SCORING_PROVISIONED, 1); 120 121 mNetworkScoreService.systemReady(); 122 123 verify(mNetworkScorerAppManager, never()).setActiveScorer(anyString()); 124 } 125 126 @Test 127 public void testSystemReady_networkScorerNotProvisioned_defaultScorer() throws Exception { 128 Settings.Global.putInt(mContentResolver, Global.NETWORK_SCORING_PROVISIONED, 0); 129 130 when(mResources.getString(R.string.config_defaultNetworkScorerPackageName)) 131 .thenReturn(NEW_SCORER.mPackageName); 132 133 mNetworkScoreService.systemReady(); 134 135 verify(mNetworkScorerAppManager).setActiveScorer(NEW_SCORER.mPackageName); 136 assertEquals(1, 137 Settings.Global.getInt(mContentResolver, Global.NETWORK_SCORING_PROVISIONED)); 138 139 } 140 141 @Test 142 public void testSystemReady_networkScorerNotProvisioned_noDefaultScorer() throws Exception { 143 Settings.Global.putInt(mContentResolver, Global.NETWORK_SCORING_PROVISIONED, 0); 144 145 when(mResources.getString(R.string.config_defaultNetworkScorerPackageName)) 146 .thenReturn(null); 147 148 mNetworkScoreService.systemReady(); 149 150 verify(mNetworkScorerAppManager, never()).setActiveScorer(anyString()); 151 assertEquals(1, 152 Settings.Global.getInt(mContentResolver, Global.NETWORK_SCORING_PROVISIONED)); 153 } 154 155 @Test 156 public void testSystemRunning() { 157 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER); 158 159 mNetworkScoreService.systemRunning(); 160 161 verify(mContext).bindServiceAsUser(MockUtils.checkIntent(new Intent().setComponent( 162 new ComponentName(NEW_SCORER.mPackageName, NEW_SCORER.mScoringServiceClassName))), 163 any(ServiceConnection.class), 164 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE), 165 eq(UserHandle.SYSTEM)); 166 } 167 168 @Test 169 public void testUpdateScores_notActiveScorer() { 170 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(false); 171 172 try { 173 mNetworkScoreService.updateScores(new ScoredNetwork[0]); 174 fail("SecurityException expected"); 175 } catch (SecurityException e) { 176 // expected 177 } 178 } 179 180 @Test 181 public void testUpdateScores_oneRegisteredCache() throws RemoteException { 182 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true); 183 184 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, 185 mNetworkScoreCache, CACHE_FILTER_NONE); 186 187 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK}); 188 189 verify(mNetworkScoreCache).updateScores(mScoredNetworkCaptor.capture()); 190 191 assertEquals(1, mScoredNetworkCaptor.getValue().size()); 192 assertEquals(SCORED_NETWORK, mScoredNetworkCaptor.getValue().get(0)); 193 } 194 195 @Test 196 public void testUpdateScores_twoRegisteredCaches() throws RemoteException { 197 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true); 198 199 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, 200 mNetworkScoreCache, CACHE_FILTER_NONE); 201 mNetworkScoreService.registerNetworkScoreCache( 202 NetworkKey.TYPE_WIFI, mNetworkScoreCache2, CACHE_FILTER_NONE); 203 204 // updateScores should update both caches 205 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK}); 206 207 verify(mNetworkScoreCache).updateScores(anyListOf(ScoredNetwork.class)); 208 verify(mNetworkScoreCache2).updateScores(anyListOf(ScoredNetwork.class)); 209 210 mNetworkScoreService.unregisterNetworkScoreCache( 211 NetworkKey.TYPE_WIFI, mNetworkScoreCache2); 212 213 // updateScores should only update the first cache since the 2nd has been unregistered 214 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK}); 215 216 verify(mNetworkScoreCache, times(2)).updateScores(anyListOf(ScoredNetwork.class)); 217 218 mNetworkScoreService.unregisterNetworkScoreCache( 219 NetworkKey.TYPE_WIFI, mNetworkScoreCache); 220 221 // updateScores should not update any caches since they are both unregistered 222 mNetworkScoreService.updateScores(new ScoredNetwork[]{SCORED_NETWORK}); 223 224 // The register and unregister calls grab the binder from the score cache. 225 verify(mNetworkScoreCache, atLeastOnce()).asBinder(); 226 verify(mNetworkScoreCache2, atLeastOnce()).asBinder(); 227 verifyNoMoreInteractions(mNetworkScoreCache, mNetworkScoreCache2); 228 } 229 230 @Test 231 public void testClearScores_notActiveScorer_noBroadcastNetworkPermission() { 232 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(false); 233 when(mContext.checkCallingOrSelfPermission(permission.BROADCAST_NETWORK_PRIVILEGED)) 234 .thenReturn(PackageManager.PERMISSION_DENIED); 235 try { 236 mNetworkScoreService.clearScores(); 237 fail("SecurityException expected"); 238 } catch (SecurityException e) { 239 // expected 240 } 241 } 242 243 @Test 244 public void testClearScores_activeScorer_noBroadcastNetworkPermission() { 245 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true); 246 when(mContext.checkCallingOrSelfPermission(permission.BROADCAST_NETWORK_PRIVILEGED)) 247 .thenReturn(PackageManager.PERMISSION_DENIED); 248 249 mNetworkScoreService.clearScores(); 250 } 251 252 @Test 253 public void testClearScores_activeScorer() throws RemoteException { 254 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true); 255 256 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache, 257 CACHE_FILTER_NONE); 258 mNetworkScoreService.clearScores(); 259 260 verify(mNetworkScoreCache).clearScores(); 261 } 262 263 @Test 264 public void testClearScores_notActiveScorer_hasBroadcastNetworkPermission() 265 throws RemoteException { 266 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(false); 267 when(mContext.checkCallingOrSelfPermission(permission.BROADCAST_NETWORK_PRIVILEGED)) 268 .thenReturn(PackageManager.PERMISSION_GRANTED); 269 270 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache, 271 CACHE_FILTER_NONE); 272 mNetworkScoreService.clearScores(); 273 274 verify(mNetworkScoreCache).clearScores(); 275 } 276 277 @Test 278 public void testSetActiveScorer_noScoreNetworksPermission() { 279 doThrow(new SecurityException()).when(mContext) 280 .enforceCallingOrSelfPermission(eq(permission.SCORE_NETWORKS), anyString()); 281 282 try { 283 mNetworkScoreService.setActiveScorer(null); 284 fail("SecurityException expected"); 285 } catch (SecurityException e) { 286 // expected 287 } 288 } 289 290 @Test 291 public void testSetActiveScorer_failure() throws RemoteException { 292 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER); 293 when(mNetworkScorerAppManager.setActiveScorer(NEW_SCORER.mPackageName)).thenReturn(false); 294 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache, 295 CACHE_FILTER_NONE); 296 297 boolean success = mNetworkScoreService.setActiveScorer(NEW_SCORER.mPackageName); 298 299 assertFalse(success); 300 verify(mNetworkScoreCache).clearScores(); 301 verify(mContext).bindServiceAsUser(MockUtils.checkIntent(new Intent().setComponent( 302 new ComponentName(PREV_SCORER.mPackageName, PREV_SCORER.mScoringServiceClassName))), 303 any(ServiceConnection.class), 304 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE), 305 eq(UserHandle.SYSTEM)); 306 } 307 308 @Test 309 public void testSetActiveScorer_success() throws RemoteException { 310 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER, NEW_SCORER); 311 when(mNetworkScorerAppManager.setActiveScorer(NEW_SCORER.mPackageName)).thenReturn(true); 312 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache, 313 CACHE_FILTER_NONE); 314 315 boolean success = mNetworkScoreService.setActiveScorer(NEW_SCORER.mPackageName); 316 317 assertTrue(success); 318 verify(mNetworkScoreCache).clearScores(); 319 verify(mContext).bindServiceAsUser(MockUtils.checkIntent(new Intent().setComponent( 320 new ComponentName(NEW_SCORER.mPackageName, NEW_SCORER.mScoringServiceClassName))), 321 any(ServiceConnection.class), 322 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE), 323 eq(UserHandle.SYSTEM)); 324 verify(mContext, times(2)).sendBroadcastAsUser( 325 MockUtils.checkIntentAction(NetworkScoreManager.ACTION_SCORER_CHANGED), 326 eq(UserHandle.SYSTEM)); 327 } 328 329 @Test 330 public void testDisableScoring_notActiveScorer_noBroadcastNetworkPermission() { 331 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(false); 332 when(mContext.checkCallingOrSelfPermission(permission.BROADCAST_NETWORK_PRIVILEGED)) 333 .thenReturn(PackageManager.PERMISSION_DENIED); 334 335 try { 336 mNetworkScoreService.disableScoring(); 337 fail("SecurityException expected"); 338 } catch (SecurityException e) { 339 // expected 340 } 341 342 } 343 344 @Test 345 public void testDisableScoring_activeScorer() throws RemoteException { 346 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(true); 347 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER, null); 348 when(mNetworkScorerAppManager.setActiveScorer(null)).thenReturn(true); 349 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache, 350 CACHE_FILTER_NONE); 351 352 mNetworkScoreService.disableScoring(); 353 354 verify(mNetworkScoreCache).clearScores(); 355 verify(mContext).sendBroadcastAsUser( 356 MockUtils.checkIntent(new Intent(NetworkScoreManager.ACTION_SCORER_CHANGED) 357 .setPackage(PREV_SCORER.mPackageName)), 358 eq(UserHandle.SYSTEM)); 359 verify(mContext, never()).bindServiceAsUser(any(Intent.class), 360 any(ServiceConnection.class), anyInt(), any(UserHandle.class)); 361 } 362 363 @Test 364 public void testDisableScoring_notActiveScorer_hasBroadcastNetworkPermission() 365 throws RemoteException { 366 when(mNetworkScorerAppManager.isCallerActiveScorer(anyInt())).thenReturn(false); 367 when(mContext.checkCallingOrSelfPermission(permission.BROADCAST_NETWORK_PRIVILEGED)) 368 .thenReturn(PackageManager.PERMISSION_GRANTED); 369 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(PREV_SCORER, null); 370 when(mNetworkScorerAppManager.setActiveScorer(null)).thenReturn(true); 371 mNetworkScoreService.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mNetworkScoreCache, 372 CACHE_FILTER_NONE); 373 374 mNetworkScoreService.disableScoring(); 375 376 verify(mNetworkScoreCache).clearScores(); 377 verify(mContext).sendBroadcastAsUser( 378 MockUtils.checkIntent(new Intent(NetworkScoreManager.ACTION_SCORER_CHANGED) 379 .setPackage(PREV_SCORER.mPackageName)), 380 eq(UserHandle.SYSTEM)); 381 verify(mContext, never()).bindServiceAsUser(any(Intent.class), 382 any(ServiceConnection.class), anyInt(), any(UserHandle.class)); 383 } 384 385 @Test 386 public void testRegisterNetworkScoreCache_noBroadcastNetworkPermission() { 387 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission( 388 eq(permission.BROADCAST_NETWORK_PRIVILEGED), anyString()); 389 390 try { 391 mNetworkScoreService.registerNetworkScoreCache( 392 NetworkKey.TYPE_WIFI, mNetworkScoreCache, CACHE_FILTER_NONE); 393 fail("SecurityException expected"); 394 } catch (SecurityException e) { 395 // expected 396 } 397 } 398 399 @Test 400 public void testUnregisterNetworkScoreCache_noBroadcastNetworkPermission() { 401 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission( 402 eq(permission.BROADCAST_NETWORK_PRIVILEGED), anyString()); 403 404 try { 405 mNetworkScoreService.unregisterNetworkScoreCache( 406 NetworkKey.TYPE_WIFI, mNetworkScoreCache); 407 fail("SecurityException expected"); 408 } catch (SecurityException e) { 409 // expected 410 } 411 } 412 413 @Test 414 public void testDump_noDumpPermission() { 415 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission( 416 eq(permission.DUMP), anyString()); 417 418 try { 419 mNetworkScoreService.dump( 420 new FileDescriptor(), new PrintWriter(new StringWriter()), new String[0]); 421 fail("SecurityException expected"); 422 } catch (SecurityException e) { 423 // expected 424 } 425 } 426 427 @Test 428 public void testDump_doesNotCrash() { 429 when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER); 430 StringWriter stringWriter = new StringWriter(); 431 432 mNetworkScoreService.dump( 433 new FileDescriptor(), new PrintWriter(stringWriter), new String[0]); 434 435 assertFalse(stringWriter.toString().isEmpty()); 436 } 437} 438