• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.IFACE_ALL;
23 import static android.net.NetworkStats.INTERFACES_ALL;
24 import static android.net.NetworkStats.METERED_ALL;
25 import static android.net.NetworkStats.METERED_NO;
26 import static android.net.NetworkStats.METERED_YES;
27 import static android.net.NetworkStats.ROAMING_ALL;
28 import static android.net.NetworkStats.ROAMING_NO;
29 import static android.net.NetworkStats.ROAMING_YES;
30 import static android.net.NetworkStats.SET_ALL;
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_DEFAULT;
34 import static android.net.NetworkStats.SET_FOREGROUND;
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 
39 import static org.junit.Assert.assertEquals;
40 import static org.junit.Assert.assertFalse;
41 import static org.junit.Assert.assertTrue;
42 
43 import android.os.Build;
44 import android.os.Process;
45 import android.util.ArrayMap;
46 
47 import androidx.test.filters.SmallTest;
48 
49 import com.android.testutils.DevSdkIgnoreRule;
50 import com.android.testutils.DevSdkIgnoreRunner;
51 
52 import com.google.android.collect.Sets;
53 
54 import org.junit.Rule;
55 import org.junit.Test;
56 import org.junit.runner.RunWith;
57 
58 import java.util.ArrayList;
59 import java.util.Arrays;
60 import java.util.HashSet;
61 import java.util.Iterator;
62 
63 @RunWith(DevSdkIgnoreRunner.class)
64 @SmallTest
65 @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
66 public class NetworkStatsTest {
67     @Rule
68     public final DevSdkIgnoreRule mIgnoreRule = new DevSdkIgnoreRule();
69     private static final String TEST_IFACE = "test0";
70     private static final String TEST_IFACE2 = "test2";
71     private static final int TEST_UID = 1001;
72     private static final long TEST_START = 1194220800000L;
73 
74     @Test
testFindIndex()75     public void testFindIndex() throws Exception {
76         final NetworkStats stats = new NetworkStats(TEST_START, 5)
77                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
78                         DEFAULT_NETWORK_YES, 1024L, 8L, 0L, 0L, 10)
79                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
80                         DEFAULT_NETWORK_NO, 0L, 0L, 1024L, 8L, 11)
81                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
82                         DEFAULT_NETWORK_YES, 0L, 0L, 1024L, 8L, 11)
83                 .insertEntry(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
84                         DEFAULT_NETWORK_NO, 1024L, 8L, 1024L, 8L, 12)
85                 .insertEntry(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES,
86                         DEFAULT_NETWORK_YES, 1024L, 8L, 1024L, 8L, 12);
87 
88         assertEquals(4, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_YES,
89                 ROAMING_YES, DEFAULT_NETWORK_YES));
90         assertEquals(3, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO,
91                 ROAMING_NO, DEFAULT_NETWORK_NO));
92         assertEquals(2, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES,
93                 ROAMING_NO, DEFAULT_NETWORK_YES));
94         assertEquals(1, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO,
95                 ROAMING_NO, DEFAULT_NETWORK_NO));
96         assertEquals(0, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO,
97                 ROAMING_NO, DEFAULT_NETWORK_YES));
98         assertEquals(-1, stats.findIndex(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE, METERED_NO,
99                 ROAMING_NO, DEFAULT_NETWORK_NO));
100         assertEquals(-1, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO,
101                 ROAMING_NO, DEFAULT_NETWORK_NO));
102     }
103 
104     @Test
testFindIndexHinted()105     public void testFindIndexHinted() {
106         final NetworkStats stats = new NetworkStats(TEST_START, 3)
107                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
108                         DEFAULT_NETWORK_YES, 1024L, 8L, 0L, 0L, 10)
109                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
110                         DEFAULT_NETWORK_NO, 0L, 0L, 1024L, 8L, 11)
111                 .insertEntry(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
112                         DEFAULT_NETWORK_YES, 1024L, 8L, 1024L, 8L, 12)
113                 .insertEntry(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
114                         DEFAULT_NETWORK_NO, 1024L, 8L, 0L, 0L, 10)
115                 .insertEntry(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
116                         DEFAULT_NETWORK_YES, 0L, 0L, 1024L, 8L, 11)
117                 .insertEntry(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO,
118                         DEFAULT_NETWORK_NO, 0L, 0L, 1024L, 8L, 11)
119                 .insertEntry(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
120                         DEFAULT_NETWORK_YES, 1024L, 8L, 1024L, 8L, 12)
121                 .insertEntry(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES,
122                         DEFAULT_NETWORK_NO, 1024L, 8L, 1024L, 8L, 12);
123 
124         // verify that we correctly find across regardless of hinting
125         for (int hint = 0; hint < stats.size(); hint++) {
126             assertEquals(0, stats.findIndexHinted(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE,
127                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
128             assertEquals(1, stats.findIndexHinted(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE,
129                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, hint));
130             assertEquals(2, stats.findIndexHinted(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE,
131                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
132             assertEquals(3, stats.findIndexHinted(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE,
133                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, hint));
134             assertEquals(4, stats.findIndexHinted(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D,
135                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
136             assertEquals(5, stats.findIndexHinted(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D,
137                     METERED_YES, ROAMING_NO, DEFAULT_NETWORK_NO, hint));
138             assertEquals(6, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
139                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
140             assertEquals(7, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
141                     METERED_YES, ROAMING_YES, DEFAULT_NETWORK_NO, hint));
142             assertEquals(-1, stats.findIndexHinted(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE,
143                     METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, hint));
144             assertEquals(-1, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
145                     METERED_YES, ROAMING_YES, DEFAULT_NETWORK_YES, hint));
146         }
147     }
148 
149     @Test
testAddEntryGrow()150     public void testAddEntryGrow() throws Exception {
151         final NetworkStats stats = new NetworkStats(TEST_START, 4);
152 
153         assertEquals(0, stats.size());
154         assertEquals(4, stats.internalSize());
155 
156         stats.insertEntry(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
157                 DEFAULT_NETWORK_YES, 1L, 1L, 2L, 2L, 3);
158         stats.insertEntry(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
159                 DEFAULT_NETWORK_NO, 2L, 2L, 2L, 2L, 4);
160         stats.insertEntry(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
161                 DEFAULT_NETWORK_YES, 3L, 3L, 2L, 2L, 5);
162         stats.insertEntry(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES,
163                 DEFAULT_NETWORK_NO, 3L, 3L, 2L, 2L, 5);
164 
165         assertEquals(4, stats.size());
166         assertEquals(4, stats.internalSize());
167 
168         stats.insertEntry(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
169                 DEFAULT_NETWORK_NO, 4L, 40L, 4L, 40L, 7);
170         stats.insertEntry(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
171                 DEFAULT_NETWORK_YES, 5L, 50L, 4L, 40L, 8);
172         stats.insertEntry(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
173                 DEFAULT_NETWORK_NO, 6L, 60L, 5L, 50L, 10);
174         stats.insertEntry(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
175                 DEFAULT_NETWORK_YES, 7L, 70L, 5L, 50L, 11);
176         stats.insertEntry(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES,
177                 DEFAULT_NETWORK_NO, 7L, 70L, 5L, 50L, 11);
178 
179         assertEquals(9, stats.size());
180         assertTrue(stats.internalSize() >= 9);
181 
182         assertValues(stats, 0, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
183                 DEFAULT_NETWORK_YES, 1L, 1L, 2L, 2L, 3);
184         assertValues(stats, 1, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
185                 DEFAULT_NETWORK_NO, 2L, 2L, 2L, 2L, 4);
186         assertValues(stats, 2, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
187                 DEFAULT_NETWORK_YES, 3L, 3L, 2L, 2L, 5);
188         assertValues(stats, 3, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES,
189                 ROAMING_YES, DEFAULT_NETWORK_NO, 3L, 3L, 2L, 2L, 5);
190         assertValues(stats, 4, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
191                 DEFAULT_NETWORK_NO, 4L, 40L, 4L, 40L, 7);
192         assertValues(stats, 5, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
193                 DEFAULT_NETWORK_YES, 5L, 50L, 4L, 40L, 8);
194         assertValues(stats, 6, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
195                 DEFAULT_NETWORK_NO, 6L, 60L, 5L, 50L, 10);
196         assertValues(stats, 7, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
197                 DEFAULT_NETWORK_YES, 7L, 70L, 5L, 50L, 11);
198         assertValues(stats, 8, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES,
199                 ROAMING_YES, DEFAULT_NETWORK_NO, 7L, 70L, 5L, 50L, 11);
200     }
201 
202     @Test
testCombineExisting()203     public void testCombineExisting() throws Exception {
204         final NetworkStats stats = new NetworkStats(TEST_START, 10);
205 
206         stats.insertEntry(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 10);
207         stats.insertEntry(TEST_IFACE, 1001, SET_DEFAULT, 0xff, 128L, 1L, 128L, 1L, 2);
208         stats.combineValues(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, -128L, -1L,
209                 -128L, -1L, -1);
210 
211         assertValues(stats, 0, TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
212                 DEFAULT_NETWORK_NO, 384L, 3L, 128L, 1L, 9);
213         assertValues(stats, 1, TEST_IFACE, 1001, SET_DEFAULT, 0xff, METERED_NO, ROAMING_NO,
214                 DEFAULT_NETWORK_NO, 128L, 1L, 128L, 1L, 2);
215 
216         // now try combining that should create row
217         stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3);
218         assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
219                 DEFAULT_NETWORK_NO, 128L, 1L, 128L, 1L, 3);
220         stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3);
221         assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
222                 DEFAULT_NETWORK_NO, 256L, 2L, 256L, 2L, 6);
223     }
224 
225     @Test
testSubtractIdenticalData()226     public void testSubtractIdenticalData() throws Exception {
227         final NetworkStats before = new NetworkStats(TEST_START, 2)
228                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
229                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
230 
231         final NetworkStats after = new NetworkStats(TEST_START, 2)
232                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
233                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
234 
235         final NetworkStats result = after.subtract(before);
236 
237         // identical data should result in zero delta
238         assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
239                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0);
240         assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
241                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0);
242     }
243 
244     @Test
testSubtractIdenticalRows()245     public void testSubtractIdenticalRows() throws Exception {
246         final NetworkStats before = new NetworkStats(TEST_START, 2)
247                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
248                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
249 
250         final NetworkStats after = new NetworkStats(TEST_START, 2)
251                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1025L, 9L, 2L, 1L, 15)
252                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 3L, 1L, 1028L, 9L, 20);
253 
254         final NetworkStats result = after.subtract(before);
255 
256         // expect delta between measurements
257         assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
258                 DEFAULT_NETWORK_NO, 1L, 1L, 2L, 1L, 4);
259         assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
260                 DEFAULT_NETWORK_NO, 3L, 1L, 4L, 1L, 8);
261     }
262 
263     @Test
testSubtractNewRows()264     public void testSubtractNewRows() throws Exception {
265         final NetworkStats before = new NetworkStats(TEST_START, 2)
266                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
267                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
268 
269         final NetworkStats after = new NetworkStats(TEST_START, 3)
270                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
271                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12)
272                 .insertEntry(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 20);
273 
274         final NetworkStats result = after.subtract(before);
275 
276         // its okay to have new rows
277         assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
278                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0);
279         assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
280                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0);
281         assertValues(result, 2, TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
282                 DEFAULT_NETWORK_NO, 1024L, 8L, 1024L, 8L, 20);
283     }
284 
285     @Test
testSubtractMissingRows()286     public void testSubtractMissingRows() throws Exception {
287         final NetworkStats before = new NetworkStats(TEST_START, 2)
288                 .insertEntry(TEST_IFACE, UID_ALL, SET_DEFAULT, TAG_NONE, 1024L, 0L, 0L, 0L, 0)
289                 .insertEntry(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, 2048L, 0L, 0L, 0L, 0);
290 
291         final NetworkStats after = new NetworkStats(TEST_START, 1)
292                 .insertEntry(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, 2049L, 2L, 3L, 4L, 0);
293 
294         final NetworkStats result = after.subtract(before);
295 
296         // should silently drop omitted rows
297         assertEquals(1, result.size());
298         assertValues(result, 0, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO,
299                 ROAMING_NO, DEFAULT_NETWORK_NO, 1L, 2L, 3L, 4L, 0);
300         assertEquals(4L, result.getTotalBytes());
301     }
302 
303     @Test
testTotalBytes()304     public void testTotalBytes() throws Exception {
305         final NetworkStats iface = new NetworkStats(TEST_START, 2)
306                 .insertEntry(TEST_IFACE, UID_ALL, SET_DEFAULT, TAG_NONE, 128L, 0L, 0L, 0L, 0L)
307                 .insertEntry(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, 256L, 0L, 0L, 0L, 0L);
308         assertEquals(384L, iface.getTotalBytes());
309 
310         final NetworkStats uidSet = new NetworkStats(TEST_START, 3)
311                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 32L, 0L, 0L, 0L, 0L)
312                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 32L, 0L, 0L, 0L, 0L)
313                 .insertEntry(TEST_IFACE, 101, SET_FOREGROUND, TAG_NONE, 32L, 0L, 0L, 0L, 0L);
314         assertEquals(96L, uidSet.getTotalBytes());
315 
316         final NetworkStats uidTag = new NetworkStats(TEST_START, 6)
317                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
318                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
319                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, 8L, 0L, 0L, 0L, 0L)
320                 .insertEntry(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
321                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
322                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 8L, 0L, 0L, 0L, 0L);
323         assertEquals(64L, uidTag.getTotalBytes());
324 
325         final NetworkStats uidMetered = new NetworkStats(TEST_START, 3)
326                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
327                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L)
328                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
329                         DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L)
330                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
331                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L);
332         assertEquals(96L, uidMetered.getTotalBytes());
333 
334         final NetworkStats uidRoaming = new NetworkStats(TEST_START, 3)
335                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
336                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L)
337                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
338                         DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L)
339                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
340                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L);
341         assertEquals(96L, uidRoaming.getTotalBytes());
342     }
343 
344     @DevSdkIgnoreRule.IgnoreAfter(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
345     @Test
testGroupedByIfaceEmpty()346     public void testGroupedByIfaceEmpty() throws Exception {
347         final NetworkStats uidStats = new NetworkStats(TEST_START, 3);
348         final NetworkStats grouped = uidStats.groupedByIface();
349 
350         assertEquals(0, uidStats.size());
351         assertEquals(0, grouped.size());
352     }
353 
354     @DevSdkIgnoreRule.IgnoreAfter(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
355     @Test
testGroupedByIfaceAll()356     public void testGroupedByIfaceAll() throws Exception {
357         final NetworkStats uidStats = new NetworkStats(TEST_START, 3)
358                 .insertEntry(IFACE_ALL, 100, SET_ALL, TAG_NONE, METERED_NO, ROAMING_NO,
359                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 2L, 20L)
360                 .insertEntry(IFACE_ALL, 101, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_NO,
361                         DEFAULT_NETWORK_NO, 128L, 8L, 0L, 2L, 20L)
362                 .insertEntry(IFACE_ALL, 101, SET_ALL, TAG_NONE, METERED_NO, ROAMING_YES,
363                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 2L, 20L);
364         final NetworkStats grouped = uidStats.groupedByIface();
365 
366         assertEquals(3, uidStats.size());
367         assertEquals(1, grouped.size());
368 
369         assertValues(grouped, 0, IFACE_ALL, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
370                 DEFAULT_NETWORK_ALL, 384L, 24L, 0L, 6L, 0L);
371     }
372 
373     @DevSdkIgnoreRule.IgnoreAfter(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
374     @Test
testGroupedByIface()375     public void testGroupedByIface() throws Exception {
376         final NetworkStats uidStats = new NetworkStats(TEST_START, 7)
377                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
378                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 2L, 20L)
379                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
380                         DEFAULT_NETWORK_NO, 512L, 32L, 0L, 0L, 0L)
381                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
382                         DEFAULT_NETWORK_YES, 64L, 4L, 0L, 0L, 0L)
383                 .insertEntry(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
384                         DEFAULT_NETWORK_NO, 512L, 32L, 0L, 0L, 0L)
385                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
386                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 0L, 0L)
387                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO,
388                         DEFAULT_NETWORK_NO, 128L, 8L, 0L, 0L, 0L)
389                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
390                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 0L, 0L);
391 
392         final NetworkStats grouped = uidStats.groupedByIface();
393 
394         assertEquals(7, uidStats.size());
395 
396         assertEquals(2, grouped.size());
397         assertValues(grouped, 0, TEST_IFACE, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
398                 DEFAULT_NETWORK_ALL, 384L, 24L, 0L, 2L, 0L);
399         assertValues(grouped, 1, TEST_IFACE2, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
400                 DEFAULT_NETWORK_ALL, 1024L, 64L, 0L, 0L, 0L);
401     }
402 
403     @Test
testAddAllValues()404     public void testAddAllValues() {
405         final NetworkStats first = new NetworkStats(TEST_START, 5)
406                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
407                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L)
408                 .insertEntry(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
409                         DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L)
410                 .insertEntry(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES,
411                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L);
412 
413         final NetworkStats second = new NetworkStats(TEST_START, 2)
414                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
415                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L)
416                 .insertEntry(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
417                         DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L)
418                 .insertEntry(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES,
419                         DEFAULT_NETWORK_YES, 32L, 0L, 0L, 0L, 0L);
420 
421         first.combineAllValues(second);
422 
423         assertEquals(4, first.size());
424         assertValues(first, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
425                 DEFAULT_NETWORK_YES, 64L, 0L, 0L, 0L, 0L);
426         assertValues(first, 1, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
427                 DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L);
428         assertValues(first, 2, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES,
429                 DEFAULT_NETWORK_YES, 64L, 0L, 0L, 0L, 0L);
430         assertValues(first, 3, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
431                 DEFAULT_NETWORK_NO, 32L, 0L, 0L, 0L, 0L);
432     }
433 
434     @Test
testGetTotal()435     public void testGetTotal() {
436         final NetworkStats stats = new NetworkStats(TEST_START, 7)
437                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
438                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 2L, 20L)
439                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
440                         DEFAULT_NETWORK_NO, 512L, 32L, 0L, 0L, 0L)
441                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
442                         DEFAULT_NETWORK_YES, 64L, 4L, 0L, 0L, 0L)
443                 .insertEntry(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
444                         DEFAULT_NETWORK_NO, 512L,32L, 0L, 0L, 0L)
445                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO,
446                         DEFAULT_NETWORK_YES, 128L, 8L, 0L, 0L, 0L)
447                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
448                         DEFAULT_NETWORK_NO, 128L, 8L, 0L, 0L, 0L)
449                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
450                         DEFAULT_NETWORK_NO, 128L, 8L, 0L, 0L, 0L);
451 
452         assertValues(stats.getTotal(null), 1408L, 88L, 0L, 2L, 20L);
453         assertValues(stats.getTotal(null, 100), 1280L, 80L, 0L, 2L, 20L);
454         assertValues(stats.getTotal(null, 101), 128L, 8L, 0L, 0L, 0L);
455 
456         final HashSet<String> ifaces = Sets.newHashSet();
457         assertValues(stats.getTotal(null, ifaces), 0L, 0L, 0L, 0L, 0L);
458 
459         ifaces.add(TEST_IFACE2);
460         assertValues(stats.getTotal(null, ifaces), 1024L, 64L, 0L, 0L, 0L);
461     }
462 
463     @Test
testRemoveUids()464     public void testRemoveUids() throws Exception {
465         final NetworkStats before = new NetworkStats(TEST_START, 3);
466 
467         // Test 0 item stats.
468         NetworkStats after = before.clone();
469         after.removeUids(new int[0]);
470         assertEquals(0, after.size());
471         after.removeUids(new int[] {100});
472         assertEquals(0, after.size());
473 
474         // Test 1 item stats.
475         before.insertEntry(TEST_IFACE, 99, SET_DEFAULT, TAG_NONE, 1L, 128L, 0L, 2L, 20L);
476         after = before.clone();
477         after.removeUids(new int[0]);
478         assertEquals(1, after.size());
479         assertValues(after, 0, TEST_IFACE, 99, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
480                 DEFAULT_NETWORK_NO, 1L, 128L, 0L, 2L, 20L);
481         after.removeUids(new int[] {99});
482         assertEquals(0, after.size());
483 
484         // Append remaining test items.
485         before.insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 2L, 64L, 0L, 2L, 20L)
486                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 4L, 32L, 0L, 0L, 0L)
487                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, 8L, 16L, 0L, 0L, 0L)
488                 .insertEntry(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, 16L, 8L, 0L, 0L, 0L)
489                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 32L, 4L, 0L, 0L, 0L)
490                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 64L, 2L, 0L, 0L, 0L);
491         assertEquals(7, before.size());
492 
493         // Test remove with empty uid list.
494         after = before.clone();
495         after.removeUids(new int[0]);
496         assertValues(after.getTotalIncludingTags(null), 127L, 254L, 0L, 4L, 40L);
497 
498         // Test remove uids don't exist in stats.
499         after.removeUids(new int[] {98, 0, Integer.MIN_VALUE, Integer.MAX_VALUE});
500         assertValues(after.getTotalIncludingTags(null), 127L, 254L, 0L, 4L, 40L);
501 
502         // Test remove all uids.
503         after.removeUids(new int[] {99, 100, 100, 101});
504         assertEquals(0, after.size());
505 
506         // Test remove in the middle.
507         after = before.clone();
508         after.removeUids(new int[] {100});
509         assertEquals(3, after.size());
510         assertValues(after, 0, TEST_IFACE, 99, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
511                 DEFAULT_NETWORK_NO, 1L, 128L, 0L, 2L, 20L);
512         assertValues(after, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
513                 DEFAULT_NETWORK_NO, 32L, 4L, 0L, 0L, 0L);
514         assertValues(after, 2, TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO,
515                 DEFAULT_NETWORK_NO, 64L, 2L, 0L, 0L, 0L);
516     }
517 
518     @Test
testRemoveEmptyEntries()519     public void testRemoveEmptyEntries() throws Exception {
520         // Test empty stats.
521         final NetworkStats statsEmpty = new NetworkStats(TEST_START, 3);
522         assertEquals(0, statsEmpty.removeEmptyEntries().size());
523 
524         // Test stats with non-zero entry.
525         final NetworkStats statsNonZero = new NetworkStats(TEST_START, 1)
526                 .insertEntry(TEST_IFACE, 99, SET_DEFAULT, TAG_NONE, METERED_NO,
527                         ROAMING_NO, DEFAULT_NETWORK_NO, 1L, 128L, 0L, 2L, 20L);
528         assertEquals(1, statsNonZero.size());
529         final NetworkStats expectedNonZero = statsNonZero.removeEmptyEntries();
530         assertEquals(1, expectedNonZero.size());
531         assertValues(expectedNonZero, 0, TEST_IFACE, 99, SET_DEFAULT, TAG_NONE, METERED_NO,
532                 ROAMING_NO, DEFAULT_NETWORK_NO, 1L, 128L, 0L, 2L, 20L);
533 
534         // Test stats with empty entry.
535         final NetworkStats statsZero = new NetworkStats(TEST_START, 1)
536                 .insertEntry(TEST_IFACE, 99, SET_DEFAULT, TAG_NONE, METERED_NO,
537                         ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
538         assertEquals(1, statsZero.size());
539         final NetworkStats expectedZero = statsZero.removeEmptyEntries();
540         assertEquals(1, statsZero.size()); // Assert immutable.
541         assertEquals(0, expectedZero.size());
542 
543         // Test stats with multiple entries.
544         final NetworkStats statsMultiple = new NetworkStats(TEST_START, 0)
545                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 2L, 64L, 0L, 2L, 20L)
546                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 4L, 32L, 0L, 0L, 0L)
547                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 0L, 0L, 0L, 0L, 0L)
548                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 0L, 0L, 0L, 0L, 0L)
549                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, 8L, 0L, 0L, 0L, 0L)
550                 .insertEntry(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, 0L, 8L, 0L, 0L, 0L)
551                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 4L, 0L, 0L)
552                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 0L, 0L, 0L, 2L, 0L)
553                 .insertEntry(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 0L, 0L, 0L, 0L, 1L);
554         assertEquals(9, statsMultiple.size());
555         final NetworkStats expectedMultiple = statsMultiple.removeEmptyEntries();
556         assertEquals(9, statsMultiple.size()); // Assert immutable.
557         assertEquals(7, expectedMultiple.size());
558         assertValues(expectedMultiple.getTotalIncludingTags(null), 14L, 104L, 4L, 4L, 21L);
559 
560         // Test stats with multiple empty entries.
561         assertEquals(statsMultiple.size(), statsMultiple.subtract(statsMultiple).size());
562         assertEquals(0, statsMultiple.subtract(statsMultiple).removeEmptyEntries().size());
563     }
564 
565     @Test
testClone()566     public void testClone() throws Exception {
567         final NetworkStats original = new NetworkStats(TEST_START, 5)
568                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L)
569                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 512L, 32L, 0L, 0L, 0L);
570 
571         // make clone and mutate original
572         final NetworkStats clone = original.clone();
573         original.insertEntry(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 0L, 0L);
574 
575         assertEquals(3, original.size());
576         assertEquals(2, clone.size());
577 
578         assertEquals(128L + 512L + 128L, original.getTotalBytes());
579         assertEquals(128L + 512L, clone.getTotalBytes());
580     }
581 
582     @Test
testAddWhenEmpty()583     public void testAddWhenEmpty() throws Exception {
584         final NetworkStats red = new NetworkStats(TEST_START, -1);
585         final NetworkStats blue = new NetworkStats(TEST_START, 5)
586                 .insertEntry(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L)
587                 .insertEntry(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 512L, 32L, 0L, 0L, 0L);
588 
589         // We're mostly checking that we don't crash
590         red.combineAllValues(blue);
591     }
592 
593     @Test
testMigrateTun()594     public void testMigrateTun() throws Exception {
595         final int tunUid = 10030;
596         final String tunIface = "tun0";
597         final String underlyingIface = "wlan0";
598         final int testTag1 = 8888;
599         NetworkStats delta = new NetworkStats(TEST_START, 17)
600                 .insertEntry(tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
601                         DEFAULT_NETWORK_NO, 39605L, 46L, 12259L, 55L, 0L)
602                 .insertEntry(tunIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
603                         DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L)
604                 .insertEntry(tunIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
605                         DEFAULT_NETWORK_NO, 72667L, 197L, 43909L, 241L, 0L)
606                 .insertEntry(tunIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
607                         DEFAULT_NETWORK_NO, 9297L, 17L, 4128L, 21L, 0L)
608                 // VPN package also uses some traffic through unprotected network.
609                 .insertEntry(tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
610                         DEFAULT_NETWORK_NO, 4983L, 10L, 1801L, 12L, 0L)
611                 .insertEntry(tunIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
612                         DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L)
613                 // Tag entries
614                 .insertEntry(tunIface, 10120, SET_DEFAULT, testTag1, METERED_NO, ROAMING_NO,
615                         DEFAULT_NETWORK_NO, 21691L, 41L, 13820L, 51L, 0L)
616                 .insertEntry(tunIface, 10120, SET_FOREGROUND, testTag1, METERED_NO, ROAMING_NO,
617                         DEFAULT_NETWORK_NO, 1281L, 2L, 665L, 2L, 0L)
618                 // Irrelevant entries
619                 .insertEntry(TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
620                         DEFAULT_NETWORK_NO, 1685L, 5L, 2070L, 6L, 0L)
621                 // Underlying Iface entries
622                 .insertEntry(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
623                         DEFAULT_NETWORK_NO, 5178L, 8L, 2139L, 11L, 0L)
624                 .insertEntry(underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO,
625                         ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L)
626                 .insertEntry(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
627                         DEFAULT_NETWORK_NO, 149873L, 287L, 59217L /* smaller than sum(tun0) */,
628                         299L /* smaller than sum(tun0) */, 0L)
629                 .insertEntry(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO,
630                         ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
631 
632         delta.migrateTun(tunUid, tunIface, Arrays.asList(underlyingIface));
633         assertEquals(20, delta.size());
634 
635         // tunIface and TEST_IFACE entries are not changed.
636         assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
637                 DEFAULT_NETWORK_NO, 39605L, 46L, 12259L, 55L, 0L);
638         assertValues(delta, 1, tunIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
639                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
640         assertValues(delta, 2, tunIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
641                 DEFAULT_NETWORK_NO, 72667L, 197L, 43909L, 241L, 0L);
642         assertValues(delta, 3, tunIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
643                 DEFAULT_NETWORK_NO, 9297L, 17L, 4128L, 21L, 0L);
644         assertValues(delta, 4, tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
645                 DEFAULT_NETWORK_NO, 4983L, 10L, 1801L, 12L, 0L);
646         assertValues(delta, 5, tunIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
647                 DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
648         assertValues(delta, 6, tunIface, 10120, SET_DEFAULT, testTag1, METERED_NO, ROAMING_NO,
649                 DEFAULT_NETWORK_NO, 21691L, 41L, 13820L, 51L, 0L);
650         assertValues(delta, 7, tunIface, 10120, SET_FOREGROUND, testTag1, METERED_NO, ROAMING_NO,
651                 DEFAULT_NETWORK_NO, 1281L, 2L, 665L, 2L, 0L);
652         assertValues(delta, 8, TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
653                 DEFAULT_NETWORK_NO, 1685L, 5L, 2070L, 6L, 0L);
654 
655         // Existing underlying Iface entries are updated
656         assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO,
657                 ROAMING_NO, DEFAULT_NETWORK_NO, 44783L, 54L, 14178L, 62L, 0L);
658         assertValues(delta, 10, underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO,
659                 ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
660 
661         // VPN underlying Iface entries are updated
662         assertValues(delta, 11, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO,
663                 ROAMING_NO, DEFAULT_NETWORK_NO, 28304L, 27L, 1L, 2L, 0L);
664         assertValues(delta, 12, underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO,
665                 ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L);
666 
667         // New entries are added for new application's underlying Iface traffic
668         assertContains(delta, underlyingIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO,
669                 ROAMING_NO, DEFAULT_NETWORK_NO, 72667L, 197L, 43123L, 227L, 0L);
670         assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO,
671                 ROAMING_NO, DEFAULT_NETWORK_NO, 9297L, 17L, 4054, 19L, 0L);
672         assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, METERED_NO,
673                 ROAMING_NO, DEFAULT_NETWORK_NO, 21691L, 41L, 13572L, 48L, 0L);
674         assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, METERED_NO,
675                 ROAMING_NO, DEFAULT_NETWORK_NO, 1281L, 2L, 653L, 1L, 0L);
676 
677         // New entries are added for debug purpose
678         assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
679                 ROAMING_NO, DEFAULT_NETWORK_NO, 39605L, 46L, 12039, 51, 0);
680         assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
681                 ROAMING_NO, DEFAULT_NETWORK_NO, 81964, 214, 47177, 246, 0);
682         assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, METERED_ALL,
683                 ROAMING_ALL, DEFAULT_NETWORK_ALL, 121569, 260, 59216, 297, 0);
684 
685     }
686 
687     // Tests a case where all of the data received by the tun0 interface is echo back into the tun0
688     // interface by the vpn app before it's sent out of the underlying interface. The VPN app should
689     // not be charged for the echoed data but it should still be charged for any extra data it sends
690     // via the underlying interface.
691     @Test
testMigrateTun_VpnAsLoopback()692     public void testMigrateTun_VpnAsLoopback() {
693         final int tunUid = 10030;
694         final String tunIface = "tun0";
695         final String underlyingIface = "wlan0";
696         NetworkStats delta = new NetworkStats(TEST_START, 9)
697                 // 2 different apps sent/receive data via tun0.
698                 .insertEntry(tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
699                         DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L)
700                 .insertEntry(tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
701                         DEFAULT_NETWORK_NO, 500L, 2L, 200L, 5L, 0L)
702                 // VPN package resends data through the tunnel (with exaggerated overhead)
703                 .insertEntry(tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
704                         DEFAULT_NETWORK_NO, 240000, 100L, 120000L, 60L, 0L)
705                 // 1 app already has some traffic on the underlying interface, the other doesn't yet
706                 .insertEntry(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
707                         DEFAULT_NETWORK_NO, 1000L, 10L, 2000L, 20L, 0L)
708                 // Traffic through the underlying interface via the vpn app.
709                 // This test should redistribute this data correctly.
710                 .insertEntry(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
711                         DEFAULT_NETWORK_NO, 75500L, 37L, 130000L, 70L, 0L);
712 
713         delta.migrateTun(tunUid, tunIface, Arrays.asList(underlyingIface));
714         assertEquals(9, delta.size());
715 
716         // tunIface entries should not be changed.
717         assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
718                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
719         assertValues(delta, 1, tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
720                 DEFAULT_NETWORK_NO, 500L, 2L, 200L, 5L, 0L);
721         assertValues(delta, 2, tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
722                 DEFAULT_NETWORK_NO, 240000L, 100L, 120000L, 60L, 0L);
723 
724         // Existing underlying Iface entries are updated
725         assertValues(delta, 3, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO,
726                 ROAMING_NO, DEFAULT_NETWORK_NO, 51000L, 35L, 102000L, 70L, 0L);
727 
728         // VPN underlying Iface entries are updated
729         assertValues(delta, 4, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO,
730                 ROAMING_NO, DEFAULT_NETWORK_NO, 25000L, 10L, 29800L, 15L, 0L);
731 
732         // New entries are added for new application's underlying Iface traffic
733         assertContains(delta, underlyingIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO,
734                 ROAMING_NO, DEFAULT_NETWORK_NO, 500L, 2L, 200L, 5L, 0L);
735 
736         // New entries are added for debug purpose
737         assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
738                 ROAMING_NO, DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
739         assertContains(delta, underlyingIface, 20100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
740                 ROAMING_NO, DEFAULT_NETWORK_NO, 500, 2L, 200L, 5L, 0L);
741         assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, METERED_ALL,
742                 ROAMING_ALL, DEFAULT_NETWORK_ALL, 50500L, 27L, 100200L, 55, 0);
743     }
744 
745     // Tests a case where an PlatformVpn is used, where the entire datapath is in the kernel,
746     // including all encapsulation/decapsulation.
747     @Test
testMigrateTun_platformVpn()748     public void testMigrateTun_platformVpn() {
749         final int ownerUid = Process.SYSTEM_UID;
750         final String tunIface = "ipsec1";
751         final String underlyingIface = "wlan0";
752         NetworkStats delta = new NetworkStats(TEST_START, 9)
753                 // 2 different apps sent/receive data via ipsec1.
754                 .insertEntry(tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
755                         DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L)
756                 .insertEntry(tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
757                         DEFAULT_NETWORK_NO, 500L, 2L, 200L, 5L, 0L)
758                 // Owner (system) sends data through the tunnel
759                 .insertEntry(tunIface, ownerUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
760                         DEFAULT_NETWORK_NO, 2000L, 20L, 3000L, 30L, 0L)
761                 // 1 app already has some traffic on the underlying interface, the other doesn't yet
762                 .insertEntry(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
763                         DEFAULT_NETWORK_NO, 1000L, 10L, 2000L, 20L, 0L);
764 
765         delta.migrateTun(ownerUid, tunIface, Arrays.asList(underlyingIface));
766         assertEquals(9, delta.size()); // 3 DBG entries + 1 entry per app per interface
767 
768         // tunIface entries should not be changed.
769         assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
770                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
771         assertValues(delta, 1, tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
772                 DEFAULT_NETWORK_NO, 500L, 2L, 200L, 5L, 0L);
773         assertValues(delta, 2, tunIface, ownerUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
774                 DEFAULT_NETWORK_NO, 2000L, 20L, 3000L, 30L, 0L);
775 
776         // Existing underlying Iface entries are updated to include usage over ipsec1
777         assertValues(delta, 3, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO,
778                 ROAMING_NO, DEFAULT_NETWORK_NO, 51000L, 35L, 102000L, 70L, 0L);
779 
780         // New entries are added on underlying Iface traffic
781         assertContains(delta, underlyingIface, ownerUid, SET_DEFAULT, TAG_NONE, METERED_NO,
782                 ROAMING_NO, DEFAULT_NETWORK_NO, 2000L, 20L, 3000L, 30L, 0L);
783         assertContains(delta, underlyingIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO,
784                 ROAMING_NO, DEFAULT_NETWORK_NO, 500L, 2L, 200L, 5L, 0L);
785 
786         // New entries are added for debug purpose
787         assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
788                 ROAMING_NO, DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
789         assertContains(delta, underlyingIface, 20100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
790                 ROAMING_NO, DEFAULT_NETWORK_NO, 500, 2L, 200L, 5L, 0L);
791         assertContains(delta, underlyingIface, ownerUid, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
792                 ROAMING_NO, DEFAULT_NETWORK_NO, 2000L, 20L, 3000L, 30L, 0L);
793     }
794 
795     @Test
testFilter_NoFilter()796     public void testFilter_NoFilter() {
797         NetworkStats.Entry entry1 = new NetworkStats.Entry(
798                 "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
799                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
800 
801         NetworkStats.Entry entry2 = new NetworkStats.Entry(
802                 "test2", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
803                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
804 
805         NetworkStats.Entry entry3 = new NetworkStats.Entry(
806                 "test2", 10101, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
807                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
808 
809         NetworkStats stats = new NetworkStats(TEST_START, 3)
810                 .insertEntry(entry1)
811                 .insertEntry(entry2)
812                 .insertEntry(entry3);
813 
814         stats.filter(UID_ALL, INTERFACES_ALL, TAG_ALL);
815         assertEquals(3, stats.size());
816         assertEquals(entry1, stats.getValues(0, null));
817         assertEquals(entry2, stats.getValues(1, null));
818         assertEquals(entry3, stats.getValues(2, null));
819     }
820 
821     @Test
testFilter_UidFilter()822     public void testFilter_UidFilter() {
823         final int testUid = 10101;
824         NetworkStats.Entry entry1 = new NetworkStats.Entry(
825                 "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
826                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
827 
828         NetworkStats.Entry entry2 = new NetworkStats.Entry(
829                 "test2", testUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
830                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
831 
832         NetworkStats.Entry entry3 = new NetworkStats.Entry(
833                 "test2", testUid, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
834                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
835 
836         NetworkStats stats = new NetworkStats(TEST_START, 3)
837                 .insertEntry(entry1)
838                 .insertEntry(entry2)
839                 .insertEntry(entry3);
840 
841         stats.filter(testUid, INTERFACES_ALL, TAG_ALL);
842         assertEquals(2, stats.size());
843         assertEquals(entry2, stats.getValues(0, null));
844         assertEquals(entry3, stats.getValues(1, null));
845     }
846 
847     @Test
testFilter_InterfaceFilter()848     public void testFilter_InterfaceFilter() {
849         final String testIf1 = "testif1";
850         final String testIf2 = "testif2";
851         NetworkStats.Entry entry1 = new NetworkStats.Entry(
852                 testIf1, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
853                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
854 
855         NetworkStats.Entry entry2 = new NetworkStats.Entry(
856                 "otherif", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
857                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
858 
859         NetworkStats.Entry entry3 = new NetworkStats.Entry(
860                 testIf1, 10101, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
861                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
862 
863         NetworkStats.Entry entry4 = new NetworkStats.Entry(
864                 testIf2, 10101, SET_DEFAULT, 123, METERED_NO, ROAMING_NO,
865                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
866 
867         NetworkStats stats = new NetworkStats(TEST_START, 4)
868                 .insertEntry(entry1)
869                 .insertEntry(entry2)
870                 .insertEntry(entry3)
871                 .insertEntry(entry4);
872 
873         stats.filter(UID_ALL, new String[] { testIf1, testIf2 }, TAG_ALL);
874         assertEquals(3, stats.size());
875         assertEquals(entry1, stats.getValues(0, null));
876         assertEquals(entry3, stats.getValues(1, null));
877         assertEquals(entry4, stats.getValues(2, null));
878     }
879 
880     @Test
testFilter_EmptyInterfaceFilter()881     public void testFilter_EmptyInterfaceFilter() {
882         NetworkStats.Entry entry1 = new NetworkStats.Entry(
883                 "if1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
884                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
885 
886         NetworkStats.Entry entry2 = new NetworkStats.Entry(
887                 "if2", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
888                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
889 
890         NetworkStats stats = new NetworkStats(TEST_START, 3)
891                 .insertEntry(entry1)
892                 .insertEntry(entry2);
893 
894         stats.filter(UID_ALL, new String[] { }, TAG_ALL);
895         assertEquals(0, stats.size());
896     }
897 
898     @Test
testFilter_TagFilter()899     public void testFilter_TagFilter() {
900         final int testTag = 123;
901         final int otherTag = 456;
902         NetworkStats.Entry entry1 = new NetworkStats.Entry(
903                 "test1", 10100, SET_DEFAULT, testTag, METERED_NO, ROAMING_NO,
904                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
905 
906         NetworkStats.Entry entry2 = new NetworkStats.Entry(
907                 "test2", 10101, SET_DEFAULT, testTag, METERED_NO, ROAMING_NO,
908                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
909 
910         NetworkStats.Entry entry3 = new NetworkStats.Entry(
911                 "test2", 10101, SET_DEFAULT, otherTag, METERED_NO, ROAMING_NO,
912                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
913 
914         NetworkStats stats = new NetworkStats(TEST_START, 3)
915                 .insertEntry(entry1)
916                 .insertEntry(entry2)
917                 .insertEntry(entry3);
918 
919         stats.filter(UID_ALL, INTERFACES_ALL, testTag);
920         assertEquals(2, stats.size());
921         assertEquals(entry1, stats.getValues(0, null));
922         assertEquals(entry2, stats.getValues(1, null));
923     }
924 
925     @Test
testFilterDebugEntries()926     public void testFilterDebugEntries() {
927         NetworkStats.Entry entry1 = new NetworkStats.Entry(
928                 "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
929                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
930 
931         NetworkStats.Entry entry2 = new NetworkStats.Entry(
932                 "test2", 10101, SET_DBG_VPN_IN, TAG_NONE, METERED_NO, ROAMING_NO,
933                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
934 
935         NetworkStats.Entry entry3 = new NetworkStats.Entry(
936                 "test2", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
937                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
938 
939         NetworkStats.Entry entry4 = new NetworkStats.Entry(
940                 "test2", 10101, SET_DBG_VPN_OUT, TAG_NONE, METERED_NO, ROAMING_NO,
941                 DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L);
942 
943         NetworkStats stats = new NetworkStats(TEST_START, 4)
944                 .insertEntry(entry1)
945                 .insertEntry(entry2)
946                 .insertEntry(entry3)
947                 .insertEntry(entry4);
948 
949         stats.filterDebugEntries();
950 
951         assertEquals(2, stats.size());
952         assertEquals(entry1, stats.getValues(0, null));
953         assertEquals(entry3, stats.getValues(1, null));
954     }
955 
956     @Test
testApply464xlatAdjustments()957     public void testApply464xlatAdjustments() {
958         final String v4Iface = "v4-wlan0";
959         final String baseIface = "wlan0";
960         final String otherIface = "other";
961         final int appUid = 10001;
962         final int rootUid = Process.ROOT_UID;
963         ArrayMap<String, String> stackedIface = new ArrayMap<>();
964         stackedIface.put(v4Iface, baseIface);
965 
966         // Ipv4 traffic sent/received by an app on stacked interface.
967         final NetworkStats.Entry appEntry = new NetworkStats.Entry(
968                 v4Iface, appUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
969                 30501490  /* rxBytes */,
970                 22401 /* rxPackets */,
971                 876235 /* txBytes */,
972                 13805 /* txPackets */,
973                 0 /* operations */);
974 
975         // Traffic measured for the root uid on the base interface.
976         final NetworkStats.Entry rootUidEntry = new NetworkStats.Entry(
977                 baseIface, rootUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
978                 DEFAULT_NETWORK_NO,
979                 163577 /* rxBytes */,
980                 187 /* rxPackets */,
981                 17607 /* txBytes */,
982                 97 /* txPackets */,
983                 0 /* operations */);
984 
985         final NetworkStats.Entry otherEntry = new NetworkStats.Entry(
986                 otherIface, appUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
987                 DEFAULT_NETWORK_NO,
988                 2600  /* rxBytes */,
989                 2 /* rxPackets */,
990                 3800 /* txBytes */,
991                 3 /* txPackets */,
992                 0 /* operations */);
993 
994         final NetworkStats stats = new NetworkStats(TEST_START, 3)
995                 .insertEntry(appEntry)
996                 .insertEntry(rootUidEntry)
997                 .insertEntry(otherEntry);
998 
999         stats.apply464xlatAdjustments(stackedIface);
1000 
1001         assertEquals(3, stats.size());
1002         final NetworkStats.Entry expectedAppUid = new NetworkStats.Entry(
1003                 v4Iface, appUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
1004                 30949510,
1005                 22401,
1006                 1152335,
1007                 13805,
1008                 0);
1009         final NetworkStats.Entry expectedRootUid = new NetworkStats.Entry(
1010                 baseIface, 0, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
1011                 163577,
1012                 187,
1013                 17607,
1014                 97,
1015                 0);
1016         assertEquals(expectedAppUid, stats.getValues(0, null));
1017         assertEquals(expectedRootUid, stats.getValues(1, null));
1018         assertEquals(otherEntry, stats.getValues(2, null));
1019     }
1020 
1021     @Test
testApply464xlatAdjustments_noStackedIface()1022     public void testApply464xlatAdjustments_noStackedIface() {
1023         NetworkStats.Entry firstEntry = new NetworkStats.Entry(
1024                 "if1", 10002, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
1025                 DEFAULT_NETWORK_NO,
1026                 2600  /* rxBytes */,
1027                 2 /* rxPackets */,
1028                 3800 /* txBytes */,
1029                 3 /* txPackets */,
1030                 0 /* operations */);
1031         NetworkStats.Entry secondEntry = new NetworkStats.Entry(
1032                 "if2", 10002, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
1033                 DEFAULT_NETWORK_NO,
1034                 5000  /* rxBytes */,
1035                 3 /* rxPackets */,
1036                 6000 /* txBytes */,
1037                 4 /* txPackets */,
1038                 0 /* operations */);
1039 
1040         NetworkStats stats = new NetworkStats(TEST_START, 2)
1041                 .insertEntry(firstEntry)
1042                 .insertEntry(secondEntry);
1043 
1044         // Empty map: no adjustment
1045         stats.apply464xlatAdjustments(new ArrayMap<>());
1046 
1047         assertEquals(2, stats.size());
1048         assertEquals(firstEntry, stats.getValues(0, null));
1049         assertEquals(secondEntry, stats.getValues(1, null));
1050     }
1051 
1052     @Test
testIterator()1053     public void testIterator() {
1054         final NetworkStats emptyStats = new NetworkStats(0, 0);
1055         final Iterator emptyIterator = emptyStats.iterator();
1056         assertFalse(emptyIterator.hasNext());
1057 
1058         final int numEntries = 10;
1059         final ArrayList<NetworkStats.Entry> entries = new ArrayList<>();
1060         final NetworkStats stats = new NetworkStats(TEST_START, 1);
1061         for (int i = 0; i < numEntries; ++i) {
1062             NetworkStats.Entry entry = new NetworkStats.Entry("test1", 10100, SET_DEFAULT,
1063                     TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
1064                     i * 10L /* rxBytes */, i * 3L /* rxPackets */,
1065                     i * 15L /* txBytes */, i * 2L /* txPackets */, 0L /* operations */);
1066             stats.insertEntry(entry);
1067             entries.add(entry);
1068         }
1069 
1070         for (NetworkStats.Entry e : stats) {
1071             assertEquals(e, entries.remove(0));
1072         }
1073     }
1074 
1075     @Test
testWithoutInterfaces()1076     public void testWithoutInterfaces() {
1077         final NetworkStats stats = new NetworkStats(TEST_START, 1);
1078         final NetworkStats.Entry entry1 = new NetworkStats.Entry(
1079                 "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
1080                 DEFAULT_NETWORK_NO, 1024L, 50L, 100L, 20L, 0L);
1081         final NetworkStats.Entry entry2 = new NetworkStats.Entry(
1082                 "test2", 10101, SET_DEFAULT, 0xF0DD, METERED_NO, ROAMING_NO,
1083                 DEFAULT_NETWORK_NO, 51200, 25L, 101010L, 50L, 0L);
1084         final NetworkStats.Entry entry3 = new NetworkStats.Entry(
1085                 "test3", 10101, SET_DEFAULT, 0xF0DD, METERED_NO, ROAMING_NO,
1086                 DEFAULT_NETWORK_NO, 1, 2L, 3L, 4L, 5L);
1087 
1088         stats.insertEntry(entry1);
1089         stats.insertEntry(entry2);
1090         stats.insertEntry(entry3);
1091 
1092         // Verify that the interfaces have indeed been recorded.
1093         assertEquals(3, stats.size());
1094         assertValues(stats, 0, "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO,
1095                 ROAMING_NO, DEFAULT_NETWORK_NO, 1024L, 50L, 100L, 20L, 0L);
1096         assertValues(stats, 1, "test2", 10101, SET_DEFAULT, 0xF0DD, METERED_NO,
1097                 ROAMING_NO, DEFAULT_NETWORK_NO, 51200, 25L, 101010L, 50L, 0L);
1098         assertValues(stats, 2, "test3", 10101, SET_DEFAULT, 0xF0DD, METERED_NO,
1099                 ROAMING_NO, DEFAULT_NETWORK_NO, 1, 2L, 3L, 4L, 5L);
1100 
1101         // Get stats without interfaces.
1102         final NetworkStats ifaceClearedStats = stats.withoutInterfaces();
1103 
1104         // Verify that the interfaces do not exist, and key-duplicated items are merged.
1105         assertEquals(2, ifaceClearedStats.size());
1106         assertValues(ifaceClearedStats, 0, null /* iface */, 10100, SET_DEFAULT, TAG_NONE,
1107                 METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 1024L, 50L, 100L, 20L, 0L);
1108         assertValues(ifaceClearedStats, 1, null /* iface */, 10101, SET_DEFAULT, 0xF0DD,
1109                 METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 51201, 27L, 101013L, 54L, 5L);
1110     }
1111 
assertContains(NetworkStats stats, String iface, int uid, int set, int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations)1112     private static void assertContains(NetworkStats stats,  String iface, int uid, int set,
1113             int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets,
1114             long txBytes, long txPackets, long operations) {
1115         int index = stats.findIndex(iface, uid, set, tag, metered, roaming, defaultNetwork);
1116         assertTrue(index != -1);
1117         assertValues(stats, index, iface, uid, set, tag, metered, roaming, defaultNetwork,
1118                 rxBytes, rxPackets, txBytes, txPackets, operations);
1119     }
1120 
assertValues(NetworkStats stats, int index, String iface, int uid, int set, int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations)1121     private static void assertValues(NetworkStats stats, int index, String iface, int uid, int set,
1122             int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets,
1123             long txBytes, long txPackets, long operations) {
1124         final NetworkStats.Entry entry = stats.getValues(index, null);
1125         assertValues(entry, iface, uid, set, tag, metered, roaming, defaultNetwork);
1126         assertValues(entry, rxBytes, rxPackets, txBytes, txPackets, operations);
1127     }
1128 
assertValues( NetworkStats.Entry entry, String iface, int uid, int set, int tag, int metered, int roaming, int defaultNetwork)1129     private static void assertValues(
1130             NetworkStats.Entry entry, String iface, int uid, int set, int tag, int metered,
1131             int roaming, int defaultNetwork) {
1132         assertEquals(iface, entry.getIface());
1133         assertEquals(uid, entry.getUid());
1134         assertEquals(set, entry.getSet());
1135         assertEquals(tag, entry.getTag());
1136         assertEquals(metered, entry.getMetered());
1137         assertEquals(roaming, entry.getRoaming());
1138         assertEquals(defaultNetwork, entry.getDefaultNetwork());
1139     }
1140 
assertValues(NetworkStats.Entry entry, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations)1141     private static void assertValues(NetworkStats.Entry entry, long rxBytes, long rxPackets,
1142             long txBytes, long txPackets, long operations) {
1143         assertEquals(rxBytes, entry.getRxBytes());
1144         assertEquals(rxPackets, entry.getRxPackets());
1145         assertEquals(txBytes, entry.getTxBytes());
1146         assertEquals(txPackets, entry.getTxPackets());
1147         assertEquals(operations, entry.getOperations());
1148     }
1149 
1150 }
1151