NetworkStatsServiceTest.java revision 241dde2306202e7655fdf41d5381f2874e47e108
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;
34241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkeyimport static android.net.TrafficStats.MB_IN_BYTES;
35b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.net.TrafficStats.UID_REMOVED;
36905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkeyimport static android.net.TrafficStats.UID_TETHERING;
373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.DAY_IN_MILLIS;
383f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.HOUR_IN_MILLIS;
3939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS;
4039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.WEEK_IN_MILLIS;
413f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL;
423f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.anyLong;
4363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport static org.easymock.EasyMock.aryEq;
448e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport static org.easymock.EasyMock.capture;
453f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.createMock;
463f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.eq;
473f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.expect;
483f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.expectLastCall;
493f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.isA;
503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.AlarmManager;
523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.IAlarmManager;
533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.PendingIntent;
543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.content.Intent;
553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.IConnectivityManager;
568e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport android.net.INetworkManagementEventObserver;
573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.LinkProperties;
583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo;
593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo.DetailedState;
603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkState;
613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStats;
623f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStatsHistory;
631b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkTemplate;
643f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.os.INetworkManagementService;
65b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport android.telephony.TelephonyManager;
663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.AndroidTestCase;
673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest;
6863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.test.suitebuilder.annotation.Suppress;
693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.util.TrustedTime;
703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport com.android.server.net.NetworkStatsService;
7239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings;
7363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config;
743f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
758e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport org.easymock.Capture;
763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport org.easymock.EasyMock;
773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport java.io.File;
79b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
80b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport libcore.io.IoUtils;
813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey/**
833f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * Tests for {@link NetworkStatsService}.
843f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey */
853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey@LargeTest
863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeypublic class NetworkStatsServiceTest extends AndroidTestCase {
873f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final String TAG = "NetworkStatsServiceTest";
883f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
893f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final String TEST_IFACE = "test0";
90163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static final String TEST_IFACE2 = "test1";
913f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final long TEST_START = 1194220800000L;
923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
93b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_1 = "310004";
94b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_2 = "310260";
95b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
964e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateWifi = buildTemplateWifi();
974e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1);
984e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2);
991b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey
100d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_RED = 1001;
101d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_BLUE = 1002;
102d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_GREEN = 1003;
10339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
104b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long mElapsedRealtime;
105b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1063f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private BroadcastInterceptingContext mServiceContext;
1073f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private File mStatsDir;
1083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private INetworkManagementService mNetManager;
1103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private IAlarmManager mAlarmManager;
1113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private TrustedTime mTime;
11239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private NetworkStatsSettings mSettings;
1133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private IConnectivityManager mConnManager;
1143f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1153f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private NetworkStatsService mService;
1168e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private INetworkManagementEventObserver mNetworkObserver;
1173f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    @Override
1193f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void setUp() throws Exception {
1203f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        super.setUp();
1213f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext = new BroadcastInterceptingContext(getContext());
1233f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mStatsDir = getContext().getFilesDir();
124b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        if (mStatsDir.exists()) {
125b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            IoUtils.deleteContents(mStatsDir);
126b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        }
1273f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1283f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mNetManager = createMock(INetworkManagementService.class);
1293f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager = createMock(IAlarmManager.class);
1303f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mTime = createMock(TrustedTime.class);
13139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mSettings = createMock(NetworkStatsSettings.class);
1323f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mConnManager = createMock(IConnectivityManager.class);
1333f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1343f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = new NetworkStatsService(
13539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey                mServiceContext, mNetManager, mAlarmManager, mTime, mStatsDir, mSettings);
1363f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.bindConnectivityManager(mConnManager);
1373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
138b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime = 0L;
139b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
140b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
14139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
142b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
143b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
1448e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
1458e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1468e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        // catch INetworkManagementEventObserver during systemReady()
1478e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
1488e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey                INetworkManagementEventObserver>();
1498e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.registerObserver(capture(networkObserver));
1508e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
1513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
1533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
1543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        verifyAndReset();
1553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1568e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetworkObserver = networkObserver.getValue();
1578e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
1593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    @Override
1613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void tearDown() throws Exception {
1623f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        for (File file : mStatsDir.listFiles()) {
1633f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey            file.delete();
1643f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        }
1653f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext = null;
1673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mStatsDir = null;
1683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mNetManager = null;
1703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager = null;
1713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mTime = null;
172b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mSettings = null;
173b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mConnManager = null;
1743f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1753f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = null;
1763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        super.tearDown();
1783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
1793f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
180b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testNetworkStatsWifi() throws Exception {
1813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
1823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
183b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
18439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
18539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
186b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
187b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
188905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
1893f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1903f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
191961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
1923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1933f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
194a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
19539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
1963f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1973f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
198b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
199b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
20039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
201b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
202b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
203b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2048e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
2053f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2063f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2073f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
2083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
210a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
21139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // and bump forward again, with counters going higher. this is
2143f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // important, since polling should correctly subtract last snapshot.
215b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(DAY_IN_MILLIS);
216b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
21739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
218b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
219b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L));
220b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2218e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
2223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2233f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2243f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
2253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
227a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4096L, 4L, 8192L, 8L, 0);
22839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
22939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
2303f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
2313f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
23239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsRebootPersist() throws Exception {
23339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
2343f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2353f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
2363f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
237b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
23839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
23939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
240b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
241b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
242905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
2433f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2443f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
245961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
2463f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2473f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
248a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
24939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
252b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
253b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
25439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
255b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
256b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L));
257b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2)
258b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
259b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
260b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
261b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
262b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 0L));
2638e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
264b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
265b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, false);
266b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 4);
267b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
268b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 6);
269a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
2703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
2723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
274a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
275b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
276b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, 512L, 4L, 256L, 2L, 4);
277b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, 512L, 4L, 256L, 2L, 6);
278b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
27939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // graceful shutdown system, which should trigger persist of stats, and
2823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // clear any values in memory.
28334c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
28434c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectDefaultSettings();
28534c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        replay();
2863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN));
28734c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        verifyAndReset();
2883f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
28939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(true);
2903f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2913f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // boot through serviceReady() again
292b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
29339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
294b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
295b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2968e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
2978e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
2988e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        // catch INetworkManagementEventObserver during systemReady()
2998e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
3008e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey                INetworkManagementEventObserver>();
3018e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.registerObserver(capture(networkObserver));
3028e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
3033f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3043f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
3053f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
3068e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
3078e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetworkObserver = networkObserver.getValue();
3083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // after systemReady(), we should have historical stats loaded again
310a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
311b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
312b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, 512L, 4L, 256L, 2L, 4);
313b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, 512L, 4L, 256L, 2L, 6);
314b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
31539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
31639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
31739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
31839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
31963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    // TODO: simulate reboot to test bucket resize
32063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    @Suppress
32139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsBucketResize() throws Exception {
32239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        NetworkStatsHistory history = null;
32339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
32439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
32539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
32639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
32739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // network state, and poll any existing interfaces before updating.
328b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
32939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
33039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
331b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
332b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
333905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
33439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
33539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
336961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
33739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
33839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
33939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // modify some number on wifi, and trigger poll event
340b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(2 * HOUR_IN_MILLIS);
341b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
34239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
343b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
344b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L));
345b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3468e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
34739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
34839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
34939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
35039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
35139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify service recorded history
35263d27a9233fed934340231f438493746084a681dJeff Sharkey        history = mService.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
353a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
354d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(HOUR_IN_MILLIS, history.getBucketDuration());
355d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(2, history.size());
35639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
35739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
35839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // now change bucket duration setting and trigger another poll with
35939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // exact same values, which should resize existing buckets.
360b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
36139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
362b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
363b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3648e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
36539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
36639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
36739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
36839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
36939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify identical stats, but spread across 4 buckets now
37063d27a9233fed934340231f438493746084a681dJeff Sharkey        history = mService.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
371a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
372d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(30 * MINUTE_IN_MILLIS, history.getBucketDuration());
373d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(4, history.size());
37439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
3753f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
3773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
378b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidStatsAcrossNetworks() throws Exception {
379b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend first mobile network comes online
380b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
381b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
382b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
383b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
384b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
385905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
386b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
387b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
388961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
389b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
390b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
391b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic on first network
392b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
393b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
394b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
395b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
396b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
397b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
398b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
399b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
400b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
4018e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
402b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
403a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 10);
404a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
405b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
406b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
407b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
408b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
409a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
410a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
411b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
412b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
413b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
414b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
415b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now switch networks; this also tests that we're okay with interfaces
416b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // disappearing, to verify we don't count backwards.
417b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
418b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
419b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
420b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_2));
421163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
422163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
423163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
424163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
425163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
426163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
4278e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
428b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
429b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
430961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
431b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
432b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
433b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
434b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create traffic on second network
435b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
436b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
437b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
438b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
439163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2176L, 17L, 1536L, 12L));
440b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
441163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
442163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
443163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 640L, 5L, 1024L, 8L, 0L)
444b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xFAAD, 128L, 1L, 1024L, 8L, 0L));
4458e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
446b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
447b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_BLUE, 0xFAAD, 10);
448a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
449b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
450b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
451b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
452b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify original history still intact
453a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
454b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
455b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
456b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
457b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // and verify new history also recorded under different template, which
458b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verifies that we didn't cross the streams.
459a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi2, 128L, 1L, 1024L, 8L, 0);
460a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
461a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateImsi2, UID_BLUE, 128L, 1L, 1024L, 8L, 10);
462b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
463b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
464b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
465b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
466b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidRemovedIsMoved() throws Exception {
467b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend that network comes online
468b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
469b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
470b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildWifiState());
471b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
472b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
473905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
474b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
475b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
476961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
477b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
478b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
479b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic
480b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
481b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
482b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
483b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
484b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
485b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
486b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
487b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
488b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
489b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
4908e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
491b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
492b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 10);
493a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
494b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
495b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
496b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
497b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
498a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
499a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10);
500b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0);
501b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
502b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
503b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
504b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now pretend two UIDs are uninstalled, which should migrate stats to
505b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // special "removed" bucket.
50634c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
507b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
508163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
509163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
510163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
511163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
512163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
513163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
514163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
515163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsPoll();
516163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey
517b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
518b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final Intent intent = new Intent(ACTION_UID_REMOVED);
519d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_BLUE);
520b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
521d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_RED);
522b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
523b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
524b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // existing uid and total should remain unchanged; but removed UID
525b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // should be gone completely.
526a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
527a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0);
528a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 0L, 0L, 0L, 0L, 0);
529b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
530b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10);
531b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
532b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
533b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
534b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
535d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testUid3g4gCombinedByTemplate() throws Exception {
536d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
537b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
538d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
539d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
540b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
541b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
542905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
543d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
544d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
545961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
546d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
547d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
548d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic
549b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
550b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
551d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
552b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
553b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
554b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
555b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
5568e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
557d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
558a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 5);
559a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
560d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
561d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
562d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
563d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
564b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5);
565d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
566d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
567d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now switch over to 4g network
568b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
569b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
570d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
571163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkState(buildMobile4gState(TEST_IFACE2));
572b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
573163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
574163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
575163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
5768e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
577d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
578d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
579961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
580d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
581d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
582d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
583d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create traffic on second network
584b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
585b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
586d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
587b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
588b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
589163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
590163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
591163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
592163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, 0xFAAD, 512L, 4L, 256L, 2L, 0L));
5938e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
594d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
595b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 5);
596a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
597d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
598d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
599d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
600d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify that ALL_MOBILE template combines both
601b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 10);
602d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
603d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
604d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
605d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
606d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testSummaryForAllUid() throws Exception {
607d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
608b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
609d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
610d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildWifiState());
611b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
612b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
613905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
614d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
615d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
616961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
617d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
618d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
619d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic for two apps
620b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
621b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
622d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
623b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
624b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
625b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
626b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
627b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0L));
6288e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
629d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
630a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
631a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
632d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
633d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
634d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
635d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
636b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1);
637b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0);
638d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
639a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
640d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now create more traffic in next hour, but only for one app
641b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
642b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
643d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
644b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
645b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
646163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
647163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
648b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L));
6498e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
650a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
651d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
652d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
653d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
654d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // first verify entire history present
655d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        NetworkStats stats = mService.getSummaryForAllUid(
656d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
657d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(3, stats.size());
658b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 1);
659b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 1);
660b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0);
661d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
662d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now verify that recent history only contains one uid
663b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        final long currentTime = currentTimeMillis();
664d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        stats = mService.getSummaryForAllUid(
665d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true);
666d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(1, stats.size());
667b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0);
668b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
669b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
670b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
671b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
672b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    public void testForegroundBackground() throws Exception {
673b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // pretend that network comes online
674b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
675b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
676b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkState(buildWifiState());
677b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
678b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
679905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
680b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
681b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
682961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
683b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
684b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
685b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // create some initial traffic
686b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
687b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
688b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
689b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
690b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
691b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
692b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L));
6938e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
694b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
695b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
696b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
697b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
698b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
699b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
700b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify service recorded history
701b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1);
702b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
703b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
704b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // now switch to foreground
705b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
706b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
707b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
708b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
709b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
710b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
711b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L)
712b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 0L)
713b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 0L));
7148e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
715b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
716b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
717b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 1);
718b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
719b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
720b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
721b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
722b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // test that we combined correctly
723b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 160L, 4L, 160L, 4L, 2);
724b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
725b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify entire history present
726b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        final NetworkStats stats = mService.getSummaryForAllUid(
727b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
728b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertEquals(4, stats.size());
729b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 1);
730b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 1);
731b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 1);
732b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 1);
733d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
734d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
735d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
736d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
737905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    public void testTethering() throws Exception {
738905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // pretend first mobile network comes online
739905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
740905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
741905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
742905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
743905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
744905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
745905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
746905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        replay();
747905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE));
748905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        verifyAndReset();
749905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
750905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // create some tethering traffic
751905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
752905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
753905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
754905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
755905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
75663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
75763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats uidStats = new NetworkStats(getElapsedRealtime(), 1)
75863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L);
759905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        final String[] tetherIfacePairs = new String[] { TEST_IFACE, "wlan0" };
76063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats tetherStats = new NetworkStats(getElapsedRealtime(), 1)
76163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L, 0L);
76263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
76363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expectNetworkStatsUidDetail(uidStats, tetherIfacePairs, tetherStats);
76463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expectNetworkStatsPoll();
765905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
766905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        replay();
767905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
768905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
769905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // verify service recorded history
770905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
771905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
772905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_TETHERING, 1920L, 14L, 384L, 2L, 0);
773905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        verifyAndReset();
774905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
775905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    }
776905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
777a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertNetworkTotal(NetworkTemplate template, long rxBytes, long rxPackets,
778a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            long txBytes, long txPackets, int operations) {
77963d27a9233fed934340231f438493746084a681dJeff Sharkey        final NetworkStatsHistory history = mService.getHistoryForNetwork(template, FIELD_ALL);
780a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
781a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey                txPackets, operations);
7823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
7833f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
784a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets,
785a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            long txBytes, long txPackets, int operations) {
786b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(template, uid, SET_ALL, rxBytes, rxPackets, txBytes, txPackets, operations);
787b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
788b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
789b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void assertUidTotal(NetworkTemplate template, int uid, int set, long rxBytes,
790b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) {
79163d27a9233fed934340231f438493746084a681dJeff Sharkey        final NetworkStatsHistory history = mService.getHistoryForUid(
792b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                template, uid, set, TAG_NONE, FIELD_ALL);
793a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
794a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey                txPackets, operations);
79539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
79639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
7978e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private void expectSystemReady() throws Exception {
7983f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager.remove(isA(PendingIntent.class));
7993f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expectLastCall().anyTimes();
8003f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
8013f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager.setInexactRepeating(
8023f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey                eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), isA(PendingIntent.class));
8033f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expectLastCall().atLeastOnce();
804b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
8058e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.setGlobalAlert(anyLong());
8068e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
807f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey
808f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey        expect(mNetManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce();
8093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
8103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
81139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkState(NetworkState... state) throws Exception {
81239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
81363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
81463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final LinkProperties linkProp = state.length > 0 ? state[0].linkProperties : null;
81563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mConnManager.getActiveLinkProperties()).andReturn(linkProp).atLeastOnce();
81639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
81739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
81839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
81939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mNetManager.getNetworkStatsSummary()).andReturn(summary).atLeastOnce();
82039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
82139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
822a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception {
82363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expectNetworkStatsUidDetail(detail, new String[0], new NetworkStats(0L, 0));
82463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
82563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
82663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private void expectNetworkStatsUidDetail(
82763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            NetworkStats detail, String[] tetherIfacePairs, NetworkStats tetherStats)
82863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            throws Exception {
829a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        expect(mNetManager.getNetworkStatsUidDetail(eq(UID_ALL))).andReturn(detail).atLeastOnce();
83063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
83163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // also include tethering details, since they are folded into UID
83263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mConnManager.getTetheredIfacePairs()).andReturn(tetherIfacePairs).atLeastOnce();
83363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mNetManager.getNetworkStatsTethering(aryEq(tetherIfacePairs)))
83463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .andReturn(tetherStats).atLeastOnce();
83539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
83639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
83739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectDefaultSettings() throws Exception {
83839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
83939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
84039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
84163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private void expectSettings(long persistBytes, long bucketDuration, long deleteAge)
84239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey            throws Exception {
84339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes();
84439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes();
84563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getGlobalAlertBytes()).andReturn(MB_IN_BYTES).anyTimes();
84663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getSampleEnabled()).andReturn(true).anyTimes();
84763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
84863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final Config config = new Config(bucketDuration, persistBytes, deleteAge, deleteAge);
84963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getDevConfig()).andReturn(config).anyTimes();
85063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getUidConfig()).andReturn(config).anyTimes();
85163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getUidTagConfig()).andReturn(config).anyTimes();
85239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
85339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
854b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void expectCurrentTime() throws Exception {
8553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.forceRefresh()).andReturn(false).anyTimes();
8563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.hasCache()).andReturn(true).anyTimes();
857b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes();
8583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.getCacheAge()).andReturn(0L).anyTimes();
8593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes();
8603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
8613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
8628e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private void expectNetworkStatsPoll() throws Exception {
8638e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.setGlobalAlert(anyLong());
8648e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().anyTimes();
8658e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    }
8668e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
86739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void assertStatsFilesExist(boolean exist) {
86863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final File basePath = new File(mStatsDir, "netstats");
86939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        if (exist) {
87063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            assertTrue(basePath.list().length > 0);
87139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        } else {
87263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            assertTrue(basePath.list().length == 0);
87339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        }
87439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
87539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
876b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private static void assertValues(NetworkStats stats, String iface, int uid, int set,
877b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) {
878b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        final int i = stats.findIndex(iface, uid, set, tag);
879d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        final NetworkStats.Entry entry = stats.getValues(i, null);
880a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
881a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
882a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
883a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
884a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
885d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
886d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
887a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private static void assertValues(NetworkStatsHistory stats, long start, long end, long rxBytes,
888a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) {
889434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        final NetworkStatsHistory.Entry entry = stats.getValues(start, end, null);
890434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
891a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
892434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
893a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
894a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
895434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey    }
896434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey
89739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private static NetworkState buildWifiState() {
89839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
89939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
90039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final LinkProperties prop = new LinkProperties();
90139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        prop.setInterfaceName(TEST_IFACE);
90239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        return new NetworkState(info, prop, null);
90339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
90439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
905b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static NetworkState buildMobile3gState(String subscriberId) {
906b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final NetworkInfo info = new NetworkInfo(
907b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey                TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UMTS, null, null);
908b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
909b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final LinkProperties prop = new LinkProperties();
910b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        prop.setInterfaceName(TEST_IFACE);
911b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        return new NetworkState(info, prop, null, subscriberId);
912b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
913b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
914163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static NetworkState buildMobile4gState(String iface) {
915d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIMAX, 0, null, null);
916d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
917d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final LinkProperties prop = new LinkProperties();
918163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        prop.setInterfaceName(iface);
919d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        return new NetworkState(info, prop, null);
920d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
921d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
922b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private NetworkStats buildEmptyStats() {
923b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return new NetworkStats(getElapsedRealtime(), 0);
924b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
925b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
926b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long getElapsedRealtime() {
927b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return mElapsedRealtime;
928b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
929b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
930b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long startTimeMillis() {
931b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return TEST_START;
932b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
933b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
934b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long currentTimeMillis() {
935b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return startTimeMillis() + mElapsedRealtime;
936b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
937b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
938b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void incrementCurrentTime(long duration) {
939b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime += duration;
94039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
94139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
9423f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private void replay() {
94339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        EasyMock.replay(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
9443f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
9453f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
9463f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private void verifyAndReset() {
94739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        EasyMock.verify(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
94839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        EasyMock.reset(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
9493f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
9503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey}
951