1/* 2 * Copyright (C) 2014 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 junit.framework.Assert.assertEquals; 20import static junit.framework.Assert.assertNotNull; 21import static junit.framework.Assert.assertNull; 22import static junit.framework.Assert.assertTrue; 23 24import static org.junit.Assert.assertFalse; 25import static org.mockito.ArgumentMatchers.anyString; 26import static org.mockito.Matchers.any; 27import static org.mockito.Matchers.anyInt; 28import static org.mockito.Matchers.eq; 29import static org.mockito.Mockito.never; 30import static org.mockito.Mockito.verify; 31import static org.mockito.Mockito.when; 32 33import android.Manifest.permission; 34import android.content.ComponentName; 35import android.content.Context; 36import android.content.Intent; 37import android.content.pm.ActivityInfo; 38import android.content.pm.ApplicationInfo; 39import android.content.pm.PackageManager; 40import android.content.pm.ResolveInfo; 41import android.content.pm.ServiceInfo; 42import android.content.res.Resources; 43import android.net.NetworkScoreManager; 44import android.net.NetworkScorerAppData; 45import android.os.Bundle; 46import android.provider.Settings; 47import android.support.test.runner.AndroidJUnit4; 48 49import com.android.internal.R; 50 51import org.junit.Before; 52import org.junit.Test; 53import org.junit.runner.RunWith; 54import org.mockito.Mock; 55import org.mockito.Mockito; 56import org.mockito.MockitoAnnotations; 57import org.mockito.compat.ArgumentMatcher; 58 59import java.util.ArrayList; 60import java.util.List; 61 62@RunWith(AndroidJUnit4.class) 63public class NetworkScorerAppManagerTest { 64 private static String MOCK_SERVICE_LABEL = "Mock Service"; 65 private static String MOCK_OVERRIDEN_SERVICE_LABEL = "Mock Service Label Override"; 66 private static String MOCK_NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID = 67 "Mock Network Available Notification Channel Id"; 68 69 @Mock private Context mMockContext; 70 @Mock private PackageManager mMockPm; 71 @Mock private Resources mResources; 72 @Mock private NetworkScorerAppManager.SettingsFacade mSettingsFacade; 73 private NetworkScorerAppManager mNetworkScorerAppManager; 74 private List<ResolveInfo> mAvailableServices; 75 76 @Before 77 public void setUp() throws Exception { 78 MockitoAnnotations.initMocks(this); 79 mAvailableServices = new ArrayList<>(); 80 when(mMockContext.getPackageManager()).thenReturn(mMockPm); 81 when(mMockPm.queryIntentServices(Mockito.argThat(new ArgumentMatcher<Intent>() { 82 @Override 83 public boolean matchesObject(Object object) { 84 Intent intent = (Intent) object; 85 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS.equals(intent.getAction()); 86 } 87 }), eq(PackageManager.GET_META_DATA))).thenReturn(mAvailableServices); 88 when(mMockContext.getResources()).thenReturn(mResources); 89 90 mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext, mSettingsFacade); 91 } 92 93 @Test 94 public void testGetActiveScorer_providerAvailable() throws Exception { 95 final ComponentName recoComponent = new ComponentName("package1", "class1"); 96 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 97 mockScoreNetworksGranted(recoComponent.getPackageName()); 98 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */); 99 100 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 101 assertNotNull(activeScorer); 102 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 103 assertEquals(924, activeScorer.packageUid); 104 assertEquals(MOCK_SERVICE_LABEL, activeScorer.getRecommendationServiceLabel()); 105 } 106 107 @Test 108 public void testGetActiveScorer_providerAvailable_serviceLabelOverride() throws Exception { 109 final ComponentName recoComponent = new ComponentName("package1", "class1"); 110 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 111 mockScoreNetworksGranted(recoComponent.getPackageName()); 112 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 113 null /* enableUseOpenWifiPackageActivityPackage*/, true /* serviceLabelOverride */); 114 115 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 116 assertNotNull(activeScorer); 117 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 118 assertEquals(924, activeScorer.packageUid); 119 assertEquals(MOCK_OVERRIDEN_SERVICE_LABEL, activeScorer.getRecommendationServiceLabel()); 120 } 121 122 @Test 123 public void testGetActiveScorer_permissionMissing() throws Exception { 124 final ComponentName recoComponent = new ComponentName("package1", "class1"); 125 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 126 mockScoreNetworksDenied(recoComponent.getPackageName()); 127 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */); 128 129 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 130 assertNull(activeScorer); 131 } 132 133 @Test 134 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotSet() 135 throws Exception { 136 final ComponentName recoComponent = new ComponentName("package1", "class1"); 137 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 138 mockScoreNetworksGranted(recoComponent.getPackageName()); 139 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 140 null /* enableUseOpenWifiPackageActivityPackage*/); 141 142 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 143 assertNotNull(activeScorer); 144 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 145 assertEquals(924, activeScorer.packageUid); 146 assertNull(activeScorer.getEnableUseOpenWifiActivity()); 147 } 148 149 @Test 150 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotResolved() 151 throws Exception { 152 final ComponentName recoComponent = new ComponentName("package1", "class1"); 153 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 154 mockScoreNetworksGranted(recoComponent.getPackageName()); 155 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 156 "package2" /* enableUseOpenWifiPackageActivityPackage*/); 157 158 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 159 assertNotNull(activeScorer); 160 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 161 assertEquals(924, activeScorer.packageUid); 162 assertNull(activeScorer.getEnableUseOpenWifiActivity()); 163 } 164 165 @Test 166 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityResolved() 167 throws Exception { 168 final ComponentName recoComponent = new ComponentName("package1", "class1"); 169 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2"); 170 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 171 mockScoreNetworksGranted(recoComponent.getPackageName()); 172 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 173 enableUseOpenWifiComponent.getPackageName()); 174 mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent); 175 176 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 177 assertNotNull(activeScorer); 178 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 179 assertEquals(924, activeScorer.packageUid); 180 assertEquals(enableUseOpenWifiComponent, activeScorer.getEnableUseOpenWifiActivity()); 181 assertNull(activeScorer.getNetworkAvailableNotificationChannelId()); 182 } 183 184 @Test 185 public void testGetActiveScorer_providerAvailable_networkAvailableNotificationChannelIdSet() { 186 final ComponentName recoComponent = new ComponentName("package1", "class1"); 187 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 188 mockScoreNetworksGranted(recoComponent.getPackageName()); 189 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 190 null /* enableUseOpenWifiActivityPackage */, false /* serviceLabelOverride */, 191 true /* setNotificationChannelId */); 192 193 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 194 assertNotNull(activeScorer); 195 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 196 assertEquals(924, activeScorer.packageUid); 197 assertEquals(MOCK_NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID, 198 activeScorer.getNetworkAvailableNotificationChannelId()); 199 } 200 201 @Test 202 public void testGetActiveScorer_packageSettingIsNull() 203 throws Exception { 204 // NETWORK_RECOMMENDATIONS_PACKAGE is null 205 206 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 207 assertNull(activeScorer); 208 } 209 210 @Test 211 public void testGetActiveScorer_packageSettingIsInvalid() throws Exception { 212 final ComponentName recoComponent = new ComponentName("package1", "class1"); 213 setDefaultNetworkRecommendationPackage(recoComponent.getPackageName()); 214 mockScoreNetworksGranted(recoComponent.getPackageName()); 215 // NETWORK_RECOMMENDATIONS_PACKAGE is set to a package that isn't a recommender. 216 217 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 218 assertNull(activeScorer); 219 } 220 221 @Test 222 public void testSetActiveScorer_noChange() throws Exception { 223 String packageName = "package"; 224 setNetworkRecoPackageSetting(packageName); 225 226 assertTrue(mNetworkScorerAppManager.setActiveScorer(packageName)); 227 verify(mSettingsFacade, never()).putString(any(), any(), any()); 228 } 229 230 @Test 231 public void testSetActiveScorer_nullPackage_currentIsSet() throws Exception { 232 setNetworkRecoPackageSetting("package"); 233 234 assertTrue(mNetworkScorerAppManager.setActiveScorer(null)); 235 verify(mSettingsFacade).putString(mMockContext, 236 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, null); 237 verify(mSettingsFacade).putInt(mMockContext, 238 Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 239 NetworkScoreManager.RECOMMENDATIONS_ENABLED_FORCED_OFF); 240 } 241 242 @Test 243 public void testSetActiveScorer_nullPackage_currentIsNull() throws Exception { 244 setNetworkRecoPackageSetting(null); 245 246 assertTrue(mNetworkScorerAppManager.setActiveScorer(null)); 247 verify(mSettingsFacade, never()).putString(any(), any(), any()); 248 } 249 250 @Test 251 public void testSetActiveScorer_validPackage() throws Exception { 252 String packageName = "package"; 253 String newPackage = "newPackage"; 254 setNetworkRecoPackageSetting(packageName); 255 final ComponentName recoComponent = new ComponentName(newPackage, "class1"); 256 mockScoreNetworksGranted(recoComponent.getPackageName()); 257 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null); 258 259 assertTrue(mNetworkScorerAppManager.setActiveScorer(newPackage)); 260 verify(mSettingsFacade).putString(mMockContext, 261 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, newPackage); 262 verify(mSettingsFacade).putInt(mMockContext, 263 Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 264 NetworkScoreManager.RECOMMENDATIONS_ENABLED_ON); 265 } 266 267 @Test 268 public void testSetActiveScorer_invalidPackage() throws Exception { 269 String packageName = "package"; 270 String newPackage = "newPackage"; 271 setNetworkRecoPackageSetting(packageName); 272 // newPackage doesn't resolve to a valid recommender 273 274 assertFalse(mNetworkScorerAppManager.setActiveScorer(newPackage)); 275 verify(mSettingsFacade, never()).putString(any(), any(), any()); 276 } 277 278 @Test 279 public void testUpdateState_recommendationsForcedOff() throws Exception { 280 setRecommendationsEnabledSetting(NetworkScoreManager.RECOMMENDATIONS_ENABLED_FORCED_OFF); 281 282 mNetworkScorerAppManager.updateState(); 283 284 verify(mSettingsFacade, never()).getString(any(), 285 eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE)); 286 verify(mSettingsFacade, never()).putInt(any(), 287 eq(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), anyInt()); 288 } 289 290 @Test 291 public void testUpdateState_currentPackageValid() throws Exception { 292 String packageName = "package"; 293 setNetworkRecoPackageSetting(packageName); 294 final ComponentName recoComponent = new ComponentName(packageName, "class1"); 295 mockScoreNetworksGranted(recoComponent.getPackageName()); 296 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null); 297 298 mNetworkScorerAppManager.updateState(); 299 300 verify(mSettingsFacade, never()).putString(any(), 301 eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), any()); 302 verify(mSettingsFacade).putInt(mMockContext, 303 Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 304 NetworkScoreManager.RECOMMENDATIONS_ENABLED_ON); 305 } 306 307 @Test 308 public void testUpdateState_currentPackageNotValid_validDefault() throws Exception { 309 String defaultPackage = "defaultPackage"; 310 setDefaultNetworkRecommendationPackage(defaultPackage); 311 final ComponentName recoComponent = new ComponentName(defaultPackage, "class1"); 312 mockScoreNetworksGranted(recoComponent.getPackageName()); 313 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null); 314 315 mNetworkScorerAppManager.updateState(); 316 317 verify(mSettingsFacade).putString(mMockContext, 318 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage); 319 verify(mSettingsFacade).putInt(mMockContext, 320 Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 321 NetworkScoreManager.RECOMMENDATIONS_ENABLED_ON); 322 } 323 324 @Test 325 public void testUpdateState_currentPackageNotValid_invalidDefault() throws Exception { 326 String defaultPackage = "defaultPackage"; 327 setDefaultNetworkRecommendationPackage(defaultPackage); 328 setNetworkRecoPackageSetting("currentPackage"); 329 330 mNetworkScorerAppManager.updateState(); 331 332 verify(mSettingsFacade).putString(mMockContext, 333 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage); 334 verify(mSettingsFacade).putInt(mMockContext, 335 Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 336 NetworkScoreManager.RECOMMENDATIONS_ENABLED_OFF); 337 } 338 339 @Test 340 public void testUpdateState_currentPackageNull_defaultNull() throws Exception { 341 setDefaultNetworkRecommendationPackage(null); 342 setNetworkRecoPackageSetting(null); 343 344 mNetworkScorerAppManager.updateState(); 345 346 verify(mSettingsFacade, never()).putString(any(), 347 eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), anyString()); 348 verify(mSettingsFacade, never()).putInt(any(), 349 eq(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), anyInt()); 350 } 351 352 @Test 353 public void testUpdateState_currentPackageEmpty_defaultEmpty() throws Exception { 354 setDefaultNetworkRecommendationPackage(""); 355 setNetworkRecoPackageSetting(""); 356 357 mNetworkScorerAppManager.updateState(); 358 359 verify(mSettingsFacade, never()).putString(any(), 360 eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), anyString()); 361 verify(mSettingsFacade, never()).putInt(any(), 362 eq(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), anyInt()); 363 } 364 365 @Test 366 public void testUpdateState_currentPackageNotValid_sameAsDefault() throws Exception { 367 String defaultPackage = "defaultPackage"; 368 setDefaultNetworkRecommendationPackage(defaultPackage); 369 setNetworkRecoPackageSetting(defaultPackage); 370 371 mNetworkScorerAppManager.updateState(); 372 373 verify(mSettingsFacade, never()).putString(any(), 374 eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), any()); 375 } 376 377 @Test 378 public void testMigrateNetworkScorerAppSettingIfNeeded_networkScorerAppIsNull() 379 throws Exception { 380 when(mSettingsFacade.getString(mMockContext, 381 Settings.Global.NETWORK_SCORER_APP)).thenReturn(null); 382 383 mNetworkScorerAppManager.migrateNetworkScorerAppSettingIfNeeded(); 384 385 verify(mSettingsFacade, never()).putString(eq(mMockContext), 386 eq(Settings.Global.USE_OPEN_WIFI_PACKAGE), anyString()); 387 } 388 389 @Test 390 public void testMigrateNetworkScorerAppSettingIfNeeded_networkScorerAppIsEmpty() 391 throws Exception { 392 when(mSettingsFacade.getString(mMockContext, 393 Settings.Global.NETWORK_SCORER_APP)).thenReturn(""); 394 395 mNetworkScorerAppManager.migrateNetworkScorerAppSettingIfNeeded(); 396 397 verify(mSettingsFacade, never()).putString(eq(mMockContext), 398 eq(Settings.Global.USE_OPEN_WIFI_PACKAGE), anyString()); 399 } 400 401 @Test 402 public void testMigrateNetworkScorerAppSettingIfNeeded_networkScorerIsNotActive() 403 throws Exception { 404 when(mSettingsFacade.getString(mMockContext, 405 Settings.Global.NETWORK_SCORER_APP)).thenReturn("com.foo.package"); 406 // Make getActiveScorer() return null. 407 setRecommendationsEnabledSetting(NetworkScoreManager.RECOMMENDATIONS_ENABLED_FORCED_OFF); 408 409 mNetworkScorerAppManager.migrateNetworkScorerAppSettingIfNeeded(); 410 411 verify(mSettingsFacade, never()).putString(eq(mMockContext), 412 eq(Settings.Global.USE_OPEN_WIFI_PACKAGE), anyString()); 413 } 414 415 @Test 416 public void testMigrateNetworkScorerAppSettingIfNeeded_useOpenWifiSettingIsNotEmpty() 417 throws Exception { 418 final ComponentName recoComponent = new ComponentName("package1", "class1"); 419 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2"); 420 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 421 mockScoreNetworksGranted(recoComponent.getPackageName()); 422 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 423 enableUseOpenWifiComponent.getPackageName()); 424 mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent); 425 when(mSettingsFacade.getString(mMockContext, 426 Settings.Global.NETWORK_SCORER_APP)) 427 .thenReturn(enableUseOpenWifiComponent.getPackageName()); 428 // The setting has a value so the migration shouldn't touch it. 429 when(mSettingsFacade.getString(mMockContext, 430 Settings.Global.USE_OPEN_WIFI_PACKAGE)) 431 .thenReturn(enableUseOpenWifiComponent.getPackageName()); 432 433 mNetworkScorerAppManager.migrateNetworkScorerAppSettingIfNeeded(); 434 435 verify(mSettingsFacade, never()).putString(eq(mMockContext), 436 eq(Settings.Global.USE_OPEN_WIFI_PACKAGE), anyString()); 437 verify(mSettingsFacade).putString(eq(mMockContext), 438 eq(Settings.Global.NETWORK_SCORER_APP), eq(null)); 439 } 440 441 @Test 442 public void testMigrateNetworkScorerAppSettingIfNeeded_useOpenWifiActivityNotAvail() 443 throws Exception { 444 final ComponentName recoComponent = new ComponentName("package1", "class1"); 445 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2"); 446 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 447 mockScoreNetworksGranted(recoComponent.getPackageName()); 448 // The active component doesn't have an open wifi activity so the migration shouldn't 449 // set USE_OPEN_WIFI_PACKAGE. 450 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 451 null /*useOpenWifiActivityPackage*/); 452 when(mSettingsFacade.getString(mMockContext, 453 Settings.Global.NETWORK_SCORER_APP)) 454 .thenReturn(enableUseOpenWifiComponent.getPackageName()); 455 when(mSettingsFacade.getString(mMockContext, 456 Settings.Global.USE_OPEN_WIFI_PACKAGE)).thenReturn(null); 457 458 mNetworkScorerAppManager.migrateNetworkScorerAppSettingIfNeeded(); 459 460 verify(mSettingsFacade, never()).putString(eq(mMockContext), 461 eq(Settings.Global.USE_OPEN_WIFI_PACKAGE), anyString()); 462 verify(mSettingsFacade).putString(eq(mMockContext), 463 eq(Settings.Global.NETWORK_SCORER_APP), eq(null)); 464 } 465 466 @Test 467 public void testMigrateNetworkScorerAppSettingIfNeeded_packageMismatch_activity() 468 throws Exception { 469 final ComponentName recoComponent = new ComponentName("package1", "class1"); 470 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2"); 471 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 472 mockScoreNetworksGranted(recoComponent.getPackageName()); 473 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 474 enableUseOpenWifiComponent.getPackageName()); 475 mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent); 476 // The older network scorer app setting doesn't match the new use open wifi activity package 477 // so the migration shouldn't set USE_OPEN_WIFI_PACKAGE. 478 when(mSettingsFacade.getString(mMockContext, 479 Settings.Global.NETWORK_SCORER_APP)) 480 .thenReturn(enableUseOpenWifiComponent.getPackageName() + ".diff"); 481 when(mSettingsFacade.getString(mMockContext, 482 Settings.Global.USE_OPEN_WIFI_PACKAGE)).thenReturn(null); 483 484 mNetworkScorerAppManager.migrateNetworkScorerAppSettingIfNeeded(); 485 486 verify(mSettingsFacade, never()).putString(eq(mMockContext), 487 eq(Settings.Global.USE_OPEN_WIFI_PACKAGE), anyString()); 488 verify(mSettingsFacade).putString(eq(mMockContext), 489 eq(Settings.Global.NETWORK_SCORER_APP), eq(null)); 490 } 491 492 @Test 493 public void testMigrateNetworkScorerAppSettingIfNeeded_packageMismatch_service() 494 throws Exception { 495 final ComponentName recoComponent = new ComponentName("package1", "class1"); 496 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2"); 497 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 498 mockScoreNetworksGranted(recoComponent.getPackageName()); 499 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 500 enableUseOpenWifiComponent.getPackageName()); 501 mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent); 502 // The older network scorer app setting doesn't match the active package so the migration 503 // shouldn't set USE_OPEN_WIFI_PACKAGE. 504 when(mSettingsFacade.getString(mMockContext, 505 Settings.Global.NETWORK_SCORER_APP)) 506 .thenReturn(recoComponent.getPackageName() + ".diff"); 507 when(mSettingsFacade.getString(mMockContext, 508 Settings.Global.USE_OPEN_WIFI_PACKAGE)).thenReturn(null); 509 510 mNetworkScorerAppManager.migrateNetworkScorerAppSettingIfNeeded(); 511 512 verify(mSettingsFacade, never()).putString(eq(mMockContext), 513 eq(Settings.Global.USE_OPEN_WIFI_PACKAGE), anyString()); 514 verify(mSettingsFacade).putString(eq(mMockContext), 515 eq(Settings.Global.NETWORK_SCORER_APP), eq(null)); 516 } 517 518 @Test 519 public void testMigrateNetworkScorerAppSettingIfNeeded_packageMatch_activity() 520 throws Exception { 521 final ComponentName recoComponent = new ComponentName("package1", "class1"); 522 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2"); 523 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 524 mockScoreNetworksGranted(recoComponent.getPackageName()); 525 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 526 enableUseOpenWifiComponent.getPackageName()); 527 mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent); 528 // Old setting matches the new activity package, migration should happen. 529 when(mSettingsFacade.getString(mMockContext, 530 Settings.Global.NETWORK_SCORER_APP)) 531 .thenReturn(enableUseOpenWifiComponent.getPackageName()); 532 when(mSettingsFacade.getString(mMockContext, 533 Settings.Global.USE_OPEN_WIFI_PACKAGE)).thenReturn(null); 534 535 mNetworkScorerAppManager.migrateNetworkScorerAppSettingIfNeeded(); 536 537 verify(mSettingsFacade).putString(eq(mMockContext), 538 eq(Settings.Global.USE_OPEN_WIFI_PACKAGE), 539 eq(enableUseOpenWifiComponent.getPackageName())); 540 verify(mSettingsFacade).putString(eq(mMockContext), 541 eq(Settings.Global.NETWORK_SCORER_APP), eq(null)); 542 } 543 544 private void setRecommendationsEnabledSetting(int value) { 545 when(mSettingsFacade.getInt(eq(mMockContext), 546 eq(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), anyInt())).thenReturn(value); 547 } 548 549 private void setNetworkRecoPackageSetting(String packageName) { 550 when(mSettingsFacade.getString(mMockContext, 551 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE)).thenReturn(packageName); 552 } 553 554 private void setDefaultNetworkRecommendationPackage(String name) { 555 when(mResources.getString(R.string.config_defaultNetworkRecommendationProviderPackage)) 556 .thenReturn(name); 557 } 558 559 private void mockScoreNetworksGranted(String packageName) { 560 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName)) 561 .thenReturn(PackageManager.PERMISSION_GRANTED); 562 } 563 564 private void mockScoreNetworksDenied(String packageName) { 565 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName)) 566 .thenReturn(PackageManager.PERMISSION_DENIED); 567 } 568 569 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) { 570 mockRecommendationServiceAvailable(compName, packageUid, null, false); 571 } 572 573 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid, 574 String enableUseOpenWifiActivityPackage) { 575 mockRecommendationServiceAvailable( 576 compName, packageUid, enableUseOpenWifiActivityPackage, false); 577 } 578 579 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid, 580 String enableUseOpenWifiActivityPackage, boolean serviceLabelOverride) { 581 mockRecommendationServiceAvailable(compName, packageUid, enableUseOpenWifiActivityPackage, 582 serviceLabelOverride, false); 583 } 584 585 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid, 586 String enableUseOpenWifiActivityPackage, boolean serviceLabelOverride, 587 boolean setNotificationChannel) { 588 final ResolveInfo serviceInfo = new ResolveInfo(); 589 serviceInfo.serviceInfo = new ServiceInfo(); 590 serviceInfo.serviceInfo.name = compName.getClassName(); 591 serviceInfo.serviceInfo.packageName = compName.getPackageName(); 592 serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo(); 593 serviceInfo.serviceInfo.applicationInfo.uid = packageUid; 594 if (enableUseOpenWifiActivityPackage != null) { 595 serviceInfo.serviceInfo.metaData = new Bundle(); 596 serviceInfo.serviceInfo.metaData.putString( 597 NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA, 598 enableUseOpenWifiActivityPackage); 599 } 600 if (serviceLabelOverride) { 601 if (serviceInfo.serviceInfo.metaData == null) { 602 serviceInfo.serviceInfo.metaData = new Bundle(); 603 } 604 serviceInfo.serviceInfo.metaData.putString( 605 NetworkScoreManager.RECOMMENDATION_SERVICE_LABEL_META_DATA, 606 MOCK_OVERRIDEN_SERVICE_LABEL); 607 } else { 608 serviceInfo.serviceInfo.nonLocalizedLabel = MOCK_SERVICE_LABEL; 609 } 610 if (setNotificationChannel) { 611 if (serviceInfo.serviceInfo.metaData == null) { 612 serviceInfo.serviceInfo.metaData = new Bundle(); 613 } 614 serviceInfo.serviceInfo.metaData.putString( 615 NetworkScoreManager.NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID_META_DATA, 616 MOCK_NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID); 617 } 618 619 final int flags = PackageManager.GET_META_DATA; 620 when(mMockPm.resolveService( 621 Mockito.argThat(new ArgumentMatcher<Intent>() { 622 @Override 623 public boolean matchesObject(Object object) { 624 Intent intent = (Intent) object; 625 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS 626 .equals(intent.getAction()) 627 && compName.getPackageName().equals(intent.getPackage()); 628 } 629 }), Mockito.eq(flags))).thenReturn(serviceInfo); 630 631 mAvailableServices.add(serviceInfo); 632 } 633 634 private void mockEnableUseOpenWifiActivity(final ComponentName useOpenWifiComp) { 635 final ResolveInfo resolveActivityInfo = new ResolveInfo(); 636 resolveActivityInfo.activityInfo = new ActivityInfo(); 637 resolveActivityInfo.activityInfo.name = useOpenWifiComp.getClassName(); 638 resolveActivityInfo.activityInfo.packageName = useOpenWifiComp.getPackageName(); 639 640 final int flags = 0; 641 when(mMockPm.resolveActivity( 642 Mockito.argThat(new ArgumentMatcher<Intent>() { 643 @Override 644 public boolean matchesObject(Object object) { 645 Intent intent = (Intent) object; 646 return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(intent.getAction()) 647 && useOpenWifiComp.getPackageName().equals(intent.getPackage()); 648 } 649 }), Mockito.eq(flags))).thenReturn(resolveActivityInfo); 650 } 651} 652