blob: eb85eb445cbcdae88bcd578f32748b6a30e69a73 [file] [log] [blame]
Jeff Sharkeyeedcb952011-05-17 14:55:15 -07001/*
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
17package android.net;
18
Stephen Chen25147872016-10-21 12:44:26 -070019import static android.net.NetworkStats.METERED_ALL;
20import static android.net.NetworkStats.METERED_NO;
21import static android.net.NetworkStats.METERED_YES;
Jeff Davidsona6a78072016-01-11 16:02:17 -080022import static android.net.NetworkStats.ROAMING_ALL;
Jeff Davidson1f7e05e2016-03-10 13:21:38 -080023import static android.net.NetworkStats.ROAMING_NO;
24import static android.net.NetworkStats.ROAMING_YES;
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -070025import static android.net.NetworkStats.SET_DEFAULT;
Jeff Sharkey8e9992a2011-08-23 18:37:23 -070026import static android.net.NetworkStats.SET_FOREGROUND;
Wenchao Tong98170b02015-03-17 16:14:23 -070027import static android.net.NetworkStats.SET_DBG_VPN_IN;
28import static android.net.NetworkStats.SET_DBG_VPN_OUT;
Jeff Sharkey905b5892011-09-30 15:19:49 -070029import static android.net.NetworkStats.SET_ALL;
30import static android.net.NetworkStats.IFACE_ALL;
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -070031import static android.net.NetworkStats.TAG_NONE;
Jeff Sharkey8e9992a2011-08-23 18:37:23 -070032import static android.net.NetworkStats.UID_ALL;
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -070033
Jeff Sharkeyeedcb952011-05-17 14:55:15 -070034import android.test.suitebuilder.annotation.SmallTest;
35
Jeff Sharkey1059c3c2011-10-04 16:54:49 -070036import com.google.android.collect.Sets;
37
Jeff Sharkeyeedcb952011-05-17 14:55:15 -070038import junit.framework.TestCase;
39
Jeff Sharkey1059c3c2011-10-04 16:54:49 -070040import java.util.HashSet;
41
Jeff Sharkeyeedcb952011-05-17 14:55:15 -070042@SmallTest
43public class NetworkStatsTest extends TestCase {
44
45 private static final String TEST_IFACE = "test0";
Jeff Sharkey8e9992a2011-08-23 18:37:23 -070046 private static final String TEST_IFACE2 = "test2";
Jeff Sharkey4a971222011-06-11 22:16:55 -070047 private static final int TEST_UID = 1001;
48 private static final long TEST_START = 1194220800000L;
Jeff Sharkeyeedcb952011-05-17 14:55:15 -070049
50 public void testFindIndex() throws Exception {
Stephen Chen25147872016-10-21 12:44:26 -070051 final NetworkStats stats = new NetworkStats(TEST_START, 5)
52 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L,
53 8L, 0L, 0L, 10)
54 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L, 0L,
55 1024L, 8L, 11)
56 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 0L, 0L,
57 1024L, 8L, 11)
58 .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L,
59 8L, 1024L, 8L, 12)
60 .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES, 1024L,
61 8L, 1024L, 8L, 12);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -070062
Stephen Chen25147872016-10-21 12:44:26 -070063 assertEquals(4, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_YES,
64 ROAMING_YES));
65 assertEquals(3, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO,
66 ROAMING_NO));
67 assertEquals(2, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES,
68 ROAMING_NO));
69 assertEquals(1, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO,
70 ROAMING_NO));
71 assertEquals(0, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO,
72 ROAMING_NO));
73 assertEquals(-1, stats.findIndex(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE, METERED_NO,
74 ROAMING_NO));
Jeff Sharkeyeedcb952011-05-17 14:55:15 -070075 }
76
Jeff Sharkey163e6442011-10-31 16:37:52 -070077 public void testFindIndexHinted() {
78 final NetworkStats stats = new NetworkStats(TEST_START, 3)
Stephen Chen25147872016-10-21 12:44:26 -070079 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L,
80 8L, 0L, 0L, 10)
81 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L, 0L,
82 1024L, 8L, 11)
83 .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L,
84 8L, 1024L, 8L, 12)
85 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
86 1024L, 8L, 0L, 0L, 10)
87 .addValues(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 0L, 0L,
88 1024L, 8L, 11)
89 .addValues(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO, 0L, 0L,
90 1024L, 8L, 11)
91 .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1024L,
92 8L, 1024L, 8L, 12)
93 .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES, 1024L,
94 8L, 1024L, 8L, 12);
Jeff Sharkey163e6442011-10-31 16:37:52 -070095
96 // verify that we correctly find across regardless of hinting
97 for (int hint = 0; hint < stats.size(); hint++) {
Jeff Davidsona6a78072016-01-11 16:02:17 -080098 assertEquals(0, stats.findIndexHinted(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE,
Stephen Chen25147872016-10-21 12:44:26 -070099 METERED_NO, ROAMING_NO, hint));
Jeff Davidsona6a78072016-01-11 16:02:17 -0800100 assertEquals(1, stats.findIndexHinted(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE,
Stephen Chen25147872016-10-21 12:44:26 -0700101 METERED_NO, ROAMING_NO, hint));
Jeff Davidsona6a78072016-01-11 16:02:17 -0800102 assertEquals(2, stats.findIndexHinted(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE,
Stephen Chen25147872016-10-21 12:44:26 -0700103 METERED_NO, ROAMING_NO, hint));
Jeff Davidsona6a78072016-01-11 16:02:17 -0800104 assertEquals(3, stats.findIndexHinted(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE,
Stephen Chen25147872016-10-21 12:44:26 -0700105 METERED_NO, ROAMING_NO, hint));
Jeff Davidsona6a78072016-01-11 16:02:17 -0800106 assertEquals(4, stats.findIndexHinted(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D,
Stephen Chen25147872016-10-21 12:44:26 -0700107 METERED_NO, ROAMING_NO, hint));
108 assertEquals(5, stats.findIndexHinted(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D,
109 METERED_YES, ROAMING_NO, hint));
Jeff Davidsona6a78072016-01-11 16:02:17 -0800110 assertEquals(6, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
Stephen Chen25147872016-10-21 12:44:26 -0700111 METERED_NO, ROAMING_NO, hint));
112 assertEquals(7, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
113 METERED_YES, ROAMING_YES, hint));
Jeff Davidsona6a78072016-01-11 16:02:17 -0800114 assertEquals(-1, stats.findIndexHinted(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE,
Stephen Chen25147872016-10-21 12:44:26 -0700115 METERED_NO, ROAMING_NO, hint));
Jeff Sharkey163e6442011-10-31 16:37:52 -0700116 }
117 }
118
Jeff Sharkey4a971222011-06-11 22:16:55 -0700119 public void testAddEntryGrow() throws Exception {
Stephen Chen25147872016-10-21 12:44:26 -0700120 final NetworkStats stats = new NetworkStats(TEST_START, 4);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700121
Jeff Sharkeyfd8be3e2011-07-11 14:36:15 -0700122 assertEquals(0, stats.size());
Stephen Chen25147872016-10-21 12:44:26 -0700123 assertEquals(4, stats.internalSize());
Jeff Sharkey4a971222011-06-11 22:16:55 -0700124
Stephen Chen25147872016-10-21 12:44:26 -0700125 stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1L, 1L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800126 2L, 2L, 3);
Stephen Chen25147872016-10-21 12:44:26 -0700127 stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 2L, 2L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800128 2L, 2L, 4);
Stephen Chen25147872016-10-21 12:44:26 -0700129 stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 3L,
130 3L, 2L, 2L, 5);
131 stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES, 3L,
132 3L, 2L, 2L, 5);
133
134 assertEquals(4, stats.size());
135 assertEquals(4, stats.internalSize());
136
137 stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 4L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800138 40L, 4L, 40L, 7);
Stephen Chen25147872016-10-21 12:44:26 -0700139 stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 5L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800140 50L, 4L, 40L, 8);
Stephen Chen25147872016-10-21 12:44:26 -0700141 stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 6L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800142 60L, 5L, 50L, 10);
Stephen Chen25147872016-10-21 12:44:26 -0700143 stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 7L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800144 70L, 5L, 50L, 11);
Stephen Chen25147872016-10-21 12:44:26 -0700145 stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_YES, 7L,
146 70L, 5L, 50L, 11);
147
148 assertEquals(9, stats.size());
149 assertTrue(stats.internalSize() >= 9);
150
151 assertValues(stats, 0, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
152 1L, 1L, 2L, 2L, 3);
153 assertValues(stats, 1, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
154 2L, 2L, 2L, 2L, 4);
155 assertValues(stats, 2, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
156 3L, 3L, 2L, 2L, 5);
157 assertValues(stats, 3, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES,
158 ROAMING_YES, 3L, 3L, 2L, 2L, 5);
159 assertValues(stats, 4, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
160 4L, 40L, 4L, 40L, 7);
161 assertValues(stats, 5, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
162 5L, 50L, 4L, 40L, 8);
163 assertValues(stats, 6, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
164 6L, 60L, 5L, 50L, 10);
165 assertValues(stats, 7, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES,
166 7L, 70L, 5L, 50L, 11);
167 assertValues(stats, 8, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, METERED_YES,
168 ROAMING_YES, 7L, 70L, 5L, 50L, 11);
Jeff Sharkey4a971222011-06-11 22:16:55 -0700169 }
170
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -0700171 public void testCombineExisting() throws Exception {
172 final NetworkStats stats = new NetworkStats(TEST_START, 10);
173
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700174 stats.addValues(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, 512L, 4L, 256L, 2L, 10);
175 stats.addValues(TEST_IFACE, 1001, SET_DEFAULT, 0xff, 128L, 1L, 128L, 1L, 2);
Jeff Davidsona6a78072016-01-11 16:02:17 -0800176 stats.combineValues(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, -128L, -1L,
177 -128L, -1L, -1);
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -0700178
Stephen Chen25147872016-10-21 12:44:26 -0700179 assertValues(stats, 0, TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
180 384L, 3L, 128L, 1L, 9);
181 assertValues(stats, 1, TEST_IFACE, 1001, SET_DEFAULT, 0xff, METERED_NO, ROAMING_NO, 128L,
182 1L, 128L, 1L, 2);
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -0700183
184 // now try combining that should create row
Stephen Chen25147872016-10-21 12:44:26 -0700185 stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3);
186 assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
187 128L, 1L, 128L, 1L, 3);
188 stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L, 128L, 1L, 3);
189 assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
190 256L, 2L, 256L, 2L, 6);
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -0700191 }
192
Jeff Sharkey4a971222011-06-11 22:16:55 -0700193 public void testSubtractIdenticalData() throws Exception {
194 final NetworkStats before = new NetworkStats(TEST_START, 2)
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700195 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
196 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
Jeff Sharkey4a971222011-06-11 22:16:55 -0700197
198 final NetworkStats after = new NetworkStats(TEST_START, 2)
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700199 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
200 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700201
Jeff Sharkey3f391352011-06-05 17:42:53 -0700202 final NetworkStats result = after.subtract(before);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700203
Jeff Sharkey75279902011-05-24 18:39:45 -0700204 // identical data should result in zero delta
Stephen Chen25147872016-10-21 12:44:26 -0700205 assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L,
206 0L, 0L, 0L, 0);
207 assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L,
208 0L, 0L, 0L, 0);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700209 }
210
211 public void testSubtractIdenticalRows() throws Exception {
Jeff Sharkey4a971222011-06-11 22:16:55 -0700212 final NetworkStats before = new NetworkStats(TEST_START, 2)
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700213 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
214 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700215
Jeff Sharkey4a971222011-06-11 22:16:55 -0700216 final NetworkStats after = new NetworkStats(TEST_START, 2)
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700217 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1025L, 9L, 2L, 1L, 15)
218 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 3L, 1L, 1028L, 9L, 20);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700219
Jeff Sharkey3f391352011-06-05 17:42:53 -0700220 final NetworkStats result = after.subtract(before);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700221
222 // expect delta between measurements
Stephen Chen25147872016-10-21 12:44:26 -0700223 assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1L,
224 1L, 2L, 1L, 4);
225 assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 3L,
226 1L, 4L, 1L, 8);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700227 }
228
229 public void testSubtractNewRows() throws Exception {
Jeff Sharkey4a971222011-06-11 22:16:55 -0700230 final NetworkStats before = new NetworkStats(TEST_START, 2)
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700231 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
232 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700233
Jeff Sharkey4a971222011-06-11 22:16:55 -0700234 final NetworkStats after = new NetworkStats(TEST_START, 3)
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700235 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 1024L, 8L, 0L, 0L, 11)
236 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 0L, 0L, 1024L, 8L, 12)
237 .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, 1024L, 8L, 1024L, 8L, 20);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700238
Jeff Sharkey3f391352011-06-05 17:42:53 -0700239 final NetworkStats result = after.subtract(before);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700240
241 // its okay to have new rows
Stephen Chen25147872016-10-21 12:44:26 -0700242 assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L,
243 0L, 0L, 0L, 0);
244 assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 0L,
245 0L, 0L, 0L, 0);
246 assertValues(result, 2, TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
247 1024L, 8L, 1024L, 8L, 20);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700248 }
249
Jeff Sharkey8e9992a2011-08-23 18:37:23 -0700250 public void testSubtractMissingRows() throws Exception {
251 final NetworkStats before = new NetworkStats(TEST_START, 2)
252 .addValues(TEST_IFACE, UID_ALL, SET_DEFAULT, TAG_NONE, 1024L, 0L, 0L, 0L, 0)
253 .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, 2048L, 0L, 0L, 0L, 0);
254
255 final NetworkStats after = new NetworkStats(TEST_START, 1)
256 .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, 2049L, 2L, 3L, 4L, 0);
257
258 final NetworkStats result = after.subtract(before);
259
260 // should silently drop omitted rows
261 assertEquals(1, result.size());
Stephen Chen25147872016-10-21 12:44:26 -0700262 assertValues(result, 0, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO,
263 ROAMING_NO, 1L, 2L, 3L, 4L, 0);
Jeff Sharkey8e9992a2011-08-23 18:37:23 -0700264 assertEquals(4L, result.getTotalBytes());
265 }
266
267 public void testTotalBytes() throws Exception {
268 final NetworkStats iface = new NetworkStats(TEST_START, 2)
269 .addValues(TEST_IFACE, UID_ALL, SET_DEFAULT, TAG_NONE, 128L, 0L, 0L, 0L, 0L)
270 .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, 256L, 0L, 0L, 0L, 0L);
271 assertEquals(384L, iface.getTotalBytes());
272
273 final NetworkStats uidSet = new NetworkStats(TEST_START, 3)
274 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 32L, 0L, 0L, 0L, 0L)
275 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 32L, 0L, 0L, 0L, 0L)
276 .addValues(TEST_IFACE, 101, SET_FOREGROUND, TAG_NONE, 32L, 0L, 0L, 0L, 0L);
277 assertEquals(96L, uidSet.getTotalBytes());
278
Jeff Davidsona6a78072016-01-11 16:02:17 -0800279 final NetworkStats uidTag = new NetworkStats(TEST_START, 6)
Jeff Sharkey8e9992a2011-08-23 18:37:23 -0700280 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
281 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
282 .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, 8L, 0L, 0L, 0L, 0L)
283 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
284 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 16L, 0L, 0L, 0L, 0L)
285 .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 8L, 0L, 0L, 0L, 0L);
286 assertEquals(64L, uidTag.getTotalBytes());
Jeff Davidsona6a78072016-01-11 16:02:17 -0800287
Stephen Chen25147872016-10-21 12:44:26 -0700288 final NetworkStats uidMetered = new NetworkStats(TEST_START, 3)
289 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 32L, 0L,
290 0L, 0L, 0L)
291 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L,
292 0L, 0L, 0L)
293 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L,
294 0L, 0L, 0L);
295 assertEquals(96L, uidMetered.getTotalBytes());
296
Jeff Davidsona6a78072016-01-11 16:02:17 -0800297 final NetworkStats uidRoaming = new NetworkStats(TEST_START, 3)
Stephen Chen25147872016-10-21 12:44:26 -0700298 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 32L, 0L,
299 0L, 0L, 0L)
300 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L,
301 0L, 0L, 0L)
302 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 32L, 0L,
303 0L, 0L, 0L);
Jeff Davidsona6a78072016-01-11 16:02:17 -0800304 assertEquals(96L, uidRoaming.getTotalBytes());
Jeff Sharkey8e9992a2011-08-23 18:37:23 -0700305 }
306
Jeff Sharkey905b5892011-09-30 15:19:49 -0700307 public void testGroupedByIfaceEmpty() throws Exception {
308 final NetworkStats uidStats = new NetworkStats(TEST_START, 3);
309 final NetworkStats grouped = uidStats.groupedByIface();
310
311 assertEquals(0, uidStats.size());
312 assertEquals(0, grouped.size());
313 }
314
315 public void testGroupedByIfaceAll() throws Exception {
316 final NetworkStats uidStats = new NetworkStats(TEST_START, 3)
Stephen Chen25147872016-10-21 12:44:26 -0700317 .addValues(IFACE_ALL, 100, SET_ALL, TAG_NONE, METERED_NO, ROAMING_NO, 128L, 8L, 0L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800318 2L, 20L)
Stephen Chen25147872016-10-21 12:44:26 -0700319 .addValues(IFACE_ALL, 101, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_NO, 128L,
320 8L, 0L, 2L, 20L)
321 .addValues(IFACE_ALL, 101, SET_ALL, TAG_NONE, METERED_NO, ROAMING_YES, 128L, 8L, 0L,
322 2L, 20L);
Jeff Sharkey905b5892011-09-30 15:19:49 -0700323 final NetworkStats grouped = uidStats.groupedByIface();
324
Jeff Davidsona6a78072016-01-11 16:02:17 -0800325 assertEquals(3, uidStats.size());
Jeff Sharkey905b5892011-09-30 15:19:49 -0700326 assertEquals(1, grouped.size());
327
Stephen Chen25147872016-10-21 12:44:26 -0700328 assertValues(grouped, 0, IFACE_ALL, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
329 384L, 24L, 0L, 6L, 0L);
Jeff Sharkey905b5892011-09-30 15:19:49 -0700330 }
331
332 public void testGroupedByIface() throws Exception {
Jeff Davidsona6a78072016-01-11 16:02:17 -0800333 final NetworkStats uidStats = new NetworkStats(TEST_START, 7)
Stephen Chen25147872016-10-21 12:44:26 -0700334 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L, 8L,
335 0L, 2L, 20L)
336 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 512L,
337 32L, 0L, 0L, 0L)
338 .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 64L, 4L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800339 0L, 0L, 0L)
Stephen Chen25147872016-10-21 12:44:26 -0700340 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 512L,
341 32L, 0L, 0L, 0L)
342 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L, 8L,
343 0L, 0L, 0L)
344 .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_YES, ROAMING_NO, 128L, 8L,
345 0L, 0L, 0L)
346 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 128L,
347 8L, 0L, 0L, 0L);
Jeff Sharkey905b5892011-09-30 15:19:49 -0700348
349 final NetworkStats grouped = uidStats.groupedByIface();
350
Jeff Davidsona6a78072016-01-11 16:02:17 -0800351 assertEquals(7, uidStats.size());
Jeff Sharkey905b5892011-09-30 15:19:49 -0700352
353 assertEquals(2, grouped.size());
Stephen Chen25147872016-10-21 12:44:26 -0700354 assertValues(grouped, 0, TEST_IFACE, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
355 384L, 24L, 0L, 2L, 0L);
356 assertValues(grouped, 1, TEST_IFACE2, UID_ALL, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
357 1024L, 64L, 0L, 0L, 0L);
Jeff Sharkey905b5892011-09-30 15:19:49 -0700358 }
359
360 public void testAddAllValues() {
361 final NetworkStats first = new NetworkStats(TEST_START, 5)
Stephen Chen25147872016-10-21 12:44:26 -0700362 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L,
363 0L, 0L, 0L)
364 .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 32L,
365 0L, 0L, 0L, 0L)
366 .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES, 32L,
367 0L, 0L, 0L, 0L);
Jeff Sharkey905b5892011-09-30 15:19:49 -0700368
369 final NetworkStats second = new NetworkStats(TEST_START, 2)
Stephen Chen25147872016-10-21 12:44:26 -0700370 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 32L, 0L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800371 0L, 0L, 0L)
Stephen Chen25147872016-10-21 12:44:26 -0700372 .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 32L,
373 0L, 0L, 0L, 0L)
374 .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES, 32L,
375 0L, 0L, 0L, 0L);
Jeff Sharkey905b5892011-09-30 15:19:49 -0700376
377 first.combineAllValues(second);
378
Jeff Davidsona6a78072016-01-11 16:02:17 -0800379 assertEquals(4, first.size());
Stephen Chen25147872016-10-21 12:44:26 -0700380 assertValues(first, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 64L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800381 0L, 0L, 0L, 0L);
Stephen Chen25147872016-10-21 12:44:26 -0700382 assertValues(first, 1, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
383 32L, 0L, 0L, 0L, 0L);
384 assertValues(first, 2, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, METERED_YES, ROAMING_YES,
385 64L, 0L, 0L, 0L, 0L);
386 assertValues(first, 3, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
387 32L, 0L, 0L, 0L, 0L);
Jeff Sharkey905b5892011-09-30 15:19:49 -0700388 }
389
Jeff Sharkey1059c3c2011-10-04 16:54:49 -0700390 public void testGetTotal() {
Jeff Davidsona6a78072016-01-11 16:02:17 -0800391 final NetworkStats stats = new NetworkStats(TEST_START, 7)
Stephen Chen25147872016-10-21 12:44:26 -0700392 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 128L, 8L,
393 0L, 2L, 20L)
394 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 512L,
395 32L, 0L, 0L, 0L)
396 .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 64L, 4L,
Jeff Davidsona6a78072016-01-11 16:02:17 -0800397 0L, 0L, 0L)
Stephen Chen25147872016-10-21 12:44:26 -0700398 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 512L,
399 32L, 0L, 0L, 0L)
400 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_YES, ROAMING_NO, 128L,
401 8L, 0L, 0L, 0L)
402 .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 128L, 8L,
403 0L, 0L, 0L)
404 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_YES, 128L,
405 8L, 0L, 0L, 0L);
Jeff Sharkey1059c3c2011-10-04 16:54:49 -0700406
Jeff Davidsona6a78072016-01-11 16:02:17 -0800407 assertValues(stats.getTotal(null), 1408L, 88L, 0L, 2L, 20L);
408 assertValues(stats.getTotal(null, 100), 1280L, 80L, 0L, 2L, 20L);
Jeff Sharkey1059c3c2011-10-04 16:54:49 -0700409 assertValues(stats.getTotal(null, 101), 128L, 8L, 0L, 0L, 0L);
410
411 final HashSet<String> ifaces = Sets.newHashSet();
412 assertValues(stats.getTotal(null, ifaces), 0L, 0L, 0L, 0L, 0L);
413
414 ifaces.add(TEST_IFACE2);
415 assertValues(stats.getTotal(null, ifaces), 1024L, 64L, 0L, 0L, 0L);
416 }
417
Jeff Sharkey163e6442011-10-31 16:37:52 -0700418 public void testWithoutUid() throws Exception {
419 final NetworkStats before = new NetworkStats(TEST_START, 3)
420 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L)
421 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 512L, 32L, 0L, 0L, 0L)
422 .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, 64L, 4L, 0L, 0L, 0L)
423 .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, 512L, 32L, 0L, 0L, 0L)
424 .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 0L, 0L)
425 .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, 128L, 8L, 0L, 0L, 0L);
426
Jeff Sharkeydaa57e82012-09-19 14:10:39 -0700427 final NetworkStats after = before.withoutUids(new int[] { 100 });
Jeff Sharkey163e6442011-10-31 16:37:52 -0700428 assertEquals(6, before.size());
429 assertEquals(2, after.size());
Stephen Chen25147872016-10-21 12:44:26 -0700430 assertValues(after, 0, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
431 128L, 8L, 0L, 0L, 0L);
432 assertValues(after, 1, TEST_IFACE, 101, SET_DEFAULT, 0xF00D, METERED_NO, ROAMING_NO, 128L,
433 8L, 0L, 0L, 0L);
Jeff Sharkey163e6442011-10-31 16:37:52 -0700434 }
435
Jeff Sharkey4abb1b82011-11-08 17:35:28 -0800436 public void testClone() throws Exception {
437 final NetworkStats original = new NetworkStats(TEST_START, 5)
438 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L)
439 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 512L, 32L, 0L, 0L, 0L);
440
441 // make clone and mutate original
442 final NetworkStats clone = original.clone();
443 original.addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 0L, 0L);
444
445 assertEquals(3, original.size());
446 assertEquals(2, clone.size());
447
448 assertEquals(128L + 512L + 128L, original.getTotalBytes());
449 assertEquals(128L + 512L, clone.getTotalBytes());
450 }
451
Jeff Sharkey7a8f1a32014-09-17 09:26:28 -0700452 public void testAddWhenEmpty() throws Exception {
453 final NetworkStats red = new NetworkStats(TEST_START, -1);
454 final NetworkStats blue = new NetworkStats(TEST_START, 5)
455 .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L)
456 .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 512L, 32L, 0L, 0L, 0L);
457
458 // We're mostly checking that we don't crash
459 red.combineAllValues(blue);
460 }
461
Wenchao Tong21377c32015-02-26 18:13:07 -0800462 public void testMigrateTun() throws Exception {
463 final int tunUid = 10030;
464 final String tunIface = "tun0";
465 final String underlyingIface = "wlan0";
466 final int testTag1 = 8888;
467 NetworkStats delta = new NetworkStats(TEST_START, 17)
Stephen Chen25147872016-10-21 12:44:26 -0700468 .addValues(tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 39605L, 46L,
469 12259L, 55L, 0L)
470 .addValues(tunIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 0L, 0L,
471 0L, 0L, 0L)
472 .addValues(tunIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 72667L, 197L,
473 43909L, 241L, 0L)
474 .addValues(tunIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 9297L,
475 17L, 4128L, 21L, 0L)
Wenchao Tong21377c32015-02-26 18:13:07 -0800476 // VPN package also uses some traffic through unprotected network.
Stephen Chen25147872016-10-21 12:44:26 -0700477 .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 4983L, 10L,
478 1801L, 12L, 0L)
479 .addValues(tunIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 0L, 0L,
480 0L, 0L, 0L)
Wenchao Tong21377c32015-02-26 18:13:07 -0800481 // Tag entries
Stephen Chen25147872016-10-21 12:44:26 -0700482 .addValues(tunIface, 10120, SET_DEFAULT, testTag1, METERED_NO, ROAMING_NO, 21691L, 41L,
483 13820L, 51L, 0L)
484 .addValues(tunIface, 10120, SET_FOREGROUND, testTag1, METERED_NO, ROAMING_NO, 1281L, 2L,
485 665L, 2L, 0L)
Wenchao Tong21377c32015-02-26 18:13:07 -0800486 // Irrelevant entries
Stephen Chen25147872016-10-21 12:44:26 -0700487 .addValues(TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1685L, 5L,
488 2070L, 6L, 0L)
Wenchao Tong21377c32015-02-26 18:13:07 -0800489 // Underlying Iface entries
Stephen Chen25147872016-10-21 12:44:26 -0700490 .addValues(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 5178L,
491 8L, 2139L, 11L, 0L)
492 .addValues(underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, 0L,
493 0L, 0L, 0L, 0L)
494 .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
495 149873L, 287L, 59217L /* smaller than sum(tun0) */,
496 299L /* smaller than sum(tun0) */, 0L)
497 .addValues(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
498 0L, 0L, 0L, 0L, 0L);
Wenchao Tong21377c32015-02-26 18:13:07 -0800499
500 assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface));
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700501 assertEquals(20, delta.size());
Wenchao Tong21377c32015-02-26 18:13:07 -0800502
503 // tunIface and TEST_IFACE entries are not changed.
Stephen Chen25147872016-10-21 12:44:26 -0700504 assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Wenchao Tong21377c32015-02-26 18:13:07 -0800505 39605L, 46L, 12259L, 55L, 0L);
Stephen Chen25147872016-10-21 12:44:26 -0700506 assertValues(delta, 1, tunIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
507 0L, 0L, 0L, 0L, 0L);
508 assertValues(delta, 2, tunIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Wenchao Tong21377c32015-02-26 18:13:07 -0800509 72667L, 197L, 43909L, 241L, 0L);
Stephen Chen25147872016-10-21 12:44:26 -0700510 assertValues(delta, 3, tunIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
Wenchao Tong21377c32015-02-26 18:13:07 -0800511 9297L, 17L, 4128L, 21L, 0L);
Stephen Chen25147872016-10-21 12:44:26 -0700512 assertValues(delta, 4, tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Wenchao Tong21377c32015-02-26 18:13:07 -0800513 4983L, 10L, 1801L, 12L, 0L);
Stephen Chen25147872016-10-21 12:44:26 -0700514 assertValues(delta, 5, tunIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO,
515 0L, 0L, 0L, 0L, 0L);
516 assertValues(delta, 6, tunIface, 10120, SET_DEFAULT, testTag1, METERED_NO, ROAMING_NO,
Wenchao Tong21377c32015-02-26 18:13:07 -0800517 21691L, 41L, 13820L, 51L, 0L);
Stephen Chen25147872016-10-21 12:44:26 -0700518 assertValues(delta, 7, tunIface, 10120, SET_FOREGROUND, testTag1, METERED_NO, ROAMING_NO,
519 1281L, 2L, 665L, 2L, 0L);
520 assertValues(delta, 8, TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
521 1685L, 5L, 2070L, 6L, 0L);
Wenchao Tong21377c32015-02-26 18:13:07 -0800522
523 // Existing underlying Iface entries are updated
Stephen Chen25147872016-10-21 12:44:26 -0700524 assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO,
525 ROAMING_NO, 44783L, 54L, 14178L, 62L, 0L);
526 assertValues(delta, 10, underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, METERED_NO,
527 ROAMING_NO, 0L, 0L, 0L, 0L, 0L);
Wenchao Tong21377c32015-02-26 18:13:07 -0800528
529 // VPN underlying Iface entries are updated
Stephen Chen25147872016-10-21 12:44:26 -0700530 assertValues(delta, 11, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO,
531 ROAMING_NO, 28304L, 27L, 1L, 2L, 0L);
532 assertValues(delta, 12, underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO,
533 ROAMING_NO, 0L, 0L, 0L, 0L, 0L);
Wenchao Tong21377c32015-02-26 18:13:07 -0800534
535 // New entries are added for new application's underlying Iface traffic
Stephen Chen25147872016-10-21 12:44:26 -0700536 assertContains(delta, underlyingIface, 10120, SET_DEFAULT, TAG_NONE, METERED_NO,
537 ROAMING_NO, 72667L, 197L, 43123L, 227L, 0L);
538 assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, METERED_NO,
539 ROAMING_NO, 9297L, 17L, 4054, 19L, 0L);
540 assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, METERED_NO,
541 ROAMING_NO, 21691L, 41L, 13572L, 48L, 0L);
542 assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, METERED_NO,
543 ROAMING_NO, 1281L, 2L, 653L, 1L, 0L);
Wenchao Tong98170b02015-03-17 16:14:23 -0700544
545 // New entries are added for debug purpose
Stephen Chen25147872016-10-21 12:44:26 -0700546 assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
547 ROAMING_NO, 39605L, 46L, 12039, 51, 0);
548 assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
549 ROAMING_NO, 81964, 214, 47177, 246, 0);
550 assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, METERED_ALL,
551 ROAMING_ALL, 121569, 260, 59216, 297, 0);
Wenchao Tong98170b02015-03-17 16:14:23 -0700552
553 }
554
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700555 // Tests a case where all of the data received by the tun0 interface is echo back into the tun0
556 // interface by the vpn app before it's sent out of the underlying interface. The VPN app should
557 // not be charged for the echoed data but it should still be charged for any extra data it sends
558 // via the underlying interface.
559 public void testMigrateTun_VpnAsLoopback() {
560 final int tunUid = 10030;
561 final String tunIface = "tun0";
562 final String underlyingIface = "wlan0";
563 NetworkStats delta = new NetworkStats(TEST_START, 9)
564 // 2 different apps sent/receive data via tun0.
Stephen Chen25147872016-10-21 12:44:26 -0700565 .addValues(tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 50000L, 25L,
566 100000L, 50L, 0L)
567 .addValues(tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 500L, 2L,
568 200L, 5L, 0L)
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700569 // VPN package resends data through the tunnel (with exaggerated overhead)
Stephen Chen25147872016-10-21 12:44:26 -0700570 .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 240000,
571 100L, 120000L, 60L, 0L)
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700572 // 1 app already has some traffic on the underlying interface, the other doesn't yet
Stephen Chen25147872016-10-21 12:44:26 -0700573 .addValues(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, 1000L,
574 10L, 2000L, 20L, 0L)
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700575 // Traffic through the underlying interface via the vpn app.
576 // This test should redistribute this data correctly.
Stephen Chen25147872016-10-21 12:44:26 -0700577 .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700578 75500L, 37L, 130000L, 70L, 0L);
579
580 assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface));
581 assertEquals(9, delta.size());
582
583 // tunIface entries should not be changed.
Stephen Chen25147872016-10-21 12:44:26 -0700584 assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700585 50000L, 25L, 100000L, 50L, 0L);
Stephen Chen25147872016-10-21 12:44:26 -0700586 assertValues(delta, 1, tunIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700587 500L, 2L, 200L, 5L, 0L);
Stephen Chen25147872016-10-21 12:44:26 -0700588 assertValues(delta, 2, tunIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700589 240000L, 100L, 120000L, 60L, 0L);
590
591 // Existing underlying Iface entries are updated
Stephen Chen25147872016-10-21 12:44:26 -0700592 assertValues(delta, 3, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, METERED_NO,
593 ROAMING_NO, 51000L, 35L, 102000L, 70L, 0L);
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700594
595 // VPN underlying Iface entries are updated
Stephen Chen25147872016-10-21 12:44:26 -0700596 assertValues(delta, 4, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO,
597 ROAMING_NO, 25000L, 10L, 29800L, 15L, 0L);
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700598
599 // New entries are added for new application's underlying Iface traffic
Stephen Chen25147872016-10-21 12:44:26 -0700600 assertContains(delta, underlyingIface, 20100, SET_DEFAULT, TAG_NONE, METERED_NO,
601 ROAMING_NO, 500L, 2L, 200L, 5L, 0L);
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700602
603 // New entries are added for debug purpose
Stephen Chen25147872016-10-21 12:44:26 -0700604 assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
605 ROAMING_NO, 50000L, 25L, 100000L, 50L, 0L);
606 assertContains(delta, underlyingIface, 20100, SET_DBG_VPN_IN, TAG_NONE, METERED_NO,
607 ROAMING_NO, 500, 2L, 200L, 5L, 0L);
608 assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, METERED_ALL,
609 ROAMING_ALL, 50500L, 27L, 100200L, 55, 0);
Jeremy Joslin8b436d82016-08-08 16:07:37 -0700610 }
611
Wenchao Tong98170b02015-03-17 16:14:23 -0700612 private static void assertContains(NetworkStats stats, String iface, int uid, int set,
Stephen Chen25147872016-10-21 12:44:26 -0700613 int tag, int metered, int roaming, long rxBytes, long rxPackets, long txBytes,
614 long txPackets, long operations) {
615 int index = stats.findIndex(iface, uid, set, tag, metered, roaming);
Wenchao Tong98170b02015-03-17 16:14:23 -0700616 assertTrue(index != -1);
Stephen Chen25147872016-10-21 12:44:26 -0700617 assertValues(stats, index, iface, uid, set, tag, metered, roaming,
Wenchao Tong98170b02015-03-17 16:14:23 -0700618 rxBytes, rxPackets, txBytes, txPackets, operations);
Wenchao Tong21377c32015-02-26 18:13:07 -0800619 }
620
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700621 private static void assertValues(NetworkStats stats, int index, String iface, int uid, int set,
Stephen Chen25147872016-10-21 12:44:26 -0700622 int tag, int metered, int roaming, long rxBytes, long rxPackets, long txBytes,
623 long txPackets, long operations) {
Jeff Sharkeyd37948f2011-07-12 13:57:00 -0700624 final NetworkStats.Entry entry = stats.getValues(index, null);
Stephen Chen25147872016-10-21 12:44:26 -0700625 assertValues(entry, iface, uid, set, tag, metered, roaming);
Jeff Sharkey1059c3c2011-10-04 16:54:49 -0700626 assertValues(entry, rxBytes, rxPackets, txBytes, txPackets, operations);
627 }
628
629 private static void assertValues(
Stephen Chen25147872016-10-21 12:44:26 -0700630 NetworkStats.Entry entry, String iface, int uid, int set, int tag, int metered,
631 int roaming) {
Jeff Sharkeyd37948f2011-07-12 13:57:00 -0700632 assertEquals(iface, entry.iface);
633 assertEquals(uid, entry.uid);
Jeff Sharkeyb5d55e32011-08-10 17:53:27 -0700634 assertEquals(set, entry.set);
Jeff Sharkeyd37948f2011-07-12 13:57:00 -0700635 assertEquals(tag, entry.tag);
Stephen Chen25147872016-10-21 12:44:26 -0700636 assertEquals(metered, entry.metered);
Jeff Davidsona6a78072016-01-11 16:02:17 -0800637 assertEquals(roaming, entry.roaming);
Jeff Sharkey1059c3c2011-10-04 16:54:49 -0700638 }
639
640 private static void assertValues(NetworkStats.Entry entry, long rxBytes, long rxPackets,
641 long txBytes, long txPackets, long operations) {
Jeff Sharkeyd37948f2011-07-12 13:57:00 -0700642 assertEquals(rxBytes, entry.rxBytes);
643 assertEquals(rxPackets, entry.rxPackets);
644 assertEquals(txBytes, entry.txBytes);
645 assertEquals(txPackets, entry.txPackets);
Jeff Sharkeya63ba592011-07-19 23:47:12 -0700646 assertEquals(operations, entry.operations);
Jeff Sharkey1b5a2a92011-06-18 18:34:16 -0700647 }
648
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700649}