NetworkScorerAppManagerTest.java revision 8b1339af53c3e3287cfb98eb25c69f31739923e6
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 com.android.server;
18
19import static junit.framework.Assert.assertEquals;
20import static junit.framework.Assert.assertNotNull;
21import static junit.framework.Assert.assertNull;
22import static junit.framework.Assert.assertTrue;
23
24import static org.junit.Assert.assertFalse;
25import static org.mockito.Matchers.any;
26import static org.mockito.Matchers.eq;
27import static org.mockito.Mockito.never;
28import static org.mockito.Mockito.verify;
29import static org.mockito.Mockito.when;
30
31import android.Manifest.permission;
32import android.content.ComponentName;
33import android.content.Context;
34import android.content.Intent;
35import android.content.pm.ActivityInfo;
36import android.content.pm.ApplicationInfo;
37import android.content.pm.PackageManager;
38import android.content.pm.ResolveInfo;
39import android.content.pm.ServiceInfo;
40import android.content.res.Resources;
41import android.net.NetworkScoreManager;
42import android.net.NetworkScorerAppData;
43import android.os.Bundle;
44import android.provider.Settings;
45import android.support.test.runner.AndroidJUnit4;
46
47import com.android.internal.R;
48
49import org.junit.Before;
50import org.junit.Test;
51import org.junit.runner.RunWith;
52import org.mockito.ArgumentMatcher;
53import org.mockito.Mock;
54import org.mockito.Mockito;
55import org.mockito.MockitoAnnotations;
56
57import java.util.ArrayList;
58import java.util.List;
59
60@RunWith(AndroidJUnit4.class)
61public class NetworkScorerAppManagerTest {
62    private static String MOCK_SERVICE_LABEL = "Mock Service";
63    private static String MOCK_OVERRIDEN_SERVICE_LABEL = "Mock Service Label Override";
64
65    @Mock private Context mMockContext;
66    @Mock private PackageManager mMockPm;
67    @Mock private Resources mResources;
68    @Mock private NetworkScorerAppManager.SettingsFacade mSettingsFacade;
69    private NetworkScorerAppManager mNetworkScorerAppManager;
70    private List<ResolveInfo> mAvailableServices;
71
72    @Before
73    public void setUp() throws Exception {
74        MockitoAnnotations.initMocks(this);
75        mAvailableServices = new ArrayList<>();
76        when(mMockContext.getPackageManager()).thenReturn(mMockPm);
77        when(mMockPm.queryIntentServices(Mockito.argThat(new ArgumentMatcher<Intent>() {
78            @Override
79            public boolean matches(Object object) {
80                Intent intent = (Intent) object;
81                return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS.equals(intent.getAction());
82            }
83        }), eq(PackageManager.GET_META_DATA))).thenReturn(mAvailableServices);
84        when(mMockContext.getResources()).thenReturn(mResources);
85
86        mNetworkScorerAppManager = new NetworkScorerAppManager(mMockContext, mSettingsFacade);
87    }
88
89    @Test
90    public void testGetActiveScorer_providerAvailable() throws Exception {
91        final ComponentName recoComponent = new ComponentName("package1", "class1");
92        setNetworkRecoPackageSetting(recoComponent.getPackageName());
93        mockScoreNetworksGranted(recoComponent.getPackageName());
94        mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
95
96        final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
97        assertNotNull(activeScorer);
98        assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
99        assertEquals(924, activeScorer.packageUid);
100        assertEquals(MOCK_SERVICE_LABEL, activeScorer.getRecommendationServiceLabel());
101    }
102
103    @Test
104    public void testGetActiveScorer_providerAvailable_serviceLabelOverride() throws Exception {
105        final ComponentName recoComponent = new ComponentName("package1", "class1");
106        setNetworkRecoPackageSetting(recoComponent.getPackageName());
107        mockScoreNetworksGranted(recoComponent.getPackageName());
108        mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
109                null /* enableUseOpenWifiPackageActivityPackage*/, true /* serviceLabelOverride */);
110
111        final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
112        assertNotNull(activeScorer);
113        assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
114        assertEquals(924, activeScorer.packageUid);
115        assertEquals(MOCK_OVERRIDEN_SERVICE_LABEL, activeScorer.getRecommendationServiceLabel());
116    }
117
118    @Test
119    public void testGetActiveScorer_permissionMissing() throws Exception {
120        final ComponentName recoComponent = new ComponentName("package1", "class1");
121        setNetworkRecoPackageSetting(recoComponent.getPackageName());
122        mockScoreNetworksDenied(recoComponent.getPackageName());
123        mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */);
124
125        final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
126        assertNull(activeScorer);
127    }
128
129    @Test
130    public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotSet()
131            throws Exception {
132        final ComponentName recoComponent = new ComponentName("package1", "class1");
133        setNetworkRecoPackageSetting(recoComponent.getPackageName());
134        mockScoreNetworksGranted(recoComponent.getPackageName());
135        mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
136                null /* enableUseOpenWifiPackageActivityPackage*/);
137
138        final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
139        assertNotNull(activeScorer);
140        assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
141        assertEquals(924, activeScorer.packageUid);
142        assertNull(activeScorer.getEnableUseOpenWifiActivity());
143    }
144
145    @Test
146    public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotResolved()
147            throws Exception {
148        final ComponentName recoComponent = new ComponentName("package1", "class1");
149        setNetworkRecoPackageSetting(recoComponent.getPackageName());
150        mockScoreNetworksGranted(recoComponent.getPackageName());
151        mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
152                "package2" /* enableUseOpenWifiPackageActivityPackage*/);
153
154        final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
155        assertNotNull(activeScorer);
156        assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
157        assertEquals(924, activeScorer.packageUid);
158        assertNull(activeScorer.getEnableUseOpenWifiActivity());
159    }
160
161    @Test
162    public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityResolved()
163            throws Exception {
164        final ComponentName recoComponent = new ComponentName("package1", "class1");
165        final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2");
166        setNetworkRecoPackageSetting(recoComponent.getPackageName());
167        mockScoreNetworksGranted(recoComponent.getPackageName());
168        mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
169                enableUseOpenWifiComponent.getPackageName());
170        mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent);
171
172        final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
173        assertNotNull(activeScorer);
174        assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
175        assertEquals(924, activeScorer.packageUid);
176        assertEquals(enableUseOpenWifiComponent, activeScorer.getEnableUseOpenWifiActivity());
177    }
178
179    @Test
180    public void testGetActiveScorer_packageSettingIsNull()
181            throws Exception {
182        // NETWORK_RECOMMENDATIONS_PACKAGE is null
183
184        final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
185        assertNull(activeScorer);
186    }
187
188    @Test
189    public void testGetActiveScorer_packageSettingIsInvalid() throws Exception {
190        final ComponentName recoComponent = new ComponentName("package1", "class1");
191        setDefaultNetworkRecommendationPackage(recoComponent.getPackageName());
192        mockScoreNetworksGranted(recoComponent.getPackageName());
193        // NETWORK_RECOMMENDATIONS_PACKAGE is set to a package that isn't a recommender.
194
195        final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
196        assertNull(activeScorer);
197    }
198
199    @Test
200    public void testSetActiveScorer_noChange() throws Exception {
201        String packageName = "package";
202        setNetworkRecoPackageSetting(packageName);
203
204        assertTrue(mNetworkScorerAppManager.setActiveScorer(packageName));
205        verify(mSettingsFacade, never()).putString(any(), any(), any());
206    }
207
208    @Test
209    public void testSetActiveScorer_nullPackage() throws Exception {
210        String packageName = "package";
211        String defaultPackage = "defaultPackage";
212        setNetworkRecoPackageSetting(packageName);
213        setDefaultNetworkRecommendationPackage(defaultPackage);
214
215        assertTrue(mNetworkScorerAppManager.setActiveScorer(null));
216        verify(mSettingsFacade).putString(mMockContext,
217                Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage);
218    }
219
220    @Test
221    public void testSetActiveScorer_validPackage() throws Exception {
222        String packageName = "package";
223        String newPackage = "newPackage";
224        setNetworkRecoPackageSetting(packageName);
225        final ComponentName recoComponent = new ComponentName(newPackage, "class1");
226        mockScoreNetworksGranted(recoComponent.getPackageName());
227        mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null);
228
229        assertTrue(mNetworkScorerAppManager.setActiveScorer(newPackage));
230        verify(mSettingsFacade).putString(mMockContext,
231                Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, newPackage);
232    }
233
234    @Test
235    public void testSetActiveScorer_invalidPackage() throws Exception {
236        String packageName = "package";
237        String newPackage = "newPackage";
238        setNetworkRecoPackageSetting(packageName);
239        // newPackage doesn't resolve to a valid recommender
240
241        assertFalse(mNetworkScorerAppManager.setActiveScorer(newPackage));
242        verify(mSettingsFacade, never()).putString(any(), any(), any());
243    }
244
245
246    @Test
247    public void testRevertToDefaultIfNoActive_notActive() throws Exception {
248        String defaultPackage = "defaultPackage";
249        setDefaultNetworkRecommendationPackage(defaultPackage);
250
251        mNetworkScorerAppManager.revertToDefaultIfNoActive();
252
253        verify(mSettingsFacade).putString(mMockContext,
254                Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE, defaultPackage);
255    }
256
257    @Test
258    public void testRevertToDefaultIfNoActive_active() throws Exception {
259        String packageName = "package";
260        setNetworkRecoPackageSetting(packageName);
261        final ComponentName recoComponent = new ComponentName(packageName, "class1");
262        mockScoreNetworksGranted(recoComponent.getPackageName());
263        mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */, null);
264
265        mNetworkScorerAppManager.revertToDefaultIfNoActive();
266
267        verify(mSettingsFacade, never()).putString(any(), any(), any());
268    }
269
270    private void setNetworkRecoPackageSetting(String packageName) {
271        when(mSettingsFacade.getString(mMockContext,
272                Settings.Global.NETWORK_RECOMMENDATIONS_PACKAGE)).thenReturn(packageName);
273    }
274
275    private void setDefaultNetworkRecommendationPackage(String name) {
276        when(mResources.getString(R.string.config_defaultNetworkRecommendationProviderPackage))
277                .thenReturn(name);
278    }
279
280    private void mockScoreNetworksGranted(String packageName) {
281        when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
282                .thenReturn(PackageManager.PERMISSION_GRANTED);
283    }
284
285    private void mockScoreNetworksDenied(String packageName) {
286        when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
287                .thenReturn(PackageManager.PERMISSION_DENIED);
288    }
289
290    private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) {
291        mockRecommendationServiceAvailable(compName, packageUid, null, false);
292    }
293
294    private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid,
295            String enableUseOpenWifiActivityPackage) {
296        mockRecommendationServiceAvailable(
297                compName, packageUid, enableUseOpenWifiActivityPackage, false);
298    }
299
300    private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid,
301            String enableUseOpenWifiActivityPackage, boolean serviceLabelOverride) {
302        final ResolveInfo serviceInfo = new ResolveInfo();
303        serviceInfo.serviceInfo = new ServiceInfo();
304        serviceInfo.serviceInfo.name = compName.getClassName();
305        serviceInfo.serviceInfo.packageName = compName.getPackageName();
306        serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo();
307        serviceInfo.serviceInfo.applicationInfo.uid = packageUid;
308        if (enableUseOpenWifiActivityPackage != null) {
309            serviceInfo.serviceInfo.metaData = new Bundle();
310            serviceInfo.serviceInfo.metaData.putString(
311                    NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA,
312                    enableUseOpenWifiActivityPackage);
313        }
314        if (serviceLabelOverride) {
315            if (serviceInfo.serviceInfo.metaData == null) {
316                serviceInfo.serviceInfo.metaData = new Bundle();
317            }
318            serviceInfo.serviceInfo.metaData.putString(
319                    NetworkScoreManager.RECOMMENDATION_SERVICE_LABEL_META_DATA,
320                    MOCK_OVERRIDEN_SERVICE_LABEL);
321        } else {
322            serviceInfo.serviceInfo.nonLocalizedLabel = MOCK_SERVICE_LABEL;
323        }
324
325        final int flags = PackageManager.GET_META_DATA;
326        when(mMockPm.resolveService(
327                Mockito.argThat(new ArgumentMatcher<Intent>() {
328                    @Override
329                    public boolean matches(Object object) {
330                        Intent intent = (Intent) object;
331                        return NetworkScoreManager.ACTION_RECOMMEND_NETWORKS
332                                .equals(intent.getAction())
333                                && compName.getPackageName().equals(intent.getPackage());
334                    }
335                }), Mockito.eq(flags))).thenReturn(serviceInfo);
336
337        mAvailableServices.add(serviceInfo);
338    }
339
340    private void mockEnableUseOpenWifiActivity(final ComponentName useOpenWifiComp) {
341        final ResolveInfo resolveActivityInfo = new ResolveInfo();
342        resolveActivityInfo.activityInfo = new ActivityInfo();
343        resolveActivityInfo.activityInfo.name = useOpenWifiComp.getClassName();
344        resolveActivityInfo.activityInfo.packageName = useOpenWifiComp.getPackageName();
345
346        final int flags = 0;
347        when(mMockPm.resolveActivity(
348                Mockito.argThat(new ArgumentMatcher<Intent>() {
349                    @Override
350                    public boolean matches(Object object) {
351                        Intent intent = (Intent) object;
352                        return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(intent.getAction())
353                                && useOpenWifiComp.getPackageName().equals(intent.getPackage());
354                    }
355                }), Mockito.eq(flags))).thenReturn(resolveActivityInfo);
356    }
357}
358