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