blob: 36a25677a8d22147d122f6ee9c6d05c8c40754b4 [file] [log] [blame]
Jeff Sharkey9599cc52011-05-22 14:59:31 -07001/*
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
Jeff Sharkeyb09540f2011-06-19 01:08:12 -070019import static android.content.Intent.ACTION_UID_REMOVED;
20import static android.content.Intent.EXTRA_UID;
Jeff Sharkey961e3042011-08-29 16:02:57 -070021import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
Jeff Sharkey21c9c452011-06-07 12:26:43 -070022import static android.net.ConnectivityManager.TYPE_WIFI;
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -070023import static android.net.NetworkPolicy.LIMIT_DISABLED;
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -070024import static android.net.NetworkPolicy.SNOOZE_NEVER;
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -070025import static android.net.NetworkPolicy.WARNING_DISABLED;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070026import static android.net.NetworkPolicyManager.POLICY_NONE;
Jeff Sharkeyfdfef572011-06-16 15:07:48 -070027import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070028import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL;
Jeff Sharkeyfdfef572011-06-16 15:07:48 -070029import static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
Jeff Sharkeycd2ca402011-06-10 15:14:07 -070030import static android.net.NetworkPolicyManager.computeLastCycleBoundary;
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -070031import static android.net.NetworkPolicyManager.computeNextCycleBoundary;
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -070032import static android.text.format.DateUtils.DAY_IN_MILLIS;
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -070033import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
34import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT;
35import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOOZED;
36import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING;
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -070037import static org.easymock.EasyMock.anyInt;
Jeff Sharkeyfdfef572011-06-16 15:07:48 -070038import static org.easymock.EasyMock.aryEq;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070039import static org.easymock.EasyMock.capture;
40import static org.easymock.EasyMock.createMock;
41import static org.easymock.EasyMock.eq;
42import static org.easymock.EasyMock.expect;
43import static org.easymock.EasyMock.expectLastCall;
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -070044import static org.easymock.EasyMock.isA;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070045
46import android.app.IActivityManager;
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -070047import android.app.INotificationManager;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070048import android.app.IProcessObserver;
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -070049import android.app.Notification;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070050import android.content.Intent;
Jeff Sharkey4414cea2011-06-24 17:05:24 -070051import android.content.pm.PackageInfo;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070052import android.content.pm.PackageManager;
Jeff Sharkey4414cea2011-06-24 17:05:24 -070053import android.content.pm.Signature;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070054import android.net.ConnectivityManager;
Jeff Sharkey21c9c452011-06-07 12:26:43 -070055import android.net.IConnectivityManager;
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -070056import android.net.INetworkManagementEventObserver;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070057import android.net.INetworkPolicyListener;
Jeff Sharkey75279902011-05-24 18:39:45 -070058import android.net.INetworkStatsService;
Jeff Sharkey21c9c452011-06-07 12:26:43 -070059import android.net.LinkProperties;
60import android.net.NetworkInfo;
61import android.net.NetworkInfo.DetailedState;
62import android.net.NetworkPolicy;
63import android.net.NetworkState;
64import android.net.NetworkStats;
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -070065import android.net.NetworkTemplate;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070066import android.os.Binder;
Ashish Sharma50fd36d2011-06-15 19:34:53 -070067import android.os.INetworkManagementService;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070068import android.os.IPowerManager;
Jeff Sharkey163e6442011-10-31 16:37:52 -070069import android.os.MessageQueue.IdleHandler;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070070import android.test.AndroidTestCase;
71import android.test.mock.MockPackageManager;
72import android.test.suitebuilder.annotation.LargeTest;
73import android.test.suitebuilder.annotation.Suppress;
Jeff Sharkey21c9c452011-06-07 12:26:43 -070074import android.text.format.Time;
75import android.util.TrustedTime;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070076
77import com.android.server.net.NetworkPolicyManagerService;
Jeff Sharkey4414cea2011-06-24 17:05:24 -070078import com.google.common.util.concurrent.AbstractFuture;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070079
80import org.easymock.Capture;
81import org.easymock.EasyMock;
Jeff Sharkey4414cea2011-06-24 17:05:24 -070082import org.easymock.IAnswer;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070083
Jeff Sharkey21c9c452011-06-07 12:26:43 -070084import java.io.File;
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -070085import java.util.LinkedHashSet;
Jeff Sharkey4414cea2011-06-24 17:05:24 -070086import java.util.concurrent.ExecutionException;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070087import java.util.concurrent.Future;
Jeff Sharkey4414cea2011-06-24 17:05:24 -070088import java.util.concurrent.TimeUnit;
89import java.util.concurrent.TimeoutException;
Jeff Sharkey163e6442011-10-31 16:37:52 -070090import java.util.logging.Handler;
Jeff Sharkey9599cc52011-05-22 14:59:31 -070091
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -070092import libcore.io.IoUtils;
93
Jeff Sharkey9599cc52011-05-22 14:59:31 -070094/**
95 * Tests for {@link NetworkPolicyManagerService}.
96 */
97@LargeTest
98public class NetworkPolicyManagerServiceTest extends AndroidTestCase {
99 private static final String TAG = "NetworkPolicyManagerServiceTest";
100
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700101 private static final long TEST_START = 1194220800000L;
102 private static final String TEST_IFACE = "test0";
103
Jeff Sharkey163e6442011-10-31 16:37:52 -0700104 private static final long KB_IN_BYTES = 1024;
105 private static final long MB_IN_BYTES = KB_IN_BYTES * 1024;
106 private static final long GB_IN_BYTES = MB_IN_BYTES * 1024;
107
Jeff Sharkey4e814c32011-07-14 20:37:37 -0700108 private static NetworkTemplate sTemplateWifi = NetworkTemplate.buildTemplateWifi();
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -0700109
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700110 private BroadcastInterceptingContext mServiceContext;
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700111 private File mPolicyDir;
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700112
113 private IActivityManager mActivityManager;
114 private IPowerManager mPowerManager;
Jeff Sharkey75279902011-05-24 18:39:45 -0700115 private INetworkStatsService mStatsService;
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700116 private INetworkManagementService mNetworkManager;
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700117 private INetworkPolicyListener mPolicyListener;
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700118 private TrustedTime mTime;
119 private IConnectivityManager mConnManager;
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -0700120 private INotificationManager mNotifManager;
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700121
122 private NetworkPolicyManagerService mService;
123 private IProcessObserver mProcessObserver;
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700124 private INetworkManagementEventObserver mNetworkObserver;
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700125
126 private Binder mStubBinder = new Binder();
127
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700128 private long mStartTime;
129 private long mElapsedRealtime;
130
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -0700131 private static final int UID_A = android.os.Process.FIRST_APPLICATION_UID + 800;
132 private static final int UID_B = android.os.Process.FIRST_APPLICATION_UID + 801;
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700133
134 private static final int PID_1 = 400;
135 private static final int PID_2 = 401;
136 private static final int PID_3 = 402;
137
138 @Override
139 public void setUp() throws Exception {
140 super.setUp();
141
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700142 setCurrentTimeMillis(TEST_START);
143
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700144 // intercept various broadcasts, and pretend that uids have packages
145 mServiceContext = new BroadcastInterceptingContext(getContext()) {
146 @Override
147 public PackageManager getPackageManager() {
148 return new MockPackageManager() {
149 @Override
150 public String[] getPackagesForUid(int uid) {
151 return new String[] { "com.example" };
152 }
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700153
154 @Override
155 public PackageInfo getPackageInfo(String packageName, int flags) {
156 final PackageInfo info = new PackageInfo();
157 final Signature signature;
158 if ("android".equals(packageName)) {
159 signature = new Signature("F00D");
160 } else {
161 signature = new Signature("DEAD");
162 }
163 info.signatures = new Signature[] { signature };
164 return info;
165 }
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700166 };
167 }
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700168
169 @Override
170 public void startActivity(Intent intent) {
171 // ignored
172 }
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700173 };
174
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700175 mPolicyDir = getContext().getFilesDir();
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700176 if (mPolicyDir.exists()) {
177 IoUtils.deleteContents(mPolicyDir);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700178 }
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700179
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700180 mActivityManager = createMock(IActivityManager.class);
181 mPowerManager = createMock(IPowerManager.class);
Jeff Sharkey75279902011-05-24 18:39:45 -0700182 mStatsService = createMock(INetworkStatsService.class);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700183 mNetworkManager = createMock(INetworkManagementService.class);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700184 mPolicyListener = createMock(INetworkPolicyListener.class);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700185 mTime = createMock(TrustedTime.class);
186 mConnManager = createMock(IConnectivityManager.class);
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -0700187 mNotifManager = createMock(INotificationManager.class);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700188
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700189 mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mPowerManager,
190 mStatsService, mNetworkManager, mTime, mPolicyDir, true);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700191 mService.bindConnectivityManager(mConnManager);
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -0700192 mService.bindNotificationManager(mNotifManager);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700193
194 // RemoteCallbackList needs a binder to use as key
195 expect(mPolicyListener.asBinder()).andReturn(mStubBinder).atLeastOnce();
196 replay();
197 mService.registerListener(mPolicyListener);
198 verifyAndReset();
199
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700200 // catch IProcessObserver during systemReady()
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700201 final Capture<IProcessObserver> processObserver = new Capture<IProcessObserver>();
202 mActivityManager.registerProcessObserver(capture(processObserver));
203 expectLastCall().atLeastOnce();
204
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700205 // catch INetworkManagementEventObserver during systemReady()
206 final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
207 INetworkManagementEventObserver>();
208 mNetworkManager.registerObserver(capture(networkObserver));
209 expectLastCall().atLeastOnce();
210
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700211 // expect to answer screen status during systemReady()
212 expect(mPowerManager.isScreenOn()).andReturn(true).atLeastOnce();
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700213 expectCurrentTime();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700214
215 replay();
216 mService.systemReady();
217 verifyAndReset();
218
219 mProcessObserver = processObserver.getValue();
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700220 mNetworkObserver = networkObserver.getValue();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700221
222 }
223
224 @Override
225 public void tearDown() throws Exception {
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700226 for (File file : mPolicyDir.listFiles()) {
227 file.delete();
228 }
229
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700230 mServiceContext = null;
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700231 mPolicyDir = null;
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700232
233 mActivityManager = null;
234 mPowerManager = null;
Jeff Sharkey75279902011-05-24 18:39:45 -0700235 mStatsService = null;
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700236 mPolicyListener = null;
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700237 mTime = null;
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700238
239 mService = null;
240 mProcessObserver = null;
241
242 super.tearDown();
243 }
244
245 @Suppress
246 public void testPolicyChangeTriggersBroadcast() throws Exception {
247 mService.setUidPolicy(UID_A, POLICY_NONE);
248
249 // change background policy and expect broadcast
250 final Future<Intent> backgroundChanged = mServiceContext.nextBroadcastIntent(
251 ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED);
252
Jeff Sharkeyfdfef572011-06-16 15:07:48 -0700253 mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700254
255 backgroundChanged.get();
256 }
257
258 public void testPidForegroundCombined() throws Exception {
259 // push all uid into background
260 mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
261 mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false);
262 mProcessObserver.onForegroundActivitiesChanged(PID_3, UID_B, false);
Jeff Sharkey163e6442011-10-31 16:37:52 -0700263 waitUntilIdle();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700264 assertFalse(mService.isUidForeground(UID_A));
265 assertFalse(mService.isUidForeground(UID_B));
266
267 // push one of the shared pids into foreground
268 mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, true);
Jeff Sharkey163e6442011-10-31 16:37:52 -0700269 waitUntilIdle();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700270 assertTrue(mService.isUidForeground(UID_A));
271 assertFalse(mService.isUidForeground(UID_B));
272
273 // and swap another uid into foreground
274 mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false);
275 mProcessObserver.onForegroundActivitiesChanged(PID_3, UID_B, true);
Jeff Sharkey163e6442011-10-31 16:37:52 -0700276 waitUntilIdle();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700277 assertFalse(mService.isUidForeground(UID_A));
278 assertTrue(mService.isUidForeground(UID_B));
279
280 // push both pid into foreground
281 mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true);
282 mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, true);
Jeff Sharkey163e6442011-10-31 16:37:52 -0700283 waitUntilIdle();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700284 assertTrue(mService.isUidForeground(UID_A));
285
286 // pull one out, should still be foreground
287 mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
Jeff Sharkey163e6442011-10-31 16:37:52 -0700288 waitUntilIdle();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700289 assertTrue(mService.isUidForeground(UID_A));
290
291 // pull final pid out, should now be background
292 mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false);
Jeff Sharkey163e6442011-10-31 16:37:52 -0700293 waitUntilIdle();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700294 assertFalse(mService.isUidForeground(UID_A));
295 }
296
297 public void testScreenChangesRules() throws Exception {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700298 Future<Void> future;
299
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700300 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700301 expectSetUidForeground(UID_A, true);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700302 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700303 replay();
304 mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700305 future.get();
306 verifyAndReset();
307
308 // push strict policy for foreground uid, verify ALLOW rule
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700309 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700310 expectSetUidForeground(UID_A, true);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700311 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
312 replay();
Jeff Sharkeyfdfef572011-06-16 15:07:48 -0700313 mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700314 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700315 verifyAndReset();
316
317 // now turn screen off and verify REJECT rule
318 expect(mPowerManager.isScreenOn()).andReturn(false).atLeastOnce();
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700319 expectSetUidNetworkRules(UID_A, true);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700320 expectSetUidForeground(UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700321 future = expectRulesChanged(UID_A, RULE_REJECT_METERED);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700322 replay();
323 mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_OFF));
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700324 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700325 verifyAndReset();
326
327 // and turn screen back on, verify ALLOW rule restored
328 expect(mPowerManager.isScreenOn()).andReturn(true).atLeastOnce();
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700329 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700330 expectSetUidForeground(UID_A, true);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700331 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700332 replay();
333 mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_ON));
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700334 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700335 verifyAndReset();
336 }
337
338 public void testPolicyNone() throws Exception {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700339 Future<Void> future;
340
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700341 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700342 expectSetUidForeground(UID_A, true);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700343 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
344 replay();
345 mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true);
346 future.get();
347 verifyAndReset();
348
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700349 // POLICY_NONE should RULE_ALLOW in foreground
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700350 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700351 expectSetUidForeground(UID_A, true);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700352 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700353 replay();
354 mService.setUidPolicy(UID_A, POLICY_NONE);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700355 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700356 verifyAndReset();
357
358 // POLICY_NONE should RULE_ALLOW in background
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700359 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700360 expectSetUidForeground(UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700361 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700362 replay();
363 mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700364 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700365 verifyAndReset();
366 }
367
368 public void testPolicyReject() throws Exception {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700369 Future<Void> future;
370
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700371 // POLICY_REJECT should RULE_ALLOW in background
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700372 expectSetUidNetworkRules(UID_A, true);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700373 expectSetUidForeground(UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700374 future = expectRulesChanged(UID_A, RULE_REJECT_METERED);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700375 replay();
Jeff Sharkeyfdfef572011-06-16 15:07:48 -0700376 mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700377 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700378 verifyAndReset();
379
380 // POLICY_REJECT should RULE_ALLOW in foreground
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700381 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700382 expectSetUidForeground(UID_A, true);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700383 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700384 replay();
385 mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700386 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700387 verifyAndReset();
388
389 // POLICY_REJECT should RULE_REJECT in background
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700390 expectSetUidNetworkRules(UID_A, true);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700391 expectSetUidForeground(UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700392 future = expectRulesChanged(UID_A, RULE_REJECT_METERED);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700393 replay();
394 mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700395 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700396 verifyAndReset();
397 }
398
399 public void testPolicyRejectAddRemove() throws Exception {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700400 Future<Void> future;
401
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700402 // POLICY_NONE should have RULE_ALLOW in background
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700403 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700404 expectSetUidForeground(UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700405 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700406 replay();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700407 mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700408 mService.setUidPolicy(UID_A, POLICY_NONE);
409 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700410 verifyAndReset();
411
412 // adding POLICY_REJECT should cause RULE_REJECT
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700413 expectSetUidNetworkRules(UID_A, true);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700414 expectSetUidForeground(UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700415 future = expectRulesChanged(UID_A, RULE_REJECT_METERED);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700416 replay();
Jeff Sharkeyfdfef572011-06-16 15:07:48 -0700417 mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700418 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700419 verifyAndReset();
420
421 // removing POLICY_REJECT should return us to RULE_ALLOW
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700422 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700423 expectSetUidForeground(UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700424 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700425 replay();
426 mService.setUidPolicy(UID_A, POLICY_NONE);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700427 future.get();
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700428 verifyAndReset();
429 }
430
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700431 public void testLastCycleBoundaryThisMonth() throws Exception {
432 // assume cycle day of "5th", which should be in same month
433 final long currentTime = parseTime("2007-11-14T00:00:00.000Z");
434 final long expectedCycle = parseTime("2007-11-05T00:00:00.000Z");
435
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700436 final NetworkPolicy policy = new NetworkPolicy(
Jeff Sharkeyf60d0af2011-11-30 15:28:02 -0800437 sTemplateWifi, 5, 1024L, 1024L, SNOOZE_NEVER, false);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700438 final long actualCycle = computeLastCycleBoundary(currentTime, policy);
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -0700439 assertTimeEquals(expectedCycle, actualCycle);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700440 }
441
442 public void testLastCycleBoundaryLastMonth() throws Exception {
443 // assume cycle day of "20th", which should be in last month
444 final long currentTime = parseTime("2007-11-14T00:00:00.000Z");
445 final long expectedCycle = parseTime("2007-10-20T00:00:00.000Z");
446
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700447 final NetworkPolicy policy = new NetworkPolicy(
Jeff Sharkeyf60d0af2011-11-30 15:28:02 -0800448 sTemplateWifi, 20, 1024L, 1024L, SNOOZE_NEVER, false);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700449 final long actualCycle = computeLastCycleBoundary(currentTime, policy);
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -0700450 assertTimeEquals(expectedCycle, actualCycle);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700451 }
452
453 public void testLastCycleBoundaryThisMonthFebruary() throws Exception {
454 // assume cycle day of "30th" in february; should go to january
455 final long currentTime = parseTime("2007-02-14T00:00:00.000Z");
456 final long expectedCycle = parseTime("2007-01-30T00:00:00.000Z");
457
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700458 final NetworkPolicy policy = new NetworkPolicy(
Jeff Sharkeyf60d0af2011-11-30 15:28:02 -0800459 sTemplateWifi, 30, 1024L, 1024L, SNOOZE_NEVER, false);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700460 final long actualCycle = computeLastCycleBoundary(currentTime, policy);
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -0700461 assertTimeEquals(expectedCycle, actualCycle);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700462 }
463
464 public void testLastCycleBoundaryLastMonthFebruary() throws Exception {
465 // assume cycle day of "30th" in february, which should clamp
466 final long currentTime = parseTime("2007-03-14T00:00:00.000Z");
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -0700467 final long expectedCycle = parseTime("2007-02-28T23:59:59.000Z");
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700468
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700469 final NetworkPolicy policy = new NetworkPolicy(
Jeff Sharkeyf60d0af2011-11-30 15:28:02 -0800470 sTemplateWifi, 30, 1024L, 1024L, SNOOZE_NEVER, false);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700471 final long actualCycle = computeLastCycleBoundary(currentTime, policy);
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -0700472 assertTimeEquals(expectedCycle, actualCycle);
473 }
474
475 public void testNextCycleSane() throws Exception {
476 final NetworkPolicy policy = new NetworkPolicy(
Jeff Sharkeyf60d0af2011-11-30 15:28:02 -0800477 sTemplateWifi, 31, WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER, false);
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -0700478 final LinkedHashSet<Long> seen = new LinkedHashSet<Long>();
479
480 // walk forwards, ensuring that cycle boundaries don't get stuck
481 long currentCycle = computeNextCycleBoundary(parseTime("2011-08-01T00:00:00.000Z"), policy);
482 for (int i = 0; i < 128; i++) {
483 long nextCycle = computeNextCycleBoundary(currentCycle, policy);
484 assertEqualsFuzzy(DAY_IN_MILLIS * 30, nextCycle - currentCycle, DAY_IN_MILLIS * 3);
485 assertUnique(seen, nextCycle);
486 currentCycle = nextCycle;
487 }
488 }
489
490 public void testLastCycleSane() throws Exception {
491 final NetworkPolicy policy = new NetworkPolicy(
Jeff Sharkeyf60d0af2011-11-30 15:28:02 -0800492 sTemplateWifi, 31, WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER, false);
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -0700493 final LinkedHashSet<Long> seen = new LinkedHashSet<Long>();
494
495 // walk backwards, ensuring that cycle boundaries look sane
496 long currentCycle = computeLastCycleBoundary(parseTime("2011-08-04T00:00:00.000Z"), policy);
497 for (int i = 0; i < 128; i++) {
498 long lastCycle = computeLastCycleBoundary(currentCycle, policy);
499 assertEqualsFuzzy(DAY_IN_MILLIS * 30, currentCycle - lastCycle, DAY_IN_MILLIS * 3);
500 assertUnique(seen, lastCycle);
501 currentCycle = lastCycle;
502 }
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700503 }
504
505 public void testNetworkPolicyAppliedCycleLastMonth() throws Exception {
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700506 NetworkState[] state = null;
507 NetworkStats stats = null;
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700508 Future<Void> future;
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700509
510 final long TIME_FEB_15 = 1171497600000L;
511 final long TIME_MAR_10 = 1173484800000L;
512 final int CYCLE_DAY = 15;
513
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700514 setCurrentTimeMillis(TIME_MAR_10);
515
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700516 // first, pretend that wifi network comes online. no policy active,
517 // which means we shouldn't push limit to interface.
518 state = new NetworkState[] { buildWifi() };
519 expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700520 expectCurrentTime();
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700521 expectClearNotifications();
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700522 future = expectMeteredIfacesChanged();
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700523
524 replay();
Jeff Sharkey961e3042011-08-29 16:02:57 -0700525 mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700526 future.get();
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700527 verifyAndReset();
528
529 // now change cycle to be on 15th, and test in early march, to verify we
530 // pick cycle day in previous month.
531 expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700532 expectCurrentTime();
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700533
534 // pretend that 512 bytes total have happened
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700535 stats = new NetworkStats(getElapsedRealtime(), 1)
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700536 .addIfaceValues(TEST_IFACE, 256L, 2L, 256L, 2L);
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -0700537 expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, TIME_MAR_10))
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700538 .andReturn(stats).atLeastOnce();
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800539 expectPolicyDataEnable(TYPE_WIFI, true);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700540
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700541 // TODO: consider making strongly ordered mock
542 expectRemoveInterfaceQuota(TEST_IFACE);
Jeff Sharkey163e6442011-10-31 16:37:52 -0700543 expectSetInterfaceQuota(TEST_IFACE, (2 * MB_IN_BYTES) - 512);
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700544
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -0700545 expectClearNotifications();
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700546 future = expectMeteredIfacesChanged(TEST_IFACE);
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -0700547
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700548 replay();
Jeff Sharkey163e6442011-10-31 16:37:52 -0700549 setNetworkPolicies(new NetworkPolicy(
Jeff Sharkeyf60d0af2011-11-30 15:28:02 -0800550 sTemplateWifi, CYCLE_DAY, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, SNOOZE_NEVER, false));
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700551 future.get();
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700552 verifyAndReset();
553 }
554
Jeff Sharkeyb09540f2011-06-19 01:08:12 -0700555 public void testUidRemovedPolicyCleared() throws Exception {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700556 Future<Void> future;
557
Jeff Sharkeyb09540f2011-06-19 01:08:12 -0700558 // POLICY_REJECT should RULE_REJECT in background
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700559 expectSetUidNetworkRules(UID_A, true);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700560 expectSetUidForeground(UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700561 future = expectRulesChanged(UID_A, RULE_REJECT_METERED);
Jeff Sharkeyb09540f2011-06-19 01:08:12 -0700562 replay();
563 mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700564 future.get();
Jeff Sharkeyb09540f2011-06-19 01:08:12 -0700565 verifyAndReset();
566
567 // uninstall should clear RULE_REJECT
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700568 expectSetUidNetworkRules(UID_A, false);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700569 expectSetUidForeground(UID_A, false);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700570 future = expectRulesChanged(UID_A, RULE_ALLOW_ALL);
Jeff Sharkeyb09540f2011-06-19 01:08:12 -0700571 replay();
572 final Intent intent = new Intent(ACTION_UID_REMOVED);
573 intent.putExtra(EXTRA_UID, UID_A);
574 mServiceContext.sendBroadcast(intent);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700575 future.get();
Jeff Sharkeyb09540f2011-06-19 01:08:12 -0700576 verifyAndReset();
577 }
578
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700579 public void testOverWarningLimitNotification() throws Exception {
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700580 NetworkState[] state = null;
581 NetworkStats stats = null;
582 Future<Void> future;
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800583 Future<String> tagFuture;
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700584
585 final long TIME_FEB_15 = 1171497600000L;
586 final long TIME_MAR_10 = 1173484800000L;
587 final int CYCLE_DAY = 15;
588
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700589 setCurrentTimeMillis(TIME_MAR_10);
590
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700591 // assign wifi policy
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700592 state = new NetworkState[] {};
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700593 stats = new NetworkStats(getElapsedRealtime(), 1)
594 .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700595
596 {
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700597 expectCurrentTime();
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700598 expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700599 expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
600 .andReturn(stats).atLeastOnce();
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800601 expectPolicyDataEnable(TYPE_WIFI, true);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700602
603 expectClearNotifications();
604 future = expectMeteredIfacesChanged();
605
606 replay();
Jeff Sharkeyf60d0af2011-11-30 15:28:02 -0800607 setNetworkPolicies(
608 new NetworkPolicy(sTemplateWifi, CYCLE_DAY, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES,
609 SNOOZE_NEVER, false));
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700610 future.get();
611 verifyAndReset();
612 }
613
614 // bring up wifi network
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700615 incrementCurrentTime(MINUTE_IN_MILLIS);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700616 state = new NetworkState[] { buildWifi() };
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700617 stats = new NetworkStats(getElapsedRealtime(), 1)
618 .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700619
620 {
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700621 expectCurrentTime();
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700622 expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700623 expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700624 .andReturn(stats).atLeastOnce();
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800625 expectPolicyDataEnable(TYPE_WIFI, true);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700626
627 expectRemoveInterfaceQuota(TEST_IFACE);
Jeff Sharkey163e6442011-10-31 16:37:52 -0700628 expectSetInterfaceQuota(TEST_IFACE, 2 * MB_IN_BYTES);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700629
630 expectClearNotifications();
631 future = expectMeteredIfacesChanged(TEST_IFACE);
632
633 replay();
Jeff Sharkey961e3042011-08-29 16:02:57 -0700634 mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700635 future.get();
636 verifyAndReset();
637 }
638
639 // go over warning, which should kick notification
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700640 incrementCurrentTime(MINUTE_IN_MILLIS);
641 stats = new NetworkStats(getElapsedRealtime(), 1)
Jeff Sharkey163e6442011-10-31 16:37:52 -0700642 .addIfaceValues(TEST_IFACE, 1536 * KB_IN_BYTES, 15L, 0L, 0L);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700643
644 {
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700645 expectCurrentTime();
646 expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700647 .andReturn(stats).atLeastOnce();
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800648 expectPolicyDataEnable(TYPE_WIFI, true);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700649
650 expectForceUpdate();
651 expectClearNotifications();
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800652 tagFuture = expectEnqueueNotification();
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700653
654 replay();
655 mNetworkObserver.limitReached(null, TEST_IFACE);
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800656 assertNotificationType(TYPE_WARNING, tagFuture.get());
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700657 verifyAndReset();
658 }
659
660 // go over limit, which should kick notification and dialog
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700661 incrementCurrentTime(MINUTE_IN_MILLIS);
662 stats = new NetworkStats(getElapsedRealtime(), 1)
Jeff Sharkey163e6442011-10-31 16:37:52 -0700663 .addIfaceValues(TEST_IFACE, 5 * MB_IN_BYTES, 512L, 0L, 0L);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700664
665 {
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700666 expectCurrentTime();
667 expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700668 .andReturn(stats).atLeastOnce();
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800669 expectPolicyDataEnable(TYPE_WIFI, false);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700670
671 expectForceUpdate();
672 expectClearNotifications();
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800673 tagFuture = expectEnqueueNotification();
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700674
675 replay();
676 mNetworkObserver.limitReached(null, TEST_IFACE);
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800677 assertNotificationType(TYPE_LIMIT, tagFuture.get());
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700678 verifyAndReset();
679 }
680
681 // now snooze policy, which should remove quota
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700682 incrementCurrentTime(MINUTE_IN_MILLIS);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700683
684 {
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700685 expectCurrentTime();
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700686 expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700687 expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700688 .andReturn(stats).atLeastOnce();
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800689 expectPolicyDataEnable(TYPE_WIFI, true);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700690
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700691 // snoozed interface still has high quota so background data is
692 // still restricted.
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700693 expectRemoveInterfaceQuota(TEST_IFACE);
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700694 expectSetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE);
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800695 expectMeteredIfacesChanged(TEST_IFACE);
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700696
Jeff Sharkeyc506ff62011-11-17 11:59:29 -0800697 future = expectClearNotifications();
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800698 tagFuture = expectEnqueueNotification();
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700699
700 replay();
701 mService.snoozePolicy(sTemplateWifi);
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800702 assertNotificationType(TYPE_LIMIT_SNOOZED, tagFuture.get());
Jeff Sharkeyc506ff62011-11-17 11:59:29 -0800703 future.get();
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700704 verifyAndReset();
705 }
706 }
707
Jeff Sharkeyf60d0af2011-11-30 15:28:02 -0800708 public void testMeteredNetworkWithoutLimit() throws Exception {
709 NetworkState[] state = null;
710 NetworkStats stats = null;
711 Future<Void> future;
712 Future<String> tagFuture;
713
714 final long TIME_FEB_15 = 1171497600000L;
715 final long TIME_MAR_10 = 1173484800000L;
716 final int CYCLE_DAY = 15;
717
718 setCurrentTimeMillis(TIME_MAR_10);
719
720 // bring up wifi network with metered policy
721 state = new NetworkState[] { buildWifi() };
722 stats = new NetworkStats(getElapsedRealtime(), 1)
723 .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L);
724
725 {
726 expectCurrentTime();
727 expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
728 expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
729 .andReturn(stats).atLeastOnce();
730 expectPolicyDataEnable(TYPE_WIFI, true);
731
732 expectRemoveInterfaceQuota(TEST_IFACE);
733 expectSetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE);
734
735 expectClearNotifications();
736 future = expectMeteredIfacesChanged(TEST_IFACE);
737
738 replay();
739 setNetworkPolicies(
740 new NetworkPolicy(sTemplateWifi, CYCLE_DAY, WARNING_DISABLED, LIMIT_DISABLED,
741 SNOOZE_NEVER, true));
742 future.get();
743 verifyAndReset();
744 }
745 }
746
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700747 private static long parseTime(String time) {
748 final Time result = new Time();
749 result.parse3339(time);
750 return result.toMillis(true);
751 }
752
Jeff Sharkeyaf11d482011-06-13 00:14:31 -0700753 private void setNetworkPolicies(NetworkPolicy... policies) {
754 mService.setNetworkPolicies(policies);
755 }
756
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700757 private static NetworkState buildWifi() {
758 final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
759 info.setDetailedState(DetailedState.CONNECTED, null, null);
760 final LinkProperties prop = new LinkProperties();
761 prop.setInterfaceName(TEST_IFACE);
762 return new NetworkState(info, prop, null);
763 }
764
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700765 private void expectCurrentTime() throws Exception {
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700766 expect(mTime.forceRefresh()).andReturn(false).anyTimes();
767 expect(mTime.hasCache()).andReturn(true).anyTimes();
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700768 expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes();
Jeff Sharkey21c9c452011-06-07 12:26:43 -0700769 expect(mTime.getCacheAge()).andReturn(0L).anyTimes();
770 expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes();
771 }
772
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700773 private void expectForceUpdate() throws Exception {
774 mStatsService.forceUpdate();
775 expectLastCall().atLeastOnce();
776 }
777
Jeff Sharkeyc506ff62011-11-17 11:59:29 -0800778 private Future<Void> expectClearNotifications() throws Exception {
779 final FutureAnswer future = new FutureAnswer();
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -0700780 mNotifManager.cancelNotificationWithTag(isA(String.class), isA(String.class), anyInt());
Jeff Sharkeyc506ff62011-11-17 11:59:29 -0800781 expectLastCall().andAnswer(future).anyTimes();
782 return future;
Jeff Sharkey2ef2aeb2011-06-15 11:01:31 -0700783 }
784
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800785 private Future<String> expectEnqueueNotification() throws Exception {
786 final FutureCapture<String> tag = new FutureCapture<String>();
787 mNotifManager.enqueueNotificationWithTag(isA(String.class), capture(tag.capture), anyInt(),
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700788 isA(Notification.class), isA(int[].class));
789 return tag;
790 }
791
792 private void expectSetInterfaceQuota(String iface, long quotaBytes) throws Exception {
793 mNetworkManager.setInterfaceQuota(iface, quotaBytes);
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700794 expectLastCall().atLeastOnce();
795 }
796
797 private void expectRemoveInterfaceQuota(String iface) throws Exception {
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700798 mNetworkManager.removeInterfaceQuota(iface);
799 expectLastCall().atLeastOnce();
800 }
801
802 private void expectSetInterfaceAlert(String iface, long alertBytes) throws Exception {
803 mNetworkManager.setInterfaceAlert(iface, alertBytes);
804 expectLastCall().atLeastOnce();
805 }
806
807 private void expectRemoveInterfaceAlert(String iface) throws Exception {
808 mNetworkManager.removeInterfaceAlert(iface);
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700809 expectLastCall().atLeastOnce();
810 }
811
812 private void expectSetUidNetworkRules(int uid, boolean rejectOnQuotaInterfaces)
813 throws Exception {
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700814 mNetworkManager.setUidNetworkRules(uid, rejectOnQuotaInterfaces);
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700815 expectLastCall().atLeastOnce();
816 }
817
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700818 private void expectSetUidForeground(int uid, boolean uidForeground) throws Exception {
819 mStatsService.setUidForeground(uid, uidForeground);
820 expectLastCall().atLeastOnce();
821 }
822
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700823 private Future<Void> expectRulesChanged(int uid, int policy) throws Exception {
824 final FutureAnswer future = new FutureAnswer();
Jeff Sharkeyfdfef572011-06-16 15:07:48 -0700825 mPolicyListener.onUidRulesChanged(eq(uid), eq(policy));
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700826 expectLastCall().andAnswer(future);
827 return future;
Jeff Sharkeyfdfef572011-06-16 15:07:48 -0700828 }
829
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700830 private Future<Void> expectMeteredIfacesChanged(String... ifaces) throws Exception {
831 final FutureAnswer future = new FutureAnswer();
Jeff Sharkeyfdfef572011-06-16 15:07:48 -0700832 mPolicyListener.onMeteredIfacesChanged(aryEq(ifaces));
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700833 expectLastCall().andAnswer(future);
834 return future;
835 }
836
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800837 private Future<Void> expectPolicyDataEnable(int type, boolean enabled) throws Exception {
838 final FutureAnswer future = new FutureAnswer();
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700839 mConnManager.setPolicyDataEnable(type, enabled);
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800840 expectLastCall().andAnswer(future);
841 return future;
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700842 }
843
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800844 private static class TestAbstractFuture<T> extends AbstractFuture<T> {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700845 @Override
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800846 public T get() throws InterruptedException, ExecutionException {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700847 try {
848 return get(5, TimeUnit.SECONDS);
849 } catch (TimeoutException e) {
850 throw new RuntimeException(e);
851 }
852 }
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800853 }
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700854
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800855 private static class FutureAnswer extends TestAbstractFuture<Void> implements IAnswer<Void> {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700856 @Override
857 public Void answer() {
858 set(null);
859 return null;
860 }
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700861 }
862
Jeff Sharkey7ee86582011-11-14 18:02:21 -0800863 private static class FutureCapture<T> extends TestAbstractFuture<T> {
864 public Capture<T> capture = new Capture<T>() {
865 @Override
866 public void setValue(T value) {
867 super.setValue(value);
868 set(value);
869 }
870 };
871 }
872
Jeff Sharkey163e6442011-10-31 16:37:52 -0700873 private static class IdleFuture extends AbstractFuture<Void> implements IdleHandler {
874 @Override
875 public Void get() throws InterruptedException, ExecutionException {
876 try {
877 return get(5, TimeUnit.SECONDS);
878 } catch (TimeoutException e) {
879 throw new RuntimeException(e);
880 }
881 }
882
883 /** {@inheritDoc} */
884 public boolean queueIdle() {
885 set(null);
886 return false;
887 }
888 }
889
890 /**
891 * Wait until {@link #mService} internal {@link Handler} is idle.
892 */
893 private void waitUntilIdle() throws Exception {
894 final IdleFuture future = new IdleFuture();
895 mService.addIdleHandler(future);
896 future.get();
897 }
898
Jeff Sharkeyaf82ea22011-08-04 15:38:48 -0700899 private static void assertTimeEquals(long expected, long actual) {
900 if (expected != actual) {
901 fail("expected " + formatTime(expected) + " but was actually " + formatTime(actual));
902 }
903 }
904
905 private static String formatTime(long millis) {
906 final Time time = new Time(Time.TIMEZONE_UTC);
907 time.set(millis);
908 return time.format3339(false);
909 }
910
911 private static void assertEqualsFuzzy(long expected, long actual, long fuzzy) {
912 final long low = expected - fuzzy;
913 final long high = expected + fuzzy;
914 if (actual < low || actual > high) {
915 fail("value " + actual + " is outside [" + low + "," + high + "]");
916 }
917 }
918
919 private static void assertUnique(LinkedHashSet<Long> seen, Long value) {
920 if (!seen.add(value)) {
921 fail("found duplicate time " + value + " in series " + seen.toString());
922 }
923 }
924
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700925 private static void assertNotificationType(int expected, String actualTag) {
926 assertEquals(
927 Integer.toString(expected), actualTag.substring(actualTag.lastIndexOf(':') + 1));
928 }
929
Jeff Sharkey8e28b7d2011-08-19 02:24:24 -0700930 private long getElapsedRealtime() {
931 return mElapsedRealtime;
932 }
933
934 private void setCurrentTimeMillis(long currentTimeMillis) {
935 mStartTime = currentTimeMillis;
936 mElapsedRealtime = 0L;
937 }
938
939 private long currentTimeMillis() {
940 return mStartTime + mElapsedRealtime;
941 }
942
943 private void incrementCurrentTime(long duration) {
944 mElapsedRealtime += duration;
945 }
946
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700947 private void replay() {
Ashish Sharma50fd36d2011-06-15 19:34:53 -0700948 EasyMock.replay(mActivityManager, mPowerManager, mStatsService, mPolicyListener,
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700949 mNetworkManager, mTime, mConnManager, mNotifManager);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700950 }
951
952 private void verifyAndReset() {
Ashish Sharma50fd36d2011-06-15 19:34:53 -0700953 EasyMock.verify(mActivityManager, mPowerManager, mStatsService, mPolicyListener,
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700954 mNetworkManager, mTime, mConnManager, mNotifManager);
Ashish Sharma50fd36d2011-06-15 19:34:53 -0700955 EasyMock.reset(mActivityManager, mPowerManager, mStatsService, mPolicyListener,
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700956 mNetworkManager, mTime, mConnManager, mNotifManager);
Jeff Sharkey9599cc52011-05-22 14:59:31 -0700957 }
958}