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; 33e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateWifiWildcard; 34241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkeyimport static android.net.TrafficStats.MB_IN_BYTES; 35b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.net.TrafficStats.UID_REMOVED; 36905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkeyimport static android.net.TrafficStats.UID_TETHERING; 373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.DAY_IN_MILLIS; 383f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static android.text.format.DateUtils.HOUR_IN_MILLIS; 3939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS; 4039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport static android.text.format.DateUtils.WEEK_IN_MILLIS; 413f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL; 423f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.anyLong; 4363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport static org.easymock.EasyMock.aryEq; 448e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport static org.easymock.EasyMock.capture; 453f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.createMock; 463f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.eq; 473f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.expect; 483f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.expectLastCall; 493f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport static org.easymock.EasyMock.isA; 503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.AlarmManager; 523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.IAlarmManager; 533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.app.PendingIntent; 543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.content.Intent; 553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.IConnectivityManager; 568e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport android.net.INetworkManagementEventObserver; 57b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkeyimport android.net.INetworkStatsSession; 583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.LinkProperties; 593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo; 603f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkInfo.DetailedState; 613f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkState; 623f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStats; 633f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.net.NetworkStatsHistory; 641b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkTemplate; 653f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.os.INetworkManagementService; 66b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport android.telephony.TelephonyManager; 673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.AndroidTestCase; 683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest; 6963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.test.suitebuilder.annotation.Suppress; 703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.util.TrustedTime; 713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport com.android.server.net.NetworkStatsService; 7339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings; 7463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config; 753f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 768e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport org.easymock.Capture; 773f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport org.easymock.EasyMock; 783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 793f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport java.io.File; 80b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 81b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport libcore.io.IoUtils; 823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 833f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey/** 843f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey * Tests for {@link NetworkStatsService}. 853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey */ 863f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey@LargeTest 873f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeypublic class NetworkStatsServiceTest extends AndroidTestCase { 88b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey private static final String TAG = "NetworkStatsServiceTest"; 893f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 903f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private static final String TEST_IFACE = "test0"; 91163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey private static final String TEST_IFACE2 = "test1"; 923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private static final long TEST_START = 1194220800000L; 933f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 94b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey private static final String IMSI_1 = "310004"; 95b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey private static final String IMSI_2 = "310260"; 96ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey private static final String TEST_SSID = "AndroidAP"; 97b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 98e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey private static NetworkTemplate sTemplateWifi = buildTemplateWifiWildcard(); 994e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1); 1004e814c348ce205fcc1a273427f95ef1d100ed60cJeff Sharkey private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2); 1011b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 102d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey private static final int UID_RED = 1001; 103d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey private static final int UID_BLUE = 1002; 104d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey private static final int UID_GREEN = 1003; 10539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 106b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private long mElapsedRealtime; 107b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 1083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private BroadcastInterceptingContext mServiceContext; 1093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private File mStatsDir; 1103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private INetworkManagementService mNetManager; 1123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private IAlarmManager mAlarmManager; 1133f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private TrustedTime mTime; 11439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey private NetworkStatsSettings mSettings; 1153f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private IConnectivityManager mConnManager; 1163f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1173f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private NetworkStatsService mService; 118b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey private INetworkStatsSession mSession; 1198e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey private INetworkManagementEventObserver mNetworkObserver; 1203f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1213f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey @Override 1223f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey public void setUp() throws Exception { 1233f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey super.setUp(); 1243f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mServiceContext = new BroadcastInterceptingContext(getContext()); 1263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mStatsDir = getContext().getFilesDir(); 127b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey if (mStatsDir.exists()) { 128b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey IoUtils.deleteContents(mStatsDir); 129b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1303f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1313f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mNetManager = createMock(INetworkManagementService.class); 1323f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mAlarmManager = createMock(IAlarmManager.class); 1333f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mTime = createMock(TrustedTime.class); 13439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey mSettings = createMock(NetworkStatsSettings.class); 1353f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mConnManager = createMock(IConnectivityManager.class); 1363f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mService = new NetworkStatsService( 13839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey mServiceContext, mNetManager, mAlarmManager, mTime, mStatsDir, mSettings); 1393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mService.bindConnectivityManager(mConnManager); 1403f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 141b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mElapsedRealtime = 0L; 142b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 143b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 14439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectDefaultSettings(); 145b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 146b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 1478e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectSystemReady(); 1488e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 1498e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey // catch INetworkManagementEventObserver during systemReady() 1508e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey final Capture<INetworkManagementEventObserver> networkObserver = new Capture< 1518e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey INetworkManagementEventObserver>(); 1528e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mNetManager.registerObserver(capture(networkObserver)); 1538e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectLastCall().atLeastOnce(); 1543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey replay(); 1563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mService.systemReady(); 157e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mSession = mService.openSession(); 1583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey verifyAndReset(); 1593f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1608e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mNetworkObserver = networkObserver.getValue(); 1618e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 1623f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 1633f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1643f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey @Override 1653f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey public void tearDown() throws Exception { 166ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey IoUtils.deleteContents(mStatsDir); 1673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mServiceContext = null; 1693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mStatsDir = null; 1703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1713f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mNetManager = null; 1723f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mAlarmManager = null; 1733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mTime = null; 174b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mSettings = null; 175b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mConnManager = null; 1763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 177b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey mSession.close(); 1783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mService = null; 1793f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey super.tearDown(); 1813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 1823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 183b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey public void testNetworkStatsWifi() throws Exception { 1843f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // pretend that wifi network comes online; service should ask about full 1853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // network state, and poll any existing interfaces before updating. 186b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 18739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectDefaultSettings(); 18839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectNetworkState(buildWifiState()); 189b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 190b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 191905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsPoll(); 1923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1933f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey replay(); 194961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 1953f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1963f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // verify service has empty history for wifi 197a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); 19839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey verifyAndReset(); 1993f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2003f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // modify some number on wifi, and trigger poll event 201b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 202b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 20339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectDefaultSettings(); 204b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 205b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L)); 206b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 2078e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 2083f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2093f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey replay(); 2103f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 2113f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2123f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // verify service recorded history 213a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0); 21439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey verifyAndReset(); 2153f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2163f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // and bump forward again, with counters going higher. this is 2173f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // important, since polling should correctly subtract last snapshot. 218b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(DAY_IN_MILLIS); 219b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 22039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectDefaultSettings(); 221b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 222b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L)); 223b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 2248e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 2253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey replay(); 2273f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 2283f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2293f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // verify service recorded history 230a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateWifi, 4096L, 4L, 8192L, 8L, 0); 23139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey verifyAndReset(); 23239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 2333f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 2343f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 23539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey public void testStatsRebootPersist() throws Exception { 23639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey assertStatsFilesExist(false); 2373f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2383f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // pretend that wifi network comes online; service should ask about full 2393f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // network state, and poll any existing interfaces before updating. 240b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 24139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectDefaultSettings(); 24239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectNetworkState(buildWifiState()); 243b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 244b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 245905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsPoll(); 2463f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2473f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey replay(); 248961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 2493f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // verify service has empty history for wifi 251a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); 25239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey verifyAndReset(); 2533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // modify some number on wifi, and trigger poll event 255b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 256b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 25739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectDefaultSettings(); 258b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 259b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L)); 260b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2) 261b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L) 262b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 256L, 2L, 128L, 1L, 0L) 263b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 512L, 4L, 256L, 2L, 0L) 264b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 256L, 2L, 128L, 1L, 0L) 265b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 0L)); 2668e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 267b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 268b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.setUidForeground(UID_RED, false); 269b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.incrementOperationCount(UID_RED, 0xFAAD, 4); 270b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.setUidForeground(UID_RED, true); 271b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.incrementOperationCount(UID_RED, 0xFAAD, 6); 272a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 2733f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey replay(); 2743f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 2753f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // verify service recorded history 277a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0); 278b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10); 279b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, 512L, 4L, 256L, 2L, 4); 280b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, 512L, 4L, 256L, 2L, 6); 281b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0); 28239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey verifyAndReset(); 2833f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 2843f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // graceful shutdown system, which should trigger persist of stats, and 2853f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // clear any values in memory. 28634c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey expectCurrentTime(); 28734c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey expectDefaultSettings(); 28834c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey replay(); 2893f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN)); 29034c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey verifyAndReset(); 2913f3913550c10792edb8aecf66cc83c3db5c8b311Jeff 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 32263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // TODO: simulate reboot to test bucket resize 32363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey @Suppress 32439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey public void testStatsBucketResize() throws Exception { 32539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey NetworkStatsHistory history = null; 32639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 32739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey assertStatsFilesExist(false); 32839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 32939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey // pretend that wifi network comes online; service should ask about full 33039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey // network state, and poll any existing interfaces before updating. 331b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 33239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS); 33339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectNetworkState(buildWifiState()); 334b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 335b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 336905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsPoll(); 33739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 33839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey replay(); 339961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 34039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey verifyAndReset(); 34139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 34239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey // modify some number on wifi, and trigger poll event 343b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(2 * HOUR_IN_MILLIS); 344b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 34539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS); 346b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 347b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L)); 348b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 3498e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 35039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 35139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey replay(); 35239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 35339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 35439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey // verify service recorded history 355b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL); 356a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0); 357d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey assertEquals(HOUR_IN_MILLIS, history.getBucketDuration()); 358d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey assertEquals(2, history.size()); 35939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey verifyAndReset(); 36039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 36139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey // now change bucket duration setting and trigger another poll with 36239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey // exact same values, which should resize existing buckets. 363b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 36439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS); 365b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 366b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 3678e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 36839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 36939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey replay(); 37039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 37139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 37239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey // verify identical stats, but spread across 4 buckets now 373b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL); 374a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0); 375d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey assertEquals(30 * MINUTE_IN_MILLIS, history.getBucketDuration()); 376d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey assertEquals(4, history.size()); 37739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey verifyAndReset(); 3783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 3793f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 3803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 381b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey public void testUidStatsAcrossNetworks() throws Exception { 382b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // pretend first mobile network comes online 383b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 384b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectDefaultSettings(); 385b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectNetworkState(buildMobile3gState(IMSI_1)); 386b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 387b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 388905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsPoll(); 389b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 390b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey replay(); 391961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 392b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey verifyAndReset(); 393b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 394b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // create some traffic on first network 395b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 396b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 397b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectDefaultSettings(); 398b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 399b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L)); 400b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3) 401b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L) 402b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L) 403b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L)); 4048e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 405b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 406a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey mService.incrementOperationCount(UID_RED, 0xF00D, 10); 407a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 408b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey replay(); 409b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 410b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 411b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // verify service recorded history 412a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0); 413a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); 414b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10); 415b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0); 416b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey verifyAndReset(); 417b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 418b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // now switch networks; this also tests that we're okay with interfaces 419b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // disappearing, to verify we don't count backwards. 420b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 421b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 422b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectDefaultSettings(); 423b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectNetworkState(buildMobile3gState(IMSI_2)); 424163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 425163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L)); 426163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3) 427163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L) 428163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L) 429163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L)); 4308e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 431b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 432b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey replay(); 433961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 434b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 435b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey verifyAndReset(); 436b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 437b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // create traffic on second network 438b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 439b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 440b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectDefaultSettings(); 441b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 442163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addIfaceValues(TEST_IFACE, 2176L, 17L, 1536L, 12L)); 443b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 444163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L) 445163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L) 446163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 640L, 5L, 1024L, 8L, 0L) 447b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xFAAD, 128L, 1L, 1024L, 8L, 0L)); 4488e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 449b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 450b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.incrementOperationCount(UID_BLUE, 0xFAAD, 10); 451a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 452b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey replay(); 453b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 454b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 455b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // verify original history still intact 456a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0); 457b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10); 458b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0); 459b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 460b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // and verify new history also recorded under different template, which 461b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // verifies that we didn't cross the streams. 462a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateImsi2, 128L, 1L, 1024L, 8L, 0); 463a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); 464a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertUidTotal(sTemplateImsi2, UID_BLUE, 128L, 1L, 1024L, 8L, 10); 465b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey verifyAndReset(); 466b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 467b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } 468b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 469b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey public void testUidRemovedIsMoved() throws Exception { 470b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // pretend that network comes online 471b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 472b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectDefaultSettings(); 473b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectNetworkState(buildWifiState()); 474b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 475b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 476905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsPoll(); 477b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 478b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey replay(); 479961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 480b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey verifyAndReset(); 481b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 482b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // create some traffic 483b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 484b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 485b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectDefaultSettings(); 486b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 487b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L)); 488b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 489b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L) 490b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L) 491b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L) 492b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)); 4938e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 494b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 495b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.incrementOperationCount(UID_RED, 0xFAAD, 10); 496a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 497b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey replay(); 498b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 499b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 500b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // verify service recorded history 501a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0); 502a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10); 503b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0); 504b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0); 505b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey verifyAndReset(); 506b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 507b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // now pretend two UIDs are uninstalled, which should migrate stats to 508b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // special "removed" bucket. 50934c73acf88c8190b8cd51d8b8f2b9c22aa7f7941Jeff Sharkey expectCurrentTime(); 510b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey expectDefaultSettings(); 511163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 512163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L)); 513163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 514163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L) 515163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L) 516163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L) 517163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)); 518163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey expectNetworkStatsPoll(); 519163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 520b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey replay(); 521b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey final Intent intent = new Intent(ACTION_UID_REMOVED); 522d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey intent.putExtra(EXTRA_UID, UID_BLUE); 523b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mServiceContext.sendBroadcast(intent); 524d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey intent.putExtra(EXTRA_UID, UID_RED); 525b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mServiceContext.sendBroadcast(intent); 526b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 527b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // existing uid and total should remain unchanged; but removed UID 528b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // should be gone completely. 529a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0); 530a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0); 531a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertUidTotal(sTemplateWifi, UID_BLUE, 0L, 0L, 0L, 0L, 0); 532b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0); 533b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10); 534b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey verifyAndReset(); 535b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 536b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } 537b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 538d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey public void testUid3g4gCombinedByTemplate() throws Exception { 539d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // pretend that network comes online 540b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 541d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey expectDefaultSettings(); 542d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey expectNetworkState(buildMobile3gState(IMSI_1)); 543b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 544b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 545905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsPoll(); 546d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 547d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey replay(); 548961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 549d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey verifyAndReset(); 550d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 551d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // create some traffic 552b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 553b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 554d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey expectDefaultSettings(); 555b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 556b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 557b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L) 558b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)); 5598e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 560d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 561a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey mService.incrementOperationCount(UID_RED, 0xF00D, 5); 562a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 563d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey replay(); 564d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 565d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 566d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // verify service recorded history 567b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5); 568d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey verifyAndReset(); 569d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 570d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // now switch over to 4g network 571b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 572b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 573d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey expectDefaultSettings(); 574163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey expectNetworkState(buildMobile4gState(TEST_IFACE2)); 575b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 576163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 577163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L) 578163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)); 5798e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 580d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 581d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey replay(); 582961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 583d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 584d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey verifyAndReset(); 585d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 586d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // create traffic on second network 587b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 588b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 589d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey expectDefaultSettings(); 590b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 591b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 592163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L) 593163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L) 594163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L) 595163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, 0xFAAD, 512L, 4L, 256L, 2L, 0L)); 5968e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 597d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 598b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.incrementOperationCount(UID_RED, 0xFAAD, 5); 599a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 600d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey replay(); 601d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 602d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 603d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // verify that ALL_MOBILE template combines both 604b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 10); 605d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 606d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey verifyAndReset(); 607d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey } 608d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 609d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey public void testSummaryForAllUid() throws Exception { 610d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // pretend that network comes online 611b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 612d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey expectDefaultSettings(); 613d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey expectNetworkState(buildWifiState()); 614b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 615b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 616905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsPoll(); 617d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 618d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey replay(); 619961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 620d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey verifyAndReset(); 621d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 622d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // create some traffic for two apps 623b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 624b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 625d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey expectDefaultSettings(); 626b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 627b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 628b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L) 629b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L) 630b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0L)); 6318e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 632d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 633a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey mService.incrementOperationCount(UID_RED, 0xF00D, 1); 634a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 635d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey replay(); 636d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 637d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 638d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // verify service recorded history 639b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1); 640b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0); 641d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey verifyAndReset(); 642a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 643d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // now create more traffic in next hour, but only for one app 644b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 645b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 646d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey expectDefaultSettings(); 647b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 648b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 649163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L) 650163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L) 651b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L)); 6528e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 653a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 654d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey replay(); 655d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 656d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 657d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // first verify entire history present 658b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey NetworkStats stats = mSession.getSummaryForAllUid( 659d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true); 660d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey assertEquals(3, stats.size()); 661b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 1); 662b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 1); 663b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0); 664d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 665d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey // now verify that recent history only contains one uid 666b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey final long currentTime = currentTimeMillis(); 667b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey stats = mSession.getSummaryForAllUid( 668d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true); 669d37948f6ed1667d077e0e3a38808f42f981ddcc2Jeff Sharkey assertEquals(1, stats.size()); 670b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0); 671b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 672b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey verifyAndReset(); 673b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 674b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 675b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey public void testForegroundBackground() throws Exception { 676b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey // pretend that network comes online 677b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 678b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectDefaultSettings(); 679b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkState(buildWifiState()); 680b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 681b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 682905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsPoll(); 683b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 684b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey replay(); 685961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 686b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey verifyAndReset(); 687b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 688b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey // create some initial traffic 689b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 690b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 691b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectDefaultSettings(); 692b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 693b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 694b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L) 695b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L)); 6968e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 697b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 698b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.incrementOperationCount(UID_RED, 0xF00D, 1); 699b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 700b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey replay(); 701b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 702b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 703b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey // verify service recorded history 704b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1); 705b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey verifyAndReset(); 706b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 707b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey // now switch to foreground 708b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 709b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectCurrentTime(); 710b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectDefaultSettings(); 711b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 712b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1) 713b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L) 714b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L) 715b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 0L) 716b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 0L)); 7178e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectNetworkStatsPoll(); 718b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 719b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.setUidForeground(UID_RED, true); 720b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mService.incrementOperationCount(UID_RED, 0xFAAD, 1); 721b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 722b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey replay(); 723b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 724b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 725b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey // test that we combined correctly 726b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(sTemplateWifi, UID_RED, 160L, 4L, 160L, 4L, 2); 727b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 728b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey // verify entire history present 729b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey final NetworkStats stats = mSession.getSummaryForAllUid( 730b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true); 731b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertEquals(4, stats.size()); 732b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 1); 733b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 1); 734b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 1); 735b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 1); 736d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 737d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey verifyAndReset(); 738d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey } 739d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 740905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey public void testTethering() throws Exception { 741905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey // pretend first mobile network comes online 742905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectCurrentTime(); 743905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectDefaultSettings(); 744905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkState(buildMobile3gState(IMSI_1)); 745905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 746905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 747905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsPoll(); 748905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey 749905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey replay(); 750905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 751905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey verifyAndReset(); 752905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey 753905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey // create some tethering traffic 754905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey incrementCurrentTime(HOUR_IN_MILLIS); 755905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectCurrentTime(); 756905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectDefaultSettings(); 757905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) 758905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L)); 75963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 76063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final NetworkStats uidStats = new NetworkStats(getElapsedRealtime(), 1) 76163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L); 762905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey final String[] tetherIfacePairs = new String[] { TEST_IFACE, "wlan0" }; 76363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final NetworkStats tetherStats = new NetworkStats(getElapsedRealtime(), 1) 76463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L, 0L); 76563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 76663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expectNetworkStatsUidDetail(uidStats, tetherIfacePairs, tetherStats); 76763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expectNetworkStatsPoll(); 768905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey 769905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey replay(); 770905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 771905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey 772905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey // verify service recorded history 773905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0); 774905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0); 775905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey assertUidTotal(sTemplateImsi1, UID_TETHERING, 1920L, 14L, 384L, 2L, 0); 776905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey verifyAndReset(); 777905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey 778905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey } 779905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey 78070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey public void testReportXtOverDev() throws Exception { 78170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // bring mobile network online 78270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectCurrentTime(); 78370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectDefaultSettings(); 78470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkState(buildMobile3gState(IMSI_1)); 78570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsSummary(buildEmptyStats()); 78670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 78770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsPoll(); 78870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 78970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey replay(); 79070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION_IMMEDIATE)); 79170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey verifyAndReset(); 79270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 79370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // create some traffic, but only for DEV, and across 1.5 buckets 79470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey incrementCurrentTime(90 * MINUTE_IN_MILLIS); 79570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectCurrentTime(); 79670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectDefaultSettings(); 79770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsSummaryDev(new NetworkStats(getElapsedRealtime(), 1) 79870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey .addIfaceValues(TEST_IFACE, 6000L, 60L, 3000L, 30L)); 79970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsSummaryXt(buildEmptyStats()); 80070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 80170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsPoll(); 80270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 80370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey replay(); 80470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 80570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 80670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // verify service recorded history: 80770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // 4000(dev) + 2000(dev) 80870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey assertNetworkTotal(sTemplateImsi1, 6000L, 60L, 3000L, 30L, 0); 80970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey verifyAndReset(); 81070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 81170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // create traffic on both DEV and XT, across two buckets 81270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey incrementCurrentTime(2 * HOUR_IN_MILLIS); 81370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectCurrentTime(); 81470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectDefaultSettings(); 81570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsSummaryDev(new NetworkStats(getElapsedRealtime(), 1) 81670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey .addIfaceValues(TEST_IFACE, 6004L, 64L, 3004L, 34L)); 81770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsSummaryXt(new NetworkStats(getElapsedRealtime(), 1) 81870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey .addIfaceValues(TEST_IFACE, 10240L, 0L, 0L, 0L)); 81970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsUidDetail(buildEmptyStats()); 82070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsPoll(); 82170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 82270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey replay(); 82370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL)); 82470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 82570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // verify that we switching reporting at the first atomic XT bucket, 82670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // which should give us: 82770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // 4000(dev) + 2000(dev) + 1(dev) + 5120(xt) + 2560(xt) 82870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey assertNetworkTotal(sTemplateImsi1, 13681L, 61L, 3001L, 31L, 0); 82970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 83070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // also test pure-DEV and pure-XT ranges 83170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey assertNetworkTotal(sTemplateImsi1, startTimeMillis(), 83270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey startTimeMillis() + 2 * HOUR_IN_MILLIS, 6001L, 61L, 3001L, 31L, 0); 83370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey assertNetworkTotal(sTemplateImsi1, startTimeMillis() + 2 * HOUR_IN_MILLIS, 83470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey startTimeMillis() + 4 * HOUR_IN_MILLIS, 7680L, 0L, 0L, 0L, 0); 83570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 83670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey verifyAndReset(); 83770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 83870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 839a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey private void assertNetworkTotal(NetworkTemplate template, long rxBytes, long rxPackets, 840b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey long txBytes, long txPackets, int operations) throws Exception { 84170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey assertNetworkTotal(template, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes, 84270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey txPackets, operations); 84370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 84470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 84570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey private void assertNetworkTotal(NetworkTemplate template, long start, long end, long rxBytes, 84670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey long rxPackets, long txBytes, long txPackets, int operations) throws Exception { 84770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // verify history API 848b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey final NetworkStatsHistory history = mSession.getHistoryForNetwork(template, FIELD_ALL); 84970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey assertValues(history, start, end, rxBytes, rxPackets, txBytes, txPackets, operations); 85070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 85170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // verify summary API 85270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final NetworkStats stats = mSession.getSummaryForNetwork(template, start, end); 85370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey assertValues(stats, IFACE_ALL, UID_ALL, SET_DEFAULT, TAG_NONE, rxBytes, rxPackets, txBytes, 854a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey txPackets, operations); 8553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 8563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 857a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets, 858b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey long txBytes, long txPackets, int operations) throws Exception { 859b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey assertUidTotal(template, uid, SET_ALL, rxBytes, rxPackets, txBytes, txPackets, operations); 860b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 861b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 862b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private void assertUidTotal(NetworkTemplate template, int uid, int set, long rxBytes, 863b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey long rxPackets, long txBytes, long txPackets, int operations) throws Exception { 86470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // verify history API 865b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey final NetworkStatsHistory history = mSession.getHistoryForUid( 866b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey template, uid, set, TAG_NONE, FIELD_ALL); 867a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes, 868a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey txPackets, operations); 86970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 87070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // verify summary API 87170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final NetworkStats stats = mSession.getSummaryForAllUid( 87270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey template, Long.MIN_VALUE, Long.MAX_VALUE, false); 87370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey assertValues(stats, IFACE_ALL, uid, set, TAG_NONE, rxBytes, rxPackets, txBytes, txPackets, 87470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey operations); 87539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 87639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 8778e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey private void expectSystemReady() throws Exception { 8783f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mAlarmManager.remove(isA(PendingIntent.class)); 8793f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey expectLastCall().anyTimes(); 8803f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 8813f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mAlarmManager.setInexactRepeating( 8823f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey eq(AlarmManager.ELAPSED_REALTIME), anyLong(), anyLong(), isA(PendingIntent.class)); 8833f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey expectLastCall().atLeastOnce(); 884b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 8858e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mNetManager.setGlobalAlert(anyLong()); 8868e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectLastCall().atLeastOnce(); 887f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey 888f60d0afd1ef08a24121d015bb016df05265b6d07Jeff Sharkey expect(mNetManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce(); 8893f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 8903f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 89139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey private void expectNetworkState(NetworkState... state) throws Exception { 89239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); 89363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 89463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final LinkProperties linkProp = state.length > 0 ? state[0].linkProperties : null; 89563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expect(mConnManager.getActiveLinkProperties()).andReturn(linkProp).atLeastOnce(); 89639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 89739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 89839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey private void expectNetworkStatsSummary(NetworkStats summary) throws Exception { 89970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsSummaryDev(summary); 90070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expectNetworkStatsSummaryXt(summary); 90170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 90270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 90370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey private void expectNetworkStatsSummaryDev(NetworkStats summary) throws Exception { 904e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey expect(mNetManager.getNetworkStatsSummaryDev()).andReturn(summary).atLeastOnce(); 90570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 90670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 90770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey private void expectNetworkStatsSummaryXt(NetworkStats summary) throws Exception { 908e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey expect(mNetManager.getNetworkStatsSummaryXt()).andReturn(summary).atLeastOnce(); 90939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 91039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 911a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception { 91263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expectNetworkStatsUidDetail(detail, new String[0], new NetworkStats(0L, 0)); 91363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 91463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 91563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private void expectNetworkStatsUidDetail( 91663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey NetworkStats detail, String[] tetherIfacePairs, NetworkStats tetherStats) 91763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey throws Exception { 918a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey expect(mNetManager.getNetworkStatsUidDetail(eq(UID_ALL))).andReturn(detail).atLeastOnce(); 91963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 92063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // also include tethering details, since they are folded into UID 92163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expect(mConnManager.getTetheredIfacePairs()).andReturn(tetherIfacePairs).atLeastOnce(); 92263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expect(mNetManager.getNetworkStatsTethering(aryEq(tetherIfacePairs))) 92363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey .andReturn(tetherStats).atLeastOnce(); 92439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 92539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 92639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey private void expectDefaultSettings() throws Exception { 92739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS); 92839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 92939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 93063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private void expectSettings(long persistBytes, long bucketDuration, long deleteAge) 93139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey throws Exception { 93239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes(); 93339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes(); 93463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expect(mSettings.getSampleEnabled()).andReturn(true).anyTimes(); 93570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey expect(mSettings.getReportXtOverDev()).andReturn(true).anyTimes(); 93663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 937ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey final Config config = new Config(bucketDuration, deleteAge, deleteAge); 93863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expect(mSettings.getDevConfig()).andReturn(config).anyTimes(); 939e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey expect(mSettings.getXtConfig()).andReturn(config).anyTimes(); 94063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expect(mSettings.getUidConfig()).andReturn(config).anyTimes(); 94163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey expect(mSettings.getUidTagConfig()).andReturn(config).anyTimes(); 942ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey 943ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey expect(mSettings.getGlobalAlertBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); 944ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey expect(mSettings.getDevPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); 945ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey expect(mSettings.getXtPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); 946ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey expect(mSettings.getUidPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); 947ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey expect(mSettings.getUidTagPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes(); 94839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 94939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 950b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private void expectCurrentTime() throws Exception { 9513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey expect(mTime.forceRefresh()).andReturn(false).anyTimes(); 9523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey expect(mTime.hasCache()).andReturn(true).anyTimes(); 953b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes(); 9543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey expect(mTime.getCacheAge()).andReturn(0L).anyTimes(); 9553f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes(); 9563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 9573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 9588e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey private void expectNetworkStatsPoll() throws Exception { 9598e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mNetManager.setGlobalAlert(anyLong()); 9608e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey expectLastCall().anyTimes(); 9618e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 9628e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 96339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey private void assertStatsFilesExist(boolean exist) { 96463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final File basePath = new File(mStatsDir, "netstats"); 96539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey if (exist) { 96663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey assertTrue(basePath.list().length > 0); 96739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } else { 96863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey assertTrue(basePath.list().length == 0); 96939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 97039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 97139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 972b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private static void assertValues(NetworkStats stats, String iface, int uid, int set, 973b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) { 97470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final NetworkStats.Entry entry = new NetworkStats.Entry(); 97570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey if (set == SET_DEFAULT || set == SET_ALL) { 97670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final int i = stats.findIndex(iface, uid, SET_DEFAULT, tag); 97770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey if (i != -1) { 97870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey entry.add(stats.getValues(i, null)); 97970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 98070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 98170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey if (set == SET_FOREGROUND || set == SET_ALL) { 98270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final int i = stats.findIndex(iface, uid, SET_FOREGROUND, tag); 98370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey if (i != -1) { 98470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey entry.add(stats.getValues(i, null)); 98570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 98670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 98770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 988a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); 989a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets); 990a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertEquals("unexpected txBytes", txBytes, entry.txBytes); 991a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertEquals("unexpected txPackets", txPackets, entry.txPackets); 992a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertEquals("unexpected operations", operations, entry.operations); 993d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey } 994d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 995a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey private static void assertValues(NetworkStatsHistory stats, long start, long end, long rxBytes, 996a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey long rxPackets, long txBytes, long txPackets, int operations) { 997434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey final NetworkStatsHistory.Entry entry = stats.getValues(start, end, null); 998434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); 999a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets); 1000434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey assertEquals("unexpected txBytes", txBytes, entry.txBytes); 1001a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertEquals("unexpected txPackets", txPackets, entry.txPackets); 1002a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey assertEquals("unexpected operations", operations, entry.operations); 1003434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey } 1004434962e44ea93b1c4d216c55f636a435bf54aa54Jeff Sharkey 100539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey private static NetworkState buildWifiState() { 100639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null); 100739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey info.setDetailedState(DetailedState.CONNECTED, null, null); 100839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey final LinkProperties prop = new LinkProperties(); 100939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey prop.setInterfaceName(TEST_IFACE); 1010ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey return new NetworkState(info, prop, null, null, TEST_SSID); 101139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 101239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 1013b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey private static NetworkState buildMobile3gState(String subscriberId) { 1014b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey final NetworkInfo info = new NetworkInfo( 1015b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UMTS, null, null); 1016b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey info.setDetailedState(DetailedState.CONNECTED, null, null); 1017b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey final LinkProperties prop = new LinkProperties(); 1018b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey prop.setInterfaceName(TEST_IFACE); 1019e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey return new NetworkState(info, prop, null, subscriberId, null); 1020b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } 1021b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 1022163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey private static NetworkState buildMobile4gState(String iface) { 1023d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey final NetworkInfo info = new NetworkInfo(TYPE_WIMAX, 0, null, null); 1024d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey info.setDetailedState(DetailedState.CONNECTED, null, null); 1025d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey final LinkProperties prop = new LinkProperties(); 1026163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey prop.setInterfaceName(iface); 1027d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey return new NetworkState(info, prop, null); 1028d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey } 1029d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey 1030b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private NetworkStats buildEmptyStats() { 1031b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey return new NetworkStats(getElapsedRealtime(), 0); 1032b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1033b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 1034b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private long getElapsedRealtime() { 1035b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey return mElapsedRealtime; 1036b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1037b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 1038b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private long startTimeMillis() { 1039b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey return TEST_START; 1040b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1041b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 1042b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private long currentTimeMillis() { 1043b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey return startTimeMillis() + mElapsedRealtime; 1044b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1045b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 1046b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private void incrementCurrentTime(long duration) { 1047b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mElapsedRealtime += duration; 104839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 104939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 10503f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private void replay() { 105139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey EasyMock.replay(mNetManager, mAlarmManager, mTime, mSettings, mConnManager); 10523f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 10533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 10543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private void verifyAndReset() { 105539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey EasyMock.verify(mNetManager, mAlarmManager, mTime, mSettings, mConnManager); 105639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey EasyMock.reset(mNetManager, mAlarmManager, mTime, mSettings, mConnManager); 10573f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 10583f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey} 1059