Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.server.net;
     18 
     19 import static android.content.Intent.ACTION_UID_REMOVED;
     20 import static android.content.Intent.EXTRA_UID;
     21 import static android.net.ConnectivityManager.TYPE_MOBILE;
     22 import static android.net.ConnectivityManager.TYPE_WIFI;
     23 import static android.net.ConnectivityManager.TYPE_WIMAX;
     24 import static android.net.NetworkStats.IFACE_ALL;
     25 import static android.net.NetworkStats.ROAMING_ALL;
     26 import static android.net.NetworkStats.ROAMING_NO;
     27 import static android.net.NetworkStats.ROAMING_YES;
     28 import static android.net.NetworkStats.SET_ALL;
     29 import static android.net.NetworkStats.SET_DEFAULT;
     30 import static android.net.NetworkStats.SET_FOREGROUND;
     31 import static android.net.NetworkStats.TAG_NONE;
     32 import static android.net.NetworkStats.UID_ALL;
     33 import static android.net.NetworkStatsHistory.FIELD_ALL;
     34 import static android.net.NetworkTemplate.buildTemplateMobileAll;
     35 import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
     36 import static android.net.TrafficStats.MB_IN_BYTES;
     37 import static android.net.TrafficStats.UID_REMOVED;
     38 import static android.net.TrafficStats.UID_TETHERING;
     39 import static android.text.format.DateUtils.DAY_IN_MILLIS;
     40 import static android.text.format.DateUtils.HOUR_IN_MILLIS;
     41 import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
     42 import static android.text.format.DateUtils.WEEK_IN_MILLIS;
     43 import static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_POLL;
     44 import static org.easymock.EasyMock.anyInt;
     45 import static org.easymock.EasyMock.anyLong;
     46 import static org.easymock.EasyMock.anyObject;
     47 import static org.easymock.EasyMock.capture;
     48 import static org.easymock.EasyMock.createMock;
     49 import static org.easymock.EasyMock.eq;
     50 import static org.easymock.EasyMock.expect;
     51 import static org.easymock.EasyMock.expectLastCall;
     52 import static org.easymock.EasyMock.isA;
     53 
     54 import android.app.AlarmManager;
     55 import android.app.IAlarmListener;
     56 import android.app.IAlarmManager;
     57 import android.app.PendingIntent;
     58 import android.app.usage.NetworkStatsManager;
     59 import android.content.Context;
     60 import android.content.Intent;
     61 import android.net.DataUsageRequest;
     62 import android.net.IConnectivityManager;
     63 import android.net.INetworkManagementEventObserver;
     64 import android.net.INetworkStatsSession;
     65 import android.net.LinkProperties;
     66 import android.net.NetworkInfo;
     67 import android.net.NetworkInfo.DetailedState;
     68 import android.net.NetworkState;
     69 import android.net.NetworkStats;
     70 import android.net.NetworkStatsHistory;
     71 import android.net.NetworkTemplate;
     72 import android.os.ConditionVariable;
     73 import android.os.Handler;
     74 import android.os.HandlerThread;
     75 import android.os.INetworkManagementService;
     76 import android.os.IBinder;
     77 import android.os.Looper;
     78 import android.os.Messenger;
     79 import android.os.MessageQueue;
     80 import android.os.MessageQueue.IdleHandler;
     81 import android.os.Message;
     82 import android.os.PowerManager;
     83 import android.os.WorkSource;
     84 import android.telephony.TelephonyManager;
     85 import android.test.AndroidTestCase;
     86 import android.test.suitebuilder.annotation.LargeTest;
     87 import android.test.suitebuilder.annotation.Suppress;
     88 import android.util.TrustedTime;
     89 
     90 import com.android.internal.net.VpnInfo;
     91 import com.android.server.BroadcastInterceptingContext;
     92 import com.android.server.net.NetworkStatsService;
     93 import com.android.server.net.NetworkStatsService.NetworkStatsSettings;
     94 import com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config;
     95 
     96 import libcore.io.IoUtils;
     97 
     98 import org.easymock.Capture;
     99 import org.easymock.EasyMock;
    100 
    101 import java.io.File;
    102 import java.util.ArrayList;
    103 import java.util.Objects;
    104 import java.util.List;
    105 
    106 /**
    107  * Tests for {@link NetworkStatsService}.
    108  *
    109  * TODO: This test is really brittle, largely due to overly-strict use of Easymock.
    110  * Rewrite w/ Mockito.
    111  */
    112 @LargeTest
    113 public class NetworkStatsServiceTest extends AndroidTestCase {
    114     private static final String TAG = "NetworkStatsServiceTest";
    115 
    116     private static final String TEST_IFACE = "test0";
    117     private static final String TEST_IFACE2 = "test1";
    118     private static final long TEST_START = 1194220800000L;
    119 
    120     private static final String IMSI_1 = "310004";
    121     private static final String IMSI_2 = "310260";
    122     private static final String TEST_SSID = "AndroidAP";
    123 
    124     private static NetworkTemplate sTemplateWifi = buildTemplateWifiWildcard();
    125     private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1);
    126     private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2);
    127 
    128     private static final int UID_RED = 1001;
    129     private static final int UID_BLUE = 1002;
    130     private static final int UID_GREEN = 1003;
    131 
    132     private static final long WAIT_TIMEOUT = 2 * 1000;  // 2 secs
    133     private static final int INVALID_TYPE = -1;
    134 
    135     private long mElapsedRealtime;
    136 
    137     private BroadcastInterceptingContext mServiceContext;
    138     private File mStatsDir;
    139 
    140     private INetworkManagementService mNetManager;
    141     private TrustedTime mTime;
    142     private NetworkStatsSettings mSettings;
    143     private IConnectivityManager mConnManager;
    144     private IdleableHandlerThread mHandlerThread;
    145     private Handler mHandler;
    146 
    147     private NetworkStatsService mService;
    148     private INetworkStatsSession mSession;
    149     private INetworkManagementEventObserver mNetworkObserver;
    150 
    151     @Override
    152     public void setUp() throws Exception {
    153         super.setUp();
    154 
    155         mServiceContext = new BroadcastInterceptingContext(getContext());
    156         mStatsDir = getContext().getFilesDir();
    157         if (mStatsDir.exists()) {
    158             IoUtils.deleteContents(mStatsDir);
    159         }
    160 
    161         mNetManager = createMock(INetworkManagementService.class);
    162 
    163         // TODO: Mock AlarmManager when migrating this test to Mockito.
    164         AlarmManager alarmManager = (AlarmManager) mServiceContext
    165                 .getSystemService(Context.ALARM_SERVICE);
    166         mTime = createMock(TrustedTime.class);
    167         mSettings = createMock(NetworkStatsSettings.class);
    168         mConnManager = createMock(IConnectivityManager.class);
    169 
    170         PowerManager powerManager = (PowerManager) mServiceContext.getSystemService(
    171                 Context.POWER_SERVICE);
    172         PowerManager.WakeLock wakeLock =
    173                 powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
    174 
    175         mService = new NetworkStatsService(
    176                 mServiceContext, mNetManager, alarmManager, wakeLock, mTime,
    177                 TelephonyManager.getDefault(), mSettings, new NetworkStatsObservers(),
    178                 mStatsDir, getBaseDir(mStatsDir));
    179         mHandlerThread = new IdleableHandlerThread("HandlerThread");
    180         mHandlerThread.start();
    181         Handler.Callback callback = new NetworkStatsService.HandlerCallback(mService);
    182         mHandler = new Handler(mHandlerThread.getLooper(), callback);
    183         mService.setHandler(mHandler, callback);
    184         mService.bindConnectivityManager(mConnManager);
    185 
    186         mElapsedRealtime = 0L;
    187 
    188         expectCurrentTime();
    189         expectDefaultSettings();
    190         expectNetworkStatsUidDetail(buildEmptyStats());
    191         expectSystemReady();
    192 
    193         // catch INetworkManagementEventObserver during systemReady()
    194         final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
    195                 INetworkManagementEventObserver>();
    196         mNetManager.registerObserver(capture(networkObserver));
    197         expectLastCall().atLeastOnce();
    198 
    199         replay();
    200         mService.systemReady();
    201         mSession = mService.openSession();
    202         verifyAndReset();
    203 
    204         mNetworkObserver = networkObserver.getValue();
    205 
    206     }
    207 
    208     @Override
    209     public void tearDown() throws Exception {
    210         IoUtils.deleteContents(mStatsDir);
    211 
    212         mServiceContext = null;
    213         mStatsDir = null;
    214 
    215         mNetManager = null;
    216         mTime = null;
    217         mSettings = null;
    218         mConnManager = null;
    219 
    220         mSession.close();
    221         mService = null;
    222 
    223         super.tearDown();
    224     }
    225 
    226     public void testNetworkStatsWifi() throws Exception {
    227         // pretend that wifi network comes online; service should ask about full
    228         // network state, and poll any existing interfaces before updating.
    229         expectCurrentTime();
    230         expectDefaultSettings();
    231         expectNetworkState(buildWifiState());
    232         expectNetworkStatsSummary(buildEmptyStats());
    233         expectNetworkStatsUidDetail(buildEmptyStats());
    234         expectNetworkStatsPoll();
    235         expectBandwidthControlCheck();
    236 
    237         replay();
    238         mService.forceUpdateIfaces();
    239 
    240         // verify service has empty history for wifi
    241         assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
    242         verifyAndReset();
    243 
    244         // modify some number on wifi, and trigger poll event
    245         incrementCurrentTime(HOUR_IN_MILLIS);
    246         expectCurrentTime();
    247         expectDefaultSettings();
    248         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    249                 .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
    250         expectNetworkStatsUidDetail(buildEmptyStats());
    251         expectNetworkStatsPoll();
    252 
    253         replay();
    254         forcePollAndWaitForIdle();
    255 
    256         // verify service recorded history
    257         assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
    258         verifyAndReset();
    259 
    260         // and bump forward again, with counters going higher. this is
    261         // important, since polling should correctly subtract last snapshot.
    262         incrementCurrentTime(DAY_IN_MILLIS);
    263         expectCurrentTime();
    264         expectDefaultSettings();
    265         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    266                 .addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L));
    267         expectNetworkStatsUidDetail(buildEmptyStats());
    268         expectNetworkStatsPoll();
    269 
    270         replay();
    271         forcePollAndWaitForIdle();
    272 
    273         // verify service recorded history
    274         assertNetworkTotal(sTemplateWifi, 4096L, 4L, 8192L, 8L, 0);
    275         verifyAndReset();
    276 
    277     }
    278 
    279     public void testStatsRebootPersist() throws Exception {
    280         assertStatsFilesExist(false);
    281 
    282         // pretend that wifi network comes online; service should ask about full
    283         // network state, and poll any existing interfaces before updating.
    284         expectCurrentTime();
    285         expectDefaultSettings();
    286         expectNetworkState(buildWifiState());
    287         expectNetworkStatsSummary(buildEmptyStats());
    288         expectNetworkStatsUidDetail(buildEmptyStats());
    289         expectNetworkStatsPoll();
    290         expectBandwidthControlCheck();
    291 
    292         replay();
    293         mService.forceUpdateIfaces();
    294 
    295         // verify service has empty history for wifi
    296         assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
    297         verifyAndReset();
    298 
    299         // modify some number on wifi, and trigger poll event
    300         incrementCurrentTime(HOUR_IN_MILLIS);
    301         expectCurrentTime();
    302         expectDefaultSettings();
    303         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    304                 .addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L));
    305         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2)
    306                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
    307                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
    308                 .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
    309                 .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 256L, 2L, 128L, 1L, 0L)
    310                 .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 0L));
    311         expectNetworkStatsPoll();
    312 
    313         mService.setUidForeground(UID_RED, false);
    314         mService.incrementOperationCount(UID_RED, 0xFAAD, 4);
    315         mService.setUidForeground(UID_RED, true);
    316         mService.incrementOperationCount(UID_RED, 0xFAAD, 6);
    317 
    318         replay();
    319         forcePollAndWaitForIdle();
    320 
    321         // verify service recorded history
    322         assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
    323         assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
    324         assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_NO, 512L, 4L, 256L, 2L, 4);
    325         assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_NO, 512L, 4L, 256L, 2L,
    326                 6);
    327         assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
    328         verifyAndReset();
    329 
    330         // graceful shutdown system, which should trigger persist of stats, and
    331         // clear any values in memory.
    332         expectCurrentTime();
    333         expectDefaultSettings();
    334         replay();
    335         mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN));
    336         verifyAndReset();
    337 
    338         assertStatsFilesExist(true);
    339 
    340         // boot through serviceReady() again
    341         expectCurrentTime();
    342         expectDefaultSettings();
    343         expectNetworkStatsUidDetail(buildEmptyStats());
    344         expectSystemReady();
    345 
    346         // catch INetworkManagementEventObserver during systemReady()
    347         final Capture<INetworkManagementEventObserver> networkObserver = new Capture<
    348                 INetworkManagementEventObserver>();
    349         mNetManager.registerObserver(capture(networkObserver));
    350         expectLastCall().atLeastOnce();
    351 
    352         replay();
    353         mService.systemReady();
    354 
    355         mNetworkObserver = networkObserver.getValue();
    356 
    357         // after systemReady(), we should have historical stats loaded again
    358         assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
    359         assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
    360         assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_NO, 512L, 4L, 256L, 2L, 4);
    361         assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_NO, 512L, 4L, 256L, 2L,
    362                 6);
    363         assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
    364         verifyAndReset();
    365 
    366     }
    367 
    368     // TODO: simulate reboot to test bucket resize
    369     @Suppress
    370     public void testStatsBucketResize() throws Exception {
    371         NetworkStatsHistory history = null;
    372 
    373         assertStatsFilesExist(false);
    374 
    375         // pretend that wifi network comes online; service should ask about full
    376         // network state, and poll any existing interfaces before updating.
    377         expectCurrentTime();
    378         expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
    379         expectNetworkState(buildWifiState());
    380         expectNetworkStatsSummary(buildEmptyStats());
    381         expectNetworkStatsUidDetail(buildEmptyStats());
    382         expectNetworkStatsPoll();
    383         expectBandwidthControlCheck();
    384 
    385         replay();
    386         mService.forceUpdateIfaces();
    387         verifyAndReset();
    388 
    389         // modify some number on wifi, and trigger poll event
    390         incrementCurrentTime(2 * HOUR_IN_MILLIS);
    391         expectCurrentTime();
    392         expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
    393         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    394                 .addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L));
    395         expectNetworkStatsUidDetail(buildEmptyStats());
    396         expectNetworkStatsPoll();
    397 
    398         replay();
    399         forcePollAndWaitForIdle();
    400 
    401         // verify service recorded history
    402         history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
    403         assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
    404         assertEquals(HOUR_IN_MILLIS, history.getBucketDuration());
    405         assertEquals(2, history.size());
    406         verifyAndReset();
    407 
    408         // now change bucket duration setting and trigger another poll with
    409         // exact same values, which should resize existing buckets.
    410         expectCurrentTime();
    411         expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
    412         expectNetworkStatsSummary(buildEmptyStats());
    413         expectNetworkStatsUidDetail(buildEmptyStats());
    414         expectNetworkStatsPoll();
    415 
    416         replay();
    417         forcePollAndWaitForIdle();
    418 
    419         // verify identical stats, but spread across 4 buckets now
    420         history = mSession.getHistoryForNetwork(sTemplateWifi, FIELD_ALL);
    421         assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, 512L, 4L, 512L, 4L, 0);
    422         assertEquals(30 * MINUTE_IN_MILLIS, history.getBucketDuration());
    423         assertEquals(4, history.size());
    424         verifyAndReset();
    425 
    426     }
    427 
    428     public void testUidStatsAcrossNetworks() throws Exception {
    429         // pretend first mobile network comes online
    430         expectCurrentTime();
    431         expectDefaultSettings();
    432         expectNetworkState(buildMobile3gState(IMSI_1));
    433         expectNetworkStatsSummary(buildEmptyStats());
    434         expectNetworkStatsUidDetail(buildEmptyStats());
    435         expectNetworkStatsPoll();
    436         expectBandwidthControlCheck();
    437 
    438         replay();
    439         mService.forceUpdateIfaces();
    440         verifyAndReset();
    441 
    442         // create some traffic on first network
    443         incrementCurrentTime(HOUR_IN_MILLIS);
    444         expectCurrentTime();
    445         expectDefaultSettings();
    446         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    447                 .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
    448         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
    449                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
    450                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
    451                 .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
    452         expectNetworkStatsPoll();
    453 
    454         mService.incrementOperationCount(UID_RED, 0xF00D, 10);
    455 
    456         replay();
    457         forcePollAndWaitForIdle();
    458 
    459         // verify service recorded history
    460         assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
    461         assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
    462         assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
    463         assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
    464         verifyAndReset();
    465 
    466         // now switch networks; this also tests that we're okay with interfaces
    467         // disappearing, to verify we don't count backwards.
    468         incrementCurrentTime(HOUR_IN_MILLIS);
    469         expectCurrentTime();
    470         expectDefaultSettings();
    471         expectNetworkState(buildMobile3gState(IMSI_2));
    472         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    473                 .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
    474         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3)
    475                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
    476                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
    477                 .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L));
    478         expectNetworkStatsPoll();
    479         expectBandwidthControlCheck();
    480 
    481         replay();
    482         mService.forceUpdateIfaces();
    483         forcePollAndWaitForIdle();
    484         verifyAndReset();
    485 
    486         // create traffic on second network
    487         incrementCurrentTime(HOUR_IN_MILLIS);
    488         expectCurrentTime();
    489         expectDefaultSettings();
    490         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    491                 .addIfaceValues(TEST_IFACE, 2176L, 17L, 1536L, 12L));
    492         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    493                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1536L, 12L, 512L, 4L, 0L)
    494                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
    495                 .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 640L, 5L, 1024L, 8L, 0L)
    496                 .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xFAAD, 128L, 1L, 1024L, 8L, 0L));
    497         expectNetworkStatsPoll();
    498 
    499         mService.incrementOperationCount(UID_BLUE, 0xFAAD, 10);
    500 
    501         replay();
    502         forcePollAndWaitForIdle();
    503 
    504         // verify original history still intact
    505         assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
    506         assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 512L, 4L, 10);
    507         assertUidTotal(sTemplateImsi1, UID_BLUE, 512L, 4L, 0L, 0L, 0);
    508 
    509         // and verify new history also recorded under different template, which
    510         // verifies that we didn't cross the streams.
    511         assertNetworkTotal(sTemplateImsi2, 128L, 1L, 1024L, 8L, 0);
    512         assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
    513         assertUidTotal(sTemplateImsi2, UID_BLUE, 128L, 1L, 1024L, 8L, 10);
    514         verifyAndReset();
    515 
    516     }
    517 
    518     public void testUidRemovedIsMoved() throws Exception {
    519         // pretend that network comes online
    520         expectCurrentTime();
    521         expectDefaultSettings();
    522         expectNetworkState(buildWifiState());
    523         expectNetworkStatsSummary(buildEmptyStats());
    524         expectNetworkStatsUidDetail(buildEmptyStats());
    525         expectNetworkStatsPoll();
    526         expectBandwidthControlCheck();
    527 
    528         replay();
    529         mService.forceUpdateIfaces();
    530         verifyAndReset();
    531 
    532         // create some traffic
    533         incrementCurrentTime(HOUR_IN_MILLIS);
    534         expectCurrentTime();
    535         expectDefaultSettings();
    536         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    537                 .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
    538         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    539                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
    540                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
    541                 .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
    542                 .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
    543         expectNetworkStatsPoll();
    544 
    545         mService.incrementOperationCount(UID_RED, 0xFAAD, 10);
    546 
    547         replay();
    548         forcePollAndWaitForIdle();
    549 
    550         // verify service recorded history
    551         assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
    552         assertUidTotal(sTemplateWifi, UID_RED, 16L, 1L, 16L, 1L, 10);
    553         assertUidTotal(sTemplateWifi, UID_BLUE, 4096L, 258L, 512L, 32L, 0);
    554         assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
    555         verifyAndReset();
    556 
    557         // now pretend two UIDs are uninstalled, which should migrate stats to
    558         // special "removed" bucket.
    559         expectCurrentTime();
    560         expectDefaultSettings();
    561         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    562                 .addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
    563         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    564                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L)
    565                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xFAAD, 16L, 1L, 16L, 1L, 0L)
    566                 .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 4096L, 258L, 512L, 32L, 0L)
    567                 .addValues(TEST_IFACE, UID_GREEN, SET_DEFAULT, TAG_NONE, 16L, 1L, 16L, 1L, 0L));
    568         expectNetworkStatsPoll();
    569 
    570         replay();
    571         final Intent intent = new Intent(ACTION_UID_REMOVED);
    572         intent.putExtra(EXTRA_UID, UID_BLUE);
    573         mServiceContext.sendBroadcast(intent);
    574         intent.putExtra(EXTRA_UID, UID_RED);
    575         mServiceContext.sendBroadcast(intent);
    576 
    577         // existing uid and total should remain unchanged; but removed UID
    578         // should be gone completely.
    579         assertNetworkTotal(sTemplateWifi, 4128L, 258L, 544L, 34L, 0);
    580         assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0);
    581         assertUidTotal(sTemplateWifi, UID_BLUE, 0L, 0L, 0L, 0L, 0);
    582         assertUidTotal(sTemplateWifi, UID_GREEN, 16L, 1L, 16L, 1L, 0);
    583         assertUidTotal(sTemplateWifi, UID_REMOVED, 4112L, 259L, 528L, 33L, 10);
    584         verifyAndReset();
    585 
    586     }
    587 
    588     public void testUid3g4gCombinedByTemplate() throws Exception {
    589         // pretend that network comes online
    590         expectCurrentTime();
    591         expectDefaultSettings();
    592         expectNetworkState(buildMobile3gState(IMSI_1));
    593         expectNetworkStatsSummary(buildEmptyStats());
    594         expectNetworkStatsUidDetail(buildEmptyStats());
    595         expectNetworkStatsPoll();
    596         expectBandwidthControlCheck();
    597 
    598         replay();
    599         mService.forceUpdateIfaces();
    600         verifyAndReset();
    601 
    602         // create some traffic
    603         incrementCurrentTime(HOUR_IN_MILLIS);
    604         expectCurrentTime();
    605         expectDefaultSettings();
    606         expectNetworkStatsSummary(buildEmptyStats());
    607         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    608                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
    609                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
    610         expectNetworkStatsPoll();
    611 
    612         mService.incrementOperationCount(UID_RED, 0xF00D, 5);
    613 
    614         replay();
    615         forcePollAndWaitForIdle();
    616 
    617         // verify service recorded history
    618         assertUidTotal(sTemplateImsi1, UID_RED, 1024L, 8L, 1024L, 8L, 5);
    619         verifyAndReset();
    620 
    621         // now switch over to 4g network
    622         incrementCurrentTime(HOUR_IN_MILLIS);
    623         expectCurrentTime();
    624         expectDefaultSettings();
    625         expectNetworkState(buildMobile4gState(TEST_IFACE2));
    626         expectNetworkStatsSummary(buildEmptyStats());
    627         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    628                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
    629                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L));
    630         expectNetworkStatsPoll();
    631         expectBandwidthControlCheck();
    632 
    633         replay();
    634         mService.forceUpdateIfaces();
    635         forcePollAndWaitForIdle();
    636         verifyAndReset();
    637 
    638         // create traffic on second network
    639         incrementCurrentTime(HOUR_IN_MILLIS);
    640         expectCurrentTime();
    641         expectDefaultSettings();
    642         expectNetworkStatsSummary(buildEmptyStats());
    643         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    644                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 0L)
    645                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)
    646                 .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 0L)
    647                 .addValues(TEST_IFACE2, UID_RED, SET_DEFAULT, 0xFAAD, 512L, 4L, 256L, 2L, 0L));
    648         expectNetworkStatsPoll();
    649 
    650         mService.incrementOperationCount(UID_RED, 0xFAAD, 5);
    651 
    652         replay();
    653         forcePollAndWaitForIdle();
    654 
    655         // verify that ALL_MOBILE template combines both
    656         assertUidTotal(sTemplateImsi1, UID_RED, 1536L, 12L, 1280L, 10L, 10);
    657 
    658         verifyAndReset();
    659     }
    660 
    661     public void testSummaryForAllUid() throws Exception {
    662         // pretend that network comes online
    663         expectCurrentTime();
    664         expectDefaultSettings();
    665         expectNetworkState(buildWifiState());
    666         expectNetworkStatsSummary(buildEmptyStats());
    667         expectNetworkStatsUidDetail(buildEmptyStats());
    668         expectNetworkStatsPoll();
    669         expectBandwidthControlCheck();
    670 
    671         replay();
    672         mService.forceUpdateIfaces();
    673         verifyAndReset();
    674 
    675         // create some traffic for two apps
    676         incrementCurrentTime(HOUR_IN_MILLIS);
    677         expectCurrentTime();
    678         expectDefaultSettings();
    679         expectNetworkStatsSummary(buildEmptyStats());
    680         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    681                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
    682                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
    683                 .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 1024L, 8L, 512L, 4L, 0L));
    684         expectNetworkStatsPoll();
    685 
    686         mService.incrementOperationCount(UID_RED, 0xF00D, 1);
    687 
    688         replay();
    689         forcePollAndWaitForIdle();
    690 
    691         // verify service recorded history
    692         assertUidTotal(sTemplateWifi, UID_RED, 50L, 5L, 50L, 5L, 1);
    693         assertUidTotal(sTemplateWifi, UID_BLUE, 1024L, 8L, 512L, 4L, 0);
    694         verifyAndReset();
    695 
    696         // now create more traffic in next hour, but only for one app
    697         incrementCurrentTime(HOUR_IN_MILLIS);
    698         expectCurrentTime();
    699         expectDefaultSettings();
    700         expectNetworkStatsSummary(buildEmptyStats());
    701         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    702                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L)
    703                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 10L, 1L, 10L, 1L, 0L)
    704                 .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 2048L, 16L, 1024L, 8L, 0L));
    705         expectNetworkStatsPoll();
    706 
    707         replay();
    708         forcePollAndWaitForIdle();
    709 
    710         // first verify entire history present
    711         NetworkStats stats = mSession.getSummaryForAllUid(
    712                 sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
    713         assertEquals(3, stats.size());
    714         assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 50L, 5L,
    715                 50L, 5L, 1);
    716         assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 10L, 1L, 10L,
    717                 1L, 1);
    718         assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_NO, 2048L, 16L,
    719                 1024L, 8L, 0);
    720 
    721         // now verify that recent history only contains one uid
    722         final long currentTime = currentTimeMillis();
    723         stats = mSession.getSummaryForAllUid(
    724                 sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true);
    725         assertEquals(1, stats.size());
    726         assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L,
    727                 512L, 4L, 0);
    728 
    729         verifyAndReset();
    730     }
    731 
    732     public void testForegroundBackground() throws Exception {
    733         // pretend that network comes online
    734         expectCurrentTime();
    735         expectDefaultSettings();
    736         expectNetworkState(buildWifiState());
    737         expectNetworkStatsSummary(buildEmptyStats());
    738         expectNetworkStatsUidDetail(buildEmptyStats());
    739         expectNetworkStatsPoll();
    740         expectBandwidthControlCheck();
    741 
    742         replay();
    743         mService.forceUpdateIfaces();
    744         verifyAndReset();
    745 
    746         // create some initial traffic
    747         incrementCurrentTime(HOUR_IN_MILLIS);
    748         expectCurrentTime();
    749         expectDefaultSettings();
    750         expectNetworkStatsSummary(buildEmptyStats());
    751         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    752                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
    753                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L));
    754         expectNetworkStatsPoll();
    755 
    756         mService.incrementOperationCount(UID_RED, 0xF00D, 1);
    757 
    758         replay();
    759         forcePollAndWaitForIdle();
    760 
    761         // verify service recorded history
    762         assertUidTotal(sTemplateWifi, UID_RED, 128L, 2L, 128L, 2L, 1);
    763         verifyAndReset();
    764 
    765         // now switch to foreground
    766         incrementCurrentTime(HOUR_IN_MILLIS);
    767         expectCurrentTime();
    768         expectDefaultSettings();
    769         expectNetworkStatsSummary(buildEmptyStats());
    770         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    771                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L)
    772                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 64L, 1L, 64L, 1L, 0L)
    773                 .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, TAG_NONE, 32L, 2L, 32L, 2L, 0L)
    774                 .addValues(TEST_IFACE, UID_RED, SET_FOREGROUND, 0xFAAD, 1L, 1L, 1L, 1L, 0L));
    775         expectNetworkStatsPoll();
    776 
    777         mService.setUidForeground(UID_RED, true);
    778         mService.incrementOperationCount(UID_RED, 0xFAAD, 1);
    779 
    780         replay();
    781         forcePollAndWaitForIdle();
    782 
    783         // test that we combined correctly
    784         assertUidTotal(sTemplateWifi, UID_RED, 160L, 4L, 160L, 4L, 2);
    785 
    786         // verify entire history present
    787         final NetworkStats stats = mSession.getSummaryForAllUid(
    788                 sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
    789         assertEquals(4, stats.size());
    790         assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L,
    791                 128L, 2L, 1);
    792         assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L,
    793                 1L, 1);
    794         assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 32L, 2L,
    795                 32L, 2L, 1);
    796         assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, ROAMING_NO, 1L, 1L, 1L,
    797                 1L, 1);
    798 
    799         verifyAndReset();
    800     }
    801 
    802     public void testRoaming() throws Exception {
    803         // pretend that network comes online
    804         expectCurrentTime();
    805         expectDefaultSettings();
    806         expectNetworkState(buildMobile3gState(IMSI_1, true /* isRoaming */));
    807         expectNetworkStatsSummary(buildEmptyStats());
    808         expectNetworkStatsUidDetail(buildEmptyStats());
    809         expectNetworkStatsPoll();
    810         expectBandwidthControlCheck();
    811 
    812         replay();
    813         mService.forceUpdateIfaces();
    814         verifyAndReset();
    815 
    816         // Create some traffic
    817         incrementCurrentTime(HOUR_IN_MILLIS);
    818         expectCurrentTime();
    819         expectDefaultSettings();
    820         expectNetworkStatsSummary(buildEmptyStats());
    821         // Note that all traffic from NetworkManagementService is tagged as ROAMING_NO, because
    822         // roaming isn't tracked at that layer. We layer it on top by inspecting the iface
    823         // properties.
    824         expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
    825                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L,
    826                         128L, 2L, 0L)
    827                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L,
    828                         1L, 0L));
    829         expectNetworkStatsPoll();
    830 
    831         replay();
    832         forcePollAndWaitForIdle();
    833 
    834         // verify service recorded history
    835         assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
    836 
    837         // verify entire history present
    838         final NetworkStats stats = mSession.getSummaryForAllUid(
    839                 sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
    840         assertEquals(2, stats.size());
    841         assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 2L,
    842                 128L, 2L, 0);
    843         assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES, 64L, 1L, 64L,
    844                 1L, 0);
    845 
    846         verifyAndReset();
    847     }
    848 
    849     public void testTethering() throws Exception {
    850         // pretend first mobile network comes online
    851         expectCurrentTime();
    852         expectDefaultSettings();
    853         expectNetworkState(buildMobile3gState(IMSI_1));
    854         expectNetworkStatsSummary(buildEmptyStats());
    855         expectNetworkStatsUidDetail(buildEmptyStats());
    856         expectNetworkStatsPoll();
    857         expectBandwidthControlCheck();
    858 
    859         replay();
    860         mService.forceUpdateIfaces();
    861         verifyAndReset();
    862 
    863         // create some tethering traffic
    864         incrementCurrentTime(HOUR_IN_MILLIS);
    865         expectCurrentTime();
    866         expectDefaultSettings();
    867         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    868                 .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
    869 
    870         final NetworkStats uidStats = new NetworkStats(getElapsedRealtime(), 1)
    871                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L);
    872         final String[] tetherIfacePairs = new String[] { TEST_IFACE, "wlan0" };
    873         final NetworkStats tetherStats = new NetworkStats(getElapsedRealtime(), 1)
    874                 .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L, 0L);
    875 
    876         expectNetworkStatsUidDetail(uidStats, tetherIfacePairs, tetherStats);
    877         expectNetworkStatsPoll();
    878 
    879         replay();
    880         forcePollAndWaitForIdle();
    881 
    882         // verify service recorded history
    883         assertNetworkTotal(sTemplateImsi1, 2048L, 16L, 512L, 4L, 0);
    884         assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
    885         assertUidTotal(sTemplateImsi1, UID_TETHERING, 1920L, 14L, 384L, 2L, 0);
    886         verifyAndReset();
    887 
    888     }
    889 
    890     public void testRegisterUsageCallback() throws Exception {
    891         // pretend that wifi network comes online; service should ask about full
    892         // network state, and poll any existing interfaces before updating.
    893         expectCurrentTime();
    894         expectDefaultSettings();
    895         expectNetworkState(buildWifiState());
    896         expectNetworkStatsSummary(buildEmptyStats());
    897         expectNetworkStatsUidDetail(buildEmptyStats());
    898         expectNetworkStatsPoll();
    899         expectBandwidthControlCheck();
    900 
    901         replay();
    902         mService.forceUpdateIfaces();
    903 
    904         // verify service has empty history for wifi
    905         assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0);
    906         verifyAndReset();
    907 
    908         String callingPackage = "the.calling.package";
    909         long thresholdInBytes = 1L;  // very small; should be overriden by framework
    910         DataUsageRequest inputRequest = new DataUsageRequest(
    911                 DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdInBytes);
    912 
    913         // Create a messenger that waits for callback activity
    914         ConditionVariable cv = new ConditionVariable(false);
    915         LatchedHandler latchedHandler = new LatchedHandler(Looper.getMainLooper(), cv);
    916         Messenger messenger = new Messenger(latchedHandler);
    917 
    918         // Allow binder to connect
    919         IBinder mockBinder = createMock(IBinder.class);
    920         mockBinder.linkToDeath((IBinder.DeathRecipient) anyObject(), anyInt());
    921         EasyMock.replay(mockBinder);
    922 
    923         // Force poll
    924         expectCurrentTime();
    925         expectDefaultSettings();
    926         expectNetworkStatsSummary(buildEmptyStats());
    927         expectNetworkStatsUidDetail(buildEmptyStats());
    928         expectNetworkStatsPoll();
    929         replay();
    930 
    931         // Register and verify request and that binder was called
    932         DataUsageRequest request =
    933                 mService.registerUsageCallback(callingPackage, inputRequest,
    934                         messenger, mockBinder);
    935         assertTrue(request.requestId > 0);
    936         assertTrue(Objects.equals(sTemplateWifi, request.template));
    937         long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB
    938         assertEquals(minThresholdInBytes, request.thresholdInBytes);
    939 
    940         // Send dummy message to make sure that any previous message has been handled
    941         mHandler.sendMessage(mHandler.obtainMessage(-1));
    942         mHandlerThread.waitForIdle(WAIT_TIMEOUT);
    943 
    944         verifyAndReset();
    945 
    946         // Make sure that the caller binder gets connected
    947         EasyMock.verify(mockBinder);
    948         EasyMock.reset(mockBinder);
    949 
    950         // modify some number on wifi, and trigger poll event
    951         // not enough traffic to call data usage callback
    952         incrementCurrentTime(HOUR_IN_MILLIS);
    953         expectCurrentTime();
    954         expectDefaultSettings();
    955         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    956                 .addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
    957         expectNetworkStatsUidDetail(buildEmptyStats());
    958         expectNetworkStatsPoll();
    959 
    960         replay();
    961         forcePollAndWaitForIdle();
    962 
    963         // verify service recorded history
    964         verifyAndReset();
    965         assertNetworkTotal(sTemplateWifi, 1024L, 1L, 2048L, 2L, 0);
    966 
    967         // make sure callback has not being called
    968         assertEquals(INVALID_TYPE, latchedHandler.mLastMessageType);
    969 
    970         // and bump forward again, with counters going higher. this is
    971         // important, since it will trigger the data usage callback
    972         incrementCurrentTime(DAY_IN_MILLIS);
    973         expectCurrentTime();
    974         expectDefaultSettings();
    975         expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
    976                 .addIfaceValues(TEST_IFACE, 4096000L, 4L, 8192000L, 8L));
    977         expectNetworkStatsUidDetail(buildEmptyStats());
    978         expectNetworkStatsPoll();
    979 
    980         replay();
    981         forcePollAndWaitForIdle();
    982 
    983         // verify service recorded history
    984         assertNetworkTotal(sTemplateWifi, 4096000L, 4L, 8192000L, 8L, 0);
    985         verifyAndReset();
    986 
    987         // Wait for the caller to ack receipt of CALLBACK_LIMIT_REACHED
    988         assertTrue(cv.block(WAIT_TIMEOUT));
    989         assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, latchedHandler.mLastMessageType);
    990         cv.close();
    991 
    992         // Allow binder to disconnect
    993         expect(mockBinder.unlinkToDeath((IBinder.DeathRecipient) anyObject(), anyInt()))
    994                 .andReturn(true);
    995         EasyMock.replay(mockBinder);
    996 
    997         // Unregister request
    998         mService.unregisterUsageRequest(request);
    999 
   1000         // Wait for the caller to ack receipt of CALLBACK_RELEASED
   1001         assertTrue(cv.block(WAIT_TIMEOUT));
   1002         assertEquals(NetworkStatsManager.CALLBACK_RELEASED, latchedHandler.mLastMessageType);
   1003 
   1004         // Make sure that the caller binder gets disconnected
   1005         EasyMock.verify(mockBinder);
   1006     }
   1007 
   1008     public void testUnregisterUsageCallback_unknown_noop() throws Exception {
   1009         String callingPackage = "the.calling.package";
   1010         long thresholdInBytes = 10 * 1024 * 1024;  // 10 MB
   1011         DataUsageRequest unknownRequest = new DataUsageRequest(
   1012                 2 /* requestId */, sTemplateImsi1, thresholdInBytes);
   1013 
   1014         mService.unregisterUsageRequest(unknownRequest);
   1015     }
   1016 
   1017     private static File getBaseDir(File statsDir) {
   1018         File baseDir = new File(statsDir, "netstats");
   1019         baseDir.mkdirs();
   1020         return baseDir;
   1021     }
   1022 
   1023     private void assertNetworkTotal(NetworkTemplate template, long rxBytes, long rxPackets,
   1024             long txBytes, long txPackets, int operations) throws Exception {
   1025         assertNetworkTotal(template, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
   1026                 txPackets, operations);
   1027     }
   1028 
   1029     private void assertNetworkTotal(NetworkTemplate template, long start, long end, long rxBytes,
   1030             long rxPackets, long txBytes, long txPackets, int operations) throws Exception {
   1031         // verify history API
   1032         final NetworkStatsHistory history = mSession.getHistoryForNetwork(template, FIELD_ALL);
   1033         assertValues(history, start, end, rxBytes, rxPackets, txBytes, txPackets, operations);
   1034 
   1035         // verify summary API
   1036         final NetworkStats stats = mSession.getSummaryForNetwork(template, start, end);
   1037         assertValues(stats, IFACE_ALL, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, rxBytes,
   1038                 rxPackets, txBytes, txPackets, operations);
   1039     }
   1040 
   1041     private void assertUidTotal(NetworkTemplate template, int uid, long rxBytes, long rxPackets,
   1042             long txBytes, long txPackets, int operations) throws Exception {
   1043         assertUidTotal(template, uid, SET_ALL, ROAMING_ALL, rxBytes, rxPackets, txBytes, txPackets,
   1044                 operations);
   1045     }
   1046 
   1047     private void assertUidTotal(NetworkTemplate template, int uid, int set, int roaming,
   1048             long rxBytes, long rxPackets, long txBytes, long txPackets, int operations)
   1049             throws Exception {
   1050         // verify history API
   1051         final NetworkStatsHistory history = mSession.getHistoryForUid(
   1052                 template, uid, set, TAG_NONE, FIELD_ALL);
   1053         assertValues(history, Long.MIN_VALUE, Long.MAX_VALUE, rxBytes, rxPackets, txBytes,
   1054                 txPackets, operations);
   1055 
   1056         // verify summary API
   1057         final NetworkStats stats = mSession.getSummaryForAllUid(
   1058                 template, Long.MIN_VALUE, Long.MAX_VALUE, false);
   1059         assertValues(stats, IFACE_ALL, uid, set, TAG_NONE, roaming, rxBytes, rxPackets, txBytes,
   1060                 txPackets, operations);
   1061     }
   1062 
   1063     private void expectSystemReady() throws Exception {
   1064         mNetManager.setGlobalAlert(anyLong());
   1065         expectLastCall().atLeastOnce();
   1066 
   1067         expectNetworkStatsSummary(buildEmptyStats());
   1068         expectBandwidthControlCheck();
   1069     }
   1070 
   1071     private void expectNetworkState(NetworkState... state) throws Exception {
   1072         expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
   1073 
   1074         final LinkProperties linkProp = state.length > 0 ? state[0].linkProperties : null;
   1075         expect(mConnManager.getActiveLinkProperties()).andReturn(linkProp).atLeastOnce();
   1076     }
   1077 
   1078     private void expectNetworkStatsSummary(NetworkStats summary) throws Exception {
   1079         expect(mConnManager.getAllVpnInfo()).andReturn(new VpnInfo[0]).atLeastOnce();
   1080 
   1081         expectNetworkStatsSummaryDev(summary);
   1082         expectNetworkStatsSummaryXt(summary);
   1083     }
   1084 
   1085     private void expectNetworkStatsSummaryDev(NetworkStats summary) throws Exception {
   1086         expect(mNetManager.getNetworkStatsSummaryDev()).andReturn(summary).atLeastOnce();
   1087     }
   1088 
   1089     private void expectNetworkStatsSummaryXt(NetworkStats summary) throws Exception {
   1090         expect(mNetManager.getNetworkStatsSummaryXt()).andReturn(summary).atLeastOnce();
   1091     }
   1092 
   1093     private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception {
   1094         expectNetworkStatsUidDetail(detail, new String[0], new NetworkStats(0L, 0));
   1095     }
   1096 
   1097     private void expectNetworkStatsUidDetail(
   1098             NetworkStats detail, String[] tetherIfacePairs, NetworkStats tetherStats)
   1099             throws Exception {
   1100         expect(mNetManager.getNetworkStatsUidDetail(eq(UID_ALL))).andReturn(detail).atLeastOnce();
   1101 
   1102         // also include tethering details, since they are folded into UID
   1103         expect(mNetManager.getNetworkStatsTethering())
   1104                 .andReturn(tetherStats).atLeastOnce();
   1105     }
   1106 
   1107     private void expectDefaultSettings() throws Exception {
   1108         expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
   1109     }
   1110 
   1111     private void expectSettings(long persistBytes, long bucketDuration, long deleteAge)
   1112             throws Exception {
   1113         expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes();
   1114         expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes();
   1115         expect(mSettings.getSampleEnabled()).andReturn(true).anyTimes();
   1116 
   1117         final Config config = new Config(bucketDuration, deleteAge, deleteAge);
   1118         expect(mSettings.getDevConfig()).andReturn(config).anyTimes();
   1119         expect(mSettings.getXtConfig()).andReturn(config).anyTimes();
   1120         expect(mSettings.getUidConfig()).andReturn(config).anyTimes();
   1121         expect(mSettings.getUidTagConfig()).andReturn(config).anyTimes();
   1122 
   1123         expect(mSettings.getGlobalAlertBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
   1124         expect(mSettings.getDevPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
   1125         expect(mSettings.getXtPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
   1126         expect(mSettings.getUidPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
   1127         expect(mSettings.getUidTagPersistBytes(anyLong())).andReturn(MB_IN_BYTES).anyTimes();
   1128     }
   1129 
   1130     private void expectCurrentTime() throws Exception {
   1131         expect(mTime.forceRefresh()).andReturn(false).anyTimes();
   1132         expect(mTime.hasCache()).andReturn(true).anyTimes();
   1133         expect(mTime.currentTimeMillis()).andReturn(currentTimeMillis()).anyTimes();
   1134         expect(mTime.getCacheAge()).andReturn(0L).anyTimes();
   1135         expect(mTime.getCacheCertainty()).andReturn(0L).anyTimes();
   1136     }
   1137 
   1138     private void expectNetworkStatsPoll() throws Exception {
   1139         mNetManager.setGlobalAlert(anyLong());
   1140         expectLastCall().anyTimes();
   1141     }
   1142 
   1143     private void expectBandwidthControlCheck() throws Exception {
   1144         expect(mNetManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce();
   1145     }
   1146 
   1147     private void assertStatsFilesExist(boolean exist) {
   1148         final File basePath = new File(mStatsDir, "netstats");
   1149         if (exist) {
   1150             assertTrue(basePath.list().length > 0);
   1151         } else {
   1152             assertTrue(basePath.list().length == 0);
   1153         }
   1154     }
   1155 
   1156     private static void assertValues(NetworkStats stats, String iface, int uid, int set,
   1157             int tag, int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets,
   1158             int operations) {
   1159         final NetworkStats.Entry entry = new NetworkStats.Entry();
   1160         List<Integer> sets = new ArrayList<>();
   1161         if (set == SET_DEFAULT || set == SET_ALL) {
   1162             sets.add(SET_DEFAULT);
   1163         }
   1164         if (set == SET_FOREGROUND || set == SET_ALL) {
   1165             sets.add(SET_FOREGROUND);
   1166         }
   1167 
   1168         List<Integer> roamings = new ArrayList<>();
   1169         if (roaming == ROAMING_NO || roaming == ROAMING_ALL) {
   1170             roamings.add(ROAMING_NO);
   1171         }
   1172         if (roaming == ROAMING_YES || roaming == ROAMING_ALL) {
   1173             roamings.add(ROAMING_YES);
   1174         }
   1175 
   1176         for (int s : sets) {
   1177             for (int r : roamings) {
   1178                 final int i = stats.findIndex(iface, uid, s, tag, r);
   1179                 if (i != -1) {
   1180                     entry.add(stats.getValues(i, null));
   1181                 }
   1182             }
   1183         }
   1184 
   1185         assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
   1186         assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
   1187         assertEquals("unexpected txBytes", txBytes, entry.txBytes);
   1188         assertEquals("unexpected txPackets", txPackets, entry.txPackets);
   1189         assertEquals("unexpected operations", operations, entry.operations);
   1190     }
   1191 
   1192     private static void assertValues(NetworkStatsHistory stats, long start, long end, long rxBytes,
   1193             long rxPackets, long txBytes, long txPackets, int operations) {
   1194         final NetworkStatsHistory.Entry entry = stats.getValues(start, end, null);
   1195         assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
   1196         assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
   1197         assertEquals("unexpected txBytes", txBytes, entry.txBytes);
   1198         assertEquals("unexpected txPackets", txPackets, entry.txPackets);
   1199         assertEquals("unexpected operations", operations, entry.operations);
   1200     }
   1201 
   1202     private static NetworkState buildWifiState() {
   1203         final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
   1204         info.setDetailedState(DetailedState.CONNECTED, null, null);
   1205         final LinkProperties prop = new LinkProperties();
   1206         prop.setInterfaceName(TEST_IFACE);
   1207         return new NetworkState(info, prop, null, null, null, TEST_SSID);
   1208     }
   1209 
   1210     private static NetworkState buildMobile3gState(String subscriberId) {
   1211         return buildMobile3gState(subscriberId, false /* isRoaming */);
   1212     }
   1213 
   1214     private static NetworkState buildMobile3gState(String subscriberId, boolean isRoaming) {
   1215         final NetworkInfo info = new NetworkInfo(
   1216                 TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UMTS, null, null);
   1217         info.setDetailedState(DetailedState.CONNECTED, null, null);
   1218         info.setRoaming(isRoaming);
   1219         final LinkProperties prop = new LinkProperties();
   1220         prop.setInterfaceName(TEST_IFACE);
   1221         return new NetworkState(info, prop, null, null, subscriberId, null);
   1222     }
   1223 
   1224     private static NetworkState buildMobile4gState(String iface) {
   1225         final NetworkInfo info = new NetworkInfo(TYPE_WIMAX, 0, null, null);
   1226         info.setDetailedState(DetailedState.CONNECTED, null, null);
   1227         final LinkProperties prop = new LinkProperties();
   1228         prop.setInterfaceName(iface);
   1229         return new NetworkState(info, prop, null, null, null, null);
   1230     }
   1231 
   1232     private NetworkStats buildEmptyStats() {
   1233         return new NetworkStats(getElapsedRealtime(), 0);
   1234     }
   1235 
   1236     private long getElapsedRealtime() {
   1237         return mElapsedRealtime;
   1238     }
   1239 
   1240     private long startTimeMillis() {
   1241         return TEST_START;
   1242     }
   1243 
   1244     private long currentTimeMillis() {
   1245         return startTimeMillis() + mElapsedRealtime;
   1246     }
   1247 
   1248     private void incrementCurrentTime(long duration) {
   1249         mElapsedRealtime += duration;
   1250     }
   1251 
   1252     private void replay() {
   1253         EasyMock.replay(mNetManager, mTime, mSettings, mConnManager);
   1254     }
   1255 
   1256     private void verifyAndReset() {
   1257         EasyMock.verify(mNetManager, mTime, mSettings, mConnManager);
   1258         EasyMock.reset(mNetManager, mTime, mSettings, mConnManager);
   1259     }
   1260 
   1261     private void forcePollAndWaitForIdle() {
   1262         mServiceContext.sendBroadcast(new Intent(ACTION_NETWORK_STATS_POLL));
   1263         // Send dummy message to make sure that any previous message has been handled
   1264         mHandler.sendMessage(mHandler.obtainMessage(-1));
   1265         mHandlerThread.waitForIdle(WAIT_TIMEOUT);
   1266     }
   1267 
   1268     static class LatchedHandler extends Handler {
   1269         private final ConditionVariable mCv;
   1270         int mLastMessageType = INVALID_TYPE;
   1271 
   1272         LatchedHandler(Looper looper, ConditionVariable cv) {
   1273             super(looper);
   1274             mCv = cv;
   1275         }
   1276 
   1277         @Override
   1278         public void handleMessage(Message msg) {
   1279             mLastMessageType = msg.what;
   1280             mCv.open();
   1281             super.handleMessage(msg);
   1282         }
   1283     }
   1284 
   1285     /**
   1286      * A subclass of HandlerThread that allows callers to wait for it to become idle. waitForIdle
   1287      * will return immediately if the handler is already idle.
   1288      */
   1289     static class IdleableHandlerThread extends HandlerThread {
   1290         private IdleHandler mIdleHandler;
   1291 
   1292         public IdleableHandlerThread(String name) {
   1293             super(name);
   1294         }
   1295 
   1296         public void waitForIdle(long timeoutMs) {
   1297             final ConditionVariable cv = new ConditionVariable();
   1298             final MessageQueue queue = getLooper().getQueue();
   1299 
   1300             synchronized (queue) {
   1301                 if (queue.isIdle()) {
   1302                     return;
   1303                 }
   1304 
   1305                 assertNull("BUG: only one idle handler allowed", mIdleHandler);
   1306                 mIdleHandler = new IdleHandler() {
   1307                     public boolean queueIdle() {
   1308                         cv.open();
   1309                         mIdleHandler = null;
   1310                         return false;  // Remove the handler.
   1311                     }
   1312                 };
   1313                 queue.addIdleHandler(mIdleHandler);
   1314             }
   1315 
   1316             if (!cv.block(timeoutMs)) {
   1317                 fail("HandlerThread " + getName() + " did not become idle after " + timeoutMs
   1318                         + " ms");
   1319                 queue.removeIdleHandler(mIdleHandler);
   1320             }
   1321         }
   1322     }
   1323 
   1324 }
   1325