1dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson/* 2dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * Copyright (C) 2014 The Android Open Source Project 3dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * 4dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * Licensed under the Apache License, Version 2.0 (the "License"); 5dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * you may not use this file except in compliance with the License. 6dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * You may obtain a copy of the License at 7dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * 8dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * http://www.apache.org/licenses/LICENSE-2.0 9dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * 10dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * Unless required by applicable law or agreed to in writing, software 11dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * distributed under the License is distributed on an "AS IS" BASIS, 12dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * See the License for the specific language governing permissions and 14dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson * limitations under the License 15dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson */ 16dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 17dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonpackage android.net; 18dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 19dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport android.Manifest.permission; 20dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport android.content.Context; 21dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport android.content.Intent; 22dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport android.content.pm.ActivityInfo; 23c741553644f8b19c63938ab9e36af1721c2cfa34Jeff Davidsonimport android.content.pm.ApplicationInfo; 24dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport android.content.pm.PackageManager; 25dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport android.content.pm.ResolveInfo; 26c741553644f8b19c63938ab9e36af1721c2cfa34Jeff Davidsonimport android.net.NetworkScorerAppManager.NetworkScorerAppData; 27dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport android.test.InstrumentationTestCase; 28b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidsonimport android.util.Pair; 29dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 30dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport org.mockito.ArgumentMatcher; 31dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport org.mockito.Mock; 32dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport org.mockito.Mockito; 33dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport org.mockito.MockitoAnnotations; 34dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 35b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidsonimport java.util.ArrayList; 36b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidsonimport java.util.Collections; 37dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidsonimport java.util.Iterator; 38b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidsonimport java.util.List; 39dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 406a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidsonpublic class NetworkScorerAppManagerTest extends InstrumentationTestCase { 41dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson @Mock private Context mMockContext; 42dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson @Mock private PackageManager mMockPm; 43dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 44dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson @Override 45dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson public void setUp() throws Exception { 46dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson super.setUp(); 47dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 48dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson // Configuration needed to make mockito/dexcache work. 49dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson System.setProperty("dexmaker.dexcache", 50dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson getInstrumentation().getTargetContext().getCacheDir().getPath()); 51dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson ClassLoader newClassLoader = getInstrumentation().getClass().getClassLoader(); 52dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson Thread.currentThread().setContextClassLoader(newClassLoader); 53dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 54dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson MockitoAnnotations.initMocks(this); 55dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson Mockito.when(mMockContext.getPackageManager()).thenReturn(mMockPm); 56dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson } 57dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 58dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson public void testGetAllValidScorers() throws Exception { 59dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson // Package 1 - Valid scorer. 60b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson Pair<ResolveInfo, ResolveInfo> package1 = buildResolveInfo("package1", true, true, false); 61dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 62dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson // Package 2 - Receiver does not have BROADCAST_SCORE_NETWORKS permission. 63b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson Pair<ResolveInfo, ResolveInfo> package2 = buildResolveInfo("package2", false, true, false); 64dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 65dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson // Package 3 - App does not have SCORE_NETWORKS permission. 66b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson Pair<ResolveInfo, ResolveInfo> package3 = buildResolveInfo("package3", true, false, false); 67b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson 68b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson // Package 4 - Valid scorer w/ optional config activity. 69b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson Pair<ResolveInfo, ResolveInfo> package4 = buildResolveInfo("package4", true, true, true); 70dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 71b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson List<Pair<ResolveInfo, ResolveInfo>> scorers = new ArrayList<>(); 72b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson scorers.add(package1); 73b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson scorers.add(package2); 74b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson scorers.add(package3); 75b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson scorers.add(package4); 76b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson setScorers(scorers); 77dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 78c741553644f8b19c63938ab9e36af1721c2cfa34Jeff Davidson Iterator<NetworkScorerAppData> result = 796a4b220f1263d95fdefe6361c2bc87bbb04bbed0Jeff Davidson NetworkScorerAppManager.getAllValidScorers(mMockContext).iterator(); 80dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 81dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson assertTrue(result.hasNext()); 82b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson NetworkScorerAppData next = result.next(); 83b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson assertEquals("package1", next.mPackageName); 84b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson assertNull(next.mConfigurationActivityClassName); 85b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson 86b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson assertTrue(result.hasNext()); 87b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson next = result.next(); 88b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson assertEquals("package4", next.mPackageName); 89b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson assertEquals(".ConfigActivity", next.mConfigurationActivityClassName); 90dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 91dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson assertFalse(result.hasNext()); 92dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson } 93dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 94b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson private void setScorers(List<Pair<ResolveInfo, ResolveInfo>> scorers) { 95b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson List<ResolveInfo> receivers = new ArrayList<>(); 96b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson for (final Pair<ResolveInfo, ResolveInfo> scorer : scorers) { 97b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson receivers.add(scorer.first); 98b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson if (scorer.second != null) { 99b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson // This scorer has a config activity. 100b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson Mockito.when(mMockPm.queryIntentActivities( 101b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson Mockito.argThat(new ArgumentMatcher<Intent>() { 102b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson @Override 103b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson public boolean matches(Object object) { 104b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson Intent intent = (Intent) object; 105b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals( 106b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson intent.getAction()) 107b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson && scorer.first.activityInfo.packageName.equals( 108b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson intent.getPackage()); 109b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson } 110b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson }), Mockito.eq(0))).thenReturn(Collections.singletonList(scorer.second)); 111b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson } 112b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson } 113b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson 114dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson Mockito.when(mMockPm.queryBroadcastReceivers( 115dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson Mockito.argThat(new ArgumentMatcher<Intent>() { 116dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson @Override 117dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson public boolean matches(Object object) { 118dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson Intent intent = (Intent) object; 119dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson return NetworkScoreManager.ACTION_SCORE_NETWORKS.equals(intent.getAction()); 120dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson } 121dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson }), Mockito.eq(0))) 122b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson .thenReturn(receivers); 123dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson } 124dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 125b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson private Pair<ResolveInfo, ResolveInfo> buildResolveInfo(String packageName, 126b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson boolean hasReceiverPermission, boolean hasScorePermission, boolean hasConfigActivity) 127b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson throws Exception { 128dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson Mockito.when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName)) 129dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson .thenReturn(hasScorePermission ? 130dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED); 131dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson 132dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson ResolveInfo resolveInfo = new ResolveInfo(); 133dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson resolveInfo.activityInfo = new ActivityInfo(); 134dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson resolveInfo.activityInfo.packageName = packageName; 135c741553644f8b19c63938ab9e36af1721c2cfa34Jeff Davidson resolveInfo.activityInfo.applicationInfo = new ApplicationInfo(); 136dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson if (hasReceiverPermission) { 137dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson resolveInfo.activityInfo.permission = permission.BROADCAST_SCORE_NETWORKS; 138dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson } 139b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson 140b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson ResolveInfo configActivityInfo = null; 141b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson if (hasConfigActivity) { 142b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson configActivityInfo = new ResolveInfo(); 143b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson configActivityInfo.activityInfo = new ActivityInfo(); 144b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson configActivityInfo.activityInfo.name = ".ConfigActivity"; 145b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson } 146b6646a8987a8ce6abd34cc05d9ca0193a6d7bea9Jeff Davidson return Pair.create(resolveInfo, configActivityInfo); 147dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson } 148dd6fd1e62b1792d1f96824b2fefb16d894b43197Jeff Davidson} 149