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