NetworkStatsServiceTest.java revision 4a97122ebf4d92a3f94402041729d77905e6c0c0
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (C) 2011 The Android Open Source Project
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * you may not use this file except in compliance with the License.
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * You may obtain a copy of the License at
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * See the License for the specific language governing permissions and
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * limitations under the License.
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpackage com.android.server;
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static android.net.ConnectivityManager.TYPE_WIFI;
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static android.net.NetworkStats.IFACE_ALL;
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static android.net.NetworkStats.UID_ALL;
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static android.net.TrafficStats.TEMPLATE_WIFI;
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static android.text.format.DateUtils.DAY_IN_MILLIS;
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static android.text.format.DateUtils.HOUR_IN_MILLIS;
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static android.text.format.DateUtils.MINUTE_IN_MILLIS;
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static android.text.format.DateUtils.WEEK_IN_MILLIS;
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL;
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static org.easymock.EasyMock.anyLong;
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static org.easymock.EasyMock.createMock;
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static org.easymock.EasyMock.eq;
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static org.easymock.EasyMock.expect;
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static org.easymock.EasyMock.expectLastCall;
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport static org.easymock.EasyMock.isA;
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.app.AlarmManager;
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.app.IAlarmManager;
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.app.PendingIntent;
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.content.Intent;
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.net.IConnectivityManager;
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.net.LinkProperties;
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.net.NetworkInfo;
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.net.NetworkInfo.DetailedState;
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.net.NetworkState;
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.net.NetworkStats;
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.net.NetworkStatsHistory;
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.os.INetworkManagementService;
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.test.AndroidTestCase;
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport android.util.TrustedTime;
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport com.android.server.net.NetworkStatsService;
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport com.android.server.net.NetworkStatsService.NetworkStatsSettings;
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport org.easymock.EasyMock;
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectimport java.io.File;
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/**
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Tests for {@link NetworkStatsService}.
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project@LargeTest
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic class NetworkStatsServiceTest extends AndroidTestCase {
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private static final String TAG = "NetworkStatsServiceTest";
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private static final String TEST_IFACE = "test0";
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private static final long TEST_START = 1194220800000L;
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private static final int TEST_UID_1 = 1001;
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private static final int TEST_UID_2 = 1002;
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private BroadcastInterceptingContext mServiceContext;
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private File mStatsDir;
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private INetworkManagementService mNetManager;
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private IAlarmManager mAlarmManager;
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private TrustedTime mTime;
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private NetworkStatsSettings mSettings;
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private IConnectivityManager mConnManager;
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private NetworkStatsService mService;
82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    @Override
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    public void setUp() throws Exception {
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        super.setUp();
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mServiceContext = new BroadcastInterceptingContext(getContext());
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mStatsDir = getContext().getFilesDir();
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mNetManager = createMock(INetworkManagementService.class);
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mAlarmManager = createMock(IAlarmManager.class);
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mTime = createMock(TrustedTime.class);
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mSettings = createMock(NetworkStatsSettings.class);
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mConnManager = createMock(IConnectivityManager.class);
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mService = new NetworkStatsService(
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                mServiceContext, mNetManager, mAlarmManager, mTime, mStatsDir, mSettings);
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mService.bindConnectivityManager(mConnManager);
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        expectDefaultSettings();
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        expectSystemReady();
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        replay();
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        mService.systemReady();
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        verifyAndReset();
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    @Override
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    public void tearDown() throws Exception {
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        for (File file : mStatsDir.listFiles()) {
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            file.delete();
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
114
115        mServiceContext = null;
116        mStatsDir = null;
117
118        mNetManager = null;
119        mAlarmManager = null;
120        mTime = null;
121
122        mService = null;
123
124        super.tearDown();
125    }
126
127    public void testSummaryStatsWifi() throws Exception {
128        long elapsedRealtime = 0;
129
130        // pretend that wifi network comes online; service should ask about full
131        // network state, and poll any existing interfaces before updating.
132        expectTime(TEST_START + elapsedRealtime);
133        expectDefaultSettings();
134        expectNetworkState(buildWifiState());
135        expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
136
137        replay();
138        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
139
140        // verify service has empty history for wifi
141        assertNetworkTotal(TEMPLATE_WIFI, 0L, 0L);
142        verifyAndReset();
143
144        // modify some number on wifi, and trigger poll event
145        elapsedRealtime += HOUR_IN_MILLIS;
146        expectTime(TEST_START + elapsedRealtime);
147        expectDefaultSettings();
148        expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
149                .addEntry(TEST_IFACE, UID_ALL, 1024L, 2048L));
150        expectNetworkStatsDetail(buildEmptyStats(elapsedRealtime));
151
152        replay();
153        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
154
155        // verify service recorded history
156        assertNetworkTotal(TEMPLATE_WIFI, 1024L, 2048L);
157        verifyAndReset();
158
159        // and bump forward again, with counters going higher. this is
160        // important, since polling should correctly subtract last snapshot.
161        elapsedRealtime += DAY_IN_MILLIS;
162        expectTime(TEST_START + elapsedRealtime);
163        expectDefaultSettings();
164        expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
165                .addEntry(TEST_IFACE, UID_ALL, 4096L, 8192L));
166        expectNetworkStatsDetail(buildEmptyStats(elapsedRealtime));
167
168        replay();
169        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
170
171        // verify service recorded history
172        assertNetworkTotal(TEMPLATE_WIFI, 4096L, 8192L);
173        verifyAndReset();
174
175    }
176
177    public void testStatsRebootPersist() throws Exception {
178        long elapsedRealtime = 0;
179        assertStatsFilesExist(false);
180
181        // pretend that wifi network comes online; service should ask about full
182        // network state, and poll any existing interfaces before updating.
183        expectTime(TEST_START + elapsedRealtime);
184        expectDefaultSettings();
185        expectNetworkState(buildWifiState());
186        expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
187
188        replay();
189        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
190
191        // verify service has empty history for wifi
192        assertNetworkTotal(TEMPLATE_WIFI, 0L, 0L);
193        verifyAndReset();
194
195        // modify some number on wifi, and trigger poll event
196        elapsedRealtime += HOUR_IN_MILLIS;
197        expectTime(TEST_START + elapsedRealtime);
198        expectDefaultSettings();
199        expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
200                .addEntry(TEST_IFACE, UID_ALL, 1024L, 2048L));
201        // TODO: switch these stats to specific iface
202        expectNetworkStatsDetail(new NetworkStats(elapsedRealtime, 2)
203                .addEntry(IFACE_ALL, TEST_UID_1, 512L, 256L)
204                .addEntry(IFACE_ALL, TEST_UID_2, 128L, 128L));
205
206        replay();
207        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
208
209        // verify service recorded history
210        assertNetworkTotal(TEMPLATE_WIFI, 1024L, 2048L);
211        assertUidTotal(TEST_UID_1, TEMPLATE_WIFI, 512L, 256L);
212        assertUidTotal(TEST_UID_2, TEMPLATE_WIFI, 128L, 128L);
213        verifyAndReset();
214
215        // graceful shutdown system, which should trigger persist of stats, and
216        // clear any values in memory.
217        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN));
218
219        // talk with zombie service to assert stats have gone; and assert that
220        // we persisted them to file.
221        expectDefaultSettings();
222        replay();
223        assertNetworkTotal(TEMPLATE_WIFI, 0L, 0L);
224        verifyAndReset();
225
226        assertStatsFilesExist(true);
227
228        // boot through serviceReady() again
229        expectDefaultSettings();
230        expectSystemReady();
231
232        replay();
233        mService.systemReady();
234
235        // after systemReady(), we should have historical stats loaded again
236        assertNetworkTotal(TEMPLATE_WIFI, 1024L, 2048L);
237        assertUidTotal(TEST_UID_1, TEMPLATE_WIFI, 512L, 256L);
238        assertUidTotal(TEST_UID_2, TEMPLATE_WIFI, 128L, 128L);
239        verifyAndReset();
240
241    }
242
243    public void testStatsBucketResize() throws Exception {
244        long elapsedRealtime = 0;
245        NetworkStatsHistory history = null;
246        long[] total = null;
247
248        assertStatsFilesExist(false);
249
250        // pretend that wifi network comes online; service should ask about full
251        // network state, and poll any existing interfaces before updating.
252        expectTime(TEST_START + elapsedRealtime);
253        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
254        expectNetworkState(buildWifiState());
255        expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
256
257        replay();
258        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
259        verifyAndReset();
260
261        // modify some number on wifi, and trigger poll event
262        elapsedRealtime += 2 * HOUR_IN_MILLIS;
263        expectTime(TEST_START + elapsedRealtime);
264        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
265        expectNetworkStatsSummary(new NetworkStats(elapsedRealtime, 1)
266                .addEntry(TEST_IFACE, UID_ALL, 512L, 512L));
267        expectNetworkStatsDetail(buildEmptyStats(elapsedRealtime));
268
269        replay();
270        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
271
272        // verify service recorded history
273        history = mService.getHistoryForNetwork(TEMPLATE_WIFI);
274        total = history.getTotalData(Long.MIN_VALUE, Long.MAX_VALUE, null);
275        assertEquals(512L, total[0]);
276        assertEquals(512L, total[1]);
277        assertEquals(HOUR_IN_MILLIS, history.bucketDuration);
278        assertEquals(2, history.bucketCount);
279        verifyAndReset();
280
281        // now change bucket duration setting and trigger another poll with
282        // exact same values, which should resize existing buckets.
283        expectTime(TEST_START + elapsedRealtime);
284        expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
285        expectNetworkStatsSummary(buildEmptyStats(elapsedRealtime));
286        expectNetworkStatsDetail(buildEmptyStats(elapsedRealtime));
287
288        replay();
289        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
290
291        // verify identical stats, but spread across 4 buckets now
292        history = mService.getHistoryForNetwork(TEMPLATE_WIFI);
293        total = history.getTotalData(Long.MIN_VALUE, Long.MAX_VALUE, null);
294        assertEquals(512L, total[0]);
295        assertEquals(512L, total[1]);
296        assertEquals(30 * MINUTE_IN_MILLIS, history.bucketDuration);
297        assertEquals(4, history.bucketCount);
298        verifyAndReset();
299
300    }
301
302    private void assertNetworkTotal(int template, long rx, long tx) {
303        final NetworkStatsHistory history = mService.getHistoryForNetwork(template);
304        final long[] total = history.getTotalData(Long.MIN_VALUE, Long.MAX_VALUE, null);
305        assertEquals(rx, total[0]);
306        assertEquals(tx, total[1]);
307    }
308
309    private void assertUidTotal(int uid, int template, long rx, long tx) {
310        final NetworkStatsHistory history = mService.getHistoryForUid(uid, template);
311        final long[] total = history.getTotalData(Long.MIN_VALUE, Long.MAX_VALUE, null);
312        assertEquals(rx, total[0]);
313        assertEquals(tx, total[1]);
314    }
315
316    private void expectSystemReady() throws Exception {
317        mAlarmManager.remove(isA(PendingIntent.class));
318        expectLastCall().anyTimes();
319
320        mAlarmManager.setInexactRepeating(
321                eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), isA(PendingIntent.class));
322        expectLastCall().atLeastOnce();
323    }
324
325    private void expectNetworkState(NetworkState... state) throws Exception {
326        expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
327    }
328
329    private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
330        expect(mNetManager.getNetworkStatsSummary()).andReturn(summary).atLeastOnce();
331    }
332
333    private void expectNetworkStatsDetail(NetworkStats detail) throws Exception {
334        expect(mNetManager.getNetworkStatsDetail()).andReturn(detail).atLeastOnce();
335    }
336
337    private void expectDefaultSettings() throws Exception {
338        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
339    }
340
341    private void expectSettings(long persistThreshold, long bucketDuration, long maxHistory)
342            throws Exception {
343        expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes();
344        expect(mSettings.getPersistThreshold()).andReturn(persistThreshold).anyTimes();
345        expect(mSettings.getNetworkBucketDuration()).andReturn(bucketDuration).anyTimes();
346        expect(mSettings.getNetworkMaxHistory()).andReturn(maxHistory).anyTimes();
347        expect(mSettings.getUidBucketDuration()).andReturn(bucketDuration).anyTimes();
348        expect(mSettings.getUidMaxHistory()).andReturn(maxHistory).anyTimes();
349        expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes();
350    }
351
352    private void expectTime(long currentTime) throws Exception {
353        expect(mTime.forceRefresh()).andReturn(false).anyTimes();
354        expect(mTime.hasCache()).andReturn(true).anyTimes();
355        expect(mTime.currentTimeMillis()).andReturn(currentTime).anyTimes();
356        expect(mTime.getCacheAge()).andReturn(0L).anyTimes();
357        expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes();
358    }
359
360    private void assertStatsFilesExist(boolean exist) {
361        final File summaryFile = new File(mStatsDir, "netstats.bin");
362        final File detailFile = new File(mStatsDir, "netstats_uid.bin");
363        if (exist) {
364            assertTrue(summaryFile.exists());
365            assertTrue(detailFile.exists());
366        } else {
367            assertFalse(summaryFile.exists());
368            assertFalse(detailFile.exists());
369        }
370    }
371
372    private static NetworkState buildWifiState() {
373        final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
374        info.setDetailedState(DetailedState.CONNECTED, null, null);
375        final LinkProperties prop = new LinkProperties();
376        prop.setInterfaceName(TEST_IFACE);
377        return new NetworkState(info, prop, null);
378    }
379
380    private static NetworkStats buildEmptyStats(long elapsedRealtime) {
381        return new NetworkStats(elapsedRealtime, 0);
382    }
383
384    private void replay() {
385        EasyMock.replay(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
386    }
387
388    private void verifyAndReset() {
389        EasyMock.verify(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
390        EasyMock.reset(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
391    }
392}
393