NetworkScorerAppManagerTest.java revision d601360904df9b811205f44f15c89f12703d6d72
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.Matchers.any; 26import static org.mockito.Matchers.anyInt; 27import static org.mockito.Matchers.eq; 28import static org.mockito.Mockito.never; 29import static org.mockito.Mockito.verify; 30import static org.mockito.Mockito.when; 31 32import android.Manifest.permission; 33import android.content.ComponentName; 34import android.content.Context; 35import android.content.Intent; 36import android.content.pm.ActivityInfo; 37import android.content.pm.ApplicationInfo; 38import android.content.pm.PackageManager; 39import android.content.pm.ResolveInfo; 40import android.content.pm.ServiceInfo; 41import android.content.res.Resources; 42import android.net.NetworkScoreManager; 43import android.net.NetworkScorerAppData; 44import android.os.Bundle; 45import android.provider.Settings; 46import android.support.test.runner.AndroidJUnit4; 47 48import com.android.internal.R; 49 50import org.junit.Before; 51import org.junit.Test; 52import org.junit.runner.RunWith; 53import org.mockito.Mock; 54import org.mockito.Mockito; 55import org.mockito.MockitoAnnotations; 56import org.mockito.compat.ArgumentMatcher; 57 58import java.util.ArrayList; 59import java.util.List; 60 61@RunWith(AndroidJUnit4.class) 62public class NetworkScorerAppManagerTest { 63 private static String MOCK_SERVICE_LABEL = "Mock Service"; 64 private static String MOCK_OVERRIDEN_SERVICE_LABEL = "Mock Service Label Override"; 65 private static String MOCK_NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID = 66 "Mock Network Available Notification Channel Id"; 67 68 @Mock private Context mMockContext; 69 @Mock private PackageManager mMockPm; 70 @Mock private Resources mResources; 71 @Mock private NetworkScorerAppManager.SettingsFacade mSettingsFacade; 72 private NetworkScorerAppManager mNetworkScorerAppManager; 73 private List<ResolveInfo> mAvailableServices; 74 75 @Before 76 public void setUp() throws Exception { 77 MockitoAnnotations.initMocks(this); 78 mAvailableServices = new ArrayList<>(); 79 when(mMockContext.getPackageManager()).thenReturn(mMockPm); 80 when(mMockPm.queryIntentServices(Mockito.argThat(new ArgumentMatcher<Intent>() { 81 @Override 82 public boolean matchesObject(Object object) { 83 Intent intent = (Intent) object; 84 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS.equals(intent.getAction()); 85 } 86 }), eq(PackageManager.GET_META_DATA))).thenReturn(mAvailableServices); 87 when(mMockContext.getResources()).thenReturn(mResources); 88 89 mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext, mSettingsFacade); 90 } 91 92 @Test 93 public void testGetActiveScorer_providerAvailable() throws Exception { 94 final ComponentName recoComponent = new ComponentName("package1", "class1"); 95 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 96 mockScoreNetworksGranted(recoComponent.getPackageName()); 97 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */); 98 99 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 100 assertNotNull(activeScorer); 101 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 102 assertEquals(924, activeScorer.packageUid); 103 assertEquals(MOCK_SERVICE_LABEL, activeScorer.getRecommendationServiceLabel()); 104 } 105 106 @Test 107 public void testGetActiveScorer_providerAvailable_serviceLabelOverride() throws Exception { 108 final ComponentName recoComponent = new ComponentName("package1", "class1"); 109 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 110 mockScoreNetworksGranted(recoComponent.getPackageName()); 111 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 112 null /* enableUseOpenWifiPackageActivityPackage*/, true /* serviceLabelOverride */); 113 114 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 115 assertNotNull(activeScorer); 116 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 117 assertEquals(924, activeScorer.packageUid); 118 assertEquals(MOCK_OVERRIDEN_SERVICE_LABEL, activeScorer.getRecommendationServiceLabel()); 119 } 120 121 @Test 122 public void testGetActiveScorer_permissionMissing() throws Exception { 123 final ComponentName recoComponent = new ComponentName("package1", "class1"); 124 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 125 mockScoreNetworksDenied(recoComponent.getPackageName()); 126 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */); 127 128 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 129 assertNull(activeScorer); 130 } 131 132 @Test 133 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotSet() 134 throws Exception { 135 final ComponentName recoComponent = new ComponentName("package1", "class1"); 136 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 137 mockScoreNetworksGranted(recoComponent.getPackageName()); 138 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 139 null /* enableUseOpenWifiPackageActivityPackage*/); 140 141 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 142 assertNotNull(activeScorer); 143 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 144 assertEquals(924, activeScorer.packageUid); 145 assertNull(activeScorer.getEnableUseOpenWifiActivity()); 146 } 147 148 @Test 149 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotResolved() 150 throws Exception { 151 final ComponentName recoComponent = new ComponentName("package1", "class1"); 152 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 153 mockScoreNetworksGranted(recoComponent.getPackageName()); 154 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 155 "package2" /* enableUseOpenWifiPackageActivityPackage*/); 156 157 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 158 assertNotNull(activeScorer); 159 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 160 assertEquals(924, activeScorer.packageUid); 161 assertNull(activeScorer.getEnableUseOpenWifiActivity()); 162 } 163 164 @Test 165 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityResolved() 166 throws Exception { 167 final ComponentName recoComponent = new ComponentName("package1", "class1"); 168 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2"); 169 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 170 mockScoreNetworksGranted(recoComponent.getPackageName()); 171 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 172 enableUseOpenWifiComponent.getPackageName()); 173 174 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 175 assertNotNull(activeScorer); 176 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 177 assertEquals(924, activeScorer.packageUid); 178 assertEquals(enableUseOpenWifiComponent, activeScorer.getEnableUseOpenWifiActivity()); 179 assertNull(activeScorer.getNetworkAvailableNotificationChannelId()); 180 } 181 182 @Test 183 public void testGetActiveScorer_providerAvailable_networkAvailableNotificationChannelIdSet() { 184 final ComponentName recoComponent = new ComponentName("package1", "class1"); 185 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 186 mockScoreNetworksGranted(recoComponent.getPackageName()); 187 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 188 null /* enableUseOpenWifiActivityPackage */, false /* serviceLabelOverride */, 189 true /* setNotificationChannelId */); 190 191 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 192 assertNotNull(activeScorer); 193 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 194 assertEquals(924, activeScorer.packageUid); 195 assertEquals(MOCK_NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID, 196 activeScorer.getNetworkAvailableNotificationChannelId()); 197 } 198 199 @Test 200 public void testGetActiveScorer_packageSettingIsNull() 201 throws Exception { 202 // NETWORK_RECOMMENDATIONS_PACKAGE is null 203 204 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 205 assertNull(activeScorer); 206 } 207 208 @Test 209 public void testGetActiveScorer_packageSettingIsInvalid() throws Exception { 210 final ComponentName recoComponent = new ComponentName("package1", "class1"); 211 setDefaultNetworkRecommendationPackage(recoComponent.getPackageName()); 212 mockScoreNetworksGranted(recoComponent.getPackageName()); 213 // NETWORK_RECOMMENDATIONS_PACKAGE is set to a package that isn't a recommender. 214 215 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 216 assertNull(activeScorer); 217 } 218 219 @Test 220 public void testSetActiveScorer_noChange() throws Exception { 221 String packageName = "package"; 222 setNetworkRecoPackageSetting(packageName); 223 224 assertTrue(mNetworkScorerAppManager.setActiveScorer(packageName)); 225 verify(mSettingsFacade, never()).putString(any(), any(), any()); 226 } 227 228 @Test 229 public void testSetActiveScorer_nullPackage_validDefault() throws Exception { 230 String packageName = "package"; 231 String defaultPackage = "defaultPackage"; 232 setNetworkRecoPackageSetting(packageName); 233 setDefaultNetworkRecommendationPackage(defaultPackage); 234 final ComponentName recoComponent = new ComponentName(defaultPackage, "class1"); 235 mockScoreNetworksGranted(recoComponent.getPackageName()); 236 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null); 237 238 assertTrue(mNetworkScorerAppManager.setActiveScorer(null)); 239 verify(mSettingsFacade).putString(mMockContext, 240 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage); 241 } 242 243 @Test 244 public void testSetActiveScorer_nullPackage_invalidDefault() throws Exception { 245 String packageName = "package"; 246 String defaultPackage = "defaultPackage"; 247 setNetworkRecoPackageSetting(packageName); 248 setDefaultNetworkRecommendationPackage(defaultPackage); 249 250 assertFalse(mNetworkScorerAppManager.setActiveScorer(null)); 251 verify(mSettingsFacade, never()).putString(any(), 252 eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), any()); 253 } 254 255 @Test 256 public void testSetActiveScorer_validPackage() throws Exception { 257 String packageName = "package"; 258 String newPackage = "newPackage"; 259 setNetworkRecoPackageSetting(packageName); 260 final ComponentName recoComponent = new ComponentName(newPackage, "class1"); 261 mockScoreNetworksGranted(recoComponent.getPackageName()); 262 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null); 263 264 assertTrue(mNetworkScorerAppManager.setActiveScorer(newPackage)); 265 verify(mSettingsFacade).putString(mMockContext, 266 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, newPackage); 267 } 268 269 @Test 270 public void testSetActiveScorer_invalidPackage() throws Exception { 271 String packageName = "package"; 272 String newPackage = "newPackage"; 273 setNetworkRecoPackageSetting(packageName); 274 // newPackage doesn't resolve to a valid recommender 275 276 assertFalse(mNetworkScorerAppManager.setActiveScorer(newPackage)); 277 verify(mSettingsFacade, never()).putString(any(), any(), any()); 278 } 279 280 @Test 281 public void testUpdateState_recommendationsForcedOff() throws Exception { 282 setRecommendationsEnabledSetting(NetworkScoreManager.RECOMMENDATIONS_ENABLED_FORCED_OFF); 283 284 mNetworkScorerAppManager.updateState(); 285 286 verify(mSettingsFacade, never()).getString(any(), 287 eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE)); 288 verify(mSettingsFacade, never()).putInt(any(), 289 eq(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), anyInt()); 290 } 291 292 @Test 293 public void testUpdateState_currentPackageValid() throws Exception { 294 String packageName = "package"; 295 setNetworkRecoPackageSetting(packageName); 296 final ComponentName recoComponent = new ComponentName(packageName, "class1"); 297 mockScoreNetworksGranted(recoComponent.getPackageName()); 298 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null); 299 300 mNetworkScorerAppManager.updateState(); 301 302 verify(mSettingsFacade, never()).putString(any(), 303 eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), any()); 304 verify(mSettingsFacade).putInt(mMockContext, 305 Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 306 NetworkScoreManager.RECOMMENDATIONS_ENABLED_ON); 307 } 308 309 @Test 310 public void testUpdateState_currentPackageNotValid_validDefault() throws Exception { 311 String defaultPackage = "defaultPackage"; 312 setDefaultNetworkRecommendationPackage(defaultPackage); 313 final ComponentName recoComponent = new ComponentName(defaultPackage, "class1"); 314 mockScoreNetworksGranted(recoComponent.getPackageName()); 315 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null); 316 317 mNetworkScorerAppManager.updateState(); 318 319 verify(mSettingsFacade).putString(mMockContext, 320 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage); 321 verify(mSettingsFacade).putInt(mMockContext, 322 Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 323 NetworkScoreManager.RECOMMENDATIONS_ENABLED_ON); 324 } 325 326 @Test 327 public void testUpdateState_currentPackageNotValid_invalidDefault() throws Exception { 328 String defaultPackage = "defaultPackage"; 329 setDefaultNetworkRecommendationPackage(defaultPackage); 330 setNetworkRecoPackageSetting("currentPackage"); 331 332 mNetworkScorerAppManager.updateState(); 333 334 verify(mSettingsFacade).putString(mMockContext, 335 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage); 336 verify(mSettingsFacade).putInt(mMockContext, 337 Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 338 NetworkScoreManager.RECOMMENDATIONS_ENABLED_OFF); 339 } 340 341 @Test 342 public void testUpdateState_currentPackageNotValid_sameAsDefault() throws Exception { 343 String defaultPackage = "defaultPackage"; 344 setDefaultNetworkRecommendationPackage(defaultPackage); 345 setNetworkRecoPackageSetting(defaultPackage); 346 347 mNetworkScorerAppManager.updateState(); 348 349 verify(mSettingsFacade, never()).putString(any(), 350 eq(Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE), any()); 351 } 352 353 private void setRecommendationsEnabledSetting(int value) { 354 when(mSettingsFacade.getInt(eq(mMockContext), 355 eq(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED), anyInt())).thenReturn(value); 356 } 357 358 private void setNetworkRecoPackageSetting(String packageName) { 359 when(mSettingsFacade.getString(mMockContext, 360 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE)).thenReturn(packageName); 361 } 362 363 private void setDefaultNetworkRecommendationPackage(String name) { 364 when(mResources.getString(R.string.config_defaultNetworkRecommendationProviderPackage)) 365 .thenReturn(name); 366 } 367 368 private void mockScoreNetworksGranted(String packageName) { 369 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName)) 370 .thenReturn(PackageManager.PERMISSION_GRANTED); 371 } 372 373 private void mockScoreNetworksDenied(String packageName) { 374 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName)) 375 .thenReturn(PackageManager.PERMISSION_DENIED); 376 } 377 378 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) { 379 mockRecommendationServiceAvailable(compName, packageUid, null, false); 380 } 381 382 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid, 383 String enableUseOpenWifiActivityPackage) { 384 mockRecommendationServiceAvailable( 385 compName, packageUid, enableUseOpenWifiActivityPackage, false); 386 } 387 388 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid, 389 String enableUseOpenWifiActivityPackage, boolean serviceLabelOverride) { 390 mockRecommendationServiceAvailable(compName, packageUid, enableUseOpenWifiActivityPackage, 391 serviceLabelOverride, false); 392 } 393 394 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid, 395 String enableUseOpenWifiActivityPackage, boolean serviceLabelOverride, 396 boolean setNotificationChannel) { 397 final ResolveInfo serviceInfo = new ResolveInfo(); 398 serviceInfo.serviceInfo = new ServiceInfo(); 399 serviceInfo.serviceInfo.name = compName.getClassName(); 400 serviceInfo.serviceInfo.packageName = compName.getPackageName(); 401 serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo(); 402 serviceInfo.serviceInfo.applicationInfo.uid = packageUid; 403 if (enableUseOpenWifiActivityPackage != null) { 404 serviceInfo.serviceInfo.metaData = new Bundle(); 405 serviceInfo.serviceInfo.metaData.putString( 406 NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA, 407 enableUseOpenWifiActivityPackage); 408 } 409 if (serviceLabelOverride) { 410 if (serviceInfo.serviceInfo.metaData == null) { 411 serviceInfo.serviceInfo.metaData = new Bundle(); 412 } 413 serviceInfo.serviceInfo.metaData.putString( 414 NetworkScoreManager.RECOMMENDATION_SERVICE_LABEL_META_DATA, 415 MOCK_OVERRIDEN_SERVICE_LABEL); 416 } else { 417 serviceInfo.serviceInfo.nonLocalizedLabel = MOCK_SERVICE_LABEL; 418 } 419 if (setNotificationChannel) { 420 if (serviceInfo.serviceInfo.metaData == null) { 421 serviceInfo.serviceInfo.metaData = new Bundle(); 422 } 423 serviceInfo.serviceInfo.metaData.putString( 424 NetworkScoreManager.NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID_META_DATA, 425 MOCK_NETWORK_AVAILABLE_NOTIFICATION_CHANNEL_ID); 426 } 427 428 final int flags = PackageManager.GET_META_DATA; 429 when(mMockPm.resolveService( 430 Mockito.argThat(new ArgumentMatcher<Intent>() { 431 @Override 432 public boolean matchesObject(Object object) { 433 Intent intent = (Intent) object; 434 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS 435 .equals(intent.getAction()) 436 && compName.getPackageName().equals(intent.getPackage()); 437 } 438 }), Mockito.eq(flags))).thenReturn(serviceInfo); 439 440 mAvailableServices.add(serviceInfo); 441 } 442 443 private void mockEnableUseOpenWifiActivity(final ComponentName useOpenWifiComp) { 444 final ResolveInfo resolveActivityInfo = new ResolveInfo(); 445 resolveActivityInfo.activityInfo = new ActivityInfo(); 446 resolveActivityInfo.activityInfo.name = useOpenWifiComp.getClassName(); 447 resolveActivityInfo.activityInfo.packageName = useOpenWifiComp.getPackageName(); 448 449 final int flags = 0; 450 when(mMockPm.resolveActivity( 451 Mockito.argThat(new ArgumentMatcher<Intent>() { 452 @Override 453 public boolean matchesObject(Object object) { 454 Intent intent = (Intent) object; 455 return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(intent.getAction()) 456 && useOpenWifiComp.getPackageName().equals(intent.getPackage()); 457 } 458 }), Mockito.eq(flags))).thenReturn(resolveActivityInfo); 459 } 460} 461