blob: ce5d3ef665bbe2f2b4d9166e3b7829a2e888d79d [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;
Jeff Davidsonc7415532014-06-23 18:15:34 -070026import android.content.pm.ApplicationInfo;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070027import android.content.pm.PackageManager;
28import android.content.pm.ResolveInfo;
Jeremy Joslindd251ef2016-03-14 11:17:41 -070029import android.content.pm.ServiceInfo;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080030import android.content.res.Resources;
Jeff Davidsonc7415532014-06-23 18:15:34 -070031import android.net.NetworkScorerAppManager.NetworkScorerAppData;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080032import android.provider.Settings;
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070033import android.test.InstrumentationTestCase;
Jeremy Joslin37e877b2017-02-02 11:06:14 -080034
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080035import com.android.internal.R;
Jeremy Joslin37e877b2017-02-02 11:06:14 -080036
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070037import org.mockito.ArgumentMatcher;
38import org.mockito.Mock;
39import org.mockito.Mockito;
40import org.mockito.MockitoAnnotations;
41
Jeremy Joslin37e877b2017-02-02 11:06:14 -080042import java.util.List;
43
Jeff Davidson6a4b2202014-04-16 17:29:40 -070044public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070045 @Mock private Context mMockContext;
46 @Mock private PackageManager mMockPm;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080047 @Mock private Resources mResources;
48 @Mock private ContentResolver mContentResolver;
49 private Context mTargetContext;
Amin Shaikhaa09aa02016-11-21 17:27:53 -080050 private NetworkScorerAppManager mNetworkScorerAppManager;
51
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070052 @Override
53 public void setUp() throws Exception {
54 super.setUp();
55
56 // Configuration needed to make mockito/dexcache work.
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080057 mTargetContext = getInstrumentation().getTargetContext();
58 System.setProperty("dexmaker.dexcache", mTargetContext.getCacheDir().getPath());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070059 ClassLoader newClassLoader = getInstrumentation().getClass().getClassLoader();
60 Thread.currentThread().setContextClassLoader(newClassLoader);
61
62 MockitoAnnotations.initMocks(this);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080063 when(mMockContext.getPackageManager()).thenReturn(mMockPm);
64 when(mMockContext.getResources()).thenReturn(mResources);
65 when(mMockContext.getContentResolver()).thenReturn(mTargetContext.getContentResolver());
Amin Shaikhaa09aa02016-11-21 17:27:53 -080066 mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext);
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070067 }
68
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080069 public void testGetPotentialRecommendationProviderPackages_emptyConfig() throws Exception {
70 setNetworkRecommendationPackageNames(/*no configured packages*/);
71 assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -070072 }
73
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080074 public void testGetPotentialRecommendationProviderPackages_permissionNotGranted()
75 throws Exception {
76 setNetworkRecommendationPackageNames("package1");
77 mockScoreNetworksDenied("package1");
Jeremy Joslindd251ef2016-03-14 11:17:41 -070078
Jeremy Joslinb8418ac82016-12-06 07:42:38 -080079 assertTrue(mNetworkScorerAppManager.getPotentialRecommendationProviderPackages().isEmpty());
80 }
81
82 public void testGetPotentialRecommendationProviderPackages_permissionGranted()
83 throws Exception {
84 setNetworkRecommendationPackageNames("package1");
85 mockScoreNetworksGranted("package1");
86
87 List<String> potentialProviderPackages =
88 mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
89
90 assertFalse(potentialProviderPackages.isEmpty());
91 assertEquals("package1", potentialProviderPackages.get(0));
92 }
93
94 public void testGetPotentialRecommendationProviderPackages_multipleConfigured()
95 throws Exception {
96 setNetworkRecommendationPackageNames("package1", "package2");
97 mockScoreNetworksDenied("package1");
98 mockScoreNetworksGranted("package2");
99
100 List<String> potentialProviderPackages =
101 mNetworkScorerAppManager.getPotentialRecommendationProviderPackages();
102
103 assertEquals(1, potentialProviderPackages.size());
104 assertEquals("package2", potentialProviderPackages.get(0));
105 }
106
107 public void testGetNetworkRecommendationProviderData_noPotentialPackages() throws Exception {
108 setNetworkRecommendationPackageNames(/*no configured packages*/);
109 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
110 }
111
112 public void testGetNetworkRecommendationProviderData_serviceMissing() throws Exception {
113 setNetworkRecommendationPackageNames("package1");
114 mockScoreNetworksGranted("package1");
115
116 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
117 }
118
119 public void testGetNetworkRecommendationProviderData_scoreNetworksNotGranted()
120 throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800121 final ComponentName recoComponent = new ComponentName("package1", "class1");
122 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
123 mockScoreNetworksDenied(recoComponent.getPackageName());
124 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800125
126 assertNull(mNetworkScorerAppManager.getNetworkRecommendationProviderData());
127 }
128
129 public void testGetNetworkRecommendationProviderData_available() throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800130 final ComponentName recoComponent = new ComponentName("package1", "class1");
131 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
132 mockScoreNetworksGranted(recoComponent.getPackageName());
133 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800134
135 NetworkScorerAppData appData =
136 mNetworkScorerAppManager.getNetworkRecommendationProviderData();
137 assertNotNull(appData);
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800138 assertEquals(recoComponent, appData.getRecommendationServiceComponent());
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800139 assertEquals(924, appData.packageUid);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800140 }
141
142 public void testGetActiveScorer_providerAvailable() throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800143 final ComponentName recoComponent = new ComponentName("package1", "class1");
144 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
145 mockScoreNetworksGranted(recoComponent.getPackageName());
146 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800147
148 ContentResolver cr = mTargetContext.getContentResolver();
149 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
150
151 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
152 assertNotNull(activeScorer);
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800153 assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800154 assertEquals(924, activeScorer.packageUid);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800155 }
156
157 public void testGetActiveScorer_providerNotAvailable()
158 throws Exception {
159 ContentResolver cr = mTargetContext.getContentResolver();
160 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
161
162 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
163 assertNull(activeScorer);
164 }
165
166 public void testGetActiveScorer_recommendationsDisabled() throws Exception {
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800167 final ComponentName recoComponent = new ComponentName("package1", "class1");
168 setNetworkRecommendationPackageNames(recoComponent.getPackageName());
169 mockScoreNetworksGranted(recoComponent.getPackageName());
170 mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800171 ContentResolver cr = mTargetContext.getContentResolver();
172 Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0);
173
174 final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
175 assertNull(activeScorer);
176 }
177
178 private void setNetworkRecommendationPackageNames(String... names) {
179 if (names == null) {
180 names = new String[0];
Jeff Davidsonb6646a82014-06-27 16:24:42 -0700181 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800182 when(mResources.getStringArray(R.array.config_networkRecommendationPackageNames))
183 .thenReturn(names);
184 }
Jeff Davidsonb6646a82014-06-27 16:24:42 -0700185
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800186 private void mockScoreNetworksGranted(String packageName) {
187 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
188 .thenReturn(PackageManager.PERMISSION_GRANTED);
189 }
190
191 private void mockScoreNetworksDenied(String packageName) {
192 when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
193 .thenReturn(PackageManager.PERMISSION_DENIED);
194 }
195
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800196 private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) {
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800197 final ResolveInfo serviceInfo = new ResolveInfo();
198 serviceInfo.serviceInfo = new ServiceInfo();
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800199 serviceInfo.serviceInfo.name = compName.getClassName();
200 serviceInfo.serviceInfo.packageName = compName.getPackageName();
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800201 serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo();
202 serviceInfo.serviceInfo.applicationInfo.uid = packageUid;
203
204 final int flags = 0;
205 when(mMockPm.resolveService(
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700206 Mockito.argThat(new ArgumentMatcher<Intent>() {
207 @Override
208 public boolean matches(Object object) {
209 Intent intent = (Intent) object;
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800210 return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS
211 .equals(intent.getAction())
Jeremy Joslin37e877b2017-02-02 11:06:14 -0800212 && compName.getPackageName().equals(intent.getPackage());
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700213 }
Jeremy Joslinb8418ac82016-12-06 07:42:38 -0800214 }), Mockito.eq(flags))).thenReturn(serviceInfo);
Jeff Davidsondd6fd1e2014-04-14 15:14:30 -0700215 }
216}