blob: f71421e9035b0109a16e3d7ae203578dc60d2b40 [file] [log] [blame]
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -07001/*
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
Jeremy Joslinf621bc92017-02-16 11:11:57 -080017package com.android.server;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070018
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080019import static org.mockito.Mockito.when;
20
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070021import android.Manifest.permission;
Jeremy Joslin37e877b2017-02-02 11:06:14 -080022import android.content.ComponentName;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080023import android.content.ContentResolver;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070024import android.content.Context;
25import android.content.Intent;
Amin Shaikhbc9a8e62017-02-02 15:39:12 -080026import android.content.pm.ActivityInfo;
Jeff Davidsonc7415532014-06-23 18:15:34 -070027import android.content.pm.ApplicationInfo;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070028import android.content.pm.PackageManager;
29import android.content.pm.ResolveInfo;
Jeremy Joslindd251ef2016-03-14 11:17:41 -070030import android.content.pm.ServiceInfo;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080031import android.content.res.Resources;
Jeremy Joslinf621bc92017-02-16 11:11:57 -080032import android.net.NetworkScoreManager;
33import android.net.NetworkScorerAppData;
Amin Shaikhbc9a8e62017-02-02 15:39:12 -080034import android.os.Bundle;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080035import android.provider.Settings;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070036import android.test.InstrumentationTestCase;
Jeremy Joslin37e877b2017-02-02 11:06:14 -080037
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080038import com.android.internal.R;
Jeremy Joslin37e877b2017-02-02 11:06:14 -080039
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070040import org.mockito.ArgumentMatcher;
41import org.mockito.Mock;
42import org.mockito.Mockito;
43import org.mockito.MockitoAnnotations;
44
Jeremy Joslin37e877b2017-02-02 11:06:14 -080045import java.util.List;
46
Jeff Davidson6a4b2202014-04-16 17:29:40 -070047public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070048 @Mock private Context mMockContext;
49 @Mock private PackageManager mMockPm;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080050 @Mock private Resources mResources;
51 @Mock private ContentResolver mContentResolver;
52 private Context mTargetContext;
Amin Shaikhaa09aa02016-11-21 17:27:53 -080053 private NetworkScorerAppManager mNetworkScorerAppManager;
54
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070055 @Override
56 public void setUp() throws Exception {
57 super.setUp();
58
59 // Configuration needed to make mockito/dexcache work.
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080060 mTargetContext = getInstrumentation().getTargetContext();
61 System.setProperty("dexmaker.dexcache", mTargetContext.getCacheDir().getPath());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070062 ClassLoader newClassLoader = getInstrumentation().getClass().getClassLoader();
63 Thread.currentThread().setContextClassLoader(newClassLoader);
64
65 MockitoAnnotations.initMocks(this);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080066 when(mMockContext.getPackageManager()).thenReturn(mMockPm);
67 when(mMockContext.getResources()).thenReturn(mResources);
68 when(mMockContext.getContentResolver()).thenReturn(mTargetContext.getContentResolver());
Amin Shaikhaa09aa02016-11-21 17:27:53 -080069 mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext);
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070070 }
71
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080072 public void testGetPotentialRecommendationProviderPackages_emptyConfig() throws Exception {
73 setNetworkRecommendationPackageNames(/*no configured packages*/);
74 assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070075 }
76
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080077 public void testGetPotentialRecommendationProviderPackages_permissionNotGranted()
78 throws Exception {
79 setNetworkRecommendationPackageNames("package1");
80 mockScoreNetworksDenied("package1");
Jeremy Joslindd251ef2016-03-14 11:17:41 -070081
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080082 assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
83 }
84
85 public void testGetPotentialRecommendationProviderPackages_permissionGranted()
86 throws Exception {
87 setNetworkRecommendationPackageNames("package1");
88 mockScoreNetworksGranted("package1");
89
90 List<String> potentialProviderPackages =
91 mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
92
93 assertFalse(potentialProviderPackages.isEmpty());
94 assertEquals("package1", potentialProviderPackages.get(0));
95 }
96
97 public void testGetPotentialRecommendationProviderPackages_multipleConfigured()
98 throws Exception {
99 setNetworkRecommendationPackageNames("package1", "package2");
100 mockScoreNetworksDenied("package1");
101 mockScoreNetworksGranted("package2");
102
103 List<String> potentialProviderPackages =
104 mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
105
106 assertEquals(1, potentialProviderPackages.size());
107 assertEquals("package2", potentialProviderPackages.get(0));
108 }
109
110 public void testGetNetworkRecommendationProviderData_noPotentialPackages() throws Exception {
111 setNetworkRecommendationPackageNames(/*no configured packages*/);
112 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
113 }
114
115 public void testGetNetworkRecommendationProviderData_serviceMissing() throws Exception {
116 setNetworkRecommendationPackageNames("package1");
117 mockScoreNetworksGranted("package1");
118
119 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
120 }
121
122 public void testGetNetworkRecommendationProviderData_scoreNetworksNotGranted()
123 throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800124 final ComponentName recoComponent = new ComponentName("package1", "class1");
125 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
126 mockScoreNetworksDenied(recoComponent.getPackageName());
127 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800128
129 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
130 }
131
132 public void testGetNetworkRecommendationProviderData_available() throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800133 final ComponentName recoComponent = new ComponentName("package1", "class1");
134 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
135 mockScoreNetworksGranted(recoComponent.getPackageName());
136 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800137
138 NetworkScorerAppData appData =
139 mNetworkScorerAppManager.getNetworkRecommendationProviderData();
140 assertNotNull(appData);
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800141 assertEquals(recoComponent, appData.getRecommendationServiceComponent());
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800142 assertEquals(924, appData.packageUid);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800143 }
144
145 public void testGetActiveScorer_providerAvailable() throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800146 final ComponentName recoComponent = new ComponentName("package1", "class1");
147 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
148 mockScoreNetworksGranted(recoComponent.getPackageName());
149 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800150
151 ContentResolver cr = mTargetContext.getContentResolver();
152 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
153
154 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
155 assertNotNull(activeScorer);
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800156 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800157 assertEquals(924, activeScorer.packageUid);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800158 }
159
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800160 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotSet()
161 throws Exception {
162 final ComponentName recoComponent = new ComponentName("package1", "class1");
163 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
164 mockScoreNetworksGranted(recoComponent.getPackageName());
165 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
166 null /* enableUseOpenWifiPackageActivityPackage*/);
167
168 ContentResolver cr = mTargetContext.getContentResolver();
169 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
170
171 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
172 assertNotNull(activeScorer);
173 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
174 assertEquals(924, activeScorer.packageUid);
175 assertNull(activeScorer.getEnableUseOpenWifiActivity());
176 }
177
178 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotResolved()
179 throws Exception {
180 final ComponentName recoComponent = new ComponentName("package1", "class1");
181 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
182 mockScoreNetworksGranted(recoComponent.getPackageName());
183 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
184 "package2" /* enableUseOpenWifiPackageActivityPackage*/);
185
186 ContentResolver cr = mTargetContext.getContentResolver();
187 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
188
189 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
190 assertNotNull(activeScorer);
191 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
192 assertEquals(924, activeScorer.packageUid);
193 assertNull(activeScorer.getEnableUseOpenWifiActivity());
194 }
195
196 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityResolved()
197 throws Exception {
198 final ComponentName recoComponent = new ComponentName("package1", "class1");
199 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2");
200 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
201 mockScoreNetworksGranted(recoComponent.getPackageName());
202 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
203 enableUseOpenWifiComponent.getPackageName());
204 mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent);
205
206 ContentResolver cr = mTargetContext.getContentResolver();
207 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
208
209 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
210 assertNotNull(activeScorer);
211 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
212 assertEquals(924, activeScorer.packageUid);
213 assertEquals(enableUseOpenWifiComponent, activeScorer.getEnableUseOpenWifiActivity());
214 }
215
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800216 public void testGetActiveScorer_providerNotAvailable()
217 throws Exception {
218 ContentResolver cr = mTargetContext.getContentResolver();
219 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
220
221 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
222 assertNull(activeScorer);
223 }
224
225 public void testGetActiveScorer_recommendationsDisabled() throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800226 final ComponentName recoComponent = new ComponentName("package1", "class1");
227 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
228 mockScoreNetworksGranted(recoComponent.getPackageName());
229 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800230 ContentResolver cr = mTargetContext.getContentResolver();
231 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0);
232
233 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
234 assertNull(activeScorer);
235 }
236
237 private void setNetworkRecommendationPackageNames(String... names) {
238 if (names == null) {
239 names = new String[0];
Jeff Davidsonb6646a82014-06-27 16:24:42 -0700240 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800241 when(mResources.getStringArray(R.array.config_networkRecommendationPackageNames))
242 .thenReturn(names);
243 }
Jeff Davidsonb6646a82014-06-27 16:24:42 -0700244
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800245 private void mockScoreNetworksGranted(String packageName) {
246 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
247 .thenReturn(PackageManager.PERMISSION_GRANTED);
248 }
249
250 private void mockScoreNetworksDenied(String packageName) {
251 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
252 .thenReturn(PackageManager.PERMISSION_DENIED);
253 }
254
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800255 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) {
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800256 mockRecommendationServiceAvailable(compName, packageUid, null);
257 }
258
259 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid,
260 String enableUseOpenWifiActivityPackage) {
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800261 final ResolveInfo serviceInfo = new ResolveInfo();
262 serviceInfo.serviceInfo = new ServiceInfo();
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800263 serviceInfo.serviceInfo.name = compName.getClassName();
264 serviceInfo.serviceInfo.packageName = compName.getPackageName();
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800265 serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo();
266 serviceInfo.serviceInfo.applicationInfo.uid = packageUid;
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800267 if (enableUseOpenWifiActivityPackage != null) {
268 serviceInfo.serviceInfo.metaData = new Bundle();
269 serviceInfo.serviceInfo.metaData.putString(
270 NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA,
271 enableUseOpenWifiActivityPackage);
272 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800273
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800274 final int flags = PackageManager.GET_META_DATA;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800275 when(mMockPm.resolveService(
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700276 Mockito.argThat(new ArgumentMatcher<Intent>() {
277 @Override
278 public boolean matches(Object object) {
279 Intent intent = (Intent) object;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800280 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS
281 .equals(intent.getAction())
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800282 && compName.getPackageName().equals(intent.getPackage());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700283 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800284 }), Mockito.eq(flags))).thenReturn(serviceInfo);
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700285 }
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800286
287 private void mockEnableUseOpenWifiActivity(final ComponentName useOpenWifiComp) {
288 final ResolveInfo resolveActivityInfo = new ResolveInfo();
289 resolveActivityInfo.activityInfo = new ActivityInfo();
290 resolveActivityInfo.activityInfo.name = useOpenWifiComp.getClassName();
291 resolveActivityInfo.activityInfo.packageName = useOpenWifiComp.getPackageName();
292
293 final int flags = 0;
294 when(mMockPm.resolveActivity(
295 Mockito.argThat(new ArgumentMatcher<Intent>() {
296 @Override
297 public boolean matches(Object object) {
298 Intent intent = (Intent) object;
299 return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(intent.getAction())
300 && useOpenWifiComp.getPackageName().equals(intent.getPackage());
301 }
302 }), Mockito.eq(flags))).thenReturn(resolveActivityInfo);
303 }
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700304}