blob: 347024d6a29d8b15107fd163dd54c85300bdbc44 [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
17package android.net;
18
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;
Jeff Davidsonc7415532014-06-23 18:15:34 -070032import android.net.NetworkScorerAppManager.NetworkScorerAppData;
Amin Shaikhbc9a8e62017-02-02 15:39:12 -080033import android.os.Bundle;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080034import android.provider.Settings;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070035import android.test.InstrumentationTestCase;
Jeremy Joslin37e877b2017-02-02 11:06:14 -080036
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080037import com.android.internal.R;
Jeremy Joslin37e877b2017-02-02 11:06:14 -080038
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070039import org.mockito.ArgumentMatcher;
40import org.mockito.Mock;
41import org.mockito.Mockito;
42import org.mockito.MockitoAnnotations;
43
Jeremy Joslin37e877b2017-02-02 11:06:14 -080044import java.util.List;
45
Jeff Davidson6a4b2202014-04-16 17:29:40 -070046public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070047 @Mock private Context mMockContext;
48 @Mock private PackageManager mMockPm;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080049 @Mock private Resources mResources;
50 @Mock private ContentResolver mContentResolver;
51 private Context mTargetContext;
Amin Shaikhaa09aa02016-11-21 17:27:53 -080052 private NetworkScorerAppManager mNetworkScorerAppManager;
53
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070054 @Override
55 public void setUp() throws Exception {
56 super.setUp();
57
58 // Configuration needed to make mockito/dexcache work.
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080059 mTargetContext = getInstrumentation().getTargetContext();
60 System.setProperty("dexmaker.dexcache", mTargetContext.getCacheDir().getPath());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070061 ClassLoader newClassLoader = getInstrumentation().getClass().getClassLoader();
62 Thread.currentThread().setContextClassLoader(newClassLoader);
63
64 MockitoAnnotations.initMocks(this);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080065 when(mMockContext.getPackageManager()).thenReturn(mMockPm);
66 when(mMockContext.getResources()).thenReturn(mResources);
67 when(mMockContext.getContentResolver()).thenReturn(mTargetContext.getContentResolver());
Amin Shaikhaa09aa02016-11-21 17:27:53 -080068 mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext);
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070069 }
70
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080071 public void testGetPotentialRecommendationProviderPackages_emptyConfig() throws Exception {
72 setNetworkRecommendationPackageNames(/*no configured packages*/);
73 assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070074 }
75
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080076 public void testGetPotentialRecommendationProviderPackages_permissionNotGranted()
77 throws Exception {
78 setNetworkRecommendationPackageNames("package1");
79 mockScoreNetworksDenied("package1");
Jeremy Joslindd251ef2016-03-14 11:17:41 -070080
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080081 assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
82 }
83
84 public void testGetPotentialRecommendationProviderPackages_permissionGranted()
85 throws Exception {
86 setNetworkRecommendationPackageNames("package1");
87 mockScoreNetworksGranted("package1");
88
89 List<String> potentialProviderPackages =
90 mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
91
92 assertFalse(potentialProviderPackages.isEmpty());
93 assertEquals("package1", potentialProviderPackages.get(0));
94 }
95
96 public void testGetPotentialRecommendationProviderPackages_multipleConfigured()
97 throws Exception {
98 setNetworkRecommendationPackageNames("package1", "package2");
99 mockScoreNetworksDenied("package1");
100 mockScoreNetworksGranted("package2");
101
102 List<String> potentialProviderPackages =
103 mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
104
105 assertEquals(1, potentialProviderPackages.size());
106 assertEquals("package2", potentialProviderPackages.get(0));
107 }
108
109 public void testGetNetworkRecommendationProviderData_noPotentialPackages() throws Exception {
110 setNetworkRecommendationPackageNames(/*no configured packages*/);
111 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
112 }
113
114 public void testGetNetworkRecommendationProviderData_serviceMissing() throws Exception {
115 setNetworkRecommendationPackageNames("package1");
116 mockScoreNetworksGranted("package1");
117
118 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
119 }
120
121 public void testGetNetworkRecommendationProviderData_scoreNetworksNotGranted()
122 throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800123 final ComponentName recoComponent = new ComponentName("package1", "class1");
124 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
125 mockScoreNetworksDenied(recoComponent.getPackageName());
126 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800127
128 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
129 }
130
131 public void testGetNetworkRecommendationProviderData_available() throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800132 final ComponentName recoComponent = new ComponentName("package1", "class1");
133 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
134 mockScoreNetworksGranted(recoComponent.getPackageName());
135 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800136
137 NetworkScorerAppData appData =
138 mNetworkScorerAppManager.getNetworkRecommendationProviderData();
139 assertNotNull(appData);
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800140 assertEquals(recoComponent, appData.getRecommendationServiceComponent());
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800141 assertEquals(924, appData.packageUid);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800142 }
143
144 public void testGetActiveScorer_providerAvailable() throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800145 final ComponentName recoComponent = new ComponentName("package1", "class1");
146 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
147 mockScoreNetworksGranted(recoComponent.getPackageName());
148 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800149
150 ContentResolver cr = mTargetContext.getContentResolver();
151 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
152
153 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
154 assertNotNull(activeScorer);
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800155 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800156 assertEquals(924, activeScorer.packageUid);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800157 }
158
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800159 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotSet()
160 throws Exception {
161 final ComponentName recoComponent = new ComponentName("package1", "class1");
162 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
163 mockScoreNetworksGranted(recoComponent.getPackageName());
164 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
165 null /* enableUseOpenWifiPackageActivityPackage*/);
166
167 ContentResolver cr = mTargetContext.getContentResolver();
168 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
169
170 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
171 assertNotNull(activeScorer);
172 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
173 assertEquals(924, activeScorer.packageUid);
174 assertNull(activeScorer.getEnableUseOpenWifiActivity());
175 }
176
177 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotResolved()
178 throws Exception {
179 final ComponentName recoComponent = new ComponentName("package1", "class1");
180 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
181 mockScoreNetworksGranted(recoComponent.getPackageName());
182 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
183 "package2" /* enableUseOpenWifiPackageActivityPackage*/);
184
185 ContentResolver cr = mTargetContext.getContentResolver();
186 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
187
188 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
189 assertNotNull(activeScorer);
190 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
191 assertEquals(924, activeScorer.packageUid);
192 assertNull(activeScorer.getEnableUseOpenWifiActivity());
193 }
194
195 public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityResolved()
196 throws Exception {
197 final ComponentName recoComponent = new ComponentName("package1", "class1");
198 final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2");
199 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
200 mockScoreNetworksGranted(recoComponent.getPackageName());
201 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
202 enableUseOpenWifiComponent.getPackageName());
203 mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent);
204
205 ContentResolver cr = mTargetContext.getContentResolver();
206 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
207
208 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
209 assertNotNull(activeScorer);
210 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
211 assertEquals(924, activeScorer.packageUid);
212 assertEquals(enableUseOpenWifiComponent, activeScorer.getEnableUseOpenWifiActivity());
213 }
214
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800215 public void testGetActiveScorer_providerNotAvailable()
216 throws Exception {
217 ContentResolver cr = mTargetContext.getContentResolver();
218 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
219
220 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
221 assertNull(activeScorer);
222 }
223
224 public void testGetActiveScorer_recommendationsDisabled() throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800225 final ComponentName recoComponent = new ComponentName("package1", "class1");
226 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
227 mockScoreNetworksGranted(recoComponent.getPackageName());
228 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800229 ContentResolver cr = mTargetContext.getContentResolver();
230 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0);
231
232 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
233 assertNull(activeScorer);
234 }
235
236 private void setNetworkRecommendationPackageNames(String... names) {
237 if (names == null) {
238 names = new String[0];
Jeff Davidsonb6646a82014-06-27 16:24:42 -0700239 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800240 when(mResources.getStringArray(R.array.config_networkRecommendationPackageNames))
241 .thenReturn(names);
242 }
Jeff Davidsonb6646a82014-06-27 16:24:42 -0700243
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800244 private void mockScoreNetworksGranted(String packageName) {
245 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
246 .thenReturn(PackageManager.PERMISSION_GRANTED);
247 }
248
249 private void mockScoreNetworksDenied(String packageName) {
250 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
251 .thenReturn(PackageManager.PERMISSION_DENIED);
252 }
253
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800254 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) {
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800255 mockRecommendationServiceAvailable(compName, packageUid, null);
256 }
257
258 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid,
259 String enableUseOpenWifiActivityPackage) {
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800260 final ResolveInfo serviceInfo = new ResolveInfo();
261 serviceInfo.serviceInfo = new ServiceInfo();
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800262 serviceInfo.serviceInfo.name = compName.getClassName();
263 serviceInfo.serviceInfo.packageName = compName.getPackageName();
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800264 serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo();
265 serviceInfo.serviceInfo.applicationInfo.uid = packageUid;
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800266 if (enableUseOpenWifiActivityPackage != null) {
267 serviceInfo.serviceInfo.metaData = new Bundle();
268 serviceInfo.serviceInfo.metaData.putString(
269 NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA,
270 enableUseOpenWifiActivityPackage);
271 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800272
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800273 final int flags = PackageManager.GET_META_DATA;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800274 when(mMockPm.resolveService(
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700275 Mockito.argThat(new ArgumentMatcher<Intent>() {
276 @Override
277 public boolean matches(Object object) {
278 Intent intent = (Intent) object;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800279 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS
280 .equals(intent.getAction())
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800281 && compName.getPackageName().equals(intent.getPackage());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700282 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800283 }), Mockito.eq(flags))).thenReturn(serviceInfo);
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700284 }
Amin Shaikhbc9a8e62017-02-02 15:39:12 -0800285
286 private void mockEnableUseOpenWifiActivity(final ComponentName useOpenWifiComp) {
287 final ResolveInfo resolveActivityInfo = new ResolveInfo();
288 resolveActivityInfo.activityInfo = new ActivityInfo();
289 resolveActivityInfo.activityInfo.name = useOpenWifiComp.getClassName();
290 resolveActivityInfo.activityInfo.packageName = useOpenWifiComp.getPackageName();
291
292 final int flags = 0;
293 when(mMockPm.resolveActivity(
294 Mockito.argThat(new ArgumentMatcher<Intent>() {
295 @Override
296 public boolean matches(Object object) {
297 Intent intent = (Intent) object;
298 return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(intent.getAction())
299 && useOpenWifiComp.getPackageName().equals(intent.getPackage());
300 }
301 }), Mockito.eq(flags))).thenReturn(resolveActivityInfo);
302 }
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700303}