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
62161977998feebf0a855ea56558464470877040cfJeff Davidson        // Package 2 - Receiver does not have BROADCAST_NETWORK_PRIVILEGED 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) {
137161977998feebf0a855ea56558464470877040cfJeff Davidson            resolveInfo.activityInfo.permission = permission.BROADCAST_NETWORK_PRIVILEGED;
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