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