NetworkScorerAppManagerTest.java revision dd251ef4952b6c7abbfe8cea49285d8cfe62f96e
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 android.net;
18
19import android.Manifest.permission;
20import android.content.Context;
21import android.content.Intent;
22import android.content.pm.ActivityInfo;
23import android.content.pm.ApplicationInfo;
24import android.content.pm.PackageManager;
25import android.content.pm.ResolveInfo;
26import android.content.pm.ServiceInfo;
27import android.net.NetworkScorerAppManager.NetworkScorerAppData;
28import android.os.UserHandle;
29import android.test.InstrumentationTestCase;
30
31import org.mockito.ArgumentMatcher;
32import org.mockito.Mock;
33import org.mockito.Mockito;
34import org.mockito.MockitoAnnotations;
35
36import java.util.ArrayList;
37import java.util.Collections;
38import java.util.Iterator;
39import java.util.List;
40
41public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
42    @Mock private Context mMockContext;
43    @Mock private PackageManager mMockPm;
44
45    @Override
46    public void setUp() throws Exception {
47        super.setUp();
48
49        // Configuration needed to make mockito/dexcache work.
50        System.setProperty("dexmaker.dexcache",
51                getInstrumentation().getTargetContext().getCacheDir().getPath());
52        ClassLoader newClassLoader = getInstrumentation().getClass().getClassLoader();
53        Thread.currentThread().setContextClassLoader(newClassLoader);
54
55        MockitoAnnotations.initMocks(this);
56        Mockito.when(mMockContext.getPackageManager()).thenReturn(mMockPm);
57    }
58
59    public void testGetAllValidScorers() throws Exception {
60        // Package 1 - Valid scorer.
61        ResolveInfoHolder package1 = buildResolveInfo("package1", 1, true, true, false, false);
62
63        // Package 2 - Receiver does not have BROADCAST_NETWORK_PRIVILEGED permission.
64        ResolveInfoHolder package2 = buildResolveInfo("package2", 2, false, true, false, false);
65
66        // Package 3 - App does not have SCORE_NETWORKS permission.
67        ResolveInfoHolder package3 = buildResolveInfo("package3", 3, true, false, false, false);
68
69        // Package 4 - Valid scorer w/ optional config activity.
70        ResolveInfoHolder package4 = buildResolveInfo("package4", 4, true, true, true, false);
71
72        // Package 5 - Valid scorer w/ optional service to bind to.
73        ResolveInfoHolder package5 = buildResolveInfo("package5", 5, true, true, false, true);
74
75        List<ResolveInfoHolder> scorers = new ArrayList<>();
76        scorers.add(package1);
77        scorers.add(package2);
78        scorers.add(package3);
79        scorers.add(package4);
80        scorers.add(package5);
81        setScorers(scorers);
82
83        Iterator<NetworkScorerAppData> result =
84                NetworkScorerAppManager.getAllValidScorers(mMockContext).iterator();
85
86        assertTrue(result.hasNext());
87        NetworkScorerAppData next = result.next();
88        assertEquals("package1", next.mPackageName);
89        assertEquals(1, next.mPackageUid);
90        assertNull(next.mConfigurationActivityClassName);
91
92        assertTrue(result.hasNext());
93        next = result.next();
94        assertEquals("package4", next.mPackageName);
95        assertEquals(4, next.mPackageUid);
96        assertEquals(".ConfigActivity", next.mConfigurationActivityClassName);
97
98        assertTrue(result.hasNext());
99        next = result.next();
100        assertEquals("package5", next.mPackageName);
101        assertEquals(5, next.mPackageUid);
102        assertEquals(".ScoringService", next.mScoringServiceClassName);
103
104        assertFalse(result.hasNext());
105    }
106
107    private void setScorers(List<ResolveInfoHolder> scorers) {
108        List<ResolveInfo> receivers = new ArrayList<>();
109        for (final ResolveInfoHolder scorer : scorers) {
110            receivers.add(scorer.scorerResolveInfo);
111            if (scorer.configActivityResolveInfo != null) {
112                // This scorer has a config activity.
113                Mockito.when(mMockPm.queryIntentActivities(
114                        Mockito.argThat(new ArgumentMatcher<Intent>() {
115                            @Override
116                            public boolean matches(Object object) {
117                                Intent intent = (Intent) object;
118                                return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(
119                                        intent.getAction())
120                                        && scorer.scorerResolveInfo.activityInfo.packageName.equals(
121                                                intent.getPackage());
122                            }
123                        }), Mockito.eq(0))).thenReturn(
124                                Collections.singletonList(scorer.configActivityResolveInfo));
125            }
126
127            if (scorer.serviceResolveInfo != null) {
128                // This scorer has a service to bind to
129                Mockito.when(mMockPm.resolveService(
130                        Mockito.argThat(new ArgumentMatcher<Intent>() {
131                            @Override
132                            public boolean matches(Object object) {
133                                Intent intent = (Intent) object;
134                                return NetworkScoreManager.ACTION_SCORE_NETWORKS.equals(
135                                        intent.getAction())
136                                        && scorer.scorerResolveInfo.activityInfo.packageName.equals(
137                                        intent.getPackage());
138                            }
139                        }), Mockito.eq(0))).thenReturn(scorer.serviceResolveInfo);
140            }
141        }
142
143        Mockito.when(mMockPm.queryBroadcastReceiversAsUser(
144                Mockito.argThat(new ArgumentMatcher<Intent>() {
145                    @Override
146                    public boolean matches(Object object) {
147                        Intent intent = (Intent) object;
148                        return NetworkScoreManager.ACTION_SCORE_NETWORKS.equals(intent.getAction());
149                    }
150                }), Mockito.eq(0), Mockito.eq(UserHandle.USER_SYSTEM)))
151                .thenReturn(receivers);
152    }
153
154    private ResolveInfoHolder buildResolveInfo(String packageName, int packageUid,
155            boolean hasReceiverPermission, boolean hasScorePermission, boolean hasConfigActivity,
156            boolean hasServiceInfo) throws Exception {
157        Mockito.when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
158                .thenReturn(hasScorePermission ?
159                        PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED);
160
161        ResolveInfo resolveInfo = new ResolveInfo();
162        resolveInfo.activityInfo = new ActivityInfo();
163        resolveInfo.activityInfo.packageName = packageName;
164        resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
165        resolveInfo.activityInfo.applicationInfo.uid = packageUid;
166        if (hasReceiverPermission) {
167            resolveInfo.activityInfo.permission = permission.BROADCAST_NETWORK_PRIVILEGED;
168        }
169
170        ResolveInfo configActivityInfo = null;
171        if (hasConfigActivity) {
172            configActivityInfo = new ResolveInfo();
173            configActivityInfo.activityInfo = new ActivityInfo();
174            configActivityInfo.activityInfo.name = ".ConfigActivity";
175        }
176
177        ResolveInfo serviceInfo = null;
178        if (hasServiceInfo) {
179            serviceInfo = new ResolveInfo();
180            serviceInfo.serviceInfo = new ServiceInfo();
181            serviceInfo.serviceInfo.name = ".ScoringService";
182        }
183
184        return new ResolveInfoHolder(resolveInfo, configActivityInfo, serviceInfo);
185    }
186
187    private static class ResolveInfoHolder {
188        final ResolveInfo scorerResolveInfo;
189        final ResolveInfo configActivityResolveInfo;
190        final ResolveInfo serviceResolveInfo;
191
192        public ResolveInfoHolder(ResolveInfo scorerResolveInfo,
193                ResolveInfo configActivityResolveInfo, ResolveInfo serviceResolveInfo) {
194            this.scorerResolveInfo = scorerResolveInfo;
195            this.configActivityResolveInfo = configActivityResolveInfo;
196            this.serviceResolveInfo = serviceResolveInfo;
197        }
198    }
199}
200