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