NetworkPolicyManagerServiceTest.java revision 75279904202357565cf5a1cb11148d01f42b4569
1/*
2 * Copyright (C) 2011 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 android.net.NetworkPolicyManager.POLICY_NONE;
20import static android.net.NetworkPolicyManager.POLICY_REJECT_PAID_BACKGROUND;
21import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL;
22import static android.net.NetworkPolicyManager.RULE_REJECT_PAID;
23import static org.easymock.EasyMock.capture;
24import static org.easymock.EasyMock.createMock;
25import static org.easymock.EasyMock.eq;
26import static org.easymock.EasyMock.expect;
27import static org.easymock.EasyMock.expectLastCall;
28
29import android.app.IActivityManager;
30import android.app.IProcessObserver;
31import android.content.Intent;
32import android.content.pm.PackageManager;
33import android.net.ConnectivityManager;
34import android.net.INetworkPolicyListener;
35import android.net.INetworkStatsService;
36import android.os.Binder;
37import android.os.IPowerManager;
38import android.test.AndroidTestCase;
39import android.test.mock.MockPackageManager;
40import android.test.suitebuilder.annotation.LargeTest;
41import android.test.suitebuilder.annotation.Suppress;
42
43import com.android.server.net.NetworkPolicyManagerService;
44
45import org.easymock.Capture;
46import org.easymock.EasyMock;
47
48import java.util.concurrent.Future;
49
50/**
51 * Tests for {@link NetworkPolicyManagerService}.
52 */
53@LargeTest
54public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
55    private static final String TAG = "NetworkPolicyManagerServiceTest";
56
57    private BroadcastInterceptingContext mServiceContext;
58
59    private IActivityManager mActivityManager;
60    private IPowerManager mPowerManager;
61    private INetworkStatsService mStatsService;
62    private INetworkPolicyListener mPolicyListener;
63
64    private NetworkPolicyManagerService mService;
65    private IProcessObserver mProcessObserver;
66
67    private Binder mStubBinder = new Binder();
68
69    private static final int UID_A = 800;
70    private static final int UID_B = 801;
71
72    private static final int PID_1 = 400;
73    private static final int PID_2 = 401;
74    private static final int PID_3 = 402;
75
76    @Override
77    public void setUp() throws Exception {
78        super.setUp();
79
80        // intercept various broadcasts, and pretend that uids have packages
81        mServiceContext = new BroadcastInterceptingContext(getContext()) {
82            @Override
83            public PackageManager getPackageManager() {
84                return new MockPackageManager() {
85                    @Override
86                    public String[] getPackagesForUid(int uid) {
87                        return new String[] { "com.example" };
88                    }
89                };
90            }
91        };
92
93        mActivityManager = createMock(IActivityManager.class);
94        mPowerManager = createMock(IPowerManager.class);
95        mStatsService = createMock(INetworkStatsService.class);
96        mPolicyListener = createMock(INetworkPolicyListener.class);
97
98        mService = new NetworkPolicyManagerService(
99                mServiceContext, mActivityManager, mPowerManager, mStatsService);
100
101        // RemoteCallbackList needs a binder to use as key
102        expect(mPolicyListener.asBinder()).andReturn(mStubBinder).atLeastOnce();
103        replay();
104        mService.registerListener(mPolicyListener);
105        verifyAndReset();
106
107        // catch the registered IProcessObserver during systemReady()
108        final Capture<IProcessObserver> processObserver = new Capture<IProcessObserver>();
109        mActivityManager.registerProcessObserver(capture(processObserver));
110        expectLastCall().atLeastOnce();
111
112        // expect to answer screen status during systemReady()
113        expect(mPowerManager.isScreenOn()).andReturn(true).atLeastOnce();
114
115        replay();
116        mService.systemReady();
117        verifyAndReset();
118
119        mProcessObserver = processObserver.getValue();
120
121    }
122
123    @Override
124    public void tearDown() throws Exception {
125        mServiceContext = null;
126
127        mActivityManager = null;
128        mPowerManager = null;
129        mStatsService = null;
130        mPolicyListener = null;
131
132        mService = null;
133        mProcessObserver = null;
134
135        super.tearDown();
136    }
137
138    @Suppress
139    public void testPolicyChangeTriggersBroadcast() throws Exception {
140        mService.setUidPolicy(UID_A, POLICY_NONE);
141
142        // change background policy and expect broadcast
143        final Future<Intent> backgroundChanged = mServiceContext.nextBroadcastIntent(
144                ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED);
145
146        mService.setUidPolicy(UID_A, POLICY_REJECT_PAID_BACKGROUND);
147
148        backgroundChanged.get();
149    }
150
151    public void testPidForegroundCombined() throws Exception {
152        // push all uid into background
153        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
154        mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false);
155        mProcessObserver.onForegroundActivitiesChanged(PID_3, UID_B, false);
156        assertFalse(mService.isUidForeground(UID_A));
157        assertFalse(mService.isUidForeground(UID_B));
158
159        // push one of the shared pids into foreground
160        mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, true);
161        assertTrue(mService.isUidForeground(UID_A));
162        assertFalse(mService.isUidForeground(UID_B));
163
164        // and swap another uid into foreground
165        mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false);
166        mProcessObserver.onForegroundActivitiesChanged(PID_3, UID_B, true);
167        assertFalse(mService.isUidForeground(UID_A));
168        assertTrue(mService.isUidForeground(UID_B));
169
170        // push both pid into foreground
171        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true);
172        mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, true);
173        assertTrue(mService.isUidForeground(UID_A));
174
175        // pull one out, should still be foreground
176        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
177        assertTrue(mService.isUidForeground(UID_A));
178
179        // pull final pid out, should now be background
180        mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false);
181        assertFalse(mService.isUidForeground(UID_A));
182    }
183
184    public void testScreenChangesRules() throws Exception {
185        // push strict policy for foreground uid, verify ALLOW rule
186        expectRulesChanged(UID_A, RULE_ALLOW_ALL);
187        replay();
188        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true);
189        mService.setUidPolicy(UID_A, POLICY_REJECT_PAID_BACKGROUND);
190        verifyAndReset();
191
192        // now turn screen off and verify REJECT rule
193        expect(mPowerManager.isScreenOn()).andReturn(false).atLeastOnce();
194        expectRulesChanged(UID_A, RULE_REJECT_PAID);
195        replay();
196        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_OFF));
197        verifyAndReset();
198
199        // and turn screen back on, verify ALLOW rule restored
200        expect(mPowerManager.isScreenOn()).andReturn(true).atLeastOnce();
201        expectRulesChanged(UID_A, RULE_ALLOW_ALL);
202        replay();
203        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_ON));
204        verifyAndReset();
205    }
206
207    public void testPolicyNone() throws Exception {
208        // POLICY_NONE should RULE_ALLOW in foreground
209        expectRulesChanged(UID_A, RULE_ALLOW_ALL);
210        replay();
211        mService.setUidPolicy(UID_A, POLICY_NONE);
212        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true);
213        verifyAndReset();
214
215        // POLICY_NONE should RULE_ALLOW in background
216        expectRulesChanged(UID_A, RULE_ALLOW_ALL);
217        replay();
218        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
219        verifyAndReset();
220    }
221
222    public void testPolicyReject() throws Exception {
223        // POLICY_REJECT should RULE_ALLOW in background
224        expectRulesChanged(UID_A, RULE_REJECT_PAID);
225        replay();
226        mService.setUidPolicy(UID_A, POLICY_REJECT_PAID_BACKGROUND);
227        verifyAndReset();
228
229        // POLICY_REJECT should RULE_ALLOW in foreground
230        expectRulesChanged(UID_A, RULE_ALLOW_ALL);
231        replay();
232        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true);
233        verifyAndReset();
234
235        // POLICY_REJECT should RULE_REJECT in background
236        expectRulesChanged(UID_A, RULE_REJECT_PAID);
237        replay();
238        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
239        verifyAndReset();
240    }
241
242    public void testPolicyRejectAddRemove() throws Exception {
243        // POLICY_NONE should have RULE_ALLOW in background
244        expectRulesChanged(UID_A, RULE_ALLOW_ALL);
245        replay();
246        mService.setUidPolicy(UID_A, POLICY_NONE);
247        mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
248        verifyAndReset();
249
250        // adding POLICY_REJECT should cause RULE_REJECT
251        expectRulesChanged(UID_A, RULE_REJECT_PAID);
252        replay();
253        mService.setUidPolicy(UID_A, POLICY_REJECT_PAID_BACKGROUND);
254        verifyAndReset();
255
256        // removing POLICY_REJECT should return us to RULE_ALLOW
257        expectRulesChanged(UID_A, RULE_ALLOW_ALL);
258        replay();
259        mService.setUidPolicy(UID_A, POLICY_NONE);
260        verifyAndReset();
261    }
262
263    private void expectRulesChanged(int uid, int policy) throws Exception {
264        mPolicyListener.onRulesChanged(eq(uid), eq(policy));
265        expectLastCall().atLeastOnce();
266    }
267
268    private void replay() {
269        EasyMock.replay(mActivityManager, mPowerManager, mStatsService, mPolicyListener);
270    }
271
272    private void verifyAndReset() {
273        EasyMock.verify(mActivityManager, mPowerManager, mStatsService, mPolicyListener);
274        EasyMock.reset(mActivityManager, mPowerManager, mStatsService, mPolicyListener);
275    }
276}
277