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