NetworkStatsServiceTest.java revision f60d0afd1ef08a24121d015bb016df05265b6d07
13f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey/*
23f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project
33f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey *
43f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
53f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * you may not use this file except in compliance with the License.
63f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * You may obtain a copy of the License at
73f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey *
83f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
93f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey *
103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * See the License for the specific language governing permissions and
143f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * limitations under the License.
153f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey */
163f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
173f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeypackage com.android.server;
183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff 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;
22b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.net.ConnectivityManager.TYPE_MOBILE;
233f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.net.ConnectivityManager.TYPE_WIFI;
24d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkeyimport static android.net.ConnectivityManager.TYPE_WIMAX;
25d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkeyimport static android.net.NetworkStats.IFACE_ALL;
26b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_ALL;
27b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_DEFAULT;
28b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_FOREGROUND;
291b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static android.net.NetworkStats.TAG_NONE;
303f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.net.NetworkStats.UID_ALL;
3163d27a9233fed934340231f438493746084a681dJeff Sharkeyimport static android.net.NetworkStatsHistory.FIELD_ALL;
324e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateMobileAll;
334e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateWifi;
34b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.net.TrafficStats.UID_REMOVED;
35905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkeyimport static android.net.TrafficStats.UID_TETHERING;
363f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.DAY_IN_MILLIS;
373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.HOUR_IN_MILLIS;
3839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS;
3939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.WEEK_IN_MILLIS;
403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL;
413f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.anyLong;
428e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport static org.easymock.EasyMock.capture;
433f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.createMock;
443f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.eq;
453f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.expect;
463f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.expectLastCall;
473f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.isA;
483f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
493f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.AlarmManager;
503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.IAlarmManager;
513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.PendingIntent;
523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.content.Intent;
533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.IConnectivityManager;
548e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport android.net.INetworkManagementEventObserver;
553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.LinkProperties;
563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo;
573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo.DetailedState;
583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkState;
593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStats;
603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStatsHistory;
611b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkTemplate;
623f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.os.INetworkManagementService;
63b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport android.telephony.TelephonyManager;
643f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.AndroidTestCase;
653f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest;
663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.util.TrustedTime;
673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport com.android.server.net.NetworkStatsService;
6939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings;
703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
718e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport org.easymock.Capture;
723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport org.easymock.EasyMock;
733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
743f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport java.io.File;
75b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
76b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport libcore.io.IoUtils;
773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey/**
793f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * Tests for {@link NetworkStatsService}.
803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey */
813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey@LargeTest
823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeypublic class NetworkStatsServiceTest extends AndroidTestCase {
833f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final String TAG = "NetworkStatsServiceTest";
843f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final String TEST_IFACE = "test0";
86163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static final String TEST_IFACE2 = "test1";
873f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final long TEST_START = 1194220800000L;
883f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
89b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_1 = "310004";
90b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_2 = "310260";
91b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
924e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateWifi = buildTemplateWifi();
934e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1);
944e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2);
951b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey
96d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_RED = 1001;
97d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_BLUE = 1002;
98d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_GREEN = 1003;
9939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
100b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long mElapsedRealtime;
101b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1023f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private BroadcastInterceptingContext mServiceContext;
1033f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private File mStatsDir;
1043f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1053f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private INetworkManagementService mNetManager;
1063f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private IAlarmManager mAlarmManager;
1073f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private TrustedTime mTime;
10839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private NetworkStatsSettings mSettings;
1093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private IConnectivityManager mConnManager;
1103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private NetworkStatsService mService;
1128e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private INetworkManagementEventObserver mNetworkObserver;
1133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1143f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    @Override
1153f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void setUp() throws Exception {
1163f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        super.setUp();
1173f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext = new BroadcastInterceptingContext(getContext());
1193f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mStatsDir = getContext().getFilesDir();
120b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        if (mStatsDir.exists()) {
121b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            IoUtils.deleteContents(mStatsDir);
122b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        }
1233f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1243f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mNetManager = createMock(INetworkManagementService.class);
1253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager = createMock(IAlarmManager.class);
1263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mTime = createMock(TrustedTime.class);
12739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mSettings = createMock(NetworkStatsSettings.class);
1283f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mConnManager = createMock(IConnectivityManager.class);
1293f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1303f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = new NetworkStatsService(
13139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey                mServiceContext, mNetManager, mAlarmManager, mTime, mStatsDir, mSettings);
1323f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.bindConnectivityManager(mConnManager);
1333f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
134b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime = 0L;
135b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
136b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
13739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
138b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
139b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
1408e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
1418e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1428e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        // catch INetworkManagementEventObserver during systemReady()
1438e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
1448e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey                INetworkManagementEventObserver>();
1458e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.registerObserver(capture(networkObserver));
1468e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
1473f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1483f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
1493f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
1503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        verifyAndReset();
1513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1528e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetworkObserver = networkObserver.getValue();
1538e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
1553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    @Override
1573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void tearDown() throws Exception {
1583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        for (File file : mStatsDir.listFiles()) {
1593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey            file.delete();
1603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        }
1613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1623f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext = null;
1633f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mStatsDir = null;
1643f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1653f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mNetManager = null;
1663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager = null;
1673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mTime = null;
168b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mSettings = null;
169b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mConnManager = null;
1703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = null;
1723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        super.tearDown();
1743f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
1753f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
176b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testNetworkStatsWifi() throws Exception {
1773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
1783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
179b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
18039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
18139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
182b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
183b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
184905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
1853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
187961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
1883f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1893f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
190a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
19139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
1923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1933f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
194b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
195b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
19639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
197b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
198b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
199b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2008e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
2013f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2023f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2033f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
2043f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2053f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
206a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
20739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // and bump forward again, with counters going higher. this is
2103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // important, since polling should correctly subtract last snapshot.
211b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(DAY_IN_MILLIS);
212b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
21339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
214b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
215b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L));
216b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2178e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
2183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2193f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2203f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
2213f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
223a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4096L, 4L, 8192L, 8L, 0);
22439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
22539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
2263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
2273f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
22839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsRebootPersist() throws Exception {
22939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
2303f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2313f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
2323f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
233b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
23439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
23539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
236b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
237b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
238905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
2393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
241961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
2423f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2433f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
244a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
24539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2463f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2473f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
248b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
249b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
25039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
251b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
252b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L));
253b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2)
254b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
255b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
256b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
257b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
258b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 0L));
2598e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
260b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
261b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, false);
262b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 4);
263b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
264b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 6);
265a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
2663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
2683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
270a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
271b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
272b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, 512L, 4L, 256L, 2L, 4);
273b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, 512L, 4L, 256L, 2L, 6);
274b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
27539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // graceful shutdown system, which should trigger persist of stats, and
2783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // clear any values in memory.
27934c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
28034c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectDefaultSettings();
28134c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        replay();
2823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN));
28334c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        verifyAndReset();
2843f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // talk with zombie service to assert stats have gone; and assert that
2863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // we persisted them to file.
28739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
28839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
289a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
29039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
29139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
29239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(true);
2933f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2943f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // boot through serviceReady() again
295b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
29639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
297b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
298b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2998e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
3008e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
3018e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        // catch INetworkManagementEventObserver during systemReady()
3028e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
3038e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey                INetworkManagementEventObserver>();
3048e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.registerObserver(capture(networkObserver));
3058e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
3063f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3073f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
3083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
3098e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
3108e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetworkObserver = networkObserver.getValue();
3113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // after systemReady(), we should have historical stats loaded again
313a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
314b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
315b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, 512L, 4L, 256L, 2L, 4);
316b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, 512L, 4L, 256L, 2L, 6);
317b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
31839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
31939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
32039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
32139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
32239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsBucketResize() throws Exception {
32339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        NetworkStatsHistory history = null;
32439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
32539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
32639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
32739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
32839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // network state, and poll any existing interfaces before updating.
329b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
33039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
33139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
332b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
333b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
334905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
33539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
33639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
337961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
33839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
33939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
34039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // modify some number on wifi, and trigger poll event
341b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(2 * HOUR_IN_MILLIS);
342b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
34339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
344b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
345b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L));
346b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3478e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
34839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
34939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
35039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
35139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
35239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify service recorded history
35363d27a9233fed934340231f438493746084a681dJeff Sharkey        history = mService.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
354a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
355d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(HOUR_IN_MILLIS, history.getBucketDuration());
356d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(2, history.size());
35739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
35839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
35939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // now change bucket duration setting and trigger another poll with
36039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // exact same values, which should resize existing buckets.
361b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
36239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
363b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
364b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3658e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
36639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
36739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
36839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
36939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
37039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify identical stats, but spread across 4 buckets now
37163d27a9233fed934340231f438493746084a681dJeff Sharkey        history = mService.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
372a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
373d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(30 * MINUTE_IN_MILLIS, history.getBucketDuration());
374d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(4, history.size());
37539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
3763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
3783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
379b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidStatsAcrossNetworks() throws Exception {
380b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend first mobile network comes online
381b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
382b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
383b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
384b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
385b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
386905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
387b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
388b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
389961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
390b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
391b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
392b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic on first network
393b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
394b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
395b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
396b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
397b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
398b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
399b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
400b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
401b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
4028e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
403b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
404a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 10);
405a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
406b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
407b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
408b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
409b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
410a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
411a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
412b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
413b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
414b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
415b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
416b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now switch networks; this also tests that we're okay with interfaces
417b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // disappearing, to verify we don't count backwards.
418b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
419b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
420b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
421b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_2));
422163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
423163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
424163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
425163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
426163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
427163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
4288e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
429b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
430b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
431961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
432b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
433b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
434b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
435b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create traffic on second network
436b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
437b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
438b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
439b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
440163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2176L, 17L, 1536L, 12L));
441b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
442163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
443163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
444163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 640L, 5L, 1024L, 8L, 0L)
445b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xFAAD, 128L, 1L, 1024L, 8L, 0L));
4468e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
447b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
448b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_BLUE, 0xFAAD, 10);
449a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
450b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
451b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
452b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
453b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify original history still intact
454a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
455b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
456b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
457b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
458b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // and verify new history also recorded under different template, which
459b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verifies that we didn't cross the streams.
460a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi2, 128L, 1L, 1024L, 8L, 0);
461a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
462a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateImsi2, UID_BLUE, 128L, 1L, 1024L, 8L, 10);
463b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
464b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
465b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
466b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
467b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidRemovedIsMoved() throws Exception {
468b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend that network comes online
469b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
470b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
471b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildWifiState());
472b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
473b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
474905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
475b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
476b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
477961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
478b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
479b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
480b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic
481b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
482b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
483b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
484b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
485b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
486b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
487b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
488b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
489b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
490b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
4918e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
492b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
493b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 10);
494a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
495b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
496b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
497b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
498b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
499a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
500a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10);
501b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0);
502b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
503b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
504b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
505b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now pretend two UIDs are uninstalled, which should migrate stats to
506b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // special "removed" bucket.
50734c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
508b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
509163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
510163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
511163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
512163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
513163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
514163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
515163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
516163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsPoll();
517163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey
518b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
519b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final Intent intent = new Intent(ACTION_UID_REMOVED);
520d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_BLUE);
521b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
522d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_RED);
523b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
524b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
525b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // existing uid and total should remain unchanged; but removed UID
526b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // should be gone completely.
527a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
528a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0);
529a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 0L, 0L, 0L, 0L, 0);
530b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
531b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10);
532b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
533b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
534b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
535b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
536d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testUid3g4gCombinedByTemplate() throws Exception {
537d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
538b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
539d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
540d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
541b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
542b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
543905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
544d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
545d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
546961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
547d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
548d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
549d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic
550b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
551b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
552d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
553b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
554b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
555b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
556b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
5578e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
558d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
559a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 5);
560a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
561d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
562d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
563d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
564d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
565b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5);
566d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
567d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
568d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now switch over to 4g network
569b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
570b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
571d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
572163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkState(buildMobile4gState(TEST_IFACE2));
573b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
574163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
575163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
576163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
5778e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
578d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
579d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
580961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
581d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
582d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
583d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
584d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create traffic on second network
585b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
586b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
587d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
588b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
589b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
590163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
591163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
592163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
593163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, 0xFAAD, 512L, 4L, 256L, 2L, 0L));
5948e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
595d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
596b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 5);
597a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
598d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
599d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
600d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
601d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify that ALL_MOBILE template combines both
602b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 10);
603d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
604d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
605d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
606d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
607d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
608d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testSummaryForAllUid() throws Exception {
609d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
610b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
611d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
612d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildWifiState());
613b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
614b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
615905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
616d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
617d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
618961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
619d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
620d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
621d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic for two apps
622b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
623b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
624d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
625b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
626b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
627b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
628b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
629b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0L));
6308e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
631d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
632a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
633a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
634d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
635d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
636d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
637d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
638b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1);
639b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0);
640d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
641a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
642d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now create more traffic in next hour, but only for one app
643b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
644b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
645d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
646b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
647b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
648163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
649163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
650b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L));
6518e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
652a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
653d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
654d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
655d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
656d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // first verify entire history present
657d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        NetworkStats stats = mService.getSummaryForAllUid(
658d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
659d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(3, stats.size());
660b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 1);
661b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 1);
662b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0);
663d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
664d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now verify that recent history only contains one uid
665b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        final long currentTime = currentTimeMillis();
666d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        stats = mService.getSummaryForAllUid(
667d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true);
668d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(1, stats.size());
669b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0);
670b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
671b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
672b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
673b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
674b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    public void testForegroundBackground() throws Exception {
675b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // pretend that network comes online
676b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
677b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
678b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkState(buildWifiState());
679b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
680b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
681905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
682b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
683b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
684961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
685b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
686b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
687b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // create some initial traffic
688b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
689b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
690b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
691b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
692b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
693b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
694b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L));
6958e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
696b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
697b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
698b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
699b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
700b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
701b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
702b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify service recorded history
703b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1);
704b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
705b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
706b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // now switch to foreground
707b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
708b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
709b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
710b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
711b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
712b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
713b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L)
714b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 0L)
715b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 0L));
7168e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
717b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
718b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
719b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 1);
720b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
721b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
722b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
723b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
724b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // test that we combined correctly
725b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 160L, 4L, 160L, 4L, 2);
726b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
727b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify entire history present
728b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        final NetworkStats stats = mService.getSummaryForAllUid(
729b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
730b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertEquals(4, stats.size());
731b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 1);
732b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 1);
733b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 1);
734b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 1);
735d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
736d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
737d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
738d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
739905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    public void testTethering() throws Exception {
740905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // pretend first mobile network comes online
741905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
742905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
743905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
744905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
745905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
746905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
747905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
748905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        replay();
749905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
750905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        verifyAndReset();
751905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
752905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // create some tethering traffic
753905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
754905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
755905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
756905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
757905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
758905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
759905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L));
760905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        final String[] tetherIfacePairs = new String[] { TEST_IFACE, "wlan0" };
761905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll(tetherIfacePairs, new NetworkStats(getElapsedRealtime(), 1)
762905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey                .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L, 0L));
763905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
764905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        replay();
765905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
766905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
767905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // verify service recorded history
768905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
769905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
770905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_TETHERING, 1920L, 14L, 384L, 2L, 0);
771905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        verifyAndReset();
772905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
773905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    }
774905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
775a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertNetworkTotal(NetworkTemplate template, long rxBytes, long rxPackets,
776a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            long txBytes, long txPackets, int operations) {
77763d27a9233fed934340231f438493746084a681dJeff Sharkey        final NetworkStatsHistory history = mService.getHistoryForNetwork(template, FIELD_ALL);
778a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
779a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey                txPackets, operations);
7803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
7813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
782a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets,
783a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            long txBytes, long txPackets, int operations) {
784b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(template, uid, SET_ALL, rxBytes, rxPackets, txBytes, txPackets, operations);
785b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
786b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
787b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void assertUidTotal(NetworkTemplate template, int uid, int set, long rxBytes,
788b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) {
78963d27a9233fed934340231f438493746084a681dJeff Sharkey        final NetworkStatsHistory history = mService.getHistoryForUid(
790b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                template, uid, set, TAG_NONE, FIELD_ALL);
791a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
792a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey                txPackets, operations);
79339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
79439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
7958e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private void expectSystemReady() throws Exception {
7963f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager.remove(isA(PendingIntent.class));
7973f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expectLastCall().anyTimes();
7983f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
7993f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager.setInexactRepeating(
8003f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey                eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), isA(PendingIntent.class));
8013f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expectLastCall().atLeastOnce();
802b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
8038e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.setGlobalAlert(anyLong());
8048e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
805f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey
806f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey        expect(mNetManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce();
8073f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
8083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
80939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkState(NetworkState... state) throws Exception {
81039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
81139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
81239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
81339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
81439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mNetManager.getNetworkStatsSummary()).andReturn(summary).atLeastOnce();
81539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
81639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
817a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception {
818a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        expect(mNetManager.getNetworkStatsUidDetail(eq(UID_ALL))).andReturn(detail).atLeastOnce();
81939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
82039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
82139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectDefaultSettings() throws Exception {
82239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
82339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
82439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
82539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectSettings(long persistThreshold, long bucketDuration, long maxHistory)
82639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey            throws Exception {
82739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes();
82839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getPersistThreshold()).andReturn(persistThreshold).anyTimes();
82939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getNetworkBucketDuration()).andReturn(bucketDuration).anyTimes();
83039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getNetworkMaxHistory()).andReturn(maxHistory).anyTimes();
83139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getUidBucketDuration()).andReturn(bucketDuration).anyTimes();
83239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getUidMaxHistory()).andReturn(maxHistory).anyTimes();
833d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expect(mSettings.getTagMaxHistory()).andReturn(maxHistory).anyTimes();
83439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes();
83539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
83639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
837b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void expectCurrentTime() throws Exception {
8383f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.forceRefresh()).andReturn(false).anyTimes();
8393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.hasCache()).andReturn(true).anyTimes();
840b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes();
8413f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.getCacheAge()).andReturn(0L).anyTimes();
8423f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes();
8433f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
8443f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
8458e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private void expectNetworkStatsPoll() throws Exception {
846905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll(new String[0], new NetworkStats(getElapsedRealtime(), 0));
847905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    }
848905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
849905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    private void expectNetworkStatsPoll(String[] tetherIfacePairs, NetworkStats tetherStats)
850905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey            throws Exception {
8518e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.setGlobalAlert(anyLong());
8528e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().anyTimes();
853905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expect(mConnManager.getTetheredIfacePairs()).andReturn(tetherIfacePairs).anyTimes();
854905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expect(mNetManager.getNetworkStatsTethering(eq(tetherIfacePairs)))
855905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey                .andReturn(tetherStats).anyTimes();
8568e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    }
8578e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
85839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void assertStatsFilesExist(boolean exist) {
859b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final File networkFile = new File(mStatsDir, "netstats.bin");
860b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final File uidFile = new File(mStatsDir, "netstats_uid.bin");
86139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        if (exist) {
862b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey            assertTrue(networkFile.exists());
863b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey            assertTrue(uidFile.exists());
86439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        } else {
865b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey            assertFalse(networkFile.exists());
866b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey            assertFalse(uidFile.exists());
86739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        }
86839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
86939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
870b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private static void assertValues(NetworkStats stats, String iface, int uid, int set,
871b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) {
872b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        final int i = stats.findIndex(iface, uid, set, tag);
873d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        final NetworkStats.Entry entry = stats.getValues(i, null);
874a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
875a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
876a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
877a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
878a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
879d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
880d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
881a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private static void assertValues(NetworkStatsHistory stats, long start, long end, long rxBytes,
882a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) {
883434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        final NetworkStatsHistory.Entry entry = stats.getValues(start, end, null);
884434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
885a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
886434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
887a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
888a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
889434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey    }
890434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey
89139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private static NetworkState buildWifiState() {
89239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
89339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
89439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final LinkProperties prop = new LinkProperties();
89539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        prop.setInterfaceName(TEST_IFACE);
89639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        return new NetworkState(info, prop, null);
89739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
89839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
899b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static NetworkState buildMobile3gState(String subscriberId) {
900b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final NetworkInfo info = new NetworkInfo(
901b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey                TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UMTS, null, null);
902b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
903b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final LinkProperties prop = new LinkProperties();
904b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        prop.setInterfaceName(TEST_IFACE);
905b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        return new NetworkState(info, prop, null, subscriberId);
906b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
907b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
908163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static NetworkState buildMobile4gState(String iface) {
909d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIMAX, 0, null, null);
910d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
911d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final LinkProperties prop = new LinkProperties();
912163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        prop.setInterfaceName(iface);
913d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        return new NetworkState(info, prop, null);
914d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
915d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
916b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private NetworkStats buildEmptyStats() {
917b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return new NetworkStats(getElapsedRealtime(), 0);
918b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
919b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
920b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long getElapsedRealtime() {
921b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return mElapsedRealtime;
922b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
923b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
924b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long startTimeMillis() {
925b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return TEST_START;
926b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
927b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
928b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long currentTimeMillis() {
929b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return startTimeMillis() + mElapsedRealtime;
930b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
931b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
932b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void incrementCurrentTime(long duration) {
933b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime += duration;
93439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
93539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
9363f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private void replay() {
93739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        EasyMock.replay(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
9383f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
9393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
9403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private void verifyAndReset() {
94139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        EasyMock.verify(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
94239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        EasyMock.reset(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
9433f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
9443f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey}
945