NetworkScorerAppManagerTest.java revision 8b1339af53c3e3287cfb98eb25c69f31739923e6
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.eq; 27import static org.mockito.Mockito.never; 28import static org.mockito.Mockito.verify; 29import static org.mockito.Mockito.when; 30 31import android.Manifest.permission; 32import android.content.ComponentName; 33import android.content.Context; 34import android.content.Intent; 35import android.content.pm.ActivityInfo; 36import android.content.pm.ApplicationInfo; 37import android.content.pm.PackageManager; 38import android.content.pm.ResolveInfo; 39import android.content.pm.ServiceInfo; 40import android.content.res.Resources; 41import android.net.NetworkScoreManager; 42import android.net.NetworkScorerAppData; 43import android.os.Bundle; 44import android.provider.Settings; 45import android.support.test.runner.AndroidJUnit4; 46 47import com.android.internal.R; 48 49import org.junit.Before; 50import org.junit.Test; 51import org.junit.runner.RunWith; 52import org.mockito.ArgumentMatcher; 53import org.mockito.Mock; 54import org.mockito.Mockito; 55import org.mockito.MockitoAnnotations; 56 57import java.util.ArrayList; 58import java.util.List; 59 60@RunWith(AndroidJUnit4.class) 61public class NetworkScorerAppManagerTest { 62 private static String MOCK_SERVICE_LABEL = "Mock Service"; 63 private static String MOCK_OVERRIDEN_SERVICE_LABEL = "Mock Service Label Override"; 64 65 @Mock private Context mMockContext; 66 @Mock private PackageManager mMockPm; 67 @Mock private Resources mResources; 68 @Mock private NetworkScorerAppManager.SettingsFacade mSettingsFacade; 69 private NetworkScorerAppManager mNetworkScorerAppManager; 70 private List<ResolveInfo> mAvailableServices; 71 72 @Before 73 public void setUp() throws Exception { 74 MockitoAnnotations.initMocks(this); 75 mAvailableServices = new ArrayList<>(); 76 when(mMockContext.getPackageManager()).thenReturn(mMockPm); 77 when(mMockPm.queryIntentServices(Mockito.argThat(new ArgumentMatcher<Intent>() { 78 @Override 79 public boolean matches(Object object) { 80 Intent intent = (Intent) object; 81 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS.equals(intent.getAction()); 82 } 83 }), eq(PackageManager.GET_META_DATA))).thenReturn(mAvailableServices); 84 when(mMockContext.getResources()).thenReturn(mResources); 85 86 mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext, mSettingsFacade); 87 } 88 89 @Test 90 public void testGetActiveScorer_providerAvailable() throws Exception { 91 final ComponentName recoComponent = new ComponentName("package1", "class1"); 92 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 93 mockScoreNetworksGranted(recoComponent.getPackageName()); 94 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */); 95 96 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 97 assertNotNull(activeScorer); 98 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 99 assertEquals(924, activeScorer.packageUid); 100 assertEquals(MOCK_SERVICE_LABEL, activeScorer.getRecommendationServiceLabel()); 101 } 102 103 @Test 104 public void testGetActiveScorer_providerAvailable_serviceLabelOverride() throws Exception { 105 final ComponentName recoComponent = new ComponentName("package1", "class1"); 106 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 107 mockScoreNetworksGranted(recoComponent.getPackageName()); 108 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 109 null /* enableUseOpenWifiPackageActivityPackage*/, true /* serviceLabelOverride */); 110 111 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 112 assertNotNull(activeScorer); 113 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 114 assertEquals(924, activeScorer.packageUid); 115 assertEquals(MOCK_OVERRIDEN_SERVICE_LABEL, activeScorer.getRecommendationServiceLabel()); 116 } 117 118 @Test 119 public void testGetActiveScorer_permissionMissing() throws Exception { 120 final ComponentName recoComponent = new ComponentName("package1", "class1"); 121 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 122 mockScoreNetworksDenied(recoComponent.getPackageName()); 123 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */); 124 125 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 126 assertNull(activeScorer); 127 } 128 129 @Test 130 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotSet() 131 throws Exception { 132 final ComponentName recoComponent = new ComponentName("package1", "class1"); 133 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 134 mockScoreNetworksGranted(recoComponent.getPackageName()); 135 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 136 null /* enableUseOpenWifiPackageActivityPackage*/); 137 138 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 139 assertNotNull(activeScorer); 140 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 141 assertEquals(924, activeScorer.packageUid); 142 assertNull(activeScorer.getEnableUseOpenWifiActivity()); 143 } 144 145 @Test 146 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotResolved() 147 throws Exception { 148 final ComponentName recoComponent = new ComponentName("package1", "class1"); 149 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 150 mockScoreNetworksGranted(recoComponent.getPackageName()); 151 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 152 "package2" /* enableUseOpenWifiPackageActivityPackage*/); 153 154 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 155 assertNotNull(activeScorer); 156 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 157 assertEquals(924, activeScorer.packageUid); 158 assertNull(activeScorer.getEnableUseOpenWifiActivity()); 159 } 160 161 @Test 162 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityResolved() 163 throws Exception { 164 final ComponentName recoComponent = new ComponentName("package1", "class1"); 165 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2"); 166 setNetworkRecoPackageSetting(recoComponent.getPackageName()); 167 mockScoreNetworksGranted(recoComponent.getPackageName()); 168 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, 169 enableUseOpenWifiComponent.getPackageName()); 170 mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent); 171 172 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 173 assertNotNull(activeScorer); 174 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent()); 175 assertEquals(924, activeScorer.packageUid); 176 assertEquals(enableUseOpenWifiComponent, activeScorer.getEnableUseOpenWifiActivity()); 177 } 178 179 @Test 180 public void testGetActiveScorer_packageSettingIsNull() 181 throws Exception { 182 // NETWORK_RECOMMENDATIONS_PACKAGE is null 183 184 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 185 assertNull(activeScorer); 186 } 187 188 @Test 189 public void testGetActiveScorer_packageSettingIsInvalid() throws Exception { 190 final ComponentName recoComponent = new ComponentName("package1", "class1"); 191 setDefaultNetworkRecommendationPackage(recoComponent.getPackageName()); 192 mockScoreNetworksGranted(recoComponent.getPackageName()); 193 // NETWORK_RECOMMENDATIONS_PACKAGE is set to a package that isn't a recommender. 194 195 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer(); 196 assertNull(activeScorer); 197 } 198 199 @Test 200 public void testSetActiveScorer_noChange() throws Exception { 201 String packageName = "package"; 202 setNetworkRecoPackageSetting(packageName); 203 204 assertTrue(mNetworkScorerAppManager.setActiveScorer(packageName)); 205 verify(mSettingsFacade, never()).putString(any(), any(), any()); 206 } 207 208 @Test 209 public void testSetActiveScorer_nullPackage() throws Exception { 210 String packageName = "package"; 211 String defaultPackage = "defaultPackage"; 212 setNetworkRecoPackageSetting(packageName); 213 setDefaultNetworkRecommendationPackage(defaultPackage); 214 215 assertTrue(mNetworkScorerAppManager.setActiveScorer(null)); 216 verify(mSettingsFacade).putString(mMockContext, 217 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage); 218 } 219 220 @Test 221 public void testSetActiveScorer_validPackage() throws Exception { 222 String packageName = "package"; 223 String newPackage = "newPackage"; 224 setNetworkRecoPackageSetting(packageName); 225 final ComponentName recoComponent = new ComponentName(newPackage, "class1"); 226 mockScoreNetworksGranted(recoComponent.getPackageName()); 227 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null); 228 229 assertTrue(mNetworkScorerAppManager.setActiveScorer(newPackage)); 230 verify(mSettingsFacade).putString(mMockContext, 231 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, newPackage); 232 } 233 234 @Test 235 public void testSetActiveScorer_invalidPackage() throws Exception { 236 String packageName = "package"; 237 String newPackage = "newPackage"; 238 setNetworkRecoPackageSetting(packageName); 239 // newPackage doesn't resolve to a valid recommender 240 241 assertFalse(mNetworkScorerAppManager.setActiveScorer(newPackage)); 242 verify(mSettingsFacade, never()).putString(any(), any(), any()); 243 } 244 245 246 @Test 247 public void testRevertToDefaultIfNoActive_notActive() throws Exception { 248 String defaultPackage = "defaultPackage"; 249 setDefaultNetworkRecommendationPackage(defaultPackage); 250 251 mNetworkScorerAppManager.revertToDefaultIfNoActive(); 252 253 verify(mSettingsFacade).putString(mMockContext, 254 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage); 255 } 256 257 @Test 258 public void testRevertToDefaultIfNoActive_active() throws Exception { 259 String packageName = "package"; 260 setNetworkRecoPackageSetting(packageName); 261 final ComponentName recoComponent = new ComponentName(packageName, "class1"); 262 mockScoreNetworksGranted(recoComponent.getPackageName()); 263 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null); 264 265 mNetworkScorerAppManager.revertToDefaultIfNoActive(); 266 267 verify(mSettingsFacade, never()).putString(any(), any(), any()); 268 } 269 270 private void setNetworkRecoPackageSetting(String packageName) { 271 when(mSettingsFacade.getString(mMockContext, 272 Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE)).thenReturn(packageName); 273 } 274 275 private void setDefaultNetworkRecommendationPackage(String name) { 276 when(mResources.getString(R.string.config_defaultNetworkRecommendationProviderPackage)) 277 .thenReturn(name); 278 } 279 280 private void mockScoreNetworksGranted(String packageName) { 281 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName)) 282 .thenReturn(PackageManager.PERMISSION_GRANTED); 283 } 284 285 private void mockScoreNetworksDenied(String packageName) { 286 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName)) 287 .thenReturn(PackageManager.PERMISSION_DENIED); 288 } 289 290 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) { 291 mockRecommendationServiceAvailable(compName, packageUid, null, false); 292 } 293 294 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid, 295 String enableUseOpenWifiActivityPackage) { 296 mockRecommendationServiceAvailable( 297 compName, packageUid, enableUseOpenWifiActivityPackage, false); 298 } 299 300 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid, 301 String enableUseOpenWifiActivityPackage, boolean serviceLabelOverride) { 302 final ResolveInfo serviceInfo = new ResolveInfo(); 303 serviceInfo.serviceInfo = new ServiceInfo(); 304 serviceInfo.serviceInfo.name = compName.getClassName(); 305 serviceInfo.serviceInfo.packageName = compName.getPackageName(); 306 serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo(); 307 serviceInfo.serviceInfo.applicationInfo.uid = packageUid; 308 if (enableUseOpenWifiActivityPackage != null) { 309 serviceInfo.serviceInfo.metaData = new Bundle(); 310 serviceInfo.serviceInfo.metaData.putString( 311 NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA, 312 enableUseOpenWifiActivityPackage); 313 } 314 if (serviceLabelOverride) { 315 if (serviceInfo.serviceInfo.metaData == null) { 316 serviceInfo.serviceInfo.metaData = new Bundle(); 317 } 318 serviceInfo.serviceInfo.metaData.putString( 319 NetworkScoreManager.RECOMMENDATION_SERVICE_LABEL_META_DATA, 320 MOCK_OVERRIDEN_SERVICE_LABEL); 321 } else { 322 serviceInfo.serviceInfo.nonLocalizedLabel = MOCK_SERVICE_LABEL; 323 } 324 325 final int flags = PackageManager.GET_META_DATA; 326 when(mMockPm.resolveService( 327 Mockito.argThat(new ArgumentMatcher<Intent>() { 328 @Override 329 public boolean matches(Object object) { 330 Intent intent = (Intent) object; 331 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS 332 .equals(intent.getAction()) 333 && compName.getPackageName().equals(intent.getPackage()); 334 } 335 }), Mockito.eq(flags))).thenReturn(serviceInfo); 336 337 mAvailableServices.add(serviceInfo); 338 } 339 340 private void mockEnableUseOpenWifiActivity(final ComponentName useOpenWifiComp) { 341 final ResolveInfo resolveActivityInfo = new ResolveInfo(); 342 resolveActivityInfo.activityInfo = new ActivityInfo(); 343 resolveActivityInfo.activityInfo.name = useOpenWifiComp.getClassName(); 344 resolveActivityInfo.activityInfo.packageName = useOpenWifiComp.getPackageName(); 345 346 final int flags = 0; 347 when(mMockPm.resolveActivity( 348 Mockito.argThat(new ArgumentMatcher<Intent>() { 349 @Override 350 public boolean matches(Object object) { 351 Intent intent = (Intent) object; 352 return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(intent.getAction()) 353 && useOpenWifiComp.getPackageName().equals(intent.getPackage()); 354 } 355 }), Mockito.eq(flags))).thenReturn(resolveActivityInfo); 356 } 357} 358