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