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