1b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey/* 2b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Copyright (C) 2011 The Android Open Source Project 3b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * 4b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * you may not use this file except in compliance with the License. 6b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * You may obtain a copy of the License at 7b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * 8b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * 10b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Unless required by applicable law or agreed to in writing, software 11b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * See the License for the specific language governing permissions and 14b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * limitations under the License. 15b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 16b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 17b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeypackage com.android.server; 18b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 19b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_DEFAULT; 20b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.TAG_NONE; 21b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.UID_ALL; 22b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport static org.easymock.EasyMock.createMock; 23b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport static org.easymock.EasyMock.eq; 24b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport static org.easymock.EasyMock.expect; 25b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport static org.easymock.EasyMock.expectLastCall; 26b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport static org.easymock.EasyMock.isA; 27b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport static org.easymock.EasyMock.replay; 28b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport static org.easymock.EasyMock.reset; 29b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport static org.easymock.EasyMock.verify; 30b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 31b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.content.ContentResolver; 32b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.content.Context; 33b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.content.Intent; 34b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.net.INetworkManagementEventObserver; 359a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport android.net.NetworkStats; 36b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.net.ThrottleManager; 379a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport android.os.IBinder; 38b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.os.INetworkManagementService; 399a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport android.os.ServiceManager; 409a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport android.os.SystemClock; 41b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.provider.Settings; 42b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.test.AndroidTestCase; 43eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest; 449a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport android.test.suitebuilder.annotation.Suppress; 45b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.text.format.DateUtils; 469a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkeyimport android.util.Log; 47b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport android.util.TrustedTime; 48b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 49b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeyimport java.util.concurrent.Future; 50b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 51b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey/** 52b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Tests for {@link ThrottleService}. 53b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 54eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey@LargeTest 55b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkeypublic class ThrottleServiceTest extends AndroidTestCase { 56b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey private static final String TAG = "ThrottleServiceTest"; 57b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 58b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey private static final long MB_IN_BYTES = 1024 * 1024; 59b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 60b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey private static final int TEST_KBITPS = 222; 61b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey private static final int TEST_RESET_DAY = 11; 62b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 63b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey private static final String TEST_IFACE = "test0"; 64b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 659599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey private BroadcastInterceptingContext mWatchingContext; 66b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey private INetworkManagementService mMockNMService; 67b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey private TrustedTime mMockTime; 68b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 69b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey private ThrottleService mThrottleService; 70b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 71b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey @Override 72b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void setUp() throws Exception { 73b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey super.setUp(); 74b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 759599cc5f21152860af9d18015b1398b50743da76Jeff Sharkey mWatchingContext = new BroadcastInterceptingContext(getContext()); 76b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 77b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mMockNMService = createMock(INetworkManagementService.class); 78b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mMockTime = createMock(TrustedTime.class); 79b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 80b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mThrottleService = new ThrottleService( 81b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mWatchingContext, mMockNMService, mMockTime, TEST_IFACE); 82b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 83b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 84b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey @Override 85b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void tearDown() throws Exception { 86b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mWatchingContext = null; 87b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mMockNMService = null; 88b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 89b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mThrottleService.shutdown(); 90b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mThrottleService = null; 91b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 92b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey clearThrottlePolicy(); 93b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 94b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey super.tearDown(); 95b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 96b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 97b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void testNoPolicyNotThrottled() throws Exception { 98b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTimeCurrent(); 99b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSystemReady(); 100b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 101b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // provide stats without policy, verify not throttled 102b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectGetInterfaceCounter(1 * MB_IN_BYTES, 2 * MB_IN_BYTES); 103b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSetInterfaceThrottle(-1, -1); 104b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 105b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey replay(mMockTime, mMockNMService); 106b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey systemReady(); 107b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey verify(mMockTime, mMockNMService); 108b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 109b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 110b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void testUnderLimitNotThrottled() throws Exception { 111b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey setThrottlePolicy(200 * MB_IN_BYTES, TEST_KBITPS, TEST_RESET_DAY); 112b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 113b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTimeCurrent(); 114b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSystemReady(); 115b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 116b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // provide stats under limits, and verify not throttled 117b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectGetInterfaceCounter(1 * MB_IN_BYTES, 2 * MB_IN_BYTES); 118b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSetInterfaceThrottle(-1, -1); 119b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 120b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey replay(mMockTime, mMockNMService); 121b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey systemReady(); 122b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey verify(mMockTime, mMockNMService); 123b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 124b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 125b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void testOverLimitThrottled() throws Exception { 126b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey setThrottlePolicy(200 * MB_IN_BYTES, TEST_KBITPS, TEST_RESET_DAY); 127b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 128b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTimeCurrent(); 129b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSystemReady(); 130b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 131b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // provide stats over limits, and verify throttled 132b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectGetInterfaceCounter(500 * MB_IN_BYTES, 600 * MB_IN_BYTES); 133b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSetInterfaceThrottle(TEST_KBITPS, TEST_KBITPS); 134b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 135b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey replay(mMockTime, mMockNMService); 136b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey systemReady(); 137b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey verify(mMockTime, mMockNMService); 138b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 139b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 140b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void testUnderThenOverLimitThrottled() throws Exception { 141b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey setThrottlePolicy(201 * MB_IN_BYTES, TEST_KBITPS, TEST_RESET_DAY); 142b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 143b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTimeCurrent(); 144b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSystemReady(); 145b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 146b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // provide stats right under 201MB limit, verify not throttled 147b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectGetInterfaceCounter(100 * MB_IN_BYTES, 100 * MB_IN_BYTES); 148b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSetInterfaceThrottle(-1, -1); 149b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 150b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey replay(mMockTime, mMockNMService); 151b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey systemReady(); 152b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey verify(mMockTime, mMockNMService); 153b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey reset(mMockTime, mMockNMService); 154b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 155b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTimeCurrent(); 156b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 157b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // adjust usage to bump over limit, verify throttle kicks in 158b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectGetInterfaceCounter(105 * MB_IN_BYTES, 100 * MB_IN_BYTES); 159b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSetInterfaceThrottle(TEST_KBITPS, TEST_KBITPS); 160b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 161b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // and kick poll event which should throttle 162b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey replay(mMockTime, mMockNMService); 163b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey forceServicePoll(); 164b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey verify(mMockTime, mMockNMService); 165b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 166b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 167b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void testUpdatedPolicyThrottled() throws Exception { 168b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey setThrottlePolicy(500 * MB_IN_BYTES, TEST_KBITPS, TEST_RESET_DAY); 169b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 170b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTimeCurrent(); 171b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSystemReady(); 172b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 173b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // provide stats under limit, verify not throttled 174b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectGetInterfaceCounter(50 * MB_IN_BYTES, 50 * MB_IN_BYTES); 175b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSetInterfaceThrottle(-1, -1); 176b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 177b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey replay(mMockTime, mMockNMService); 178b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey systemReady(); 179b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey verify(mMockTime, mMockNMService); 180b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey reset(mMockTime, mMockNMService); 181b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 182b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTimeCurrent(); 183b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 184b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // provide same stats, but verify that modified policy will throttle 185b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectGetInterfaceCounter(50 * MB_IN_BYTES, 50 * MB_IN_BYTES); 186b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSetInterfaceThrottle(TEST_KBITPS, TEST_KBITPS); 187b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 188b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey replay(mMockTime, mMockNMService); 189b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 190b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // now adjust policy to bump usage over limit 191b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey setThrottlePolicy(5 * MB_IN_BYTES, TEST_KBITPS, TEST_RESET_DAY); 192b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 193b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // and wait for policy updated broadcast 194b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mWatchingContext.nextBroadcastIntent(ThrottleManager.POLICY_CHANGED_ACTION).get(); 195b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 196b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey verify(mMockTime, mMockNMService); 197b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 198b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 199b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void testWithPolicyOverLimitThrottledAndRemovedAfterCycle() throws Exception { 200b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey setThrottlePolicy(90 * MB_IN_BYTES, TEST_KBITPS, TEST_RESET_DAY); 201b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 202b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey final long baseTime = System.currentTimeMillis(); 203b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 204b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTime(baseTime); 205b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSystemReady(); 206b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 207b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // provide stats over limit, verify throttle kicks in 208b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectGetInterfaceCounter(50 * MB_IN_BYTES, 50 * MB_IN_BYTES); 209b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSetInterfaceThrottle(TEST_KBITPS, TEST_KBITPS); 210b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 211b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey replay(mMockTime, mMockNMService); 212b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey systemReady(); 213b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey verify(mMockTime, mMockNMService); 214b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey reset(mMockTime, mMockNMService); 215b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 216b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // pretend that time has jumped forward two months 217b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTime(baseTime + DateUtils.WEEK_IN_MILLIS * 8); 218b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 219b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // provide slightly updated stats, but verify throttle is removed 220b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectGetInterfaceCounter(60 * MB_IN_BYTES, 60 * MB_IN_BYTES); 221b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectSetInterfaceThrottle(-1, -1); 222b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 223b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // and kick poll event which should throttle 224b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey replay(mMockTime, mMockNMService); 225b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey forceServiceReset(); 226b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey verify(mMockTime, mMockNMService); 227b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 228b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 2299a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey @Suppress 2309a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey public void testReturnStats() throws Exception { 2319a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey final IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 2329a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey final INetworkManagementService nmService = INetworkManagementService.Stub.asInterface(b); 2339a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey 2349a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey // test is currently no-op, just exercises stats apis 235e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey Log.d(TAG, nmService.getNetworkStatsSummaryDev().toString()); 236e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey Log.d(TAG, nmService.getNetworkStatsSummaryXt().toString()); 2379a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey Log.d(TAG, nmService.getNetworkStatsDetail().toString()); 2389a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey } 2399a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey 240b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 241b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Persist the given {@link ThrottleService} policy into {@link Settings}. 242b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 243b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void setThrottlePolicy(long thresholdBytes, int valueKbitps, int resetDay) { 244b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey final ContentResolver resolver = getContext().getContentResolver(); 245b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey Settings.Secure.putLong(resolver, Settings.Secure.THROTTLE_THRESHOLD_BYTES, thresholdBytes); 246b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey Settings.Secure.putInt(resolver, Settings.Secure.THROTTLE_VALUE_KBITSPS, valueKbitps); 247b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey Settings.Secure.putInt(resolver, Settings.Secure.THROTTLE_RESET_DAY, resetDay); 248b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 249b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 250b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 251b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Clear any {@link ThrottleService} policy from {@link Settings}. 252b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 253b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void clearThrottlePolicy() { 254b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey final ContentResolver resolver = getContext().getContentResolver(); 255b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey Settings.Secure.putString(resolver, Settings.Secure.THROTTLE_THRESHOLD_BYTES, null); 256b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey Settings.Secure.putString(resolver, Settings.Secure.THROTTLE_VALUE_KBITSPS, null); 257b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey Settings.Secure.putString(resolver, Settings.Secure.THROTTLE_RESET_DAY, null); 258b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 259b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 260b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 261b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Expect any {@link TrustedTime} mock calls, and respond with 262b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * {@link System#currentTimeMillis()}. 263b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 264b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void expectTimeCurrent() throws Exception { 265b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectTime(System.currentTimeMillis()); 266b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 267b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 268b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 269b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Expect any {@link TrustedTime} mock calls, and respond with the given 270b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * time in response to {@link TrustedTime#currentTimeMillis()}. 271b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 272b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void expectTime(long currentTime) throws Exception { 273b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expect(mMockTime.forceRefresh()).andReturn(false).anyTimes(); 274b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expect(mMockTime.hasCache()).andReturn(true).anyTimes(); 275b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expect(mMockTime.currentTimeMillis()).andReturn(currentTime).anyTimes(); 276b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expect(mMockTime.getCacheAge()).andReturn(0L).anyTimes(); 277b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expect(mMockTime.getCacheCertainty()).andReturn(0L).anyTimes(); 278b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 279b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 280b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 281b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Expect {@link ThrottleService#systemReady()} generated calls, such as 282b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * connecting with {@link NetworkManagementService} mock. 283b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 284b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void expectSystemReady() throws Exception { 285b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mMockNMService.registerObserver(isA(INetworkManagementEventObserver.class)); 286b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectLastCall().atLeastOnce(); 287b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 288b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 289b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 290e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * Expect {@link NetworkManagementService#getNetworkStatsSummaryDev()} mock 2919a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey * calls, responding with the given counter values. 292b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 293b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void expectGetInterfaceCounter(long rx, long tx) throws Exception { 2949a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey // TODO: provide elapsedRealtime mock to match TimeAuthority 2954a97122ebf4d92a3f94402041729d77905e6c0c0Jeff Sharkey final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); 296b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey stats.addValues(TEST_IFACE, UID_ALL, SET_DEFAULT, TAG_NONE, rx, 0L, tx, 0L, 0); 2979a13f36cddaad01350bdb5f000167811a1d753c9Jeff Sharkey 298e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey expect(mMockNMService.getNetworkStatsSummaryDev()).andReturn(stats).atLeastOnce(); 299b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 300b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 301b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 302b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Expect {@link NetworkManagementService#setInterfaceThrottle} mock call 303b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * with the specified parameters. 304b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 305b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void expectSetInterfaceThrottle(int rx, int tx) throws Exception { 306b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mMockNMService.setInterfaceThrottle(isA(String.class), eq(rx), eq(tx)); 307b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey expectLastCall().atLeastOnce(); 308b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 309b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 310b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 311b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Dispatch {@link ThrottleService#systemReady()} and block until finished. 312b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 313b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void systemReady() throws Exception { 314b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey final Future<Intent> policyChanged = mWatchingContext.nextBroadcastIntent( 315b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey ThrottleManager.POLICY_CHANGED_ACTION); 316b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey final Future<Intent> pollAction = mWatchingContext.nextBroadcastIntent( 317b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey ThrottleManager.THROTTLE_POLL_ACTION); 318b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 319b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mThrottleService.systemReady(); 320b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 321b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // wait for everything to settle; for policy to update and for first poll 322b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey policyChanged.get(); 323b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey pollAction.get(); 324b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 325b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 326b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 327b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Dispatch {@link ThrottleService#dispatchPoll()} and block until finished. 328b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 329b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void forceServicePoll() throws Exception { 330b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // during systemReady() service already pushed a sticky broadcast, so we 331b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // need to skip the immediate and wait for the updated sticky. 332b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey final Future<Intent> pollAction = mWatchingContext.nextBroadcastIntent( 333b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey ThrottleManager.THROTTLE_POLL_ACTION); 334b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 335b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mThrottleService.dispatchPoll(); 336b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 337b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey pollAction.get(); 338b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 339b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 340b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey /** 341b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey * Dispatch {@link ThrottleService#dispatchReset()} and block until finished. 342b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey */ 343b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey public void forceServiceReset() throws Exception { 344b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // during systemReady() service already pushed a sticky broadcast, so we 345b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey // need to skip the immediate and wait for the updated sticky. 346b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey final Future<Intent> pollAction = mWatchingContext.nextBroadcastIntent( 347b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey ThrottleManager.THROTTLE_POLL_ACTION); 348b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 349b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey mThrottleService.dispatchReset(); 350b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey 351b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey pollAction.get(); 352b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey } 353b7342acebcb7e5dc7da0cda77fbddf50e7dfdd7cJeff Sharkey} 354