blob: 29020bad51494698991686048591fb709ed94843 [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 Joslinb8418ac82016-12-06 07:42:38 -080022import android.content.ContentResolver;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070023import android.content.Context;
24import android.content.Intent;
Jeff Davidsonc7415532014-06-23 18:15:34 -070025import android.content.pm.ApplicationInfo;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070026import android.content.pm.PackageManager;
27import android.content.pm.ResolveInfo;
Jeremy Joslindd251ef2016-03-14 11:17:41 -070028import android.content.pm.ServiceInfo;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080029import android.content.res.Resources;
Jeff Davidsonc7415532014-06-23 18:15:34 -070030import android.net.NetworkScorerAppManager.NetworkScorerAppData;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080031import android.provider.Settings;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070032import android.test.InstrumentationTestCase;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080033import com.android.internal.R;
34import java.util.List;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070035import org.mockito.ArgumentMatcher;
36import org.mockito.Mock;
37import org.mockito.Mockito;
38import org.mockito.MockitoAnnotations;
39
Jeff Davidson6a4b2202014-04-16 17:29:40 -070040public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070041 @Mock private Context mMockContext;
42 @Mock private PackageManager mMockPm;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080043 @Mock private Resources mResources;
44 @Mock private ContentResolver mContentResolver;
45 private Context mTargetContext;
Amin Shaikhaa09aa02016-11-21 17:27:53 -080046 private NetworkScorerAppManager mNetworkScorerAppManager;
47
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070048 @Override
49 public void setUp() throws Exception {
50 super.setUp();
51
52 // Configuration needed to make mockito/dexcache work.
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080053 mTargetContext = getInstrumentation().getTargetContext();
54 System.setProperty("dexmaker.dexcache", mTargetContext.getCacheDir().getPath());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070055 ClassLoader newClassLoader = getInstrumentation().getClass().getClassLoader();
56 Thread.currentThread().setContextClassLoader(newClassLoader);
57
58 MockitoAnnotations.initMocks(this);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080059 when(mMockContext.getPackageManager()).thenReturn(mMockPm);
60 when(mMockContext.getResources()).thenReturn(mResources);
61 when(mMockContext.getContentResolver()).thenReturn(mTargetContext.getContentResolver());
Amin Shaikhaa09aa02016-11-21 17:27:53 -080062 mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext);
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070063 }
64
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080065 public void testGetPotentialRecommendationProviderPackages_emptyConfig() throws Exception {
66 setNetworkRecommendationPackageNames(/*no configured packages*/);
67 assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070068 }
69
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080070 public void testGetPotentialRecommendationProviderPackages_permissionNotGranted()
71 throws Exception {
72 setNetworkRecommendationPackageNames("package1");
73 mockScoreNetworksDenied("package1");
Jeremy Joslindd251ef2016-03-14 11:17:41 -070074
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080075 assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
76 }
77
78 public void testGetPotentialRecommendationProviderPackages_permissionGranted()
79 throws Exception {
80 setNetworkRecommendationPackageNames("package1");
81 mockScoreNetworksGranted("package1");
82
83 List<String> potentialProviderPackages =
84 mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
85
86 assertFalse(potentialProviderPackages.isEmpty());
87 assertEquals("package1", potentialProviderPackages.get(0));
88 }
89
90 public void testGetPotentialRecommendationProviderPackages_multipleConfigured()
91 throws Exception {
92 setNetworkRecommendationPackageNames("package1", "package2");
93 mockScoreNetworksDenied("package1");
94 mockScoreNetworksGranted("package2");
95
96 List<String> potentialProviderPackages =
97 mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
98
99 assertEquals(1, potentialProviderPackages.size());
100 assertEquals("package2", potentialProviderPackages.get(0));
101 }
102
103 public void testGetNetworkRecommendationProviderData_noPotentialPackages() throws Exception {
104 setNetworkRecommendationPackageNames(/*no configured packages*/);
105 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
106 }
107
108 public void testGetNetworkRecommendationProviderData_serviceMissing() throws Exception {
109 setNetworkRecommendationPackageNames("package1");
110 mockScoreNetworksGranted("package1");
111
112 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
113 }
114
115 public void testGetNetworkRecommendationProviderData_scoreNetworksNotGranted()
116 throws Exception {
117 setNetworkRecommendationPackageNames("package1");
118 mockScoreNetworksDenied("package1");
119 mockRecommendationServiceAvailable("package1", 924 /* packageUid */);
120
121 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
122 }
123
124 public void testGetNetworkRecommendationProviderData_available() throws Exception {
125 setNetworkRecommendationPackageNames("package1");
126 mockScoreNetworksGranted("package1");
127 mockRecommendationServiceAvailable("package1", 924 /* packageUid */);
128
129 NetworkScorerAppData appData =
130 mNetworkScorerAppManager.getNetworkRecommendationProviderData();
131 assertNotNull(appData);
132 assertEquals("package1", appData.packageName);
133 assertEquals(924, appData.packageUid);
134 assertEquals(".RecommendationService", appData.recommendationServiceClassName);
135 }
136
137 public void testGetActiveScorer_providerAvailable() throws Exception {
138 setNetworkRecommendationPackageNames("package1");
139 mockScoreNetworksGranted("package1");
140 mockRecommendationServiceAvailable("package1", 924 /* packageUid */);
141
142 ContentResolver cr = mTargetContext.getContentResolver();
143 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
144
145 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
146 assertNotNull(activeScorer);
147 assertEquals("package1", activeScorer.packageName);
148 assertEquals(924, activeScorer.packageUid);
149 assertEquals(".RecommendationService", activeScorer.recommendationServiceClassName);
150 }
151
152 public void testGetActiveScorer_providerNotAvailable()
153 throws Exception {
154 ContentResolver cr = mTargetContext.getContentResolver();
155 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
156
157 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
158 assertNull(activeScorer);
159 }
160
161 public void testGetActiveScorer_recommendationsDisabled() throws Exception {
162 setNetworkRecommendationPackageNames("package1");
163 mockScoreNetworksGranted("package1");
164 mockRecommendationServiceAvailable("package1", 924 /* packageUid */);
165 ContentResolver cr = mTargetContext.getContentResolver();
166 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0);
167
168 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
169 assertNull(activeScorer);
170 }
171
Amin Shaikh2cd918a2017-01-05 14:28:47 -0800172 public void testIsCallerActiveScorer_providerNotAvailable() throws Exception {
173 ContentResolver cr = mTargetContext.getContentResolver();
174 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
175
176 assertFalse(mNetworkScorerAppManager.isCallerActiveScorer(924));
177 }
178
179 public void testIsCallerActiveScorer_providerAvailable() throws Exception {
180 setNetworkRecommendationPackageNames("package1");
181 mockScoreNetworksGranted("package1");
182 mockRecommendationServiceAvailable("package1", 924 /* packageUid */);
183
184 ContentResolver cr = mTargetContext.getContentResolver();
185 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
186
187 assertTrue(mNetworkScorerAppManager.isCallerActiveScorer(924));
188 assertFalse(mNetworkScorerAppManager.isCallerActiveScorer(925));
189 }
190
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800191 private void setNetworkRecommendationPackageNames(String... names) {
192 if (names == null) {
193 names = new String[0];
Jeff Davidsonb6646a82014-06-27 16:24:42 -0700194 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800195 when(mResources.getStringArray(R.array.config_networkRecommendationPackageNames))
196 .thenReturn(names);
197 }
Jeff Davidsonb6646a82014-06-27 16:24:42 -0700198
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800199 private void mockScoreNetworksGranted(String packageName) {
200 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
201 .thenReturn(PackageManager.PERMISSION_GRANTED);
202 }
203
204 private void mockScoreNetworksDenied(String packageName) {
205 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
206 .thenReturn(PackageManager.PERMISSION_DENIED);
207 }
208
209 private void mockRecommendationServiceAvailable(final String packageName, int packageUid) {
210 final ResolveInfo serviceInfo = new ResolveInfo();
211 serviceInfo.serviceInfo = new ServiceInfo();
212 serviceInfo.serviceInfo.name = ".RecommendationService";
213 serviceInfo.serviceInfo.packageName = packageName;
214 serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo();
215 serviceInfo.serviceInfo.applicationInfo.uid = packageUid;
216
217 final int flags = 0;
218 when(mMockPm.resolveService(
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700219 Mockito.argThat(new ArgumentMatcher<Intent>() {
220 @Override
221 public boolean matches(Object object) {
222 Intent intent = (Intent) object;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800223 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS
224 .equals(intent.getAction())
225 && packageName.equals(intent.getPackage());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700226 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800227 }), Mockito.eq(flags))).thenReturn(serviceInfo);
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700228 }
229}