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;
21f851d6dd2a15b74f63c85403afad0ed747f7311cErik Klineimport static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
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;
33e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateWifiWildcard;
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;
424870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackbornimport static org.easymock.EasyMock.anyInt;
433f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.anyLong;
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;
57b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkeyimport android.net.INetworkStatsSession;
583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.LinkProperties;
593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo;
603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo.DetailedState;
613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkState;
623f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStats;
633f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStatsHistory;
641b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkTemplate;
653f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.os.INetworkManagementService;
66df2cab2fc46c3f2c56f85dee1a19d0fa48cfd444David Christieimport android.os.WorkSource;
67b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport android.telephony.TelephonyManager;
683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.AndroidTestCase;
693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest;
7063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.test.suitebuilder.annotation.Suppress;
713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.util.TrustedTime;
723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport com.android.server.net.NetworkStatsService;
7439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings;
7563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config;
763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
77e4984bea95a07dea0ef0259fefa1e52f0bbb1533Jeff Sharkeyimport libcore.io.IoUtils;
78e4984bea95a07dea0ef0259fefa1e52f0bbb1533Jeff Sharkey
798e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport org.easymock.Capture;
803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport org.easymock.EasyMock;
813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport java.io.File;
83b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
843f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey/**
853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * Tests for {@link NetworkStatsService}.
863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey */
873f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey@LargeTest
883f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeypublic class NetworkStatsServiceTest extends AndroidTestCase {
89b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey    private static final String TAG = "NetworkStatsServiceTest";
903f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
913f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final String TEST_IFACE = "test0";
92163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static final String TEST_IFACE2 = "test1";
933f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final long TEST_START = 1194220800000L;
943f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
95b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_1 = "310004";
96b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_2 = "310260";
97ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey    private static final String TEST_SSID = "AndroidAP";
98b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
99e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey    private static NetworkTemplate sTemplateWifi = buildTemplateWifiWildcard();
1004e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1);
1014e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2);
1021b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey
103d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_RED = 1001;
104d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_BLUE = 1002;
105d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_GREEN = 1003;
10639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
107b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long mElapsedRealtime;
108b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private BroadcastInterceptingContext mServiceContext;
1103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private File mStatsDir;
1113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private INetworkManagementService mNetManager;
1133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private IAlarmManager mAlarmManager;
1143f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private TrustedTime mTime;
11539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private NetworkStatsSettings mSettings;
1163f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private IConnectivityManager mConnManager;
1173f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private NetworkStatsService mService;
119b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey    private INetworkStatsSession mSession;
1208e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private INetworkManagementEventObserver mNetworkObserver;
1213f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    @Override
1233f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void setUp() throws Exception {
1243f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        super.setUp();
1253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext = new BroadcastInterceptingContext(getContext());
1273f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mStatsDir = getContext().getFilesDir();
128b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        if (mStatsDir.exists()) {
129b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            IoUtils.deleteContents(mStatsDir);
130b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        }
1313f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1323f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mNetManager = createMock(INetworkManagementService.class);
1333f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager = createMock(IAlarmManager.class);
1343f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mTime = createMock(TrustedTime.class);
13539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mSettings = createMock(NetworkStatsSettings.class);
1363f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mConnManager = createMock(IConnectivityManager.class);
1373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1383f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = new NetworkStatsService(
13939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey                mServiceContext, mNetManager, mAlarmManager, mTime, mStatsDir, mSettings);
1403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.bindConnectivityManager(mConnManager);
1413f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
142b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime = 0L;
143b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
144b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
14539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
146b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
147b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
1488e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
1498e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1508e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        // catch INetworkManagementEventObserver during systemReady()
1518e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
1528e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey                INetworkManagementEventObserver>();
1538e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.registerObserver(capture(networkObserver));
1548e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
1553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
1573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
158e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        mSession = mService.openSession();
1593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        verifyAndReset();
1603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1618e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetworkObserver = networkObserver.getValue();
1628e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1633f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
1643f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1653f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    @Override
1663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void tearDown() throws Exception {
167ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        IoUtils.deleteContents(mStatsDir);
1683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext = null;
1703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mStatsDir = null;
1713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mNetManager = null;
1733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager = null;
1743f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mTime = null;
175b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mSettings = null;
176b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mConnManager = null;
1773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
178b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        mSession.close();
1793f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = null;
1803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        super.tearDown();
1823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
1833f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
184b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testNetworkStatsWifi() throws Exception {
1853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
1863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
187b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
18839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
18939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
190b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
191b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
192905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
1933f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1943f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
195f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
1963f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1973f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
198a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
19939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2003f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2013f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
202b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
203b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
20439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
205b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
206b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
207b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2088e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
2093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
2123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
214a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
21539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2163f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2173f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // and bump forward again, with counters going higher. this is
2183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // important, since polling should correctly subtract last snapshot.
219b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(DAY_IN_MILLIS);
220b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
22139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
222b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
223b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L));
224b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2258e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
2263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2273f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2283f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
2293f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2303f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
231a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4096L, 4L, 8192L, 8L, 0);
23239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
23339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
2343f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
2353f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
23639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsRebootPersist() throws Exception {
23739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
2383f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
2403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
241b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
24239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
24339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
244b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
245b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
246905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
2473f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2483f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
249f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
2503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
252a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
25339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
256b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
257b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
25839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
259b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
260b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L));
261b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2)
262b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
263b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
264b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
265b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
266b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 0L));
2678e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
268b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
269b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, false);
270b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 4);
271b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
272b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 6);
273a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
2743f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2753f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
2763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
278a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
279b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
280b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, 512L, 4L, 256L, 2L, 4);
281b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, 512L, 4L, 256L, 2L, 6);
282b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
28339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2843f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // graceful shutdown system, which should trigger persist of stats, and
2863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // clear any values in memory.
28734c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
28834c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectDefaultSettings();
28934c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        replay();
2903f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN));
29134c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        verifyAndReset();
2923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
29339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(true);
2943f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2953f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // boot through serviceReady() again
296b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
29739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
298b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
299b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3008e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
3018e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
3028e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        // catch INetworkManagementEventObserver during systemReady()
3038e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
3048e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey                INetworkManagementEventObserver>();
3058e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.registerObserver(capture(networkObserver));
3068e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
3073f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
3093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
3108e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
3118e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetworkObserver = networkObserver.getValue();
3123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // after systemReady(), we should have historical stats loaded again
314a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
315b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
316b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, 512L, 4L, 256L, 2L, 4);
317b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, 512L, 4L, 256L, 2L, 6);
318b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
31939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
32039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
32139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
32239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
32363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    // TODO: simulate reboot to test bucket resize
32463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    @Suppress
32539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsBucketResize() throws Exception {
32639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        NetworkStatsHistory history = null;
32739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
32839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
32939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
33039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
33139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // network state, and poll any existing interfaces before updating.
332b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
33339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
33439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
335b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
336b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
337905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
33839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
33939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
340f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
34139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
34239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
34339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // modify some number on wifi, and trigger poll event
344b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(2 * HOUR_IN_MILLIS);
345b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
34639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
347b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
348b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L));
349b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3508e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
35139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
35239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
35339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
35439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
35539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify service recorded history
356b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
357a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
358d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(HOUR_IN_MILLIS, history.getBucketDuration());
359d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(2, history.size());
36039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
36139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
36239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // now change bucket duration setting and trigger another poll with
36339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // exact same values, which should resize existing buckets.
364b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
36539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
366b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
367b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3688e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
36939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
37039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
37139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
37239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
37339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify identical stats, but spread across 4 buckets now
374b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
375a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
376d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(30 * MINUTE_IN_MILLIS, history.getBucketDuration());
377d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(4, history.size());
37839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
3793f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
3813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
382b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidStatsAcrossNetworks() throws Exception {
383b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend first mobile network comes online
384b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
385b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
386b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
387b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
388b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
389905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
390b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
391b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
392f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
393b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
394b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
395b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic on first network
396b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
397b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
398b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
399b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
400b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
401b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
402b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
403b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
404b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
4058e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
406b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
407a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 10);
408a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
409b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
410b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
411b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
412b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
413a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
414a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
415b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
416b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
417b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
418b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
419b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now switch networks; this also tests that we're okay with interfaces
420b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // disappearing, to verify we don't count backwards.
421b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
422b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
423b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
424b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_2));
425163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
426163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
427163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
428163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
429163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
430163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
4318e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
432b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
433b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
434f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
435b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
436b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
437b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
438b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create traffic on second network
439b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
440b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
441b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
442b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
443163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2176L, 17L, 1536L, 12L));
444b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
445163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
446163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
447163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 640L, 5L, 1024L, 8L, 0L)
448b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xFAAD, 128L, 1L, 1024L, 8L, 0L));
4498e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
450b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
451b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_BLUE, 0xFAAD, 10);
452a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
453b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
454b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
455b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
456b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify original history still intact
457a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
458b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
459b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
460b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
461b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // and verify new history also recorded under different template, which
462b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verifies that we didn't cross the streams.
463a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi2, 128L, 1L, 1024L, 8L, 0);
464a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
465a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateImsi2, UID_BLUE, 128L, 1L, 1024L, 8L, 10);
466b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
467b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
468b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
469b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
470b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidRemovedIsMoved() throws Exception {
471b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend that network comes online
472b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
473b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
474b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildWifiState());
475b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
476b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
477905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
478b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
479b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
480f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
481b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
482b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
483b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic
484b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
485b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
486b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
487b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
488b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
489b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
490b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
491b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
492b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
493b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
4948e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
495b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
496b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 10);
497a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
498b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
499b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
500b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
501b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
502a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
503a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10);
504b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0);
505b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
506b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
507b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
508b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now pretend two UIDs are uninstalled, which should migrate stats to
509b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // special "removed" bucket.
51034c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
511b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
512163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
513163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
514163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
515163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
516163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
517163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
518163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
519163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsPoll();
520163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey
521b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
522b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final Intent intent = new Intent(ACTION_UID_REMOVED);
523d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_BLUE);
524b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
525d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_RED);
526b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
527b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
528b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // existing uid and total should remain unchanged; but removed UID
529b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // should be gone completely.
530a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
531a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0);
532a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 0L, 0L, 0L, 0L, 0);
533b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
534b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10);
535b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
536b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
537b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
538b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
539d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testUid3g4gCombinedByTemplate() throws Exception {
540d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
541b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
542d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
543d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
544b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
545b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
546905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
547d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
548d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
549f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
550d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
551d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
552d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic
553b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
554b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
555d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
556b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
557b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
558b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
559b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
5608e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
561d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
562a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 5);
563a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
564d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
565d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
566d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
567d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
568b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5);
569d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
570d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
571d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now switch over to 4g network
572b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
573b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
574d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
575163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkState(buildMobile4gState(TEST_IFACE2));
576b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
577163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
578163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
579163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
5808e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
581d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
582d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
583f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
584d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
585d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
586d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
587d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create traffic on second network
588b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
589b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
590d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
591b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
592b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
593163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
594163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
595163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
596163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, 0xFAAD, 512L, 4L, 256L, 2L, 0L));
5978e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
598d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
599b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 5);
600a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
601d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
602d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
603d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
604d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify that ALL_MOBILE template combines both
605b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 10);
606d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
607d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
608d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
609d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
610d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testSummaryForAllUid() throws Exception {
611d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
612b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
613d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
614d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildWifiState());
615b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
616b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
617905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
618d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
619d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
620f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
621d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
622d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
623d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic for two apps
624b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
625b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
626d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
627b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
628b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
629b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
630b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
631b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0L));
6328e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
633d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
634a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
635a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
636d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
637d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
638d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
639d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
640b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1);
641b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0);
642d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
643a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
644d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now create more traffic in next hour, but only for one app
645b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
646b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
647d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
648b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
649b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
650163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
651163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
652b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L));
6538e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
654a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
655d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
656d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
657d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
658d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // first verify entire history present
659b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        NetworkStats stats = mSession.getSummaryForAllUid(
660d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
661d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(3, stats.size());
662b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 1);
663b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 1);
664b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0);
665d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
666d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now verify that recent history only contains one uid
667b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        final long currentTime = currentTimeMillis();
668b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        stats = mSession.getSummaryForAllUid(
669d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true);
670d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(1, stats.size());
671b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0);
672b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
673b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
674b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
675b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
676b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    public void testForegroundBackground() throws Exception {
677b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // pretend that network comes online
678b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
679b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
680b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkState(buildWifiState());
681b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
682b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
683905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
684b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
685b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
686f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
687b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
688b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
689b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // create some initial traffic
690b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
691b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
692b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
693b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
694b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
695b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
696b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L));
6978e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
698b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
699b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
700b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
701b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
702b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
703b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
704b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify service recorded history
705b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1);
706b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
707b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
708b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // now switch to foreground
709b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
710b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
711b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
712b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
713b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
714b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
715b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L)
716b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 0L)
717b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 0L));
7188e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
719b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
720b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
721b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 1);
722b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
723b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
724b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
725b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
726b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // test that we combined correctly
727b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 160L, 4L, 160L, 4L, 2);
728b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
729b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify entire history present
730b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        final NetworkStats stats = mSession.getSummaryForAllUid(
731b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
732b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertEquals(4, stats.size());
733b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 1);
734b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 1);
735b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 1);
736b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 1);
737d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
738d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
739d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
740d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
741905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    public void testTethering() throws Exception {
742905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // pretend first mobile network comes online
743905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
744905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
745905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
746905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
747905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
748905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
749905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
750905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        replay();
751f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
752905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        verifyAndReset();
753905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
754905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // create some tethering traffic
755905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
756905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
757905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
758905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
759905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
76063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
76163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats uidStats = new NetworkStats(getElapsedRealtime(), 1)
76263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L);
763905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        final String[] tetherIfacePairs = new String[] { TEST_IFACE, "wlan0" };
76463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats tetherStats = new NetworkStats(getElapsedRealtime(), 1)
76563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L, 0L);
76663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
76763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expectNetworkStatsUidDetail(uidStats, tetherIfacePairs, tetherStats);
76863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expectNetworkStatsPoll();
769905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
770905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        replay();
771905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
772905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
773905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // verify service recorded history
774905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
775905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
776905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_TETHERING, 1920L, 14L, 384L, 2L, 0);
777905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        verifyAndReset();
778905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
779905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    }
780905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
78170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    public void testReportXtOverDev() throws Exception {
78270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // bring mobile network online
78370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectCurrentTime();
78470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectDefaultSettings();
78570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
78670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
78770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
78870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsPoll();
78970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
79070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        replay();
791f851d6dd2a15b74f63c85403afad0ed747f7311cErik Kline        mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
79270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        verifyAndReset();
79370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
79470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // create some traffic, but only for DEV, and across 1.5 buckets
79570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        incrementCurrentTime(90 * MINUTE_IN_MILLIS);
79670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectCurrentTime();
79770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectDefaultSettings();
79870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsSummaryDev(new NetworkStats(getElapsedRealtime(), 1)
79970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                .addIfaceValues(TEST_IFACE, 6000L, 60L, 3000L, 30L));
80070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsSummaryXt(buildEmptyStats());
80170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
80270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsPoll();
80370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
80470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        replay();
80570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
80670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
80770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify service recorded history:
80870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // 4000(dev) + 2000(dev)
80970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 6000L, 60L, 3000L, 30L, 0);
81070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        verifyAndReset();
81170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
81270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // create traffic on both DEV and XT, across two buckets
81370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        incrementCurrentTime(2 * HOUR_IN_MILLIS);
81470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectCurrentTime();
81570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectDefaultSettings();
81670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsSummaryDev(new NetworkStats(getElapsedRealtime(), 1)
81770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                .addIfaceValues(TEST_IFACE, 6004L, 64L, 3004L, 34L));
81870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsSummaryXt(new NetworkStats(getElapsedRealtime(), 1)
81970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                .addIfaceValues(TEST_IFACE, 10240L, 0L, 0L, 0L));
82070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
82170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsPoll();
82270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
82370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        replay();
82470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
82570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
82670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify that we switching reporting at the first atomic XT bucket,
82770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // which should give us:
82870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // 4000(dev) + 2000(dev) + 1(dev) + 5120(xt) + 2560(xt)
82970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 13681L, 61L, 3001L, 31L, 0);
83070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
83170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // also test pure-DEV and pure-XT ranges
83270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, startTimeMillis(),
83370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                startTimeMillis() + 2 * HOUR_IN_MILLIS, 6001L, 61L, 3001L, 31L, 0);
83470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, startTimeMillis() + 2 * HOUR_IN_MILLIS,
83570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                startTimeMillis() + 4 * HOUR_IN_MILLIS, 7680L, 0L, 0L, 0L, 0);
83670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
83770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        verifyAndReset();
83870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
83970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
840a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertNetworkTotal(NetworkTemplate template, long rxBytes, long rxPackets,
841b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            long txBytes, long txPackets, int operations) throws Exception {
84270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertNetworkTotal(template, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
84370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                txPackets, operations);
84470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
84570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
84670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    private void assertNetworkTotal(NetworkTemplate template, long start, long end, long rxBytes,
84770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) throws Exception {
84870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify history API
849b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        final NetworkStatsHistory history = mSession.getHistoryForNetwork(template, FIELD_ALL);
85070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertValues(history, start, end, rxBytes, rxPackets, txBytes, txPackets, operations);
85170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
85270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify summary API
85370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        final NetworkStats stats = mSession.getSummaryForNetwork(template, start, end);
85470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_ALL, SET_DEFAULT, TAG_NONE, rxBytes, rxPackets, txBytes,
855a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey                txPackets, operations);
8563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
8573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
858a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets,
859b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            long txBytes, long txPackets, int operations) throws Exception {
860b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(template, uid, SET_ALL, rxBytes, rxPackets, txBytes, txPackets, operations);
861b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
862b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
863b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void assertUidTotal(NetworkTemplate template, int uid, int set, long rxBytes,
864b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) throws Exception {
86570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify history API
866b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        final NetworkStatsHistory history = mSession.getHistoryForUid(
867b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                template, uid, set, TAG_NONE, FIELD_ALL);
868a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
869a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey                txPackets, operations);
87070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
87170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify summary API
87270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        final NetworkStats stats = mSession.getSummaryForAllUid(
87370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                template, Long.MIN_VALUE, Long.MAX_VALUE, false);
87470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertValues(stats, IFACE_ALL, uid, set, TAG_NONE, rxBytes, rxPackets, txBytes, txPackets,
87570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                operations);
87639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
87739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
8788e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private void expectSystemReady() throws Exception {
8793f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mAlarmManager.remove(isA(PendingIntent.class));
8803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expectLastCall().anyTimes();
8813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
882ebe51fc0d860077245c44bfb00130be62da001e1David Christie        mAlarmManager.set(eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), anyLong(),
8834870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn                anyInt(), isA(PendingIntent.class), isA(WorkSource.class),
884235510e67210f90de30c2d5582a2077ccc589619Jose Lima                isA(AlarmManager.AlarmClockInfo.class));
8853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expectLastCall().atLeastOnce();
886b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
8878e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.setGlobalAlert(anyLong());
8888e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
889f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey
890f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey        expect(mNetManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce();
8913f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
8923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
89339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkState(NetworkState... state) throws Exception {
89439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
89563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
89663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final LinkProperties linkProp = state.length > 0 ? state[0].linkProperties : null;
89763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mConnManager.getActiveLinkProperties()).andReturn(linkProp).atLeastOnce();
89839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
89939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
90039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
90170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsSummaryDev(summary);
90270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsSummaryXt(summary);
90370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
90470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
90570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    private void expectNetworkStatsSummaryDev(NetworkStats summary) throws Exception {
906e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        expect(mNetManager.getNetworkStatsSummaryDev()).andReturn(summary).atLeastOnce();
90770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
90870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
90970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    private void expectNetworkStatsSummaryXt(NetworkStats summary) throws Exception {
910e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        expect(mNetManager.getNetworkStatsSummaryXt()).andReturn(summary).atLeastOnce();
91139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
91239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
913a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception {
91463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expectNetworkStatsUidDetail(detail, new String[0], new NetworkStats(0L, 0));
91563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
91663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
91763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private void expectNetworkStatsUidDetail(
91863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            NetworkStats detail, String[] tetherIfacePairs, NetworkStats tetherStats)
91963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            throws Exception {
920a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        expect(mNetManager.getNetworkStatsUidDetail(eq(UID_ALL))).andReturn(detail).atLeastOnce();
92163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
92263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // also include tethering details, since they are folded into UID
923e4984bea95a07dea0ef0259fefa1e52f0bbb1533Jeff Sharkey        expect(mNetManager.getNetworkStatsTethering())
92463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .andReturn(tetherStats).atLeastOnce();
92539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
92639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
92739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectDefaultSettings() throws Exception {
92839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
92939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
93039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
93163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private void expectSettings(long persistBytes, long bucketDuration, long deleteAge)
93239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey            throws Exception {
93339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes();
93439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes();
93563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getSampleEnabled()).andReturn(true).anyTimes();
93663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
937ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        final Config config = new Config(bucketDuration, deleteAge, deleteAge);
93863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getDevConfig()).andReturn(config).anyTimes();
939e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        expect(mSettings.getXtConfig()).andReturn(config).anyTimes();
94063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getUidConfig()).andReturn(config).anyTimes();
94163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getUidTagConfig()).andReturn(config).anyTimes();
942ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey
943ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getGlobalAlertBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
944ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getDevPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
945ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getXtPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
946ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getUidPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
947ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getUidTagPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
94839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
94939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
950b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void expectCurrentTime() throws Exception {
9513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.forceRefresh()).andReturn(false).anyTimes();
9523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.hasCache()).andReturn(true).anyTimes();
953b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes();
9543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.getCacheAge()).andReturn(0L).anyTimes();
9553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes();
9563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
9573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
9588e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private void expectNetworkStatsPoll() throws Exception {
9598e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.setGlobalAlert(anyLong());
9608e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().anyTimes();
9618e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    }
9628e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
96339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void assertStatsFilesExist(boolean exist) {
96463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final File basePath = new File(mStatsDir, "netstats");
96539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        if (exist) {
96663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            assertTrue(basePath.list().length > 0);
96739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        } else {
96863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            assertTrue(basePath.list().length == 0);
96939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        }
97039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
97139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
972b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private static void assertValues(NetworkStats stats, String iface, int uid, int set,
973b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) {
97470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        final NetworkStats.Entry entry = new NetworkStats.Entry();
97570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        if (set == SET_DEFAULT || set == SET_ALL) {
97670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            final int i = stats.findIndex(iface, uid, SET_DEFAULT, tag);
97770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            if (i != -1) {
97870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                entry.add(stats.getValues(i, null));
97970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            }
98070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        }
98170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        if (set == SET_FOREGROUND || set == SET_ALL) {
98270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            final int i = stats.findIndex(iface, uid, SET_FOREGROUND, tag);
98370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            if (i != -1) {
98470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                entry.add(stats.getValues(i, null));
98570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            }
98670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        }
98770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
988a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
989a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
990a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
991a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
992a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
993d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
994d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
995a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private static void assertValues(NetworkStatsHistory stats, long start, long end, long rxBytes,
996a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) {
997434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        final NetworkStatsHistory.Entry entry = stats.getValues(start, end, null);
998434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
999a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
1000434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
1001a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
1002a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
1003434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey    }
1004434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey
100539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private static NetworkState buildWifiState() {
100639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
100739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
100839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final LinkProperties prop = new LinkProperties();
100939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        prop.setInterfaceName(TEST_IFACE);
101021b5ee3f0e39be4a79bcfb2b79b0529f75f5cb58Sreeram Ramachandran        return new NetworkState(info, prop, null, null, null, TEST_SSID);
101139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
101239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
1013b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static NetworkState buildMobile3gState(String subscriberId) {
1014b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final NetworkInfo info = new NetworkInfo(
1015b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey                TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UMTS, null, null);
1016b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
1017b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final LinkProperties prop = new LinkProperties();
1018b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        prop.setInterfaceName(TEST_IFACE);
101921b5ee3f0e39be4a79bcfb2b79b0529f75f5cb58Sreeram Ramachandran        return new NetworkState(info, prop, null, null, subscriberId, null);
1020b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
1021b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
1022163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static NetworkState buildMobile4gState(String iface) {
1023d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIMAX, 0, null, null);
1024d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
1025d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final LinkProperties prop = new LinkProperties();
1026163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        prop.setInterfaceName(iface);
10273256601f5e4d94713f59e97b9d4912875c1bdcafJeff Sharkey        return new NetworkState(info, prop, null, null, null, null);
1028d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
1029d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
1030b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private NetworkStats buildEmptyStats() {
1031b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return new NetworkStats(getElapsedRealtime(), 0);
1032b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1033b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1034b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long getElapsedRealtime() {
1035b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return mElapsedRealtime;
1036b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1037b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1038b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long startTimeMillis() {
1039b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return TEST_START;
1040b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1041b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1042b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long currentTimeMillis() {
1043b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return startTimeMillis() + mElapsedRealtime;
1044b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1045b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1046b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void incrementCurrentTime(long duration) {
1047b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime += duration;
104839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
104939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
10503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private void replay() {
105139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        EasyMock.replay(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
10523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
10533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
10543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private void verifyAndReset() {
105539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        EasyMock.verify(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
105639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        EasyMock.reset(mNetManager, mAlarmManager, mTime, mSettings, mConnManager);
10573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
10583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey}
1059