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