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
17cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadopackage com.android.server.net;
183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
19b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.content.Intent.ACTION_UID_REMOVED;
20b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.content.Intent.EXTRA_UID;
21b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.net.ConnectivityManager.TYPE_MOBILE;
223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.net.ConnectivityManager.TYPE_WIFI;
23d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkeyimport static android.net.ConnectivityManager.TYPE_WIMAX;
24d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkeyimport static android.net.NetworkStats.IFACE_ALL;
25a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidsonimport static android.net.NetworkStats.ROAMING_ALL;
261f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidsonimport static android.net.NetworkStats.ROAMING_NO;
271f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidsonimport static android.net.NetworkStats.ROAMING_YES;
28b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_ALL;
29b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_DEFAULT;
30b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_FOREGROUND;
311b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static android.net.NetworkStats.TAG_NONE;
323f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.net.NetworkStats.UID_ALL;
3363d27a9233fed934340231f438493746084a681dJeff Sharkeyimport static android.net.NetworkStatsHistory.FIELD_ALL;
344e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateMobileAll;
35e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateWifiWildcard;
36241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkeyimport static android.net.TrafficStats.MB_IN_BYTES;
37b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.net.TrafficStats.UID_REMOVED;
38905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkeyimport static android.net.TrafficStats.UID_TETHERING;
393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.DAY_IN_MILLIS;
403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.HOUR_IN_MILLIS;
4139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS;
4239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.WEEK_IN_MILLIS;
433f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL;
444870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackbornimport static org.easymock.EasyMock.anyInt;
453f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.anyLong;
46cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport static org.easymock.EasyMock.anyObject;
478e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport static org.easymock.EasyMock.capture;
483f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.createMock;
493f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.eq;
503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.expect;
513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.expectLastCall;
523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.isA;
533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.AlarmManager;
55b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidsonimport android.app.IAlarmListener;
563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.IAlarmManager;
573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.PendingIntent;
58cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.app.usage.NetworkStatsManager;
59cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.content.Context;
603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.content.Intent;
61cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.net.DataUsageRequest;
623f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.IConnectivityManager;
638e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport android.net.INetworkManagementEventObserver;
64b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkeyimport android.net.INetworkStatsSession;
653f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.LinkProperties;
663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo;
673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo.DetailedState;
683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkState;
693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStats;
703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStatsHistory;
711b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkTemplate;
72cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.ConditionVariable;
73cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.Handler;
74cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.HandlerThread;
753f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.os.INetworkManagementService;
76cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.IBinder;
77cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.Looper;
78cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.Messenger;
79cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.MessageQueue;
80cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.MessageQueue.IdleHandler;
81cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.Message;
82cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.PowerManager;
83df2cab2fc46c3f2c56f85dee1a19d0fa48cfd444David Christieimport android.os.WorkSource;
84b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport android.telephony.TelephonyManager;
853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.AndroidTestCase;
863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest;
8763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.test.suitebuilder.annotation.Suppress;
883f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.util.TrustedTime;
893f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
90b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidsonimport com.android.internal.net.VpnInfo;
91cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport com.android.server.BroadcastInterceptingContext;
923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport com.android.server.net.NetworkStatsService;
9339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings;
9463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config;
953f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
96e4984bea95a07dea0ef0259fefa1e52f0bbb1533Jeff Sharkeyimport libcore.io.IoUtils;
97e4984bea95a07dea0ef0259fefa1e52f0bbb1533Jeff Sharkey
988e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport org.easymock.Capture;
993f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport org.easymock.EasyMock;
1003f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1013f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport java.io.File;
102a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidsonimport java.util.ArrayList;
1036965c1869aa8499706522d057b5143bbc240178bAntonio Cansadoimport java.util.Objects;
104a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidsonimport java.util.List;
105b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1063f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey/**
1073f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * Tests for {@link NetworkStatsService}.
108b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson *
109b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson * TODO: This test is really brittle, largely due to overly-strict use of Easymock.
110b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson * Rewrite w/ Mockito.
1113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey */
1123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey@LargeTest
1133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeypublic class NetworkStatsServiceTest extends AndroidTestCase {
114b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey    private static final String TAG = "NetworkStatsServiceTest";
1153f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1163f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final String TEST_IFACE = "test0";
117163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static final String TEST_IFACE2 = "test1";
1183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final long TEST_START = 1194220800000L;
1193f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
120b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_1 = "310004";
121b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_2 = "310260";
122ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey    private static final String TEST_SSID = "AndroidAP";
123b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
124e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey    private static NetworkTemplate sTemplateWifi = buildTemplateWifiWildcard();
1254e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1);
1264e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2);
1271b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey
128d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_RED = 1001;
129d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_BLUE = 1002;
130d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_GREEN = 1003;
13139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
132cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private static final long WAIT_TIMEOUT = 2 * 1000;  // 2 secs
133cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private static final int INVALID_TYPE = -1;
134cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
135b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long mElapsedRealtime;
136b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private BroadcastInterceptingContext mServiceContext;
1383f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private File mStatsDir;
1393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private INetworkManagementService mNetManager;
1413f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private TrustedTime mTime;
14239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private NetworkStatsSettings mSettings;
1433f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private IConnectivityManager mConnManager;
144cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private IdleableHandlerThread mHandlerThread;
145cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private Handler mHandler;
1463f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1473f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private NetworkStatsService mService;
148b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey    private INetworkStatsSession mSession;
1498e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private INetworkManagementEventObserver mNetworkObserver;
1503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    @Override
1523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void setUp() throws Exception {
1533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        super.setUp();
1543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext = new BroadcastInterceptingContext(getContext());
1563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mStatsDir = getContext().getFilesDir();
157b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        if (mStatsDir.exists()) {
158b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            IoUtils.deleteContents(mStatsDir);
159b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        }
1603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mNetManager = createMock(INetworkManagementService.class);
162cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
163cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // TODO: Mock AlarmManager when migrating this test to Mockito.
164cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        AlarmManager alarmManager = (AlarmManager) mServiceContext
165cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                .getSystemService(Context.ALARM_SERVICE);
1663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mTime = createMock(TrustedTime.class);
16739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        mSettings = createMock(NetworkStatsSettings.class);
1683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mConnManager = createMock(IConnectivityManager.class);
1693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
170cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        PowerManager powerManager = (PowerManager) mServiceContext.getSystemService(
171cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                Context.POWER_SERVICE);
172cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        PowerManager.WakeLock wakeLock =
173cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
174cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1753f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = new NetworkStatsService(
176cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                mServiceContext, mNetManager, alarmManager, wakeLock, mTime,
177cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                TelephonyManager.getDefault(), mSettings, new NetworkStatsObservers(),
178cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                mStatsDir, getBaseDir(mStatsDir));
179cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandlerThread = new IdleableHandlerThread("HandlerThread");
180cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandlerThread.start();
181cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        Handler.Callback callback = new NetworkStatsService.HandlerCallback(mService);
182cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandler = new Handler(mHandlerThread.getLooper(), callback);
183cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mService.setHandler(mHandler, callback);
1843f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.bindConnectivityManager(mConnManager);
1853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
186b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime = 0L;
187b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
188b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
18939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
190b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
1918e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
1928e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1938e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        // catch INetworkManagementEventObserver during systemReady()
1948e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
1958e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey                INetworkManagementEventObserver>();
1968e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.registerObserver(capture(networkObserver));
1978e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
1983f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1993f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
2003f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
201e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        mSession = mService.openSession();
2023f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        verifyAndReset();
2033f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2048e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetworkObserver = networkObserver.getValue();
2058e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
2063f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
2073f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    @Override
2093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void tearDown() throws Exception {
210ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        IoUtils.deleteContents(mStatsDir);
2113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext = null;
2133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mStatsDir = null;
2143f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2153f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mNetManager = null;
2163f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mTime = null;
217b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mSettings = null;
218b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mConnManager = null;
2193f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
220b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        mSession.close();
2213f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = null;
2223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2233f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        super.tearDown();
2243f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
2253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
226b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testNetworkStatsWifi() throws Exception {
2273f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
2283f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
229b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
23039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
23139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
232b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
233b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
234905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
235b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
2363f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
238b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
2393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
241a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
24239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2433f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2443f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
245b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
246b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
24739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
248b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
249b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
250b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2518e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
2523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
254cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
2553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
257a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
25839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // and bump forward again, with counters going higher. this is
2613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // important, since polling should correctly subtract last snapshot.
262b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(DAY_IN_MILLIS);
263b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
26439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
265b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
266b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L));
267b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
2688e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
2693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
271cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
2723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
274a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4096L, 4L, 8192L, 8L, 0);
27539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
27639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
2773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
2783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
27939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsRebootPersist() throws Exception {
28039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
2813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
2833f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
284b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
28539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
28639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
287b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
288b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
289905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
290b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
2913f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
293b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
2943f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2953f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
296a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
29739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
2983f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2993f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
300b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
301b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
30239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
303b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
304b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L));
305b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2)
306b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
307b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
308b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
309b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
310b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 0L));
3118e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
312b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
313b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, false);
314b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 4);
315b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
316b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 6);
317a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
3183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
319cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
3203f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3213f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
322a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
323b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
3241f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_NO, 512L, 4L, 256L, 2L, 4);
3251f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_NO, 512L, 4L, 256L, 2L,
326a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                6);
327b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
32839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
3293f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3303f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // graceful shutdown system, which should trigger persist of stats, and
3313f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // clear any values in memory.
33234c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
33334c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectDefaultSettings();
33434c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        replay();
3353f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN));
33634c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        verifyAndReset();
3373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
33839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(true);
3393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // boot through serviceReady() again
341b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
34239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
343b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3448e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
3458e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
3468e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        // catch INetworkManagementEventObserver during systemReady()
3478e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
3488e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey                INetworkManagementEventObserver>();
3498e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.registerObserver(capture(networkObserver));
3508e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
3513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        replay();
3533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
3548e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
3558e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetworkObserver = networkObserver.getValue();
3563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // after systemReady(), we should have historical stats loaded again
358a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
359b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
3601f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_NO, 512L, 4L, 256L, 2L, 4);
3611f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_NO, 512L, 4L, 256L, 2L,
362a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                6);
363b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
36439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
36539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
36639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
36739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
36863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    // TODO: simulate reboot to test bucket resize
36963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    @Suppress
37039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsBucketResize() throws Exception {
37139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        NetworkStatsHistory history = null;
37239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
37339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
37439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
37539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
37639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // network state, and poll any existing interfaces before updating.
377b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
37839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
37939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
380b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
381b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
382905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
383b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
38439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
38539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
386b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
38739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
38839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
38939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // modify some number on wifi, and trigger poll event
390b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(2 * HOUR_IN_MILLIS);
391b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
39239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
393b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
394b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L));
395b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3968e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
39739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
39839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
399cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
40039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
40139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify service recorded history
402b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
403a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
404d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(HOUR_IN_MILLIS, history.getBucketDuration());
405d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(2, history.size());
40639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
40739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
40839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // now change bucket duration setting and trigger another poll with
40939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // exact same values, which should resize existing buckets.
410b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
41139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
412b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
413b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
4148e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
41539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
41639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        replay();
417cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
41839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
41939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify identical stats, but spread across 4 buckets now
420b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
421a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
422d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(30 * MINUTE_IN_MILLIS, history.getBucketDuration());
423d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(4, history.size());
42439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        verifyAndReset();
4253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
4263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
4273f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
428b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidStatsAcrossNetworks() throws Exception {
429b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend first mobile network comes online
430b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
431b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
432b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
433b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
434b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
435905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
436b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
437b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
438b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
439b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
440b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
441b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
442b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic on first network
443b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
444b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
445b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
446b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
447b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
448b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
449b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
450b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
451b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
4528e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
453b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
454a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 10);
455a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
456b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
457cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
458b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
459b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
460a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
461a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
462b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
463b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
464b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
465b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
466b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now switch networks; this also tests that we're okay with interfaces
467b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // disappearing, to verify we don't count backwards.
468b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
469b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
470b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
471b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_2));
472163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
473163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
474163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
475163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
476163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
477163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
4788e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
479b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
480b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
481b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
482b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
483cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
484b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
485b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
486b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create traffic on second network
487b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
488b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
489b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
490b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
491163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2176L, 17L, 1536L, 12L));
492b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
493163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
494163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
495163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 640L, 5L, 1024L, 8L, 0L)
496b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xFAAD, 128L, 1L, 1024L, 8L, 0L));
4978e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
498b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
499b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_BLUE, 0xFAAD, 10);
500a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
501b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
502cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
503b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
504b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify original history still intact
505a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
506b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
507b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
508b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
509b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // and verify new history also recorded under different template, which
510b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verifies that we didn't cross the streams.
511a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi2, 128L, 1L, 1024L, 8L, 0);
512a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
513a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateImsi2, UID_BLUE, 128L, 1L, 1024L, 8L, 10);
514b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
515b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
516b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
517b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
518b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidRemovedIsMoved() throws Exception {
519b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend that network comes online
520b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
521b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
522b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildWifiState());
523b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
524b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
525905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
526b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
527b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
528b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
529b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
530b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
531b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
532b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic
533b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
534b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
535b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
536b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
537b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
538b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
539b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
540b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
541b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
542b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
5438e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
544b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
545b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 10);
546a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
547b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
548cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
549b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
550b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
551a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
552a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10);
553b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0);
554b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
555b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
556b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
557b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now pretend two UIDs are uninstalled, which should migrate stats to
558b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // special "removed" bucket.
55934c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
560b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
561163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
562163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
563163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
564163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
565163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
566163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
567163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
568163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsPoll();
569163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey
570b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        replay();
571b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final Intent intent = new Intent(ACTION_UID_REMOVED);
572d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_BLUE);
573b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
574d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_RED);
575b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
576b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
577b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // existing uid and total should remain unchanged; but removed UID
578b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // should be gone completely.
579a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
580a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0);
581a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 0L, 0L, 0L, 0L, 0);
582b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
583b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10);
584b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        verifyAndReset();
585b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
586b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
587b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
588d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testUid3g4gCombinedByTemplate() throws Exception {
589d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
590b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
591d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
592d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
593b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
594b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
595905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
596b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
597d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
598d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
599b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
600d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
601d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
602d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic
603b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
604b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
605d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
606b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
607b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
608b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
609b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
6108e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
611d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
612a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 5);
613a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
614d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
615cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
616d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
617d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
618b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5);
619d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
620d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
621d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now switch over to 4g network
622b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
623b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
624d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
625163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkState(buildMobile4gState(TEST_IFACE2));
626b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
627163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
628163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
629163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
6308e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
631b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
632d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
633d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
634b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
635cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
636d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
637d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
638d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create traffic on second network
639b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
640b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
641d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
642b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
643b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
644163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
645163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
646163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
647163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, 0xFAAD, 512L, 4L, 256L, 2L, 0L));
6488e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
649d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
650b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 5);
651a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
652d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
653cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
654d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
655d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify that ALL_MOBILE template combines both
656b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 10);
657d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
658d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
659d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
660d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
661d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testSummaryForAllUid() throws Exception {
662d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
663b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
664d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
665d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildWifiState());
666b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
667b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
668905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
669b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
670d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
671d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
672b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
673d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
674d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
675d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic for two apps
676b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
677b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
678d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
679b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
680b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
681b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
682b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
683b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0L));
6848e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
685d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
686a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
687a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
688d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
689cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
690d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
691d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
692b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1);
693b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0);
694d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
695a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
696d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now create more traffic in next hour, but only for one app
697b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
698b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
699d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
700b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
701b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
702163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
703163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
704b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L));
7058e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
706a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
707d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        replay();
708cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
709d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
710d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // first verify entire history present
711b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        NetworkStats stats = mSession.getSummaryForAllUid(
712d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
713d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(3, stats.size());
7141f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 50L, 5L,
715a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                50L, 5L, 1);
7161f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 10L, 1L, 10L,
717a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                1L, 1);
7181f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_NO, 2048L, 16L,
719a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                1024L, 8L, 0);
720d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
721d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now verify that recent history only contains one uid
722b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        final long currentTime = currentTimeMillis();
723b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        stats = mSession.getSummaryForAllUid(
724d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true);
725d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(1, stats.size());
7261f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L,
727a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                512L, 4L, 0);
728b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
729b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
730b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
731b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
732b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    public void testForegroundBackground() throws Exception {
733b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // pretend that network comes online
734b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
735b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
736b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkState(buildWifiState());
737b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
738b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
739905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
740b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
741b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
742b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
743b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
744b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
745b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
746b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // create some initial traffic
747b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
748b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
749b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
750b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
751b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
752b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
753b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L));
7548e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
755b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
756b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
757b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
758b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
759cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
760b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
761b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify service recorded history
762b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1);
763b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        verifyAndReset();
764b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
765b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // now switch to foreground
766b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
767b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
768b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
769b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
770b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
771b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
772b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L)
773b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 0L)
774b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 0L));
7758e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectNetworkStatsPoll();
776b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
777b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
778b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 1);
779b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
780b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        replay();
781cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
782b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
783b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // test that we combined correctly
784b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 160L, 4L, 160L, 4L, 2);
785b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
786b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify entire history present
787b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        final NetworkStats stats = mSession.getSummaryForAllUid(
788b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
789b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertEquals(4, stats.size());
7901f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L,
791a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                128L, 2L, 1);
7921f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L,
793a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                1L, 1);
7941f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 32L, 2L,
795a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                32L, 2L, 1);
7961f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, ROAMING_NO, 1L, 1L, 1L,
797a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                1L, 1);
798a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
799a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        verifyAndReset();
800a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson    }
801a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
802a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson    public void testRoaming() throws Exception {
803a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // pretend that network comes online
804a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectCurrentTime();
805a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectDefaultSettings();
806a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkState(buildMobile3gState(IMSI_1, true /* isRoaming */));
807a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsSummary(buildEmptyStats());
808a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsUidDetail(buildEmptyStats());
809a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsPoll();
810a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectBandwidthControlCheck();
811a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
812a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        replay();
813a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        mService.forceUpdateIfaces();
814a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        verifyAndReset();
815a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
816a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // Create some traffic
817a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        incrementCurrentTime(HOUR_IN_MILLIS);
818a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectCurrentTime();
819a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectDefaultSettings();
820a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsSummary(buildEmptyStats());
8211f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        // Note that all traffic from NetworkManagementService is tagged as ROAMING_NO, because
822a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // roaming isn't tracked at that layer. We layer it on top by inspecting the iface
823a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // properties.
824a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
8251f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L,
826a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                        128L, 2L, 0L)
8271f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L,
828a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                        1L, 0L));
829a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsPoll();
830a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
831a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        replay();
832cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
833a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
834a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // verify service recorded history
835a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
836a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
837a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // verify entire history present
838a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        final NetworkStats stats = mSession.getSummaryForAllUid(
839a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
840a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        assertEquals(2, stats.size());
8411f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 2L,
842a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                128L, 2L, 0);
8431f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES, 64L, 1L, 64L,
844a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                1L, 0);
845d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
846d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        verifyAndReset();
847d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
848d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
849905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    public void testTethering() throws Exception {
850905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // pretend first mobile network comes online
851905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
852905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
853905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
854905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
855905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
856905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsPoll();
857b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
858905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
859905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        replay();
860b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
861905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        verifyAndReset();
862905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
863905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // create some tethering traffic
864905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
865905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
866905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
867905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
868905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
86963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
87063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats uidStats = new NetworkStats(getElapsedRealtime(), 1)
87163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L);
872905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        final String[] tetherIfacePairs = new String[] { TEST_IFACE, "wlan0" };
87363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats tetherStats = new NetworkStats(getElapsedRealtime(), 1)
87463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L, 0L);
87563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
87663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expectNetworkStatsUidDetail(uidStats, tetherIfacePairs, tetherStats);
87763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expectNetworkStatsPoll();
878905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
879905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        replay();
880cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
881905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
882905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // verify service recorded history
883905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
884905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
885905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_TETHERING, 1920L, 14L, 384L, 2L, 0);
886905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        verifyAndReset();
887905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
888905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    }
889905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
8906965c1869aa8499706522d057b5143bbc240178bAntonio Cansado    public void testRegisterUsageCallback() throws Exception {
891cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // pretend that wifi network comes online; service should ask about full
892cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // network state, and poll any existing interfaces before updating.
893cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectCurrentTime();
894cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectDefaultSettings();
895cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkState(buildWifiState());
896cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsSummary(buildEmptyStats());
897cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsUidDetail(buildEmptyStats());
898cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsPoll();
899cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectBandwidthControlCheck();
900cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
901cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        replay();
902cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mService.forceUpdateIfaces();
903cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
904cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // verify service has empty history for wifi
905cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
906cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        verifyAndReset();
907cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
908cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        String callingPackage = "the.calling.package";
909cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        long thresholdInBytes = 1L;  // very small; should be overriden by framework
910cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        DataUsageRequest inputRequest = new DataUsageRequest(
9116965c1869aa8499706522d057b5143bbc240178bAntonio Cansado                DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdInBytes);
912cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
913cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Create a messenger that waits for callback activity
914cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        ConditionVariable cv = new ConditionVariable(false);
915cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        LatchedHandler latchedHandler = new LatchedHandler(Looper.getMainLooper(), cv);
916cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        Messenger messenger = new Messenger(latchedHandler);
917cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
918cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Allow binder to connect
919cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        IBinder mockBinder = createMock(IBinder.class);
920cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mockBinder.linkToDeath((IBinder.DeathRecipient) anyObject(), anyInt());
921cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        EasyMock.replay(mockBinder);
922cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
923cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Force poll
924cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectCurrentTime();
925cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectDefaultSettings();
926cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsSummary(buildEmptyStats());
927cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsUidDetail(buildEmptyStats());
928cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsPoll();
929cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        replay();
930cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
931cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Register and verify request and that binder was called
932cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        DataUsageRequest request =
9336965c1869aa8499706522d057b5143bbc240178bAntonio Cansado                mService.registerUsageCallback(callingPackage, inputRequest,
934cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                        messenger, mockBinder);
935cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertTrue(request.requestId > 0);
9366965c1869aa8499706522d057b5143bbc240178bAntonio Cansado        assertTrue(Objects.equals(sTemplateWifi, request.template));
937cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB
938cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertEquals(minThresholdInBytes, request.thresholdInBytes);
939cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
940cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Send dummy message to make sure that any previous message has been handled
941cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandler.sendMessage(mHandler.obtainMessage(-1));
942cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandlerThread.waitForIdle(WAIT_TIMEOUT);
943cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
944cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        verifyAndReset();
945cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
946cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Make sure that the caller binder gets connected
947cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        EasyMock.verify(mockBinder);
948cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        EasyMock.reset(mockBinder);
949cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
950cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // modify some number on wifi, and trigger poll event
951cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // not enough traffic to call data usage callback
952cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        incrementCurrentTime(HOUR_IN_MILLIS);
953cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectCurrentTime();
954cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectDefaultSettings();
955cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
956cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
957cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsUidDetail(buildEmptyStats());
958cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsPoll();
959cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
960cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        replay();
961cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
962cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
963cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // verify service recorded history
964cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        verifyAndReset();
965cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
966cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
967cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // make sure callback has not being called
968cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertEquals(INVALID_TYPE, latchedHandler.mLastMessageType);
969cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
970cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // and bump forward again, with counters going higher. this is
971cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // important, since it will trigger the data usage callback
972cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        incrementCurrentTime(DAY_IN_MILLIS);
973cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectCurrentTime();
974cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectDefaultSettings();
975cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
976cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                .addIfaceValues(TEST_IFACE, 4096000L, 4L, 8192000L, 8L));
977cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsUidDetail(buildEmptyStats());
978cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsPoll();
979cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
980cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        replay();
981cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
982cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
983cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // verify service recorded history
984cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertNetworkTotal(sTemplateWifi, 4096000L, 4L, 8192000L, 8L, 0);
985cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        verifyAndReset();
986cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
987cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Wait for the caller to ack receipt of CALLBACK_LIMIT_REACHED
988cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertTrue(cv.block(WAIT_TIMEOUT));
989cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, latchedHandler.mLastMessageType);
990cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        cv.close();
991cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
992cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Allow binder to disconnect
993cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expect(mockBinder.unlinkToDeath((IBinder.DeathRecipient) anyObject(), anyInt()))
994cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                .andReturn(true);
995cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        EasyMock.replay(mockBinder);
996cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
997cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Unregister request
9986965c1869aa8499706522d057b5143bbc240178bAntonio Cansado        mService.unregisterUsageRequest(request);
999cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1000cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Wait for the caller to ack receipt of CALLBACK_RELEASED
1001cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertTrue(cv.block(WAIT_TIMEOUT));
1002cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertEquals(NetworkStatsManager.CALLBACK_RELEASED, latchedHandler.mLastMessageType);
1003cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1004cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Make sure that the caller binder gets disconnected
1005cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        EasyMock.verify(mockBinder);
1006cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
1007cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
10086965c1869aa8499706522d057b5143bbc240178bAntonio Cansado    public void testUnregisterUsageCallback_unknown_noop() throws Exception {
1009cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        String callingPackage = "the.calling.package";
1010cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        long thresholdInBytes = 10 * 1024 * 1024;  // 10 MB
1011cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        DataUsageRequest unknownRequest = new DataUsageRequest(
10126965c1869aa8499706522d057b5143bbc240178bAntonio Cansado                2 /* requestId */, sTemplateImsi1, thresholdInBytes);
1013cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
10146965c1869aa8499706522d057b5143bbc240178bAntonio Cansado        mService.unregisterUsageRequest(unknownRequest);
1015cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
1016cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1017cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private static File getBaseDir(File statsDir) {
1018cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        File baseDir = new File(statsDir, "netstats");
1019cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        baseDir.mkdirs();
1020cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        return baseDir;
1021cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
1022cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1023a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertNetworkTotal(NetworkTemplate template, long rxBytes, long rxPackets,
1024b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            long txBytes, long txPackets, int operations) throws Exception {
102570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertNetworkTotal(template, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
102670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                txPackets, operations);
102770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
102870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
102970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    private void assertNetworkTotal(NetworkTemplate template, long start, long end, long rxBytes,
103070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) throws Exception {
103170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify history API
1032b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        final NetworkStatsHistory history = mSession.getHistoryForNetwork(template, FIELD_ALL);
103370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertValues(history, start, end, rxBytes, rxPackets, txBytes, txPackets, operations);
103470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
103570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify summary API
103670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        final NetworkStats stats = mSession.getSummaryForNetwork(template, start, end);
10371f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        assertValues(stats, IFACE_ALL, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, rxBytes,
1038a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                rxPackets, txBytes, txPackets, operations);
10393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
10403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1041a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets,
1042b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            long txBytes, long txPackets, int operations) throws Exception {
1043a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        assertUidTotal(template, uid, SET_ALL, ROAMING_ALL, rxBytes, rxPackets, txBytes, txPackets,
1044a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                operations);
1045b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1046b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1047a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson    private void assertUidTotal(NetworkTemplate template, int uid, int set, int roaming,
1048a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson            long rxBytes, long rxPackets, long txBytes, long txPackets, int operations)
1049a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson            throws Exception {
105070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify history API
1051b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        final NetworkStatsHistory history = mSession.getHistoryForUid(
1052b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                template, uid, set, TAG_NONE, FIELD_ALL);
1053a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
1054a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey                txPackets, operations);
105570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
105670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify summary API
105770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        final NetworkStats stats = mSession.getSummaryForAllUid(
105870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                template, Long.MIN_VALUE, Long.MAX_VALUE, false);
1059a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        assertValues(stats, IFACE_ALL, uid, set, TAG_NONE, roaming, rxBytes, rxPackets, txBytes,
1060a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                txPackets, operations);
106139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
106239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
10638e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private void expectSystemReady() throws Exception {
10648e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.setGlobalAlert(anyLong());
10658e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().atLeastOnce();
1066f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey
1067b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectNetworkStatsSummary(buildEmptyStats());
1068b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
10693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
10703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
107139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkState(NetworkState... state) throws Exception {
107239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
107363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
107463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final LinkProperties linkProp = state.length > 0 ? state[0].linkProperties : null;
107563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mConnManager.getActiveLinkProperties()).andReturn(linkProp).atLeastOnce();
107639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
107739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
107839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
1079b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expect(mConnManager.getAllVpnInfo()).andReturn(new VpnInfo[0]).atLeastOnce();
1080b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson
108170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsSummaryDev(summary);
108270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        expectNetworkStatsSummaryXt(summary);
108370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
108470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
108570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    private void expectNetworkStatsSummaryDev(NetworkStats summary) throws Exception {
1086e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        expect(mNetManager.getNetworkStatsSummaryDev()).andReturn(summary).atLeastOnce();
108770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
108870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
108970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    private void expectNetworkStatsSummaryXt(NetworkStats summary) throws Exception {
1090e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        expect(mNetManager.getNetworkStatsSummaryXt()).andReturn(summary).atLeastOnce();
109139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
109239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
1093a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception {
109463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expectNetworkStatsUidDetail(detail, new String[0], new NetworkStats(0L, 0));
109563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
109663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
109763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private void expectNetworkStatsUidDetail(
109863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            NetworkStats detail, String[] tetherIfacePairs, NetworkStats tetherStats)
109963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            throws Exception {
1100a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        expect(mNetManager.getNetworkStatsUidDetail(eq(UID_ALL))).andReturn(detail).atLeastOnce();
110163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
110263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // also include tethering details, since they are folded into UID
1103e4984bea95a07dea0ef0259fefa1e52f0bbb1533Jeff Sharkey        expect(mNetManager.getNetworkStatsTethering())
110463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .andReturn(tetherStats).atLeastOnce();
110539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
110639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
110739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectDefaultSettings() throws Exception {
110839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
110939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
111039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
111163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private void expectSettings(long persistBytes, long bucketDuration, long deleteAge)
111239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey            throws Exception {
111339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes();
111439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes();
111563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getSampleEnabled()).andReturn(true).anyTimes();
111663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
1117ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        final Config config = new Config(bucketDuration, deleteAge, deleteAge);
111863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getDevConfig()).andReturn(config).anyTimes();
1119e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        expect(mSettings.getXtConfig()).andReturn(config).anyTimes();
112063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getUidConfig()).andReturn(config).anyTimes();
112163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        expect(mSettings.getUidTagConfig()).andReturn(config).anyTimes();
1122ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey
1123ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getGlobalAlertBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
1124ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getDevPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
1125ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getXtPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
1126ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getUidPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
1127ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        expect(mSettings.getUidTagPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
112839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
112939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
1130b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void expectCurrentTime() throws Exception {
11313f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.forceRefresh()).andReturn(false).anyTimes();
11323f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.hasCache()).andReturn(true).anyTimes();
1133b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes();
11343f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.getCacheAge()).andReturn(0L).anyTimes();
11353f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes();
11363f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
11373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
11388e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private void expectNetworkStatsPoll() throws Exception {
11398e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetManager.setGlobalAlert(anyLong());
11408e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectLastCall().anyTimes();
11418e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    }
11428e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1143b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson    private void expectBandwidthControlCheck() throws Exception {
1144b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expect(mNetManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce();
1145b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson    }
1146b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson
114739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void assertStatsFilesExist(boolean exist) {
114863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final File basePath = new File(mStatsDir, "netstats");
114939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        if (exist) {
115063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            assertTrue(basePath.list().length > 0);
115139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        } else {
115263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            assertTrue(basePath.list().length == 0);
115339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        }
115439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
115539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
1156b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private static void assertValues(NetworkStats stats, String iface, int uid, int set,
1157a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson            int tag, int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets,
1158a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson            int operations) {
115970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        final NetworkStats.Entry entry = new NetworkStats.Entry();
1160a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        List<Integer> sets = new ArrayList<>();
116170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        if (set == SET_DEFAULT || set == SET_ALL) {
1162a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson            sets.add(SET_DEFAULT);
116370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        }
116470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        if (set == SET_FOREGROUND || set == SET_ALL) {
1165a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson            sets.add(SET_FOREGROUND);
1166a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        }
1167a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
1168a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        List<Integer> roamings = new ArrayList<>();
11691f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        if (roaming == ROAMING_NO || roaming == ROAMING_ALL) {
11701f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson            roamings.add(ROAMING_NO);
1171a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        }
11721f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson        if (roaming == ROAMING_YES || roaming == ROAMING_ALL) {
11731f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidson            roamings.add(ROAMING_YES);
1174a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        }
1175a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
1176a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        for (int s : sets) {
1177a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson            for (int r : roamings) {
1178a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                final int i = stats.findIndex(iface, uid, s, tag, r);
1179a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                if (i != -1) {
1180a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                    entry.add(stats.getValues(i, null));
1181a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                }
118270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            }
118370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        }
118470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
1185a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
1186a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
1187a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
1188a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
1189a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
1190d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
1191d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
1192a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private static void assertValues(NetworkStatsHistory stats, long start, long end, long rxBytes,
1193a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) {
1194434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        final NetworkStatsHistory.Entry entry = stats.getValues(start, end, null);
1195434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
1196a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
1197434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
1198a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
1199a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
1200434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey    }
1201434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey
120239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private static NetworkState buildWifiState() {
120339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
120439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
120539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final LinkProperties prop = new LinkProperties();
120639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        prop.setInterfaceName(TEST_IFACE);
120721b5ee3f0e39be4a79bcfb2b79b0529f75f5cb58Sreeram Ramachandran        return new NetworkState(info, prop, null, null, null, TEST_SSID);
120839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
120939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
1210b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static NetworkState buildMobile3gState(String subscriberId) {
1211a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        return buildMobile3gState(subscriberId, false /* isRoaming */);
1212a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson    }
1213a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
1214a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson    private static NetworkState buildMobile3gState(String subscriberId, boolean isRoaming) {
1215b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final NetworkInfo info = new NetworkInfo(
1216b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey                TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UMTS, null, null);
1217b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
1218a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        info.setRoaming(isRoaming);
1219b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final LinkProperties prop = new LinkProperties();
1220b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        prop.setInterfaceName(TEST_IFACE);
122121b5ee3f0e39be4a79bcfb2b79b0529f75f5cb58Sreeram Ramachandran        return new NetworkState(info, prop, null, null, subscriberId, null);
1222b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
1223b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
1224163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static NetworkState buildMobile4gState(String iface) {
1225d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIMAX, 0, null, null);
1226d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
1227d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final LinkProperties prop = new LinkProperties();
1228163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        prop.setInterfaceName(iface);
12293256601f5e4d94713f59e97b9d4912875c1bdcafJeff Sharkey        return new NetworkState(info, prop, null, null, null, null);
1230d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
1231d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
1232b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private NetworkStats buildEmptyStats() {
1233b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return new NetworkStats(getElapsedRealtime(), 0);
1234b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1235b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1236b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long getElapsedRealtime() {
1237b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return mElapsedRealtime;
1238b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1239b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1240b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long startTimeMillis() {
1241b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return TEST_START;
1242b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1243b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1244b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long currentTimeMillis() {
1245b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return startTimeMillis() + mElapsedRealtime;
1246b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1247b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1248b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void incrementCurrentTime(long duration) {
1249b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime += duration;
125039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
125139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
12523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private void replay() {
1253cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        EasyMock.replay(mNetManager, mTime, mSettings, mConnManager);
12543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
12553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
12563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private void verifyAndReset() {
1257cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        EasyMock.verify(mNetManager, mTime, mSettings, mConnManager);
1258cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        EasyMock.reset(mNetManager, mTime, mSettings, mConnManager);
1259cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
1260cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1261cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private void forcePollAndWaitForIdle() {
1262cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
1263cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Send dummy message to make sure that any previous message has been handled
1264cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandler.sendMessage(mHandler.obtainMessage(-1));
1265cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandlerThread.waitForIdle(WAIT_TIMEOUT);
1266cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
1267cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1268cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    static class LatchedHandler extends Handler {
1269cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        private final ConditionVariable mCv;
1270cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        int mLastMessageType = INVALID_TYPE;
1271cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1272cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        LatchedHandler(Looper looper, ConditionVariable cv) {
1273cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            super(looper);
1274cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            mCv = cv;
1275cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        }
1276cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1277cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        @Override
1278cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        public void handleMessage(Message msg) {
1279cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            mLastMessageType = msg.what;
1280cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            mCv.open();
1281cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            super.handleMessage(msg);
1282cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        }
1283cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
1284cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1285cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    /**
1286cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado     * A subclass of HandlerThread that allows callers to wait for it to become idle. waitForIdle
1287cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado     * will return immediately if the handler is already idle.
1288cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado     */
1289cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    static class IdleableHandlerThread extends HandlerThread {
1290cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        private IdleHandler mIdleHandler;
1291cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1292cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        public IdleableHandlerThread(String name) {
1293cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            super(name);
1294cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        }
1295cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1296cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        public void waitForIdle(long timeoutMs) {
1297cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            final ConditionVariable cv = new ConditionVariable();
1298cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            final MessageQueue queue = getLooper().getQueue();
1299cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1300cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            synchronized (queue) {
1301cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                if (queue.isIdle()) {
1302cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                    return;
1303cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                }
1304cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1305cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                assertNull("BUG: only one idle handler allowed", mIdleHandler);
1306cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                mIdleHandler = new IdleHandler() {
1307cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                    public boolean queueIdle() {
1308cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                        cv.open();
1309cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                        mIdleHandler = null;
1310cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                        return false;  // Remove the handler.
1311cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                    }
1312cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                };
1313cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                queue.addIdleHandler(mIdleHandler);
1314cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            }
1315cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1316cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            if (!cv.block(timeoutMs)) {
1317cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                fail("HandlerThread " + getName() + " did not become idle after " + timeoutMs
1318cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                        + " ms");
1319cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                queue.removeIdleHandler(mIdleHandler);
1320cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            }
1321cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        }
13223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
1323cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
13243f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey}
1325