19599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey/* 29599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project 39599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * 49599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 59599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * you may not use this file except in compliance with the License. 69599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * You may obtain a copy of the License at 79599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * 89599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 99599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * 109599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 119599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 129599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * See the License for the specific language governing permissions and 149599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * limitations under the License. 159599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey */ 169599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 179599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeypackage com.android.server; 189599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 19b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.content.Intent.ACTION_UID_REMOVED; 20b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.content.Intent.EXTRA_UID; 21961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkeyimport static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE; 2221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport static android.net.ConnectivityManager.TYPE_WIFI; 23af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkeyimport static android.net.NetworkPolicy.LIMIT_DISABLED; 24af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkeyimport static android.net.NetworkPolicy.WARNING_DISABLED; 259599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport static android.net.NetworkPolicyManager.POLICY_NONE; 26fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkeyimport static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; 279599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport static android.net.NetworkPolicyManager.RULE_ALLOW_ALL; 28fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkeyimport static android.net.NetworkPolicyManager.RULE_REJECT_METERED; 29cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkeyimport static android.net.NetworkPolicyManager.computeLastCycleBoundary; 30af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkeyimport static android.net.NetworkPolicyManager.computeNextCycleBoundary; 31241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkeyimport static android.net.TrafficStats.KB_IN_BYTES; 32241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkeyimport static android.net.TrafficStats.MB_IN_BYTES; 33af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkeyimport static android.text.format.DateUtils.DAY_IN_MILLIS; 3441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS; 359bf3150cfae03421c9dd237b46657714859d871cJeff Sharkeyimport static android.text.format.Time.TIMEZONE_UTC; 3641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkeyimport static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT; 3741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkeyimport static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOOZED; 3841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkeyimport static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING; 392ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkeyimport static org.easymock.EasyMock.anyInt; 400cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkeyimport static org.easymock.EasyMock.anyLong; 41fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkeyimport static org.easymock.EasyMock.aryEq; 429599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport static org.easymock.EasyMock.capture; 439599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport static org.easymock.EasyMock.createMock; 449599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport static org.easymock.EasyMock.eq; 459599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport static org.easymock.EasyMock.expect; 469599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport static org.easymock.EasyMock.expectLastCall; 472ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkeyimport static org.easymock.EasyMock.isA; 489599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 499599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.app.IActivityManager; 502ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkeyimport android.app.INotificationManager; 519599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.app.IProcessObserver; 5241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkeyimport android.app.Notification; 539599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.content.Intent; 544414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.content.pm.PackageInfo; 559599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.content.pm.PackageManager; 564414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.content.pm.Signature; 579599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.net.ConnectivityManager; 5821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.net.IConnectivityManager; 5941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkeyimport android.net.INetworkManagementEventObserver; 609599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.net.INetworkPolicyListener; 6175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.net.INetworkStatsService; 6221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.net.LinkProperties; 6321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.net.NetworkInfo; 6421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.net.NetworkInfo.DetailedState; 6521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.net.NetworkPolicy; 6621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.net.NetworkState; 6721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.net.NetworkStats; 681b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkTemplate; 699599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.os.Binder; 7050fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharmaimport android.os.INetworkManagementService; 719599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.os.IPowerManager; 72163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport android.os.MessageQueue.IdleHandler; 73f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 749599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.test.AndroidTestCase; 759599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.test.mock.MockPackageManager; 769599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest; 779599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport android.test.suitebuilder.annotation.Suppress; 7821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.text.format.Time; 7921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport android.util.TrustedTime; 809599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 819599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport com.android.server.net.NetworkPolicyManagerService; 824414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport com.google.common.util.concurrent.AbstractFuture; 839599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 849599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport org.easymock.Capture; 859599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport org.easymock.EasyMock; 864414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport org.easymock.IAnswer; 879599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 8821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport java.io.File; 89af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkeyimport java.util.LinkedHashSet; 904414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport java.util.concurrent.ExecutionException; 919599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeyimport java.util.concurrent.Future; 924414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport java.util.concurrent.TimeUnit; 934414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport java.util.concurrent.TimeoutException; 94163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport java.util.logging.Handler; 959599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 968e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkeyimport libcore.io.IoUtils; 978e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 989599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey/** 999599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey * Tests for {@link NetworkPolicyManagerService}. 1009599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey */ 1019599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey@LargeTest 1029599cc5f21152860af9d18015b1398b50743da76Jeff Sharkeypublic class NetworkPolicyManagerServiceTest extends AndroidTestCase { 1039599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private static final String TAG = "NetworkPolicyManagerServiceTest"; 1049599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 10521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey private static final long TEST_START = 1194220800000L; 10621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey private static final String TEST_IFACE = "test0"; 107e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey private static final String TEST_SSID = "AndroidAP"; 10821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 109e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey private static NetworkTemplate sTemplateWifi = NetworkTemplate.buildTemplateWifi(TEST_SSID); 1101b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 1119599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private BroadcastInterceptingContext mServiceContext; 11221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey private File mPolicyDir; 1139599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 1149599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private IActivityManager mActivityManager; 1159599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private IPowerManager mPowerManager; 11675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private INetworkStatsService mStatsService; 11741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey private INetworkManagementService mNetworkManager; 1189599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private INetworkPolicyListener mPolicyListener; 11921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey private TrustedTime mTime; 12021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey private IConnectivityManager mConnManager; 1212ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkey private INotificationManager mNotifManager; 1229599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 1239599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private NetworkPolicyManagerService mService; 1249599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private IProcessObserver mProcessObserver; 12541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey private INetworkManagementEventObserver mNetworkObserver; 1269599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 1279599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private Binder mStubBinder = new Binder(); 1289599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 1298e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey private long mStartTime; 1308e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey private long mElapsedRealtime; 1318e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 132cae04a29da1334aa160ac44f7430411c23cebd1bJeff Sharkey private static final int USER_ID = 0; 133cae04a29da1334aa160ac44f7430411c23cebd1bJeff Sharkey 134cae04a29da1334aa160ac44f7430411c23cebd1bJeff Sharkey private static final int APP_ID_A = android.os.Process.FIRST_APPLICATION_UID + 800; 135cae04a29da1334aa160ac44f7430411c23cebd1bJeff Sharkey private static final int APP_ID_B = android.os.Process.FIRST_APPLICATION_UID + 801; 136cae04a29da1334aa160ac44f7430411c23cebd1bJeff Sharkey 137f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn private static final int UID_A = UserHandle.getUid(USER_ID, APP_ID_A); 138f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn private static final int UID_B = UserHandle.getUid(USER_ID, APP_ID_B); 1399599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 1409599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private static final int PID_1 = 400; 1419599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private static final int PID_2 = 401; 1429599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private static final int PID_3 = 402; 1439599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 1449599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey @Override 1459599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public void setUp() throws Exception { 1469599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey super.setUp(); 1479599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 1488e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey setCurrentTimeMillis(TEST_START); 1498e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 1509599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // intercept various broadcasts, and pretend that uids have packages 1519599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mServiceContext = new BroadcastInterceptingContext(getContext()) { 1529599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey @Override 1539599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public PackageManager getPackageManager() { 1549599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey return new MockPackageManager() { 1559599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey @Override 1569599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public String[] getPackagesForUid(int uid) { 1579599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey return new String[] { "com.example" }; 1589599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 1594414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 1604414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey @Override 1614414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey public PackageInfo getPackageInfo(String packageName, int flags) { 1624414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey final PackageInfo info = new PackageInfo(); 1634414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey final Signature signature; 1644414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey if ("android".equals(packageName)) { 1654414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey signature = new Signature("F00D"); 1664414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey } else { 1674414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey signature = new Signature("DEAD"); 1684414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey } 1694414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey info.signatures = new Signature[] { signature }; 1704414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey return info; 1714414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey } 172cae04a29da1334aa160ac44f7430411c23cebd1bJeff Sharkey 1739599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey }; 1749599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 17541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 17641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey @Override 17741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public void startActivity(Intent intent) { 17841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // ignored 17941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 1809599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey }; 1819599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 18221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey mPolicyDir = getContext().getFilesDir(); 1838e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey if (mPolicyDir.exists()) { 1848e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey IoUtils.deleteContents(mPolicyDir); 1854414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey } 18621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 1879599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mActivityManager = createMock(IActivityManager.class); 1889599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mPowerManager = createMock(IPowerManager.class); 18975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey mStatsService = createMock(INetworkStatsService.class); 19041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager = createMock(INetworkManagementService.class); 1919599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mPolicyListener = createMock(INetworkPolicyListener.class); 19221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey mTime = createMock(TrustedTime.class); 19321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey mConnManager = createMock(IConnectivityManager.class); 1942ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkey mNotifManager = createMock(INotificationManager.class); 1959599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 1968e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mPowerManager, 1978e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey mStatsService, mNetworkManager, mTime, mPolicyDir, true); 19821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey mService.bindConnectivityManager(mConnManager); 1992ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkey mService.bindNotificationManager(mNotifManager); 2009599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2019599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // RemoteCallbackList needs a binder to use as key 2029599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey expect(mPolicyListener.asBinder()).andReturn(mStubBinder).atLeastOnce(); 2039599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 2049599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mService.registerListener(mPolicyListener); 2059599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 2069599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 20741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // catch IProcessObserver during systemReady() 2089599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey final Capture<IProcessObserver> processObserver = new Capture<IProcessObserver>(); 2099599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mActivityManager.registerProcessObserver(capture(processObserver)); 2109599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey expectLastCall().atLeastOnce(); 2119599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 21241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // catch INetworkManagementEventObserver during systemReady() 21341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final Capture<INetworkManagementEventObserver> networkObserver = new Capture< 21441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey INetworkManagementEventObserver>(); 21541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager.registerObserver(capture(networkObserver)); 21641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectLastCall().atLeastOnce(); 21741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 2189599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // expect to answer screen status during systemReady() 2199599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey expect(mPowerManager.isScreenOn()).andReturn(true).atLeastOnce(); 2200cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey expect(mNetworkManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce(); 2218e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expectCurrentTime(); 2229599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2239599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 2249599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mService.systemReady(); 2259599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 2269599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2279599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver = processObserver.getValue(); 22841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkObserver = networkObserver.getValue(); 2299599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2309599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 2319599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2329599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey @Override 2339599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public void tearDown() throws Exception { 23421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey for (File file : mPolicyDir.listFiles()) { 23521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey file.delete(); 23621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 23721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 2389599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mServiceContext = null; 23921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey mPolicyDir = null; 2409599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2419599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mActivityManager = null; 2429599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mPowerManager = null; 24375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey mStatsService = null; 2449599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mPolicyListener = null; 24521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey mTime = null; 2469599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2479599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mService = null; 2489599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver = null; 2499599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2509599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey super.tearDown(); 2519599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 2529599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2539599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey @Suppress 2549599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public void testPolicyChangeTriggersBroadcast() throws Exception { 255d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mService.setUidPolicy(APP_ID_A, POLICY_NONE); 2569599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2579599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // change background policy and expect broadcast 2589599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey final Future<Intent> backgroundChanged = mServiceContext.nextBroadcastIntent( 2599599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED); 2609599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 261d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND); 2629599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2639599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey backgroundChanged.get(); 2649599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 2659599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2669599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public void testPidForegroundCombined() throws Exception { 2670e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey IdleFuture idle; 2680e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey 2699599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // push all uid into background 2700e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle = expectIdle(); 2719599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); 2729599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false); 2739599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_3, UID_B, false); 2740e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle.get(); 2759599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey assertFalse(mService.isUidForeground(UID_A)); 2769599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey assertFalse(mService.isUidForeground(UID_B)); 2779599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2789599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // push one of the shared pids into foreground 2790e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle = expectIdle(); 2809599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, true); 2810e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle.get(); 2829599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey assertTrue(mService.isUidForeground(UID_A)); 2839599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey assertFalse(mService.isUidForeground(UID_B)); 2849599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2859599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // and swap another uid into foreground 2860e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle = expectIdle(); 2879599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false); 2889599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_3, UID_B, true); 2890e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle.get(); 2909599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey assertFalse(mService.isUidForeground(UID_A)); 2919599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey assertTrue(mService.isUidForeground(UID_B)); 2929599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 2939599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // push both pid into foreground 2940e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle = expectIdle(); 2959599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); 2969599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, true); 2970e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle.get(); 2989599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey assertTrue(mService.isUidForeground(UID_A)); 2999599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 3009599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // pull one out, should still be foreground 3010e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle = expectIdle(); 3029599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); 3030e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle.get(); 3049599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey assertTrue(mService.isUidForeground(UID_A)); 3059599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 3069599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // pull final pid out, should now be background 3070e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle = expectIdle(); 3089599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_2, UID_A, false); 3090e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey idle.get(); 3109599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey assertFalse(mService.isUidForeground(UID_A)); 3119599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 3129599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 3139599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public void testScreenChangesRules() throws Exception { 3144414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey Future<Void> future; 3154414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 316b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 317b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, true); 3184414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 3199599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 3209599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); 3214414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 3224414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey verifyAndReset(); 3234414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 3244414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey // push strict policy for foreground uid, verify ALLOW rule 325b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 326b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, true); 3274414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 3284414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey replay(); 329d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND); 3304414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 3319599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 3329599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 3339599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // now turn screen off and verify REJECT rule 3349599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey expect(mPowerManager.isScreenOn()).andReturn(false).atLeastOnce(); 335b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, true); 336b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, false); 3374414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_REJECT_METERED); 3389599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 3399599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_OFF)); 3404414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 3419599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 3429599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 3439599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // and turn screen back on, verify ALLOW rule restored 3449599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey expect(mPowerManager.isScreenOn()).andReturn(true).atLeastOnce(); 345b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 346b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, true); 3474414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 3489599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 3499599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SCREEN_ON)); 3504414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 3519599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 3529599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 3539599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 3549599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public void testPolicyNone() throws Exception { 3554414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey Future<Void> future; 3564414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 357b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 358b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, true); 3594414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 3604414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey replay(); 3614414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); 3624414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 3634414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey verifyAndReset(); 3644414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 3659599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // POLICY_NONE should RULE_ALLOW in foreground 366b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 367b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, true); 3684414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 3699599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 370d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mService.setUidPolicy(APP_ID_A, POLICY_NONE); 3714414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 3729599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 3739599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 3749599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // POLICY_NONE should RULE_ALLOW in background 375b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 376b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, false); 3774414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 3789599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 3799599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); 3804414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 3819599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 3829599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 3839599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 3849599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public void testPolicyReject() throws Exception { 3854414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey Future<Void> future; 3864414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 3879599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // POLICY_REJECT should RULE_ALLOW in background 388b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, true); 389b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, false); 3904414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_REJECT_METERED); 3919599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 392d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND); 3934414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 3949599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 3959599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 3969599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // POLICY_REJECT should RULE_ALLOW in foreground 397b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 398b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, true); 3994414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 4009599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 4019599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, true); 4024414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 4039599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 4049599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 4059599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // POLICY_REJECT should RULE_REJECT in background 406b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, true); 407b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, false); 4084414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_REJECT_METERED); 4099599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 4109599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); 4114414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 4129599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 4139599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 4149599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 4159599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey public void testPolicyRejectAddRemove() throws Exception { 4164414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey Future<Void> future; 4174414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 4189599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // POLICY_NONE should have RULE_ALLOW in background 419b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 420b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, false); 4214414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 4229599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 4239599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mProcessObserver.onForegroundActivitiesChanged(PID_1, UID_A, false); 424d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mService.setUidPolicy(APP_ID_A, POLICY_NONE); 4254414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 4269599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 4279599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 4289599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // adding POLICY_REJECT should cause RULE_REJECT 429b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, true); 430b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, false); 4314414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_REJECT_METERED); 4329599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 433d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND); 4344414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 4359599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 4369599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 4379599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey // removing POLICY_REJECT should return us to RULE_ALLOW 438b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 439b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, false); 4404414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 4419599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey replay(); 442d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mService.setUidPolicy(APP_ID_A, POLICY_NONE); 4434414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 4449599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey verifyAndReset(); 4459599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 4469599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 44721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void testLastCycleBoundaryThisMonth() throws Exception { 44821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // assume cycle day of "5th", which should be in same month 44921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long currentTime = parseTime("2007-11-14T00:00:00.000Z"); 45021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long expectedCycle = parseTime("2007-11-05T00:00:00.000Z"); 45121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 45241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final NetworkPolicy policy = new NetworkPolicy( 4539bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, 5, TIMEZONE_UTC, 1024L, 1024L, false); 45421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long actualCycle = computeLastCycleBoundary(currentTime, policy); 455af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey assertTimeEquals(expectedCycle, actualCycle); 45621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 45721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 45821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void testLastCycleBoundaryLastMonth() throws Exception { 45921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // assume cycle day of "20th", which should be in last month 46021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long currentTime = parseTime("2007-11-14T00:00:00.000Z"); 46121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long expectedCycle = parseTime("2007-10-20T00:00:00.000Z"); 46221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 46341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final NetworkPolicy policy = new NetworkPolicy( 4649bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, 20, TIMEZONE_UTC, 1024L, 1024L, false); 46521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long actualCycle = computeLastCycleBoundary(currentTime, policy); 466af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey assertTimeEquals(expectedCycle, actualCycle); 46721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 46821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 46921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void testLastCycleBoundaryThisMonthFebruary() throws Exception { 47021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // assume cycle day of "30th" in february; should go to january 47121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long currentTime = parseTime("2007-02-14T00:00:00.000Z"); 47221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long expectedCycle = parseTime("2007-01-30T00:00:00.000Z"); 47321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 47441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final NetworkPolicy policy = new NetworkPolicy( 4759bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, 30, TIMEZONE_UTC, 1024L, 1024L, false); 47621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long actualCycle = computeLastCycleBoundary(currentTime, policy); 477af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey assertTimeEquals(expectedCycle, actualCycle); 47821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 47921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 48021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void testLastCycleBoundaryLastMonthFebruary() throws Exception { 48121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // assume cycle day of "30th" in february, which should clamp 48221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long currentTime = parseTime("2007-03-14T00:00:00.000Z"); 483af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey final long expectedCycle = parseTime("2007-02-28T23:59:59.000Z"); 48421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 48541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final NetworkPolicy policy = new NetworkPolicy( 4869bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, 30, TIMEZONE_UTC, 1024L, 1024L, false); 48721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long actualCycle = computeLastCycleBoundary(currentTime, policy); 488af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey assertTimeEquals(expectedCycle, actualCycle); 489af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 490af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey 4919bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public void testCycleBoundaryLeapYear() throws Exception { 4929bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey final NetworkPolicy policy = new NetworkPolicy( 4939bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, 29, TIMEZONE_UTC, 1024L, 1024L, false); 4949bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey 4959bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2012-01-29T00:00:00.000Z"), 4969bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeNextCycleBoundary(parseTime("2012-01-14T00:00:00.000Z"), policy)); 4979bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2012-02-29T00:00:00.000Z"), 4989bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeNextCycleBoundary(parseTime("2012-02-14T00:00:00.000Z"), policy)); 4999bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2012-02-29T00:00:00.000Z"), 5009bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeLastCycleBoundary(parseTime("2012-03-14T00:00:00.000Z"), policy)); 5019bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2012-03-29T00:00:00.000Z"), 5029bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeNextCycleBoundary(parseTime("2012-03-14T00:00:00.000Z"), policy)); 5039bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey 5049bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2007-01-29T00:00:00.000Z"), 5059bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeNextCycleBoundary(parseTime("2007-01-14T00:00:00.000Z"), policy)); 5069bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2007-02-28T23:59:59.000Z"), 5079bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeNextCycleBoundary(parseTime("2007-02-14T00:00:00.000Z"), policy)); 5089bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2007-02-28T23:59:59.000Z"), 5099bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeLastCycleBoundary(parseTime("2007-03-14T00:00:00.000Z"), policy)); 5109bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2007-03-29T00:00:00.000Z"), 5119bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeNextCycleBoundary(parseTime("2007-03-14T00:00:00.000Z"), policy)); 5129bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey } 5139bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey 5149bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public void testNextCycleTimezoneAfterUtc() throws Exception { 5159bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey // US/Central is UTC-6 5169bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey final NetworkPolicy policy = new NetworkPolicy( 5179bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, 10, "US/Central", 1024L, 1024L, false); 5189bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2012-01-10T06:00:00.000Z"), 5199bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeNextCycleBoundary(parseTime("2012-01-05T00:00:00.000Z"), policy)); 5209bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey } 5219bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey 5229bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey public void testNextCycleTimezoneBeforeUtc() throws Exception { 5239bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey // Israel is UTC+2 5249bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey final NetworkPolicy policy = new NetworkPolicy( 5259bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, 10, "Israel", 1024L, 1024L, false); 5269bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey assertTimeEquals(parseTime("2012-01-09T22:00:00.000Z"), 5279bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey computeNextCycleBoundary(parseTime("2012-01-05T00:00:00.000Z"), policy)); 5289bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey } 5299bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey 530af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey public void testNextCycleSane() throws Exception { 531af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey final NetworkPolicy policy = new NetworkPolicy( 5329bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, 31, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, false); 533af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey final LinkedHashSet<Long> seen = new LinkedHashSet<Long>(); 534af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey 535af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey // walk forwards, ensuring that cycle boundaries don't get stuck 536af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey long currentCycle = computeNextCycleBoundary(parseTime("2011-08-01T00:00:00.000Z"), policy); 537af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey for (int i = 0; i < 128; i++) { 538af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey long nextCycle = computeNextCycleBoundary(currentCycle, policy); 539af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey assertEqualsFuzzy(DAY_IN_MILLIS * 30, nextCycle - currentCycle, DAY_IN_MILLIS * 3); 540af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey assertUnique(seen, nextCycle); 541af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey currentCycle = nextCycle; 542af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 543af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 544af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey 545af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey public void testLastCycleSane() throws Exception { 546af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey final NetworkPolicy policy = new NetworkPolicy( 5479bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, 31, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, false); 548af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey final LinkedHashSet<Long> seen = new LinkedHashSet<Long>(); 549af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey 550af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey // walk backwards, ensuring that cycle boundaries look sane 551af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey long currentCycle = computeLastCycleBoundary(parseTime("2011-08-04T00:00:00.000Z"), policy); 552af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey for (int i = 0; i < 128; i++) { 553af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey long lastCycle = computeLastCycleBoundary(currentCycle, policy); 554af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey assertEqualsFuzzy(DAY_IN_MILLIS * 30, currentCycle - lastCycle, DAY_IN_MILLIS * 3); 555af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey assertUnique(seen, lastCycle); 556af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey currentCycle = lastCycle; 557af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 55821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 55921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 56021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void testNetworkPolicyAppliedCycleLastMonth() throws Exception { 56121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey NetworkState[] state = null; 56221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey NetworkStats stats = null; 5634414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey Future<Void> future; 56421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 56521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long TIME_FEB_15 = 1171497600000L; 56621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final long TIME_MAR_10 = 1173484800000L; 56721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final int CYCLE_DAY = 15; 56821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 5698e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey setCurrentTimeMillis(TIME_MAR_10); 5708e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 57121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // first, pretend that wifi network comes online. no policy active, 57221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // which means we shouldn't push limit to interface. 57321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey state = new NetworkState[] { buildWifi() }; 57421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); 5758e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expectCurrentTime(); 57641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectClearNotifications(); 5770cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey expectAdvisePersistThreshold(); 5784414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectMeteredIfacesChanged(); 57921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 58021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey replay(); 581961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 5824414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 58321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey verifyAndReset(); 58421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 58521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // now change cycle to be on 15th, and test in early march, to verify we 58621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // pick cycle day in previous month. 58721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); 5888e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expectCurrentTime(); 58921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 59021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // pretend that 512 bytes total have happened 5918e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey stats = new NetworkStats(getElapsedRealtime(), 1) 592b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addIfaceValues(TEST_IFACE, 256L, 2L, 256L, 2L); 593b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, TIME_MAR_10)) 594b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey .andReturn(stats.getTotalBytes()).atLeastOnce(); 5957ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey expectPolicyDataEnable(TYPE_WIFI, true); 59621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 597b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey // TODO: consider making strongly ordered mock 598b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectRemoveInterfaceQuota(TEST_IFACE); 599163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey expectSetInterfaceQuota(TEST_IFACE, (2 * MB_IN_BYTES) - 512); 60021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 6012ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkey expectClearNotifications(); 6020cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey expectAdvisePersistThreshold(); 6034414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectMeteredIfacesChanged(TEST_IFACE); 6042ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkey 60521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey replay(); 606163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey setNetworkPolicies(new NetworkPolicy( 6079bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, false)); 6084414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 60921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey verifyAndReset(); 61021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 61121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 612b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey public void testUidRemovedPolicyCleared() throws Exception { 6134414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey Future<Void> future; 6144414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 615b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // POLICY_REJECT should RULE_REJECT in background 616b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, true); 617b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, false); 6184414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_REJECT_METERED); 619b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey replay(); 620d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mService.setUidPolicy(APP_ID_A, POLICY_REJECT_METERED_BACKGROUND); 6214414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 622b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey verifyAndReset(); 623b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 624b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // uninstall should clear RULE_REJECT 625b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectSetUidNetworkRules(UID_A, false); 626b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectSetUidForeground(UID_A, false); 6274414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future = expectRulesChanged(UID_A, RULE_ALLOW_ALL); 628b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey replay(); 629b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey final Intent intent = new Intent(ACTION_UID_REMOVED); 630b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey intent.putExtra(EXTRA_UID, UID_A); 631b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mServiceContext.sendBroadcast(intent); 6324414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey future.get(); 633b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey verifyAndReset(); 634b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } 635b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 63641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey public void testOverWarningLimitNotification() throws Exception { 63741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey NetworkState[] state = null; 63841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey NetworkStats stats = null; 63941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey Future<Void> future; 6407ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey Future<String> tagFuture; 64141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 64241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final long TIME_FEB_15 = 1171497600000L; 64341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final long TIME_MAR_10 = 1173484800000L; 64441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey final int CYCLE_DAY = 15; 64541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 6468e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey setCurrentTimeMillis(TIME_MAR_10); 6478e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 64841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // assign wifi policy 64941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey state = new NetworkState[] {}; 6508e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey stats = new NetworkStats(getElapsedRealtime(), 1) 6518e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L); 65241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 65341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey { 6548e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expectCurrentTime(); 65541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); 656b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) 657b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey .andReturn(stats.getTotalBytes()).atLeastOnce(); 6587ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey expectPolicyDataEnable(TYPE_WIFI, true); 65941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 66041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectClearNotifications(); 6610cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey expectAdvisePersistThreshold(); 66241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey future = expectMeteredIfacesChanged(); 66341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 66441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey replay(); 6659bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey setNetworkPolicies(new NetworkPolicy(sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, 1 6669bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey * MB_IN_BYTES, 2 * MB_IN_BYTES, false)); 66741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey future.get(); 66841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey verifyAndReset(); 66941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 67041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 67141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // bring up wifi network 6728e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey incrementCurrentTime(MINUTE_IN_MILLIS); 67341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey state = new NetworkState[] { buildWifi() }; 6748e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey stats = new NetworkStats(getElapsedRealtime(), 1) 6758e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L); 67641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 67741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey { 6788e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expectCurrentTime(); 67941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); 680b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) 681b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey .andReturn(stats.getTotalBytes()).atLeastOnce(); 6827ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey expectPolicyDataEnable(TYPE_WIFI, true); 68341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 68441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectRemoveInterfaceQuota(TEST_IFACE); 685163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey expectSetInterfaceQuota(TEST_IFACE, 2 * MB_IN_BYTES); 68641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 68741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectClearNotifications(); 6880cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey expectAdvisePersistThreshold(); 68941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey future = expectMeteredIfacesChanged(TEST_IFACE); 69041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 69141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey replay(); 692961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 69341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey future.get(); 69441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey verifyAndReset(); 69541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 69641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 69741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // go over warning, which should kick notification 6988e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey incrementCurrentTime(MINUTE_IN_MILLIS); 6998e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey stats = new NetworkStats(getElapsedRealtime(), 1) 700163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addIfaceValues(TEST_IFACE, 1536 * KB_IN_BYTES, 15L, 0L, 0L); 70141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 70241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey { 7038e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expectCurrentTime(); 704b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) 705b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey .andReturn(stats.getTotalBytes()).atLeastOnce(); 7067ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey expectPolicyDataEnable(TYPE_WIFI, true); 70741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 70841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectForceUpdate(); 70941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectClearNotifications(); 7107ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey tagFuture = expectEnqueueNotification(); 71141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 71241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey replay(); 71341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkObserver.limitReached(null, TEST_IFACE); 7147ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey assertNotificationType(TYPE_WARNING, tagFuture.get()); 71541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey verifyAndReset(); 71641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 71741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 71841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // go over limit, which should kick notification and dialog 7198e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey incrementCurrentTime(MINUTE_IN_MILLIS); 7208e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey stats = new NetworkStats(getElapsedRealtime(), 1) 721163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addIfaceValues(TEST_IFACE, 5 * MB_IN_BYTES, 512L, 0L, 0L); 72241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 72341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey { 7248e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expectCurrentTime(); 725b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) 726b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey .andReturn(stats.getTotalBytes()).atLeastOnce(); 7277ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey expectPolicyDataEnable(TYPE_WIFI, false); 72841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 72941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectForceUpdate(); 73041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectClearNotifications(); 7317ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey tagFuture = expectEnqueueNotification(); 73241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 73341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey replay(); 73441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkObserver.limitReached(null, TEST_IFACE); 7357ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey assertNotificationType(TYPE_LIMIT, tagFuture.get()); 73641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey verifyAndReset(); 73741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 73841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 73941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey // now snooze policy, which should remove quota 7408e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey incrementCurrentTime(MINUTE_IN_MILLIS); 74141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 74241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey { 7438e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expectCurrentTime(); 74441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); 745b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) 746b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey .andReturn(stats.getTotalBytes()).atLeastOnce(); 7477ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey expectPolicyDataEnable(TYPE_WIFI, true); 74841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 7498e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey // snoozed interface still has high quota so background data is 7508e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey // still restricted. 75141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectRemoveInterfaceQuota(TEST_IFACE); 7528e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expectSetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE); 7530cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey expectAdvisePersistThreshold(); 7547ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey expectMeteredIfacesChanged(TEST_IFACE); 75541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 756c506ff615080082515b1f634ad49b19fd2111669Jeff Sharkey future = expectClearNotifications(); 7577ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey tagFuture = expectEnqueueNotification(); 75841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 75941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey replay(); 7600e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey mService.snoozeLimit(sTemplateWifi); 7617ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey assertNotificationType(TYPE_LIMIT_SNOOZED, tagFuture.get()); 762c506ff615080082515b1f634ad49b19fd2111669Jeff Sharkey future.get(); 76341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey verifyAndReset(); 76441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 76541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 76641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 767f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey public void testMeteredNetworkWithoutLimit() throws Exception { 768f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey NetworkState[] state = null; 769f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey NetworkStats stats = null; 770f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey Future<Void> future; 771f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey Future<String> tagFuture; 772f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey 773f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey final long TIME_FEB_15 = 1171497600000L; 774f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey final long TIME_MAR_10 = 1173484800000L; 775f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey final int CYCLE_DAY = 15; 776f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey 777f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey setCurrentTimeMillis(TIME_MAR_10); 778f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey 779f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey // bring up wifi network with metered policy 780f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey state = new NetworkState[] { buildWifi() }; 781f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey stats = new NetworkStats(getElapsedRealtime(), 1) 782f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L); 783f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey 784f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey { 785f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey expectCurrentTime(); 786f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); 787b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) 788b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey .andReturn(stats.getTotalBytes()).atLeastOnce(); 789f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey expectPolicyDataEnable(TYPE_WIFI, true); 790f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey 791f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey expectRemoveInterfaceQuota(TEST_IFACE); 792f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey expectSetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE); 793f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey 794f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey expectClearNotifications(); 7950cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey expectAdvisePersistThreshold(); 796f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey future = expectMeteredIfacesChanged(TEST_IFACE); 797f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey 798f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey replay(); 7999bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey setNetworkPolicies(new NetworkPolicy( 8009bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, WARNING_DISABLED, LIMIT_DISABLED, 8019bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey true)); 802f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey future.get(); 803f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey verifyAndReset(); 804f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey } 805f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey } 806f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey 80721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey private static long parseTime(String time) { 80821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final Time result = new Time(); 80921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey result.parse3339(time); 81021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey return result.toMillis(true); 81121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 81221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 813af11d4859582a9736aa204562f0beac5a7d60934Jeff Sharkey private void setNetworkPolicies(NetworkPolicy... policies) { 814af11d4859582a9736aa204562f0beac5a7d60934Jeff Sharkey mService.setNetworkPolicies(policies); 815af11d4859582a9736aa204562f0beac5a7d60934Jeff Sharkey } 816af11d4859582a9736aa204562f0beac5a7d60934Jeff Sharkey 81721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey private static NetworkState buildWifi() { 81821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null); 81921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey info.setDetailedState(DetailedState.CONNECTED, null, null); 82021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey final LinkProperties prop = new LinkProperties(); 82121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey prop.setInterfaceName(TEST_IFACE); 822e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey return new NetworkState(info, prop, null, null, TEST_SSID); 82321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 82421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 8258e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey private void expectCurrentTime() throws Exception { 82621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey expect(mTime.forceRefresh()).andReturn(false).anyTimes(); 82721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey expect(mTime.hasCache()).andReturn(true).anyTimes(); 8288e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes(); 82921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey expect(mTime.getCacheAge()).andReturn(0L).anyTimes(); 83021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes(); 83121c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 83221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 83341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey private void expectForceUpdate() throws Exception { 83441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mStatsService.forceUpdate(); 83541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectLastCall().atLeastOnce(); 83641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 83741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 838c506ff615080082515b1f634ad49b19fd2111669Jeff Sharkey private Future<Void> expectClearNotifications() throws Exception { 839c506ff615080082515b1f634ad49b19fd2111669Jeff Sharkey final FutureAnswer future = new FutureAnswer(); 840d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey mNotifManager.cancelNotificationWithTag( 841d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey isA(String.class), isA(String.class), anyInt(), anyInt()); 842c506ff615080082515b1f634ad49b19fd2111669Jeff Sharkey expectLastCall().andAnswer(future).anyTimes(); 843c506ff615080082515b1f634ad49b19fd2111669Jeff Sharkey return future; 8442ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkey } 8452ef2aeb18d9d1ca7e25ad705c4da559f3682805aJeff Sharkey 8467ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey private Future<String> expectEnqueueNotification() throws Exception { 8477ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey final FutureCapture<String> tag = new FutureCapture<String>(); 8487ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey mNotifManager.enqueueNotificationWithTag(isA(String.class), capture(tag.capture), anyInt(), 8494120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn isA(Notification.class), isA(int[].class), UserHandle.myUserId()); 85041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey return tag; 85141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 85241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 85341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey private void expectSetInterfaceQuota(String iface, long quotaBytes) throws Exception { 85441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager.setInterfaceQuota(iface, quotaBytes); 855b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectLastCall().atLeastOnce(); 856b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 857b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 858b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey private void expectRemoveInterfaceQuota(String iface) throws Exception { 85941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager.removeInterfaceQuota(iface); 86041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectLastCall().atLeastOnce(); 86141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 86241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 86341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey private void expectSetInterfaceAlert(String iface, long alertBytes) throws Exception { 86441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager.setInterfaceAlert(iface, alertBytes); 86541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey expectLastCall().atLeastOnce(); 86641ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 86741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 86841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey private void expectRemoveInterfaceAlert(String iface) throws Exception { 86941ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager.removeInterfaceAlert(iface); 870b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectLastCall().atLeastOnce(); 871b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 872b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 873b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey private void expectSetUidNetworkRules(int uid, boolean rejectOnQuotaInterfaces) 874b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey throws Exception { 87541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager.setUidNetworkRules(uid, rejectOnQuotaInterfaces); 876b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey expectLastCall().atLeastOnce(); 877b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey } 878b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey 879b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private void expectSetUidForeground(int uid, boolean uidForeground) throws Exception { 880b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mStatsService.setUidForeground(uid, uidForeground); 881b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectLastCall().atLeastOnce(); 882b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 883b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 8844414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey private Future<Void> expectRulesChanged(int uid, int policy) throws Exception { 8854414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey final FutureAnswer future = new FutureAnswer(); 886fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey mPolicyListener.onUidRulesChanged(eq(uid), eq(policy)); 8874414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey expectLastCall().andAnswer(future); 8884414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey return future; 889fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey } 890fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey 8914414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey private Future<Void> expectMeteredIfacesChanged(String... ifaces) throws Exception { 8924414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey final FutureAnswer future = new FutureAnswer(); 893fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey mPolicyListener.onMeteredIfacesChanged(aryEq(ifaces)); 8944414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey expectLastCall().andAnswer(future); 8954414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey return future; 8964414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey } 8974414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 8987ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey private Future<Void> expectPolicyDataEnable(int type, boolean enabled) throws Exception { 8997ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey final FutureAnswer future = new FutureAnswer(); 9008e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey mConnManager.setPolicyDataEnable(type, enabled); 9017ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey expectLastCall().andAnswer(future); 9027ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey return future; 9038e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey } 9048e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 9050cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey private void expectAdvisePersistThreshold() throws Exception { 9060cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey mStatsService.advisePersistThreshold(anyLong()); 9070cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey expectLastCall().anyTimes(); 9080cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey } 9090cf6de0c930c9082b7bffdb9824e4a7c7832b6dfJeff Sharkey 9107ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey private static class TestAbstractFuture<T> extends AbstractFuture<T> { 9114414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey @Override 9127ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey public T get() throws InterruptedException, ExecutionException { 9134414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey try { 9144414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey return get(5, TimeUnit.SECONDS); 9154414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey } catch (TimeoutException e) { 9164414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey throw new RuntimeException(e); 9174414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey } 9184414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey } 9197ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey } 9204414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 9217ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey private static class FutureAnswer extends TestAbstractFuture<Void> implements IAnswer<Void> { 9224414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey @Override 9234414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey public Void answer() { 9244414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey set(null); 9254414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey return null; 9264414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey } 9279599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 9289599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 9297ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey private static class FutureCapture<T> extends TestAbstractFuture<T> { 9307ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey public Capture<T> capture = new Capture<T>() { 9317ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey @Override 9327ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey public void setValue(T value) { 9337ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey super.setValue(value); 9347ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey set(value); 9357ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey } 9367ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey }; 9377ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey } 9387ee8658453fe4efe04781bea9a14368e1d5ff41fJeff Sharkey 939163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey private static class IdleFuture extends AbstractFuture<Void> implements IdleHandler { 940163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey @Override 941163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public Void get() throws InterruptedException, ExecutionException { 942163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey try { 943163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey return get(5, TimeUnit.SECONDS); 944163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } catch (TimeoutException e) { 945163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey throw new RuntimeException(e); 946163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 947163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 948163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 949bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 950163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey public boolean queueIdle() { 951163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey set(null); 952163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey return false; 953163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 954163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 955163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 956163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey /** 957163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey * Wait until {@link #mService} internal {@link Handler} is idle. 958163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey */ 9590e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey private IdleFuture expectIdle() { 960163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey final IdleFuture future = new IdleFuture(); 961163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey mService.addIdleHandler(future); 9620e2e5f8b564bebd5798c9fa387fbff96429ab5d2Jeff Sharkey return future; 963163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey } 964163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 965af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey private static void assertTimeEquals(long expected, long actual) { 966af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey if (expected != actual) { 967af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey fail("expected " + formatTime(expected) + " but was actually " + formatTime(actual)); 968af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 969af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 970af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey 971af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey private static String formatTime(long millis) { 972af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey final Time time = new Time(Time.TIMEZONE_UTC); 973af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey time.set(millis); 974af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey return time.format3339(false); 975af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 976af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey 977af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey private static void assertEqualsFuzzy(long expected, long actual, long fuzzy) { 978af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey final long low = expected - fuzzy; 979af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey final long high = expected + fuzzy; 980af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey if (actual < low || actual > high) { 981af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey fail("value " + actual + " is outside [" + low + "," + high + "]"); 982af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 983af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 984af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey 985af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey private static void assertUnique(LinkedHashSet<Long> seen, Long value) { 986af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey if (!seen.add(value)) { 987af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey fail("found duplicate time " + value + " in series " + seen.toString()); 988af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 989af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey } 990af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey 99141ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey private static void assertNotificationType(int expected, String actualTag) { 99241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey assertEquals( 99341ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey Integer.toString(expected), actualTag.substring(actualTag.lastIndexOf(':') + 1)); 99441ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey } 99541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey 9968e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey private long getElapsedRealtime() { 9978e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey return mElapsedRealtime; 9988e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey } 9998e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 10008e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey private void setCurrentTimeMillis(long currentTimeMillis) { 10018e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey mStartTime = currentTimeMillis; 10028e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey mElapsedRealtime = 0L; 10038e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey } 10048e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 10058e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey private long currentTimeMillis() { 10068e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey return mStartTime + mElapsedRealtime; 10078e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey } 10088e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 10098e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey private void incrementCurrentTime(long duration) { 10108e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey mElapsedRealtime += duration; 10118e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey } 10128e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey 10139599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private void replay() { 101450fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma EasyMock.replay(mActivityManager, mPowerManager, mStatsService, mPolicyListener, 101541ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager, mTime, mConnManager, mNotifManager); 10169599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 10179599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey 10189599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private void verifyAndReset() { 101950fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma EasyMock.verify(mActivityManager, mPowerManager, mStatsService, mPolicyListener, 102041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager, mTime, mConnManager, mNotifManager); 102150fd36d7c38c40b087c8f3e3172478abe0c051d9Ashish Sharma EasyMock.reset(mActivityManager, mPowerManager, mStatsService, mPolicyListener, 102241ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey mNetworkManager, mTime, mConnManager, mNotifManager); 10239599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey } 10249599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey} 1025