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