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 android.net;
     18 
     19 import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
     20 import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
     21 import static android.net.NetworkStats.DEFAULT_NETWORK_YES;
     22 import static android.net.NetworkStats.INTERFACES_ALL;
     23 import static android.net.NetworkStats.METERED_ALL;
     24 import static android.net.NetworkStats.METERED_NO;
     25 import static android.net.NetworkStats.METERED_YES;
     26 import static android.net.NetworkStats.ROAMING_ALL;
     27 import static android.net.NetworkStats.ROAMING_NO;
     28 import static android.net.NetworkStats.ROAMING_YES;
     29 import static android.net.NetworkStats.SET_DEFAULT;
     30 import static android.net.NetworkStats.SET_FOREGROUND;
     31 import static android.net.NetworkStats.SET_DBG_VPN_IN;
     32 import static android.net.NetworkStats.SET_DBG_VPN_OUT;
     33 import static android.net.NetworkStats.SET_ALL;
     34 import static android.net.NetworkStats.IFACE_ALL;
     35 import static android.net.NetworkStats.TAG_ALL;
     36 import static android.net.NetworkStats.TAG_NONE;
     37 import static android.net.NetworkStats.UID_ALL;
     38 import static org.junit.Assert.assertEquals;
     39 import static org.junit.Assert.assertTrue;
     40 import static org.junit.Assert.fail;
     41 
     42 import android.os.Process;
     43 import android.support.test.runner.AndroidJUnit4;
     44 import android.support.test.filters.SmallTest;
     45 import android.util.ArrayMap;
     46 
     47 import com.google.android.collect.Sets;
     48 
     49 import java.util.HashSet;
     50 
     51 import org.junit.runner.RunWith;
     52 import org.junit.Test;
     53 
     54 @RunWith(AndroidJUnit4.class)
     55 @SmallTest
     56 public class NetworkStatsTest {
     57 
     58     private static final String TEST_IFACE = "test0";
     59     private static final String TEST_IFACE2 = "test2";
     60     private static final int TEST_UID = 1001;
     61     private static final long TEST_START = 1194220800000L;
     62 
     63     @Test
     64     public void testFindIndex() throws Exception {
     65         final NetworkStats stats = new NetworkStats(TEST_START, 5)
     66                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
     67                         DEFAULT_NETWORK_YES, 1024L, 8L, 0L, 0L, 10)
     68                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
     69                         DEFAULT_NETWORK_NO, 0L, 0L, 1024L, 8L, 11)
     70                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
     71                         DEFAULT_NETWORK_YES, 0L, 0L, 1024L, 8L, 11)
     72                 .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
     73                         DEFAULT_NETWORK_NO, 1024L, 8L, 1024L, 8L, 12)
     74                 .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES,
     75                         DEFAULT_NETWORK_YES, 1024L, 8L, 1024L, 8L, 12);
     76 
     77         assertEquals(4, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_YES,
     78                 ROAMING_YES, DEFAULT_NETWORK_YES));
     79         assertEquals(3, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO,
     80                 ROAMING_NO, DEFAULT_NETWORK_NO));
     81         assertEquals(2, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES,
     82                 ROAMING_NO, DEFAULT_NETWORK_YES));
     83         assertEquals(1, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO,
     84                 ROAMING_NO, DEFAULT_NETWORK_NO));
     85         assertEquals(0, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO,
     86                 ROAMING_NO, DEFAULT_NETWORK_YES));
     87         assertEquals(-1, stats.findIndex(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE, METERED_NO,
     88                 ROAMING_NO, DEFAULT_NETWORK_NO));
     89         assertEquals(-1, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO,
     90                 ROAMING_NO, DEFAULT_NETWORK_NO));
     91     }
     92 
     93     @Test
     94     public void testFindIndexHinted() {
     95         final NetworkStats stats = new NetworkStats(TEST_START, 3)
     96                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
     97                         DEFAULT_NETWORK_YES, 1024L, 8L, 0L, 0L, 10)
     98                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
     99                         DEFAULT_NETWORK_NO, 0L, 0L, 1024L, 8L, 11)
    100                 .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    101                         DEFAULT_NETWORK_YES, 1024L, 8L, 1024L, 8L, 12)
    102                 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    103                         DEFAULT_NETWORK_NO, 1024L, 8L, 0L, 0L, 10)
    104                 .addValues(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
    105                         DEFAULT_NETWORK_YES, 0L, 0L, 1024L, 8L, 11)
    106                 .addValues(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO,
    107                         DEFAULT_NETWORK_NO, 0L, 0L, 1024L, 8L, 11)
    108                 .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    109                         DEFAULT_NETWORK_YES, 1024L, 8L, 1024L, 8L, 12)
    110                 .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES,
    111                         DEFAULT_NETWORK_NO, 1024L, 8L, 1024L, 8L, 12);
    112 
    113         // verify that we correctly find across regardless of hinting
    114         for (int hint = 0; hint < stats.size(); hint++) {
    115             assertEquals(0, stats.findIndexHinted(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE,
    116                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
    117             assertEquals(1, stats.findIndexHinted(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE,
    118                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, hint));
    119             assertEquals(2, stats.findIndexHinted(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE,
    120                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
    121             assertEquals(3, stats.findIndexHinted(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE,
    122                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, hint));
    123             assertEquals(4, stats.findIndexHinted(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D,
    124                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
    125             assertEquals(5, stats.findIndexHinted(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D,
    126                     METERED_YES, ROAMING_NO, DEFAULT_NETWORK_NO, hint));
    127             assertEquals(6, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
    128                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
    129             assertEquals(7, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
    130                     METERED_YES, ROAMING_YES, DEFAULT_NETWORK_NO, hint));
    131             assertEquals(-1, stats.findIndexHinted(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE,
    132                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
    133             assertEquals(-1, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
    134                     METERED_YES, ROAMING_YES, DEFAULT_NETWORK_YES, hint));
    135         }
    136     }
    137 
    138     @Test
    139     public void testAddEntryGrow() throws Exception {
    140         final NetworkStats stats = new NetworkStats(TEST_START, 4);
    141 
    142         assertEquals(0, stats.size());
    143         assertEquals(4, stats.internalSize());
    144 
    145         stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    146                 DEFAULT_NETWORK_YES, 1L, 1L, 2L, 2L, 3);
    147         stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    148                 DEFAULT_NETWORK_NO, 2L, 2L, 2L, 2L, 4);
    149         stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
    150                 DEFAULT_NETWORK_YES, 3L, 3L, 2L, 2L, 5);
    151         stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES,
    152                 DEFAULT_NETWORK_NO, 3L, 3L, 2L, 2L, 5);
    153 
    154         assertEquals(4, stats.size());
    155         assertEquals(4, stats.internalSize());
    156 
    157         stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    158                 DEFAULT_NETWORK_NO, 4L, 40L, 4L, 40L, 7);
    159         stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    160                 DEFAULT_NETWORK_YES, 5L, 50L, 4L, 40L, 8);
    161         stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    162                 DEFAULT_NETWORK_NO, 6L, 60L, 5L, 50L, 10);
    163         stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
    164                 DEFAULT_NETWORK_YES, 7L, 70L, 5L, 50L, 11);
    165         stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES,
    166                 DEFAULT_NETWORK_NO, 7L, 70L, 5L, 50L, 11);
    167 
    168         assertEquals(9, stats.size());
    169         assertTrue(stats.internalSize() >= 9);
    170 
    171         assertValues(stats, 0, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    172                 DEFAULT_NETWORK_YES, 1L, 1L, 2L, 2L, 3);
    173         assertValues(stats, 1, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    174                 DEFAULT_NETWORK_NO, 2L, 2L, 2L, 2L, 4);
    175         assertValues(stats, 2, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
    176                 DEFAULT_NETWORK_YES, 3L, 3L, 2L, 2L, 5);
    177         assertValues(stats, 3, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES,
    178                 ROAMING_YES, DEFAULT_NETWORK_NO, 3L, 3L, 2L, 2L, 5);
    179         assertValues(stats, 4, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    180                 DEFAULT_NETWORK_NO, 4L, 40L, 4L, 40L, 7);
    181         assertValues(stats, 5, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    182                 DEFAULT_NETWORK_YES, 5L, 50L, 4L, 40L, 8);
    183         assertValues(stats, 6, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    184                 DEFAULT_NETWORK_NO, 6L, 60L, 5L, 50L, 10);
    185         assertValues(stats, 7, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
    186                 DEFAULT_NETWORK_YES, 7L, 70L, 5L, 50L, 11);
    187         assertValues(stats, 8, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES,
    188                 ROAMING_YES, DEFAULT_NETWORK_NO, 7L, 70L, 5L, 50L, 11);
    189     }
    190 
    191     @Test
    192     public void testCombineExisting() throws Exception {
    193         final NetworkStats stats = new NetworkStats(TEST_START, 10);
    194 
    195         stats.addValues(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 10);
    196         stats.addValues(TEST_IFACE, 1001, SET_DEFAULT, 0xff, 128L, 1L, 128L, 1L, 2);
    197         stats.combineValues(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, -128L, -1L,
    198                 -128L, -1L, -1);
    199 
    200         assertValues(stats, 0, TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    201                 DEFAULT_NETWORK_NO, 384L, 3L, 128L, 1L, 9);
    202         assertValues(stats, 1, TEST_IFACE, 1001, SET_DEFAULT, 0xff, METERED_NO, ROAMING_NO,
    203                 DEFAULT_NETWORK_NO, 128L, 1L, 128L, 1L, 2);
    204 
    205         // now try combining that should create row
    206         stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3);
    207         assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    208                 DEFAULT_NETWORK_NO, 128L, 1L, 128L, 1L, 3);
    209         stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3);
    210         assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    211                 DEFAULT_NETWORK_NO, 256L, 2L, 256L, 2L, 6);
    212     }
    213 
    214     @Test
    215     public void testSubtractIdenticalData() throws Exception {
    216         final NetworkStats before = new NetworkStats(TEST_START, 2)
    217                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
    218                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
    219 
    220         final NetworkStats after = new NetworkStats(TEST_START, 2)
    221                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
    222                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
    223 
    224         final NetworkStats result = after.subtract(before);
    225 
    226         // identical data should result in zero delta
    227         assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    228                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0);
    229         assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    230                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0);
    231     }
    232 
    233     @Test
    234     public void testSubtractIdenticalRows() throws Exception {
    235         final NetworkStats before = new NetworkStats(TEST_START, 2)
    236                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
    237                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
    238 
    239         final NetworkStats after = new NetworkStats(TEST_START, 2)
    240                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1025L, 9L, 2L, 1L, 15)
    241                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 3L, 1L, 1028L, 9L, 20);
    242 
    243         final NetworkStats result = after.subtract(before);
    244 
    245         // expect delta between measurements
    246         assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    247                 DEFAULT_NETWORK_NO, 1L, 1L, 2L, 1L, 4);
    248         assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    249                 DEFAULT_NETWORK_NO, 3L, 1L, 4L, 1L, 8);
    250     }
    251 
    252     @Test
    253     public void testSubtractNewRows() throws Exception {
    254         final NetworkStats before = new NetworkStats(TEST_START, 2)
    255                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
    256                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
    257 
    258         final NetworkStats after = new NetworkStats(TEST_START, 3)
    259                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
    260                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12)
    261                 .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 20);
    262 
    263         final NetworkStats result = after.subtract(before);
    264 
    265         // its okay to have new rows
    266         assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    267                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0);
    268         assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    269                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0);
    270         assertValues(result, 2, TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    271                 DEFAULT_NETWORK_NO, 1024L, 8L, 1024L, 8L, 20);
    272     }
    273 
    274     @Test
    275     public void testSubtractMissingRows() throws Exception {
    276         final NetworkStats before = new NetworkStats(TEST_START, 2)
    277                 .addValues(TEST_IFACE, UID_ALL, SET_DEFAULT, TAG_NONE, 1024L, 0L, 0L, 0L, 0)
    278                 .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, 2048L, 0L, 0L, 0L, 0);
    279 
    280         final NetworkStats after = new NetworkStats(TEST_START, 1)
    281                 .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, 2049L, 2L, 3L, 4L, 0);
    282 
    283         final NetworkStats result = after.subtract(before);
    284 
    285         // should silently drop omitted rows
    286         assertEquals(1, result.size());
    287         assertValues(result, 0, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO,
    288                 ROAMING_NO, DEFAULT_NETWORK_NO, 1L, 2L, 3L, 4L, 0);
    289         assertEquals(4L, result.getTotalBytes());
    290     }
    291 
    292     @Test
    293     public void testTotalBytes() throws Exception {
    294         final NetworkStats iface = new NetworkStats(TEST_START, 2)
    295                 .addValues(TEST_IFACE, UID_ALL, SET_DEFAULT, TAG_NONE, 128L, 0L, 0L, 0L, 0L)
    296                 .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, 256L, 0L, 0L, 0L, 0L);
    297         assertEquals(384L, iface.getTotalBytes());
    298 
    299         final NetworkStats uidSet = new NetworkStats(TEST_START, 3)
    300                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 32L, 0L, 0L, 0L, 0L)
    301                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 32L, 0L, 0L, 0L, 0L)
    302                 .addValues(TEST_IFACE, 101, SET_FOREGROUND, TAG_NONE, 32L, 0L, 0L, 0L, 0L);
    303         assertEquals(96L, uidSet.getTotalBytes());
    304 
    305         final NetworkStats uidTag = new NetworkStats(TEST_START, 6)
    306                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
    307                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
    308                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, 8L, 0L, 0L, 0L, 0L)
    309                 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
    310                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
    311                 .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 8L, 0L, 0L, 0L, 0L);
    312         assertEquals(64L, uidTag.getTotalBytes());
    313 
    314         final NetworkStats uidMetered = new NetworkStats(TEST_START, 3)
    315                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    316                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L)
    317                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
    318                         DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L)
    319                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
    320                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L);
    321         assertEquals(96L, uidMetered.getTotalBytes());
    322 
    323         final NetworkStats uidRoaming = new NetworkStats(TEST_START, 3)
    324                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    325                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L)
    326                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
    327                         DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L)
    328                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
    329                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L);
    330         assertEquals(96L, uidRoaming.getTotalBytes());
    331     }
    332 
    333     @Test
    334     public void testGroupedByIfaceEmpty() throws Exception {
    335         final NetworkStats uidStats = new NetworkStats(TEST_START, 3);
    336         final NetworkStats grouped = uidStats.groupedByIface();
    337 
    338         assertEquals(0, uidStats.size());
    339         assertEquals(0, grouped.size());
    340     }
    341 
    342     @Test
    343     public void testGroupedByIfaceAll() throws Exception {
    344         final NetworkStats uidStats = new NetworkStats(TEST_START, 3)
    345                 .addValues(IFACE_ALL, 100, SET_ALL, TAG_NONE, METERED_NO, ROAMING_NO,
    346                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 2L, 20L)
    347                 .addValues(IFACE_ALL, 101, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_NO,
    348                         DEFAULT_NETWORK_NO, 128L, 8L, 0L, 2L, 20L)
    349                 .addValues(IFACE_ALL, 101, SET_ALL, TAG_NONE, METERED_NO, ROAMING_YES,
    350                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 2L, 20L);
    351         final NetworkStats grouped = uidStats.groupedByIface();
    352 
    353         assertEquals(3, uidStats.size());
    354         assertEquals(1, grouped.size());
    355 
    356         assertValues(grouped, 0, IFACE_ALL, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
    357                 DEFAULT_NETWORK_ALL, 384L, 24L, 0L, 6L, 0L);
    358     }
    359 
    360     @Test
    361     public void testGroupedByIface() throws Exception {
    362         final NetworkStats uidStats = new NetworkStats(TEST_START, 7)
    363                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    364                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 2L, 20L)
    365                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    366                         DEFAULT_NETWORK_NO, 512L, 32L, 0L, 0L, 0L)
    367                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
    368                         DEFAULT_NETWORK_YES, 64L, 4L, 0L, 0L, 0L)
    369                 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    370                         DEFAULT_NETWORK_NO, 512L, 32L, 0L, 0L, 0L)
    371                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    372                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 0L, 0L)
    373                 .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO,
    374                         DEFAULT_NETWORK_NO, 128L, 8L, 0L, 0L, 0L)
    375                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
    376                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 0L, 0L);
    377 
    378         final NetworkStats grouped = uidStats.groupedByIface();
    379 
    380         assertEquals(7, uidStats.size());
    381 
    382         assertEquals(2, grouped.size());
    383         assertValues(grouped, 0, TEST_IFACE, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
    384                 DEFAULT_NETWORK_ALL, 384L, 24L, 0L, 2L, 0L);
    385         assertValues(grouped, 1, TEST_IFACE2, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
    386                 DEFAULT_NETWORK_ALL, 1024L, 64L, 0L, 0L, 0L);
    387     }
    388 
    389     @Test
    390     public void testAddAllValues() {
    391         final NetworkStats first = new NetworkStats(TEST_START, 5)
    392                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
    393                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L)
    394                 .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    395                         DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L)
    396                 .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES,
    397                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L);
    398 
    399         final NetworkStats second = new NetworkStats(TEST_START, 2)
    400                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
    401                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L)
    402                 .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    403                         DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L)
    404                 .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES,
    405                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L);
    406 
    407         first.combineAllValues(second);
    408 
    409         assertEquals(4, first.size());
    410         assertValues(first, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
    411                 DEFAULT_NETWORK_YES, 64L, 0L, 0L, 0L, 0L);
    412         assertValues(first, 1, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    413                 DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L);
    414         assertValues(first, 2, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES,
    415                 DEFAULT_NETWORK_YES, 64L, 0L, 0L, 0L, 0L);
    416         assertValues(first, 3, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    417                 DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L);
    418     }
    419 
    420     @Test
    421     public void testGetTotal() {
    422         final NetworkStats stats = new NetworkStats(TEST_START, 7)
    423                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    424                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 2L, 20L)
    425                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    426                         DEFAULT_NETWORK_NO, 512L, 32L, 0L, 0L, 0L)
    427                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
    428                         DEFAULT_NETWORK_YES, 64L, 4L, 0L, 0L, 0L)
    429                 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    430                         DEFAULT_NETWORK_NO, 512L,32L, 0L, 0L, 0L)
    431                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
    432                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 0L, 0L)
    433                 .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
    434                         DEFAULT_NETWORK_NO, 128L, 8L, 0L, 0L, 0L)
    435                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
    436                         DEFAULT_NETWORK_NO, 128L, 8L, 0L, 0L, 0L);
    437 
    438         assertValues(stats.getTotal(null), 1408L, 88L, 0L, 2L, 20L);
    439         assertValues(stats.getTotal(null, 100), 1280L, 80L, 0L, 2L, 20L);
    440         assertValues(stats.getTotal(null, 101), 128L, 8L, 0L, 0L, 0L);
    441 
    442         final HashSet<String> ifaces = Sets.newHashSet();
    443         assertValues(stats.getTotal(null, ifaces), 0L, 0L, 0L, 0L, 0L);
    444 
    445         ifaces.add(TEST_IFACE2);
    446         assertValues(stats.getTotal(null, ifaces), 1024L, 64L, 0L, 0L, 0L);
    447     }
    448 
    449     @Test
    450     public void testWithoutUid() throws Exception {
    451         final NetworkStats before = new NetworkStats(TEST_START, 3)
    452                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L)
    453                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 512L, 32L, 0L, 0L, 0L)
    454                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, 64L, 4L, 0L, 0L, 0L)
    455                 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, 512L, 32L, 0L, 0L, 0L)
    456                 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 0L, 0L)
    457                 .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 128L, 8L, 0L, 0L, 0L);
    458 
    459         final NetworkStats after = before.withoutUids(new int[] { 100 });
    460         assertEquals(6, before.size());
    461         assertEquals(2, after.size());
    462         assertValues(after, 0, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    463                 DEFAULT_NETWORK_NO, 128L, 8L, 0L, 0L, 0L);
    464         assertValues(after, 1, TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
    465                 DEFAULT_NETWORK_NO, 128L, 8L, 0L, 0L, 0L);
    466     }
    467 
    468     @Test
    469     public void testClone() throws Exception {
    470         final NetworkStats original = new NetworkStats(TEST_START, 5)
    471                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L)
    472                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 512L, 32L, 0L, 0L, 0L);
    473 
    474         // make clone and mutate original
    475         final NetworkStats clone = original.clone();
    476         original.addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 0L, 0L);
    477 
    478         assertEquals(3, original.size());
    479         assertEquals(2, clone.size());
    480 
    481         assertEquals(128L + 512L + 128L, original.getTotalBytes());
    482         assertEquals(128L + 512L, clone.getTotalBytes());
    483     }
    484 
    485     @Test
    486     public void testAddWhenEmpty() throws Exception {
    487         final NetworkStats red = new NetworkStats(TEST_START, -1);
    488         final NetworkStats blue = new NetworkStats(TEST_START, 5)
    489                 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L)
    490                 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 512L, 32L, 0L, 0L, 0L);
    491 
    492         // We're mostly checking that we don't crash
    493         red.combineAllValues(blue);
    494     }
    495 
    496     @Test
    497     public void testMigrateTun() throws Exception {
    498         final int tunUid = 10030;
    499         final String tunIface = "tun0";
    500         final String underlyingIface = "wlan0";
    501         final int testTag1 = 8888;
    502         NetworkStats delta = new NetworkStats(TEST_START, 17)
    503             .addValues(tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    504                     DEFAULT_NETWORK_NO, 39605L, 46L, 12259L, 55L, 0L)
    505             .addValues(tunIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    506                     DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L)
    507             .addValues(tunIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    508                     DEFAULT_NETWORK_NO, 72667L, 197L, 43909L, 241L, 0L)
    509             .addValues(tunIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    510                     DEFAULT_NETWORK_NO, 9297L, 17L, 4128L, 21L, 0L)
    511             // VPN package also uses some traffic through unprotected network.
    512             .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    513                     DEFAULT_NETWORK_NO, 4983L, 10L, 1801L, 12L, 0L)
    514             .addValues(tunIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    515                     DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L)
    516             // Tag entries
    517             .addValues(tunIface, 10120, SET_DEFAULT, testTag1, METERED_NO, ROAMING_NO,
    518                     DEFAULT_NETWORK_NO, 21691L, 41L, 13820L, 51L, 0L)
    519             .addValues(tunIface, 10120, SET_FOREGROUND, testTag1, METERED_NO, ROAMING_NO,
    520                     DEFAULT_NETWORK_NO, 1281L, 2L, 665L, 2L, 0L)
    521             // Irrelevant entries
    522             .addValues(TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    523                     DEFAULT_NETWORK_NO, 1685L, 5L, 2070L, 6L, 0L)
    524             // Underlying Iface entries
    525             .addValues(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    526                     DEFAULT_NETWORK_NO, 5178L, 8L, 2139L, 11L, 0L)
    527             .addValues(underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    528                     DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L)
    529             .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    530                     DEFAULT_NETWORK_NO, 149873L, 287L, 59217L /* smaller than sum(tun0) */,
    531                     299L /* smaller than sum(tun0) */, 0L)
    532             .addValues(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    533                     DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
    534 
    535         assertTrue(delta.toString(), delta.migrateTun(tunUid, tunIface, underlyingIface));
    536         assertEquals(20, delta.size());
    537 
    538         // tunIface and TEST_IFACE entries are not changed.
    539         assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    540                 DEFAULT_NETWORK_NO, 39605L, 46L, 12259L, 55L, 0L);
    541         assertValues(delta, 1, tunIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    542                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
    543         assertValues(delta, 2, tunIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    544                 DEFAULT_NETWORK_NO, 72667L, 197L, 43909L, 241L, 0L);
    545         assertValues(delta, 3, tunIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    546                 DEFAULT_NETWORK_NO, 9297L, 17L, 4128L, 21L, 0L);
    547         assertValues(delta, 4, tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    548                 DEFAULT_NETWORK_NO, 4983L, 10L, 1801L, 12L, 0L);
    549         assertValues(delta, 5, tunIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
    550                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
    551         assertValues(delta, 6, tunIface, 10120, SET_DEFAULT, testTag1, METERED_NO, ROAMING_NO,
    552                 DEFAULT_NETWORK_NO, 21691L, 41L, 13820L, 51L, 0L);
    553         assertValues(delta, 7, tunIface, 10120, SET_FOREGROUND, testTag1, METERED_NO, ROAMING_NO,
    554                 DEFAULT_NETWORK_NO, 1281L, 2L, 665L, 2L, 0L);
    555         assertValues(delta, 8, TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    556                 DEFAULT_NETWORK_NO, 1685L, 5L, 2070L, 6L, 0L);
    557 
    558         // Existing underlying Iface entries are updated
    559         assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO,
    560                 ROAMING_NO, DEFAULT_NETWORK_NO, 44783L, 54L, 14178L, 62L, 0L);
    561         assertValues(delta, 10, underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO,
    562                 ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
    563 
    564         // VPN underlying Iface entries are updated
    565         assertValues(delta, 11, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO,
    566                 ROAMING_NO, DEFAULT_NETWORK_NO, 28304L, 27L, 1L, 2L, 0L);
    567         assertValues(delta, 12, underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO,
    568                 ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
    569 
    570         // New entries are added for new application's underlying Iface traffic
    571         assertContains(delta, underlyingIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO,
    572                 ROAMING_NO, DEFAULT_NETWORK_NO, 72667L, 197L, 43123L, 227L, 0L);
    573         assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO,
    574                 ROAMING_NO, DEFAULT_NETWORK_NO, 9297L, 17L, 4054, 19L, 0L);
    575         assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, METERED_NO,
    576                 ROAMING_NO, DEFAULT_NETWORK_NO, 21691L, 41L, 13572L, 48L, 0L);
    577         assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, METERED_NO,
    578                 ROAMING_NO, DEFAULT_NETWORK_NO, 1281L, 2L, 653L, 1L, 0L);
    579 
    580         // New entries are added for debug purpose
    581         assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
    582                 ROAMING_NO, DEFAULT_NETWORK_NO, 39605L, 46L, 12039, 51, 0);
    583         assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
    584                 ROAMING_NO, DEFAULT_NETWORK_NO, 81964, 214, 47177, 246, 0);
    585         assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, METERED_ALL,
    586                 ROAMING_ALL, DEFAULT_NETWORK_ALL, 121569, 260, 59216, 297, 0);
    587 
    588     }
    589 
    590     // Tests a case where all of the data received by the tun0 interface is echo back into the tun0
    591     // interface by the vpn app before it's sent out of the underlying interface. The VPN app should
    592     // not be charged for the echoed data but it should still be charged for any extra data it sends
    593     // via the underlying interface.
    594     @Test
    595     public void testMigrateTun_VpnAsLoopback() {
    596         final int tunUid = 10030;
    597         final String tunIface = "tun0";
    598         final String underlyingIface = "wlan0";
    599         NetworkStats delta = new NetworkStats(TEST_START, 9)
    600             // 2 different apps sent/receive data via tun0.
    601             .addValues(tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    602                     DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L)
    603             .addValues(tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    604                     DEFAULT_NETWORK_NO, 500L, 2L, 200L, 5L, 0L)
    605             // VPN package resends data through the tunnel (with exaggerated overhead)
    606             .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    607                     DEFAULT_NETWORK_NO, 240000, 100L, 120000L, 60L, 0L)
    608             // 1 app already has some traffic on the underlying interface, the other doesn't yet
    609             .addValues(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    610                     DEFAULT_NETWORK_NO, 1000L, 10L, 2000L, 20L, 0L)
    611             // Traffic through the underlying interface via the vpn app.
    612             // This test should redistribute this data correctly.
    613             .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    614                     DEFAULT_NETWORK_NO,  75500L, 37L, 130000L, 70L, 0L);
    615 
    616         assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface));
    617         assertEquals(9, delta.size());
    618 
    619         // tunIface entries should not be changed.
    620         assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    621                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    622         assertValues(delta, 1, tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    623                 DEFAULT_NETWORK_NO, 500L, 2L, 200L, 5L, 0L);
    624         assertValues(delta, 2, tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    625                 DEFAULT_NETWORK_NO, 240000L, 100L, 120000L, 60L, 0L);
    626 
    627         // Existing underlying Iface entries are updated
    628         assertValues(delta, 3, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO,
    629                 ROAMING_NO, DEFAULT_NETWORK_NO, 51000L, 35L, 102000L, 70L, 0L);
    630 
    631         // VPN underlying Iface entries are updated
    632         assertValues(delta, 4, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO,
    633                 ROAMING_NO, DEFAULT_NETWORK_NO, 25000L, 10L, 29800L, 15L, 0L);
    634 
    635         // New entries are added for new application's underlying Iface traffic
    636         assertContains(delta, underlyingIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO,
    637                 ROAMING_NO, DEFAULT_NETWORK_NO, 500L, 2L, 200L, 5L, 0L);
    638 
    639         // New entries are added for debug purpose
    640         assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
    641                 ROAMING_NO, DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    642         assertContains(delta, underlyingIface, 20100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
    643                 ROAMING_NO, DEFAULT_NETWORK_NO, 500, 2L, 200L, 5L, 0L);
    644         assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, METERED_ALL,
    645                 ROAMING_ALL, DEFAULT_NETWORK_ALL, 50500L, 27L, 100200L, 55, 0);
    646     }
    647 
    648     @Test
    649     public void testFilter_NoFilter() {
    650         NetworkStats.Entry entry1 = new NetworkStats.Entry(
    651                 "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    652                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    653 
    654         NetworkStats.Entry entry2 = new NetworkStats.Entry(
    655                 "test2", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    656                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    657 
    658         NetworkStats.Entry entry3 = new NetworkStats.Entry(
    659                 "test2", 10101, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
    660                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    661 
    662         NetworkStats stats = new NetworkStats(TEST_START, 3)
    663                 .addValues(entry1)
    664                 .addValues(entry2)
    665                 .addValues(entry3);
    666 
    667         stats.filter(UID_ALL, INTERFACES_ALL, TAG_ALL);
    668         assertEquals(3, stats.size());
    669         assertEquals(entry1, stats.getValues(0, null));
    670         assertEquals(entry2, stats.getValues(1, null));
    671         assertEquals(entry3, stats.getValues(2, null));
    672     }
    673 
    674     @Test
    675     public void testFilter_UidFilter() {
    676         final int testUid = 10101;
    677         NetworkStats.Entry entry1 = new NetworkStats.Entry(
    678                 "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    679                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    680 
    681         NetworkStats.Entry entry2 = new NetworkStats.Entry(
    682                 "test2", testUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    683                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    684 
    685         NetworkStats.Entry entry3 = new NetworkStats.Entry(
    686                 "test2", testUid, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
    687                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    688 
    689         NetworkStats stats = new NetworkStats(TEST_START, 3)
    690                 .addValues(entry1)
    691                 .addValues(entry2)
    692                 .addValues(entry3);
    693 
    694         stats.filter(testUid, INTERFACES_ALL, TAG_ALL);
    695         assertEquals(2, stats.size());
    696         assertEquals(entry2, stats.getValues(0, null));
    697         assertEquals(entry3, stats.getValues(1, null));
    698     }
    699 
    700     @Test
    701     public void testFilter_InterfaceFilter() {
    702         final String testIf1 = "testif1";
    703         final String testIf2 = "testif2";
    704         NetworkStats.Entry entry1 = new NetworkStats.Entry(
    705                 testIf1, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    706                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    707 
    708         NetworkStats.Entry entry2 = new NetworkStats.Entry(
    709                 "otherif", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    710                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    711 
    712         NetworkStats.Entry entry3 = new NetworkStats.Entry(
    713                 testIf1, 10101, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
    714                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    715 
    716         NetworkStats.Entry entry4 = new NetworkStats.Entry(
    717                 testIf2, 10101, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
    718                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    719 
    720         NetworkStats stats = new NetworkStats(TEST_START, 4)
    721                 .addValues(entry1)
    722                 .addValues(entry2)
    723                 .addValues(entry3)
    724                 .addValues(entry4);
    725 
    726         stats.filter(UID_ALL, new String[] { testIf1, testIf2 }, TAG_ALL);
    727         assertEquals(3, stats.size());
    728         assertEquals(entry1, stats.getValues(0, null));
    729         assertEquals(entry3, stats.getValues(1, null));
    730         assertEquals(entry4, stats.getValues(2, null));
    731     }
    732 
    733     @Test
    734     public void testFilter_EmptyInterfaceFilter() {
    735         NetworkStats.Entry entry1 = new NetworkStats.Entry(
    736                 "if1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    737                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    738 
    739         NetworkStats.Entry entry2 = new NetworkStats.Entry(
    740                 "if2", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
    741                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    742 
    743         NetworkStats stats = new NetworkStats(TEST_START, 3)
    744                 .addValues(entry1)
    745                 .addValues(entry2);
    746 
    747         stats.filter(UID_ALL, new String[] { }, TAG_ALL);
    748         assertEquals(0, stats.size());
    749     }
    750 
    751     @Test
    752     public void testFilter_TagFilter() {
    753         final int testTag = 123;
    754         final int otherTag = 456;
    755         NetworkStats.Entry entry1 = new NetworkStats.Entry(
    756                 "test1", 10100, SET_DEFAULT, testTag, METERED_NO, ROAMING_NO,
    757                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    758 
    759         NetworkStats.Entry entry2 = new NetworkStats.Entry(
    760                 "test2", 10101, SET_DEFAULT, testTag, METERED_NO, ROAMING_NO,
    761                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    762 
    763         NetworkStats.Entry entry3 = new NetworkStats.Entry(
    764                 "test2", 10101, SET_DEFAULT, otherTag, METERED_NO, ROAMING_NO,
    765                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
    766 
    767         NetworkStats stats = new NetworkStats(TEST_START, 3)
    768                 .addValues(entry1)
    769                 .addValues(entry2)
    770                 .addValues(entry3);
    771 
    772         stats.filter(UID_ALL, INTERFACES_ALL, testTag);
    773         assertEquals(2, stats.size());
    774         assertEquals(entry1, stats.getValues(0, null));
    775         assertEquals(entry2, stats.getValues(1, null));
    776     }
    777 
    778     @Test
    779     public void testApply464xlatAdjustments() {
    780         final String v4Iface = "v4-wlan0";
    781         final String baseIface = "wlan0";
    782         final String otherIface = "other";
    783         final int appUid = 10001;
    784         final int rootUid = Process.ROOT_UID;
    785         ArrayMap<String, String> stackedIface = new ArrayMap<>();
    786         stackedIface.put(v4Iface, baseIface);
    787 
    788         NetworkStats.Entry otherEntry = new NetworkStats.Entry(
    789                 otherIface, appUid, SET_DEFAULT, TAG_NONE,
    790                 2600  /* rxBytes */,
    791                 2 /* rxPackets */,
    792                 3800 /* txBytes */,
    793                 3 /* txPackets */,
    794                 0 /* operations */);
    795 
    796         NetworkStats stats = new NetworkStats(TEST_START, 3)
    797                 .addValues(v4Iface, appUid, SET_DEFAULT, TAG_NONE,
    798                         30501490  /* rxBytes */,
    799                         22401 /* rxPackets */,
    800                         876235 /* txBytes */,
    801                         13805 /* txPackets */,
    802                         0 /* operations */)
    803                 .addValues(baseIface, rootUid, SET_DEFAULT, TAG_NONE,
    804                         31113087,
    805                         22588,
    806                         1169942,
    807                         13902,
    808                         0)
    809                 .addValues(otherEntry);
    810 
    811         stats.apply464xlatAdjustments(stackedIface);
    812 
    813         assertEquals(3, stats.size());
    814         assertValues(stats, 0, v4Iface, appUid, SET_DEFAULT, TAG_NONE,
    815                 METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
    816                 30949510,
    817                 22401,
    818                 1152335,
    819                 13805,
    820                 0);
    821         assertValues(stats, 1, baseIface, 0, SET_DEFAULT, TAG_NONE,
    822                 METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
    823                 163577,
    824                 187,
    825                 17607,
    826                 97,
    827                 0);
    828         assertEquals(otherEntry, stats.getValues(2, null));
    829     }
    830 
    831     @Test
    832     public void testApply464xlatAdjustments_noStackedIface() {
    833         NetworkStats.Entry firstEntry = new NetworkStats.Entry(
    834                 "if1", 10002, SET_DEFAULT, TAG_NONE,
    835                 2600  /* rxBytes */,
    836                 2 /* rxPackets */,
    837                 3800 /* txBytes */,
    838                 3 /* txPackets */,
    839                 0 /* operations */);
    840         NetworkStats.Entry secondEntry = new NetworkStats.Entry(
    841                 "if2", 10002, SET_DEFAULT, TAG_NONE,
    842                 5000  /* rxBytes */,
    843                 3 /* rxPackets */,
    844                 6000 /* txBytes */,
    845                 4 /* txPackets */,
    846                 0 /* operations */);
    847 
    848         NetworkStats stats = new NetworkStats(TEST_START, 2)
    849                 .addValues(firstEntry)
    850                 .addValues(secondEntry);
    851 
    852         // Empty map: no adjustment
    853         stats.apply464xlatAdjustments(new ArrayMap<>());
    854 
    855         assertEquals(2, stats.size());
    856         assertEquals(firstEntry, stats.getValues(0, null));
    857         assertEquals(secondEntry, stats.getValues(1, null));
    858     }
    859 
    860     private static void assertContains(NetworkStats stats,  String iface, int uid, int set,
    861             int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets,
    862             long txBytes, long txPackets, long operations) {
    863         int index = stats.findIndex(iface, uid, set, tag, metered, roaming, defaultNetwork);
    864         assertTrue(index != -1);
    865         assertValues(stats, index, iface, uid, set, tag, metered, roaming, defaultNetwork,
    866                 rxBytes, rxPackets, txBytes, txPackets, operations);
    867     }
    868 
    869     private static void assertValues(NetworkStats stats, int index, String iface, int uid, int set,
    870             int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets,
    871             long txBytes, long txPackets, long operations) {
    872         final NetworkStats.Entry entry = stats.getValues(index, null);
    873         assertValues(entry, iface, uid, set, tag, metered, roaming, defaultNetwork);
    874         assertValues(entry, rxBytes, rxPackets, txBytes, txPackets, operations);
    875     }
    876 
    877     private static void assertValues(
    878             NetworkStats.Entry entry, String iface, int uid, int set, int tag, int metered,
    879             int roaming, int defaultNetwork) {
    880         assertEquals(iface, entry.iface);
    881         assertEquals(uid, entry.uid);
    882         assertEquals(set, entry.set);
    883         assertEquals(tag, entry.tag);
    884         assertEquals(metered, entry.metered);
    885         assertEquals(roaming, entry.roaming);
    886         assertEquals(defaultNetwork, entry.defaultNetwork);
    887     }
    888 
    889     private static void assertValues(NetworkStats.Entry entry, long rxBytes, long rxPackets,
    890             long txBytes, long txPackets, long operations) {
    891         assertEquals(rxBytes, entry.rxBytes);
    892         assertEquals(rxPackets, entry.rxPackets);
    893         assertEquals(txBytes, entry.txBytes);
    894         assertEquals(txPackets, entry.txPackets);
    895         assertEquals(operations, entry.operations);
    896     }
    897 
    898 }
    899