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