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