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;
25c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chenimport static android.net.NetworkStats.METERED_ALL;
26c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chenimport static android.net.NetworkStats.METERED_NO;
27c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chenimport static android.net.NetworkStats.METERED_YES;
28a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidsonimport static android.net.NetworkStats.ROAMING_ALL;
291f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidsonimport static android.net.NetworkStats.ROAMING_NO;
301f7e05eda687279ac9deb894f42ac927bd471ad2Jeff Davidsonimport static android.net.NetworkStats.ROAMING_YES;
31b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_ALL;
32b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_DEFAULT;
33b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_FOREGROUND;
345356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colittiimport static android.net.NetworkStats.STATS_PER_IFACE;
355356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colittiimport static android.net.NetworkStats.STATS_PER_UID;
361b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static android.net.NetworkStats.TAG_NONE;
373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.net.NetworkStats.UID_ALL;
3863d27a9233fed934340231f438493746084a681dJeff Sharkeyimport static android.net.NetworkStatsHistory.FIELD_ALL;
394e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateMobileAll;
40e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateWifiWildcard;
41241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkeyimport static android.net.TrafficStats.MB_IN_BYTES;
42b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.net.TrafficStats.UID_REMOVED;
43905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkeyimport static android.net.TrafficStats.UID_TETHERING;
443f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.DAY_IN_MILLIS;
453f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.HOUR_IN_MILLIS;
4639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS;
4739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.WEEK_IN_MILLIS;
48fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme
49669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichiimport static com.android.internal.util.TestUtils.waitForIdleHandler;
50f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkeyimport static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL;
51fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme
52fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemeimport static org.junit.Assert.assertEquals;
53d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Lemeimport static org.junit.Assert.assertNotNull;
54fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemeimport static org.junit.Assert.assertTrue;
55f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkeyimport static org.mockito.ArgumentMatchers.any;
56f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkeyimport static org.mockito.ArgumentMatchers.anyInt;
57f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkeyimport static org.mockito.ArgumentMatchers.anyLong;
58d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Lemeimport static org.mockito.Mockito.verify;
59f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkeyimport static org.mockito.Mockito.when;
603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.AlarmManager;
62cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.app.usage.NetworkStatsManager;
63cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.content.Context;
643f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.content.Intent;
65cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.net.DataUsageRequest;
663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.IConnectivityManager;
678e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport android.net.INetworkManagementEventObserver;
68b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkeyimport android.net.INetworkStatsSession;
693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.LinkProperties;
70fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemeimport android.net.NetworkCapabilities;
713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo;
723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo.DetailedState;
733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkState;
743f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStats;
753f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStatsHistory;
761b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkTemplate;
77cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.ConditionVariable;
78cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.Handler;
79cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.HandlerThread;
80cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.IBinder;
81f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkeyimport android.os.INetworkManagementService;
82cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.Looper;
83cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.Message;
84f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkeyimport android.os.Messenger;
85cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansadoimport android.os.PowerManager;
86fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemeimport android.support.test.InstrumentationRegistry;
87fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemeimport android.support.test.runner.AndroidJUnit4;
88b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport android.telephony.TelephonyManager;
89f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkeyimport android.test.suitebuilder.annotation.SmallTest;
90f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkeyimport android.util.Log;
913f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.util.TrustedTime;
923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
93b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidsonimport com.android.internal.net.VpnInfo;
94073e5e94ad95b540501df6ea6937003359f23ac0Lorenzo Colittiimport com.android.internal.util.test.BroadcastInterceptingContext;
9539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings;
9663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config;
973f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
98e4984bea95a07dea0ef0259fefa1e52f0bbb1533Jeff Sharkeyimport libcore.io.IoUtils;
99e4984bea95a07dea0ef0259fefa1e52f0bbb1533Jeff Sharkey
100fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemeimport org.junit.After;
101fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemeimport org.junit.Before;
102c97d8b7464f0c60165ac9abb6b35323583fad2b5Felipe Lemeimport org.junit.Ignore;
103fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemeimport org.junit.Test;
104fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemeimport org.junit.runner.RunWith;
105d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Lemeimport org.mockito.ArgumentCaptor;
106d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Lemeimport org.mockito.Mock;
107d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Lemeimport org.mockito.MockitoAnnotations;
1083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport java.io.File;
1106965c1869aa8499706522d057b5143bbc240178bAntonio Cansadoimport java.util.Objects;
111b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey/**
1133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * Tests for {@link NetworkStatsService}.
114b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson *
115d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme * TODO: This test used to be really brittle because it used Easymock - it uses Mockito now, but
116d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme * still uses the Easymock structure, which could be simplified.
1173f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey */
118fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme@RunWith(AndroidJUnit4.class)
119e7e10303f3bc545a9763fab7a7e89da9120bedfaHugo Benichi@SmallTest
120fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Lemepublic class NetworkStatsServiceTest {
121b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey    private static final String TAG = "NetworkStatsServiceTest";
1223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1233f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final String TEST_IFACE = "test0";
124163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static final String TEST_IFACE2 = "test1";
1253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private static final long TEST_START = 1194220800000L;
1263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
127b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_1 = "310004";
128b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static final String IMSI_2 = "310260";
129ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey    private static final String TEST_SSID = "AndroidAP";
130b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
131e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey    private static NetworkTemplate sTemplateWifi = buildTemplateWifiWildcard();
1324e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1);
1334e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey    private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2);
1341b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey
135d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_RED = 1001;
136d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_BLUE = 1002;
137d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    private static final int UID_GREEN = 1003;
13839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
139cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private static final long WAIT_TIMEOUT = 2 * 1000;  // 2 secs
140cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private static final int INVALID_TYPE = -1;
141cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
142b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long mElapsedRealtime;
143b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1443f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private BroadcastInterceptingContext mServiceContext;
1453f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private File mStatsDir;
1463f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
147d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme    private @Mock INetworkManagementService mNetManager;
148d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme    private @Mock TrustedTime mTime;
149d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme    private @Mock NetworkStatsSettings mSettings;
150d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme    private @Mock IConnectivityManager mConnManager;
151d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme    private @Mock IBinder mBinder;
152d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme    private @Mock AlarmManager mAlarmManager;
153669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichi    private HandlerThread mHandlerThread;
154cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private Handler mHandler;
1553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
1563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    private NetworkStatsService mService;
157b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey    private INetworkStatsSession mSession;
1588e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private INetworkManagementEventObserver mNetworkObserver;
1593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
160fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Before
1613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void setUp() throws Exception {
162d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        MockitoAnnotations.initMocks(this);
163fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme        final Context context = InstrumentationRegistry.getContext();
1643f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
165fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme        mServiceContext = new BroadcastInterceptingContext(context);
166fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme        mStatsDir = context.getFilesDir();
167b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        if (mStatsDir.exists()) {
168b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey            IoUtils.deleteContents(mStatsDir);
169b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        }
1703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
171cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        PowerManager powerManager = (PowerManager) mServiceContext.getSystemService(
172cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                Context.POWER_SERVICE);
173cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        PowerManager.WakeLock wakeLock =
174cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
175cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = new NetworkStatsService(
177d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme                mServiceContext, mNetManager, mAlarmManager, wakeLock, mTime,
178cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                TelephonyManager.getDefault(), mSettings, new NetworkStatsObservers(),
179cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                mStatsDir, getBaseDir(mStatsDir));
180669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichi        mHandlerThread = new HandlerThread("HandlerThread");
181cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandlerThread.start();
182cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        Handler.Callback callback = new NetworkStatsService.HandlerCallback(mService);
183cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandler = new Handler(mHandlerThread.getLooper(), callback);
184cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mService.setHandler(mHandler, callback);
1853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.bindConnectivityManager(mConnManager);
1863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
187b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime = 0L;
188b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
189b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
19039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
191b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
1928e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
1938e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1943f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
195e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        mSession = mService.openSession();
196d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        assertNotNull("openSession() failed", mSession);
197d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
1983f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
199d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        // catch INetworkManagementEventObserver during systemReady()
200d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        ArgumentCaptor<INetworkManagementEventObserver> networkObserver =
201d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme              ArgumentCaptor.forClass(INetworkManagementEventObserver.class);
202d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        verify(mNetManager).registerObserver(networkObserver.capture());
2038e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        mNetworkObserver = networkObserver.getValue();
2048e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
2053f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
2063f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
207fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @After
2083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    public void tearDown() throws Exception {
209ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        IoUtils.deleteContents(mStatsDir);
2103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext = null;
2123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mStatsDir = null;
2133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2143f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mNetManager = null;
2153f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mTime = null;
216b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mSettings = null;
217b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mConnManager = null;
2183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
219b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        mSession.close();
2203f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService = null;
2213f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
2223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
223fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
224b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testNetworkStatsWifi() throws Exception {
2253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
2263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
227b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
22839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
22939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
230b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
231b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
232b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
2333f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
234b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
2353f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2363f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
237a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
238d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
2393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
241b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
242b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
24339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
244b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
245b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
246b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
247cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
2483f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2493f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
250a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
251d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
2523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // and bump forward again, with counters going higher. this is
2543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // important, since polling should correctly subtract last snapshot.
255b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(DAY_IN_MILLIS);
256b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
25739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
258b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
259b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L));
260b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
261cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
2623f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2633f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
264a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4096L, 4L, 8192L, 8L, 0);
26539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
2663f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
2673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
268fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
26939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsRebootPersist() throws Exception {
27039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
2713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
2733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // network state, and poll any existing interfaces before updating.
274b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
27539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
27639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
277b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
278b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
279b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
2803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
281b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
2823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2833f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service has empty history for wifi
284a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
285d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
2863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
2873f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // modify some number on wifi, and trigger poll event
288b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
289b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
29039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
291b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
292b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L));
293b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2)
294b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
295b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
296b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
297b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
298b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 0L));
299b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, false);
300b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 4);
301b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
302b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 6);
303a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
304cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
3053f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3063f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // verify service recorded history
307a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
308b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
309c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, METERED_NO, ROAMING_NO, 512L, 4L, 256L,
310c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                2L, 4);
311c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, METERED_NO, ROAMING_NO, 512L, 4L,
312c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                256L, 2L, 6);
313b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
314d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
3153f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3163f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // graceful shutdown system, which should trigger persist of stats, and
3173f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // clear any values in memory.
31834c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
31934c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectDefaultSettings();
3203f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN));
32139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(true);
3223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3233f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // boot through serviceReady() again
324b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
32539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectDefaultSettings();
326b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
3278e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey        expectSystemReady();
3288e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
3293f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        mService.systemReady();
3308e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
3313f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey        // after systemReady(), we should have historical stats loaded again
332a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
333b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
334c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, METERED_NO, ROAMING_NO, 512L, 4L, 256L,
335c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                2L, 4);
336c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, METERED_NO, ROAMING_NO, 512L, 4L,
337c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                256L, 2L, 6);
338b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
33939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
34039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
34139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
34263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    // TODO: simulate reboot to test bucket resize
343c97d8b7464f0c60165ac9abb6b35323583fad2b5Felipe Leme    @Test
344c97d8b7464f0c60165ac9abb6b35323583fad2b5Felipe Leme    @Ignore
34539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    public void testStatsBucketResize() throws Exception {
34639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        NetworkStatsHistory history = null;
34739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
34839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        assertStatsFilesExist(false);
34939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
35039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // pretend that wifi network comes online; service should ask about full
35139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // network state, and poll any existing interfaces before updating.
352b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
35339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
35439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectNetworkState(buildWifiState());
355b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
356b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
357b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
35839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
359b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
360d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
36139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
36239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // modify some number on wifi, and trigger poll event
363b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(2 * HOUR_IN_MILLIS);
364b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
36539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
366b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
367b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L));
368b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
369cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
37039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
37139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify service recorded history
372b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
373a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
374d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(HOUR_IN_MILLIS, history.getBucketDuration());
375d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(2, history.size());
376d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
37739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
37839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // now change bucket duration setting and trigger another poll with
37939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // exact same values, which should resize existing buckets.
380b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
38139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
382b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
383b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
384cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
38539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
38639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        // verify identical stats, but spread across 4 buckets now
387b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
388a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
389d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(30 * MINUTE_IN_MILLIS, history.getBucketDuration());
390d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(4, history.size());
3913f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
3923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
3933f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
394fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
395b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidStatsAcrossNetworks() throws Exception {
396b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend first mobile network comes online
397b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
398b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
399b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
400b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
401b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
402b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
403b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
404b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
405d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
406b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
407b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic on first network
408b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
409b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
410b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
411b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
412b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
413b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
414b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
415b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
416b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
417a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 10);
418a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
419cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
420b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
421b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
422a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
423a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
424b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
425b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
426d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
427b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
428b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now switch networks; this also tests that we're okay with interfaces
429b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // disappearing, to verify we don't count backwards.
430b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
431b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
432b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
433b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_2));
434163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
435163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
436163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
437163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
438163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
439163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
440b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
441b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
442b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
443cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
444d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
445b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
446b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create traffic on second network
447b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
448b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
449b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
450b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
451163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 2176L, 17L, 1536L, 12L));
452b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
453163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
454163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
455163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 640L, 5L, 1024L, 8L, 0L)
456b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xFAAD, 128L, 1L, 1024L, 8L, 0L));
457b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_BLUE, 0xFAAD, 10);
458a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
459cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
460b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
461b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify original history still intact
462a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
463b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
464b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
465b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
466b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // and verify new history also recorded under different template, which
467b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verifies that we didn't cross the streams.
468a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateImsi2, 128L, 1L, 1024L, 8L, 0);
469a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
470a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateImsi2, UID_BLUE, 128L, 1L, 1024L, 8L, 10);
471b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
472b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
473b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
474fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
475b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public void testUidRemovedIsMoved() throws Exception {
476b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // pretend that network comes online
477b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
478b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
479b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectNetworkState(buildWifiState());
480b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
481b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
482b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
483b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
484b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
485d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
486b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
487b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // create some traffic
488b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
489b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
490b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
491b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
492b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
493b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
494b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
495b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
496b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
497b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
498b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 10);
499a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
500cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
501b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
502b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // verify service recorded history
503a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
504a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10);
505b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0);
506b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
507d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
508b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
509b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // now pretend two UIDs are uninstalled, which should migrate stats to
510b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // special "removed" bucket.
51134c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey        expectCurrentTime();
512b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        expectDefaultSettings();
513163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
514163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
515163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
516163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
517163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
518163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
519163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
520b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final Intent intent = new Intent(ACTION_UID_REMOVED);
521d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_BLUE);
522b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
523d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        intent.putExtra(EXTRA_UID, UID_RED);
524b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        mServiceContext.sendBroadcast(intent);
525b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
526b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // existing uid and total should remain unchanged; but removed UID
527b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        // should be gone completely.
528a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
529a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0);
530a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 0L, 0L, 0L, 0L, 0);
531b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
532b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10);
533b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
534b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
535b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
536fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
537d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testUid3g4gCombinedByTemplate() throws Exception {
538d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
539b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
540d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
541d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
542b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
543b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
544b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
545d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
546b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
547d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
548d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
549d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic
550b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
551b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
552d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
553b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
554b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
555b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
556b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
557a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 5);
558a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
559cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
560d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
561d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
562b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5);
563d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
564d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
565d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now switch over to 4g network
566b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
567b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
568d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
569163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkState(buildMobile4gState(TEST_IFACE2));
570b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
571163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
572163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
573163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
574b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
575d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
576b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
577cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
578d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
579d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
580d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create traffic on second network
581b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
582b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
583d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
584b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
585b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
586163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
587163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
588163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
589163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, 0xFAAD, 512L, 4L, 256L, 2L, 0L));
590b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 5);
591a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
592cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
593d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
594d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify that ALL_MOBILE template combines both
595b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 10);
596d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
597d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
598fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
599d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    public void testSummaryForAllUid() throws Exception {
600d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // pretend that network comes online
601b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
602d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
603d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectNetworkState(buildWifiState());
604b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
605b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
606b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
607d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
608b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
609d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
610d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
611d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // create some traffic for two apps
612b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
613b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
614d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
615b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
616b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
617b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
618b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
619b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0L));
620a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
621a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
622cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
623d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
624d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // verify service recorded history
625b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1);
626b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0);
627d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
628a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
629d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now create more traffic in next hour, but only for one app
630b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
631b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
632d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        expectDefaultSettings();
633b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
634b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
635163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
636163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
637b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L));
638cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
639d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
640d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // first verify entire history present
641b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        NetworkStats stats = mSession.getSummaryForAllUid(
642d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
643d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(3, stats.size());
644c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 50L,
645c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                5L, 50L, 5L, 1);
646c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 10L,
647c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                1L, 10L, 1L, 1);
648c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
649c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                2048L, 16L, 1024L, 8L, 0);
650d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
651d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        // now verify that recent history only contains one uid
652b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        final long currentTime = currentTimeMillis();
653b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        stats = mSession.getSummaryForAllUid(
654d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey                sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true);
655d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey        assertEquals(1, stats.size());
656c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
657c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                1024L, 8L, 512L, 4L, 0);
658b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
659b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
660fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
661b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    public void testForegroundBackground() throws Exception {
662b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // pretend that network comes online
663b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
664b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
665b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkState(buildWifiState());
666b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
667b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
668b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
669b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
670b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
671d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
672b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
673b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // create some initial traffic
674b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
675b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
676b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
677b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
678b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
679b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
680b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L));
681b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
682b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
683cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
684b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
685b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify service recorded history
686b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1);
687d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
688b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
689b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // now switch to foreground
690b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
691b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectCurrentTime();
692b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectDefaultSettings();
693b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
694b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
695b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
696b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L)
697b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 0L)
698b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 0L));
699b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.setUidForeground(UID_RED, true);
700b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mService.incrementOperationCount(UID_RED, 0xFAAD, 1);
701b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
702cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
703b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
704b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // test that we combined correctly
705b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertUidTotal(sTemplateWifi, UID_RED, 160L, 4L, 160L, 4L, 2);
706b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
707b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        // verify entire history present
708b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        final NetworkStats stats = mSession.getSummaryForAllUid(
709b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
710b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        assertEquals(4, stats.size());
711c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L,
712c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                2L, 128L, 2L, 1);
713c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 64L,
714c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                1L, 64L, 1L, 1);
715c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
716c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                32L, 2L, 32L, 2L, 1);
717c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, METERED_NO, ROAMING_NO, 1L,
718c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                1L, 1L, 1L, 1);
719c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen    }
720c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen
721c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen    @Test
722c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen    public void testMetered() throws Exception {
723c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // pretend that network comes online
724c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectCurrentTime();
725c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectDefaultSettings();
726c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectNetworkState(buildWifiState(true /* isMetered */));
727c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectNetworkStatsSummary(buildEmptyStats());
728c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectNetworkStatsUidDetail(buildEmptyStats());
729c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectBandwidthControlCheck();
730c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen
731c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        mService.forceUpdateIfaces();
732c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen
733c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen
734c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // create some initial traffic
735c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        incrementCurrentTime(HOUR_IN_MILLIS);
736c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectCurrentTime();
737c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectDefaultSettings();
738c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectNetworkStatsSummary(buildEmptyStats());
739c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // Note that all traffic from NetworkManagementService is tagged as METERED_NO and
740c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // ROAMING_NO, because metered and roaming isn't tracked at that layer. We layer it
741c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // on top by inspecting the iface properties.
742c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
743c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L,
744c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                        2L, 128L, 2L, 0L)
745c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 64L,
746c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                        1L, 64L, 1L, 0L));
747c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        mService.incrementOperationCount(UID_RED, 0xF00D, 1);
748c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen
749c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        forcePollAndWaitForIdle();
750c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen
751c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // verify service recorded history
752c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1);
753c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // verify entire history present
754c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        final NetworkStats stats = mSession.getSummaryForAllUid(
755c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
756c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertEquals(2, stats.size());
757c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
758c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                128L, 2L, 128L, 2L, 1);
759c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO, 64L,
760c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                1L, 64L, 1L, 1);
761a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson    }
762a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
763fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
764a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson    public void testRoaming() throws Exception {
765a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // pretend that network comes online
766a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectCurrentTime();
767a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectDefaultSettings();
768a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkState(buildMobile3gState(IMSI_1, true /* isRoaming */));
769a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsSummary(buildEmptyStats());
770a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsUidDetail(buildEmptyStats());
771a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectBandwidthControlCheck();
772a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
773a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        mService.forceUpdateIfaces();
774d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
775a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
776a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // Create some traffic
777a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        incrementCurrentTime(HOUR_IN_MILLIS);
778a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectCurrentTime();
779a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectDefaultSettings();
780a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsSummary(buildEmptyStats());
781c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // Note that all traffic from NetworkManagementService is tagged as METERED_NO and
782c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // ROAMING_NO, because metered and roaming isn't tracked at that layer. We layer it
783c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        // on top by inspecting the iface properties.
784a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
785c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_ALL, ROAMING_NO,
786c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                        128L, 2L, 128L, 2L, 0L)
787c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, METERED_ALL, ROAMING_NO, 64L,
788c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                        1L, 64L, 1L, 0L));
789cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
790a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
791a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // verify service recorded history
792a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
793a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
794a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        // verify entire history present
795a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        final NetworkStats stats = mSession.getSummaryForAllUid(
796a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
797a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        assertEquals(2, stats.size());
798c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, METERED_ALL, ROAMING_YES,
799c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                128L, 2L, 128L, 2L, 0);
800c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, METERED_ALL, ROAMING_YES, 64L,
801c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                1L, 64L, 1L, 0);
802d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
803d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
804fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
805905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    public void testTethering() throws Exception {
806905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // pretend first mobile network comes online
807905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
808905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
809905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkState(buildMobile3gState(IMSI_1));
810905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsSummary(buildEmptyStats());
811905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectNetworkStatsUidDetail(buildEmptyStats());
812b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
813905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
814b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        mService.forceUpdateIfaces();
815d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
816905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
817905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // create some tethering traffic
818905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        incrementCurrentTime(HOUR_IN_MILLIS);
819905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectCurrentTime();
820905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        expectDefaultSettings();
82163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
8225356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        // Traffic seen by kernel counters (includes software tethering).
8235356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        final NetworkStats ifaceStats = new NetworkStats(getElapsedRealtime(), 1)
8245356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti                .addIfaceValues(TEST_IFACE, 1536L, 12L, 384L, 3L);
8255356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        // Hardware tethering traffic, not seen by kernel counters.
8265356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        final NetworkStats tetherStatsHardware = new NetworkStats(getElapsedRealtime(), 1)
8275356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti                .addIfaceValues(TEST_IFACE, 512L, 4L, 128L, 1L);
8285356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti
8295356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        // Traffic for UID_RED.
83063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats uidStats = new NetworkStats(getElapsedRealtime(), 1)
83163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L);
8325356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        // All tethering traffic, both hardware and software.
83363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final NetworkStats tetherStats = new NetworkStats(getElapsedRealtime(), 1)
834c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L,
835c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                        0L);
83663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
8375356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        expectNetworkStatsSummary(ifaceStats, tetherStatsHardware);
8385356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        expectNetworkStatsUidDetail(uidStats, tetherStats);
839cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
840905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
841905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        // verify service recorded history
842905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
843905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
844905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey        assertUidTotal(sTemplateImsi1, UID_TETHERING, 1920L, 14L, 384L, 2L, 0);
845905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
846905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey    }
847905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey
848fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
8496965c1869aa8499706522d057b5143bbc240178bAntonio Cansado    public void testRegisterUsageCallback() throws Exception {
850cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // pretend that wifi network comes online; service should ask about full
851cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // network state, and poll any existing interfaces before updating.
852cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectCurrentTime();
853cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectDefaultSettings();
854cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkState(buildWifiState());
855cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsSummary(buildEmptyStats());
856cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsUidDetail(buildEmptyStats());
857cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectBandwidthControlCheck();
858cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
859cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mService.forceUpdateIfaces();
860cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
861cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // verify service has empty history for wifi
862cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
863cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        String callingPackage = "the.calling.package";
864cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        long thresholdInBytes = 1L;  // very small; should be overriden by framework
865cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        DataUsageRequest inputRequest = new DataUsageRequest(
8666965c1869aa8499706522d057b5143bbc240178bAntonio Cansado                DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdInBytes);
867cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
868cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Create a messenger that waits for callback activity
869cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        ConditionVariable cv = new ConditionVariable(false);
870cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        LatchedHandler latchedHandler = new LatchedHandler(Looper.getMainLooper(), cv);
871cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        Messenger messenger = new Messenger(latchedHandler);
872cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
873cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Force poll
874cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectCurrentTime();
875cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectDefaultSettings();
876cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsSummary(buildEmptyStats());
877cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsUidDetail(buildEmptyStats());
878d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
879d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
880cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
881cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Register and verify request and that binder was called
882cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        DataUsageRequest request =
8836965c1869aa8499706522d057b5143bbc240178bAntonio Cansado                mService.registerUsageCallback(callingPackage, inputRequest,
884d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme                        messenger, mBinder);
885cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertTrue(request.requestId > 0);
8866965c1869aa8499706522d057b5143bbc240178bAntonio Cansado        assertTrue(Objects.equals(sTemplateWifi, request.template));
887cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB
888cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertEquals(minThresholdInBytes, request.thresholdInBytes);
889cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
890cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Send dummy message to make sure that any previous message has been handled
891cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandler.sendMessage(mHandler.obtainMessage(-1));
892669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichi        waitForIdleHandler(mHandler, WAIT_TIMEOUT);
893cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
894d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
895cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
896cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Make sure that the caller binder gets connected
897d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        verify(mBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt());
898d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
899cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
900cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // modify some number on wifi, and trigger poll event
901cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // not enough traffic to call data usage callback
902cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        incrementCurrentTime(HOUR_IN_MILLIS);
903cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectCurrentTime();
904cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectDefaultSettings();
905cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
906cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
907cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsUidDetail(buildEmptyStats());
908cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
909cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
910cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // verify service recorded history
911cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
912cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
913cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // make sure callback has not being called
914669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichi        assertEquals(INVALID_TYPE, latchedHandler.lastMessageType);
915cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
916cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // and bump forward again, with counters going higher. this is
917cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // important, since it will trigger the data usage callback
918cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        incrementCurrentTime(DAY_IN_MILLIS);
919cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectCurrentTime();
920cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectDefaultSettings();
921cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
922cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado                .addIfaceValues(TEST_IFACE, 4096000L, 4L, 8192000L, 8L));
923cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        expectNetworkStatsUidDetail(buildEmptyStats());
924cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        forcePollAndWaitForIdle();
925cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
926cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // verify service recorded history
927cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertNetworkTotal(sTemplateWifi, 4096000L, 4L, 8192000L, 8L, 0);
928d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
929cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
930cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Wait for the caller to ack receipt of CALLBACK_LIMIT_REACHED
931cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertTrue(cv.block(WAIT_TIMEOUT));
932669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichi        assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, latchedHandler.lastMessageType);
933cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        cv.close();
934cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
935cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Allow binder to disconnect
936d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mBinder.unlinkToDeath(any(IBinder.DeathRecipient.class), anyInt())).thenReturn(true);
937cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
938cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Unregister request
9396965c1869aa8499706522d057b5143bbc240178bAntonio Cansado        mService.unregisterUsageRequest(request);
940cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
941cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Wait for the caller to ack receipt of CALLBACK_RELEASED
942cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        assertTrue(cv.block(WAIT_TIMEOUT));
943669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichi        assertEquals(NetworkStatsManager.CALLBACK_RELEASED, latchedHandler.lastMessageType);
944cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
945cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Make sure that the caller binder gets disconnected
946d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        verify(mBinder).unlinkToDeath(any(IBinder.DeathRecipient.class), anyInt());
947cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
948cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
949fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme    @Test
9506965c1869aa8499706522d057b5143bbc240178bAntonio Cansado    public void testUnregisterUsageCallback_unknown_noop() throws Exception {
951cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        String callingPackage = "the.calling.package";
952cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        long thresholdInBytes = 10 * 1024 * 1024;  // 10 MB
953cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        DataUsageRequest unknownRequest = new DataUsageRequest(
9546965c1869aa8499706522d057b5143bbc240178bAntonio Cansado                2 /* requestId */, sTemplateImsi1, thresholdInBytes);
955cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
9566965c1869aa8499706522d057b5143bbc240178bAntonio Cansado        mService.unregisterUsageRequest(unknownRequest);
957cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
958cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
959cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private static File getBaseDir(File statsDir) {
960cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        File baseDir = new File(statsDir, "netstats");
961cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        baseDir.mkdirs();
962cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        return baseDir;
963cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
964cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
965a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertNetworkTotal(NetworkTemplate template, long rxBytes, long rxPackets,
966b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            long txBytes, long txPackets, int operations) throws Exception {
96770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertNetworkTotal(template, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
96870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                txPackets, operations);
96970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
97070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
97170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    private void assertNetworkTotal(NetworkTemplate template, long start, long end, long rxBytes,
97270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) throws Exception {
97370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify history API
974b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        final NetworkStatsHistory history = mSession.getHistoryForNetwork(template, FIELD_ALL);
97570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        assertValues(history, start, end, rxBytes, rxPackets, txBytes, txPackets, operations);
97670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
97770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify summary API
97870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        final NetworkStats stats = mSession.getSummaryForNetwork(template, start, end);
979f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        assertValues(stats, IFACE_ALL, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
980c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                rxBytes, rxPackets, txBytes, txPackets, operations);
9813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
9823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
983a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets,
984b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            long txBytes, long txPackets, int operations) throws Exception {
985c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertUidTotal(template, uid, SET_ALL, METERED_ALL, ROAMING_ALL, rxBytes, rxPackets,
986c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                txBytes, txPackets, operations);
987b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
988b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
989c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen    private void assertUidTotal(NetworkTemplate template, int uid, int set, int metered,
990c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen            int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations)
991a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson            throws Exception {
99270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify history API
993b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        final NetworkStatsHistory history = mSession.getHistoryForUid(
994b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey                template, uid, set, TAG_NONE, FIELD_ALL);
995a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
996a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey                txPackets, operations);
99770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
99870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        // verify summary API
99970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        final NetworkStats stats = mSession.getSummaryForAllUid(
100070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey                template, Long.MIN_VALUE, Long.MAX_VALUE, false);
1001c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        assertValues(stats, IFACE_ALL, uid, set, TAG_NONE, metered, roaming, rxBytes, rxPackets,
1002c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                txBytes, txPackets, operations);
100339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
100439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
10058e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    private void expectSystemReady() throws Exception {
1006b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectNetworkStatsSummary(buildEmptyStats());
1007b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson        expectBandwidthControlCheck();
10083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey    }
10093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey
101039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkState(NetworkState... state) throws Exception {
1011d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mConnManager.getAllNetworkState()).thenReturn(state);
101263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
101363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final LinkProperties linkProp = state.length > 0 ? state[0].linkProperties : null;
1014d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mConnManager.getActiveLinkProperties()).thenReturn(linkProp);
101539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
101639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
101739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
10185356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        expectNetworkStatsSummary(summary, new NetworkStats(0L, 0));
10195356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti    }
10205356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti
10215356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti    private void expectNetworkStatsSummary(NetworkStats summary, NetworkStats tetherStats)
10225356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti            throws Exception {
1023d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mConnManager.getAllVpnInfo()).thenReturn(new VpnInfo[0]);
1024b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson
10255356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        expectNetworkStatsTethering(STATS_PER_IFACE, tetherStats);
10265356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        expectNetworkStatsSummaryDev(summary.clone());
10275356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        expectNetworkStatsSummaryXt(summary.clone());
102870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
102970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
103070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    private void expectNetworkStatsSummaryDev(NetworkStats summary) throws Exception {
1031d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mNetManager.getNetworkStatsSummaryDev()).thenReturn(summary);
103270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    }
103370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
103470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey    private void expectNetworkStatsSummaryXt(NetworkStats summary) throws Exception {
1035d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mNetManager.getNetworkStatsSummaryXt()).thenReturn(summary);
103639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
103739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
10385356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti    private void expectNetworkStatsTethering(int how, NetworkStats stats)
10395356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti            throws Exception {
10405356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        when(mNetManager.getNetworkStatsTethering(how)).thenReturn(stats);
10415356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti    }
10425356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti
1043a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception {
10445356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        expectNetworkStatsUidDetail(detail, new NetworkStats(0L, 0));
104563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    }
104663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
10475356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti    private void expectNetworkStatsUidDetail(NetworkStats detail, NetworkStats tetherStats)
104863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            throws Exception {
1049d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mNetManager.getNetworkStatsUidDetail(UID_ALL)).thenReturn(detail);
105063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
105163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        // also include tethering details, since they are folded into UID
10525356a35c3bcfcdf2d184c620af6bfbf9bddf35c5Lorenzo Colitti        when(mNetManager.getNetworkStatsTethering(STATS_PER_UID)).thenReturn(tetherStats);
105339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
105439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
105539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void expectDefaultSettings() throws Exception {
105639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
105739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
105839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
105963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey    private void expectSettings(long persistBytes, long bucketDuration, long deleteAge)
106039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey            throws Exception {
1061d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getPollInterval()).thenReturn(HOUR_IN_MILLIS);
1062d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getTimeCacheMaxAge()).thenReturn(DAY_IN_MILLIS);
1063d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getSampleEnabled()).thenReturn(true);
106463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey
1065ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey        final Config config = new Config(bucketDuration, deleteAge, deleteAge);
1066d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getDevConfig()).thenReturn(config);
1067d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getXtConfig()).thenReturn(config);
1068d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getUidConfig()).thenReturn(config);
1069d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getUidTagConfig()).thenReturn(config);
1070d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme
1071d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getGlobalAlertBytes(anyLong())).thenReturn(MB_IN_BYTES);
1072d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getDevPersistBytes(anyLong())).thenReturn(MB_IN_BYTES);
1073d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getXtPersistBytes(anyLong())).thenReturn(MB_IN_BYTES);
1074d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getUidPersistBytes(anyLong())).thenReturn(MB_IN_BYTES);
1075d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mSettings.getUidTagPersistBytes(anyLong())).thenReturn(MB_IN_BYTES);
107639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
107739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
1078b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void expectCurrentTime() throws Exception {
1079d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mTime.forceRefresh()).thenReturn(false);
1080d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mTime.hasCache()).thenReturn(true);
1081d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mTime.currentTimeMillis()).thenReturn(currentTimeMillis());
1082d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mTime.getCacheAge()).thenReturn(0L);
1083d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mTime.getCacheCertainty()).thenReturn(0L);
10848e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey    }
10858e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey
1086b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson    private void expectBandwidthControlCheck() throws Exception {
1087d445c5553805d7b519f128258c21e29ebfc6c17aFelipe Leme        when(mNetManager.isBandwidthControlEnabled()).thenReturn(true);
1088b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson    }
1089b7e3fd80e52cd7a3607f36044d6c3b94bb985b27Jeff Davidson
109039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private void assertStatsFilesExist(boolean exist) {
109163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey        final File basePath = new File(mStatsDir, "netstats");
109239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        if (exist) {
109363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            assertTrue(basePath.list().length > 0);
109439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        } else {
109563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey            assertTrue(basePath.list().length == 0);
109639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        }
109739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
109839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
1099b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private static void assertValues(NetworkStats stats, String iface, int uid, int set,
1100c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen            int tag, int metered, int roaming, long rxBytes, long rxPackets, long txBytes,
1101c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen            long txPackets, int operations) {
110270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        final NetworkStats.Entry entry = new NetworkStats.Entry();
1103f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        final int[] sets;
1104f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        if (set == SET_ALL) {
1105f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey            sets = new int[] { SET_ALL, SET_DEFAULT, SET_FOREGROUND };
1106f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        } else {
1107f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey            sets = new int[] { set };
1108a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        }
1109a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
1110f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        final int[] roamings;
1111f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        if (roaming == ROAMING_ALL) {
1112f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey            roamings = new int[] { ROAMING_ALL, ROAMING_YES, ROAMING_NO };
1113f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        } else {
1114f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey            roamings = new int[] { roaming };
1115a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        }
1116a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
1117f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        final int[] meterings;
1118f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        if (metered == METERED_ALL) {
1119f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey            meterings = new int[] { METERED_ALL, METERED_YES, METERED_NO };
1120f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey        } else {
1121f4de294297de47d8c594956b2d8607e314e71836Jeff Sharkey            meterings = new int[] { metered };
1122c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        }
1123c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen
1124a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        for (int s : sets) {
1125a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson            for (int r : roamings) {
1126c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                for (int m : meterings) {
1127c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                    final int i = stats.findIndex(iface, uid, s, tag, m, r);
1128c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                    if (i != -1) {
1129c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                        entry.add(stats.getValues(i, null));
1130c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen                    }
1131a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson                }
113270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey            }
113370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey        }
113470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey
1135a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
1136a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
1137a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
1138a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
1139a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
1140d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
1141d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
1142a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private static void assertValues(NetworkStatsHistory stats, long start, long end, long rxBytes,
1143a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            long rxPackets, long txBytes, long txPackets, int operations) {
1144434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        final NetworkStatsHistory.Entry entry = stats.getValues(start, end, null);
1145434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
1146a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
1147434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey        assertEquals("unexpected txBytes", txBytes, entry.txBytes);
1148a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected txPackets", txPackets, entry.txPackets);
1149a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        assertEquals("unexpected operations", operations, entry.operations);
1150434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey    }
1151434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey
115239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    private static NetworkState buildWifiState() {
1153c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        return buildWifiState(false);
1154c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen    }
1155c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen
1156c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen    private static NetworkState buildWifiState(boolean isMetered) {
115739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
115839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
115939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        final LinkProperties prop = new LinkProperties();
116039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey        prop.setInterfaceName(TEST_IFACE);
1161fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme        final NetworkCapabilities capabilities = new NetworkCapabilities();
1162c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        if (!isMetered) {
1163c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen            capabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
1164c926b7399a041fb82f15baa889bbf7ee0fa45643Stephen Chen        }
1165fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme        return new NetworkState(info, prop, capabilities, null, null, TEST_SSID);
116639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
116739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
1168b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    private static NetworkState buildMobile3gState(String subscriberId) {
1169a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        return buildMobile3gState(subscriberId, false /* isRoaming */);
1170a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson    }
1171a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson
1172a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson    private static NetworkState buildMobile3gState(String subscriberId, boolean isRoaming) {
1173b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final NetworkInfo info = new NetworkInfo(
1174b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey                TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UMTS, null, null);
1175b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
1176a6a78076eeb27084ed815ce0492d4ffe08134becJeff Davidson        info.setRoaming(isRoaming);
1177b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        final LinkProperties prop = new LinkProperties();
1178b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey        prop.setInterfaceName(TEST_IFACE);
1179fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme        final NetworkCapabilities capabilities = new NetworkCapabilities();
1180fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme        return new NetworkState(info, prop, capabilities, null, subscriberId, null);
1181b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    }
1182b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
1183163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey    private static NetworkState buildMobile4gState(String iface) {
1184d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final NetworkInfo info = new NetworkInfo(TYPE_WIMAX, 0, null, null);
1185d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        info.setDetailedState(DetailedState.CONNECTED, null, null);
1186d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey        final LinkProperties prop = new LinkProperties();
1187163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        prop.setInterfaceName(iface);
1188fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme        final NetworkCapabilities capabilities = new NetworkCapabilities();
1189fe46a2f8689f96e75c491d5c2477fe2caec2f289Felipe Leme        return new NetworkState(info, prop, capabilities, null, null, null);
1190d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey    }
1191d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey
1192b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private NetworkStats buildEmptyStats() {
1193b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return new NetworkStats(getElapsedRealtime(), 0);
1194b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1195b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1196b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long getElapsedRealtime() {
1197b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return mElapsedRealtime;
1198b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1199b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1200b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long startTimeMillis() {
1201b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return TEST_START;
1202b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1203b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1204b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private long currentTimeMillis() {
1205b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        return startTimeMillis() + mElapsedRealtime;
1206b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    }
1207b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey
1208b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey    private void incrementCurrentTime(long duration) {
1209b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey        mElapsedRealtime += duration;
121039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey    }
121139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey
1212cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    private void forcePollAndWaitForIdle() {
1213cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
1214cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        // Send dummy message to make sure that any previous message has been handled
1215cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        mHandler.sendMessage(mHandler.obtainMessage(-1));
1216669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichi        waitForIdleHandler(mHandler, WAIT_TIMEOUT);
1217cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
1218cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1219cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    static class LatchedHandler extends Handler {
1220cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        private final ConditionVariable mCv;
1221669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichi        int lastMessageType = INVALID_TYPE;
1222cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1223cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        LatchedHandler(Looper looper, ConditionVariable cv) {
1224cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            super(looper);
1225cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            mCv = cv;
1226cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        }
1227cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado
1228cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        @Override
1229cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        public void handleMessage(Message msg) {
1230669f02323f9c7298fdef79b44e1a512549d1411aHugo Benichi            lastMessageType = msg.what;
1231cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            mCv.open();
1232cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado            super.handleMessage(msg);
1233cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado        }
1234cd42acd9515bdce89d4f1401ee2888d684bf1918Antonio Cansado    }
12353f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey}
1236