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