1 /* 2 * Copyright (C) 2017 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 com.android.server.wifi.aware; 18 19 import static android.net.wifi.aware.WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_IB; 20 import static android.net.wifi.aware.WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_IB_ANY_PEER; 21 22 import static com.android.server.wifi.aware.WifiAwareMetrics.addNanHalStatusToHistogram; 23 import static com.android.server.wifi.aware.WifiAwareMetrics.histogramToProtoArray; 24 25 import static org.hamcrest.core.IsEqual.equalTo; 26 import static org.mockito.Mockito.times; 27 import static org.mockito.Mockito.when; 28 29 import android.app.AppOpsManager; 30 import android.content.Context; 31 import android.net.wifi.aware.WifiAwareManager; 32 import android.net.wifi.aware.WifiAwareNetworkSpecifier; 33 import android.util.LocalLog; 34 import android.util.Log; 35 import android.util.SparseArray; 36 import android.util.SparseIntArray; 37 38 import androidx.test.filters.SmallTest; 39 40 import com.android.dx.mockito.inline.extended.ExtendedMockito; 41 import com.android.server.wifi.Clock; 42 import com.android.server.wifi.WifiBaseTest; 43 import com.android.server.wifi.hal.WifiNanIface.NanStatusCode; 44 import com.android.server.wifi.proto.WifiStatsLog; 45 import com.android.server.wifi.proto.nano.WifiMetricsProto; 46 import com.android.server.wifi.util.MetricsUtils; 47 import com.android.server.wifi.util.WifiPermissionsUtil; 48 49 import org.junit.After; 50 import org.junit.Before; 51 import org.junit.Rule; 52 import org.junit.Test; 53 import org.junit.rules.ErrorCollector; 54 import org.mockito.Mock; 55 import org.mockito.MockitoAnnotations; 56 import org.mockito.MockitoSession; 57 import org.mockito.quality.Strictness; 58 59 import java.io.PrintWriter; 60 import java.io.StringWriter; 61 import java.util.HashMap; 62 import java.util.Map; 63 64 /** 65 * Unit test harness for WifiAwareMetrics 66 */ 67 @SmallTest 68 public class WifiAwareMetricsTest extends WifiBaseTest { 69 @Mock Clock mClock; 70 @Mock private Context mMockContext; 71 @Mock private AppOpsManager mMockAppOpsManager; 72 @Mock private WifiPermissionsUtil mWifiPermissionsUtil; 73 @Rule public ErrorCollector collector = new ErrorCollector(); 74 @Mock private PairingConfigManager mPairingConfigManager; 75 76 private WifiAwareMetrics mDut; 77 private LocalLog mLocalLog = new LocalLog(512); 78 private MockitoSession mSession; 79 80 // Histogram definition: start[i] = b + p * m^i with s sub-buckets, i=0,...,n-1 81 82 /** 83 * Histogram of following buckets, start[i] = 0 + 1 * 10^i with 9 sub-buckets, i=0,...,5 84 * 1 - 10: 9 sub-buckets each of width 1 85 * 10 - 100: 10 86 * 100 - 10e3: 10^2 87 * 10e3 - 10e4: 10^3 88 * 10e4 - 10e5: 10^4 89 * 10e5 - 10e6: 10^5 90 */ 91 private static final MetricsUtils.LogHistParms HIST1 = new MetricsUtils.LogHistParms(0, 1, 92 10, 9, 6); 93 94 /** 95 * Histogram of following buckets, start[i] = -20 + 2 * 5^i with 40 sub-buckets, i=0,...,2 96 * -18 - -10: 40 sub-bucket each of width 0.2 97 * -10 - 30: 1 98 * 30 - 230: 5 99 */ 100 private static final MetricsUtils.LogHistParms HIST2 = new MetricsUtils.LogHistParms(-20, 2, 101 5, 40, 3); 102 103 // Linear histogram of following buckets: 104 // <10 105 // [10, 30) 106 // [30, 60) 107 // [60, 100) 108 // >100 109 private static final int[] HIST_LINEAR = { 10, 30, 60, 100 }; 110 111 /** 112 * Pre-test configuration. Initialize and install mocks. 113 */ 114 @Before setUp()115 public void setUp() throws Exception { 116 MockitoAnnotations.initMocks(this); 117 when(mMockContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mMockAppOpsManager); 118 setTime(0); 119 120 mDut = new WifiAwareMetrics(mClock); 121 mSession = ExtendedMockito.mockitoSession() 122 .strictness(Strictness.LENIENT) 123 .mockStatic(WifiStatsLog.class) 124 .startMocking(); 125 } 126 127 @After tearDown()128 public void tearDown() { 129 mSession.finishMocking(); 130 } 131 132 /** 133 * Validates that recordEnableUsage() and recordDisableUsage() record valid metrics. 134 */ 135 @Test testEnableDisableUsageMetrics()136 public void testEnableDisableUsageMetrics() { 137 WifiMetricsProto.WifiAwareLog log; 138 139 // create 2 records 140 setTime(5); 141 mDut.recordEnableUsage(); 142 setTime(10); 143 mDut.recordDisableUsage(); 144 setTime(11); 145 mDut.recordEnableUsage(); 146 setTime(12); 147 mDut.recordDisableUsage(); 148 149 setTime(14); 150 log = mDut.consolidateProto(); 151 collector.checkThat(countAllHistogramSamples(log.histogramAwareAvailableDurationMs), 152 equalTo(2)); 153 validateProtoHistBucket("Duration[0] #1", log.histogramAwareAvailableDurationMs[0], 1, 2, 154 1); 155 validateProtoHistBucket("Duration[1] #1", log.histogramAwareAvailableDurationMs[1], 5, 6, 156 1); 157 collector.checkThat(log.availableTimeMs, equalTo(6L)); 158 159 // create another partial record 160 setTime(15); 161 mDut.recordEnableUsage(); 162 163 setTime(17); 164 log = mDut.consolidateProto(); 165 collector.checkThat(countAllHistogramSamples(log.histogramAwareAvailableDurationMs), 166 equalTo(2)); 167 validateProtoHistBucket("Duration[0] #2", log.histogramAwareAvailableDurationMs[0], 1, 2, 168 1); 169 validateProtoHistBucket("Duration[1] #2", log.histogramAwareAvailableDurationMs[1], 5, 6, 170 1); 171 collector.checkThat(log.availableTimeMs, equalTo(8L)); // the partial record of 2ms 172 173 174 // clear and continue that partial record (verify completed) 175 mDut.clear(); 176 setTime(23); 177 mDut.recordDisableUsage(); 178 179 log = mDut.consolidateProto(); 180 collector.checkThat(countAllHistogramSamples(log.histogramAwareAvailableDurationMs), 181 equalTo(1)); 182 validateProtoHistBucket("Duration[0] #3", log.histogramAwareAvailableDurationMs[0], 8, 9, 183 1); 184 collector.checkThat(log.availableTimeMs, equalTo(6L)); // the remnant record of 6ms 185 186 // clear and verify empty records 187 mDut.clear(); 188 log = mDut.consolidateProto(); 189 collector.checkThat(countAllHistogramSamples(log.histogramAwareAvailableDurationMs), 190 equalTo(0)); 191 } 192 193 /** 194 * Validates that recordEnableAware() and recordDisableAware() record valid metrics. 195 */ 196 @Test testEnableDisableAwareMetrics()197 public void testEnableDisableAwareMetrics() { 198 WifiMetricsProto.WifiAwareLog log; 199 200 // create 2 records 201 setTime(5); 202 mDut.recordEnableAware(); 203 setTime(10); 204 mDut.recordDisableAware(); 205 setTime(11); 206 mDut.recordEnableAware(); 207 setTime(12); 208 mDut.recordDisableAware(); 209 210 setTime(14); 211 log = mDut.consolidateProto(); 212 collector.checkThat(countAllHistogramSamples(log.histogramAwareEnabledDurationMs), 213 equalTo(2)); 214 validateProtoHistBucket("Duration[0] #1", log.histogramAwareEnabledDurationMs[0], 1, 2, 215 1); 216 validateProtoHistBucket("Duration[1] #1", log.histogramAwareEnabledDurationMs[1], 5, 6, 217 1); 218 collector.checkThat(log.enabledTimeMs, equalTo(6L)); 219 220 // create another partial record 221 setTime(15); 222 mDut.recordEnableAware(); 223 224 setTime(17); 225 log = mDut.consolidateProto(); 226 collector.checkThat(countAllHistogramSamples(log.histogramAwareEnabledDurationMs), 227 equalTo(2)); 228 validateProtoHistBucket("Duration[0] #2", log.histogramAwareEnabledDurationMs[0], 1, 2, 229 1); 230 validateProtoHistBucket("Duration[1] #2", log.histogramAwareEnabledDurationMs[1], 5, 6, 231 1); 232 collector.checkThat(log.enabledTimeMs, equalTo(8L)); // the partial record of 2ms 233 234 235 // clear and continue that partial record (verify completed) 236 mDut.clear(); 237 setTime(23); 238 mDut.recordDisableAware(); 239 240 log = mDut.consolidateProto(); 241 collector.checkThat(countAllHistogramSamples(log.histogramAwareEnabledDurationMs), 242 equalTo(1)); 243 validateProtoHistBucket("Duration[0] #3", log.histogramAwareEnabledDurationMs[0], 8, 9, 244 1); 245 collector.checkThat(log.enabledTimeMs, equalTo(6L)); // the remnant record of 6ms 246 247 // clear and verify empty records 248 mDut.clear(); 249 log = mDut.consolidateProto(); 250 collector.checkThat(countAllHistogramSamples(log.histogramAwareEnabledDurationMs), 251 equalTo(0)); 252 } 253 254 @Test testAttachSessionMetrics()255 public void testAttachSessionMetrics() { 256 final int uid1 = 1005; 257 final int uid2 = 1006; 258 final String tag1 = "tag1"; 259 final String tag2 = "tag2"; 260 final SparseArray<WifiAwareClientState> clients = new SparseArray<>(); 261 WifiMetricsProto.WifiAwareLog log; 262 263 setTime(5); 264 265 // uid1: session 1 266 clients.put(10, 267 new WifiAwareClientState(mMockContext, 10, uid1, 0, null, null, null, null, false, 268 mClock.getElapsedSinceBootMillis(), mWifiPermissionsUtil, null, 269 false, 6)); 270 mDut.recordAttachSession(uid1, false, clients, 6, tag1); 271 272 // uid1: session 2 273 clients.put(11, 274 new WifiAwareClientState(mMockContext, 11, uid1, 0, null, null, null, null, false, 275 mClock.getElapsedSinceBootMillis(), mWifiPermissionsUtil, null, 276 false, 6)); 277 mDut.recordAttachSession(uid1, false, clients, 6, tag1); 278 279 // uid2: session 1 280 clients.put(12, 281 new WifiAwareClientState(mMockContext, 12, uid2, 0, null, null, null, null, false, 282 mClock.getElapsedSinceBootMillis(), mWifiPermissionsUtil, null, 283 false, 6)); 284 mDut.recordAttachSession(uid2, false, clients, 6, tag2); 285 286 // uid2: session 2 287 clients.put(13, 288 new WifiAwareClientState(mMockContext, 13, uid2, 0, null, null, null, null, true, 289 mClock.getElapsedSinceBootMillis(), mWifiPermissionsUtil, null, 290 false, 6)); 291 mDut.recordAttachSession(uid2, true, clients, 6, tag2); 292 293 // uid2: delete session 1 294 setTime(10); 295 mDut.recordAttachSessionDuration(clients.get(12).getCreationTime()); 296 clients.delete(12); 297 298 // uid2: delete session 2 299 setTime(15); 300 mDut.recordAttachSessionDuration(clients.get(13).getCreationTime()); 301 clients.delete(13); 302 303 // uid2: session 3 304 clients.put(14, 305 new WifiAwareClientState(mMockContext, 14, uid2, 0, null, null, null, null, false, 306 mClock.getElapsedSinceBootMillis(), mWifiPermissionsUtil, null, 307 false, 6)); 308 mDut.recordAttachSession(uid2, false, clients, 6, tag2); 309 310 // a few failures 311 mDut.recordAttachStatus(NanStatusCode.INTERNAL_FAILURE, 6, tag1, uid1); 312 mDut.recordAttachStatus(NanStatusCode.INTERNAL_FAILURE, 6, tag2, uid2); 313 mDut.recordAttachStatus(-5, 6, tag2, uid2); // invalid 314 315 // verify 316 log = mDut.consolidateProto(); 317 318 collector.checkThat("numApps", log.numApps, equalTo(2)); 319 collector.checkThat("numAppsUsingIdentityCallback", log.numAppsUsingIdentityCallback, 320 equalTo(1)); 321 collector.checkThat("maxConcurrentAttachSessionsInApp", 322 log.maxConcurrentAttachSessionsInApp, equalTo(2)); 323 collector.checkThat("histogramAttachSessionStatus.length", 324 log.histogramAttachSessionStatus.length, equalTo(3)); // 3 buckets 325 validateNanStatusProtoHistBucket("Bucket[SUCCESS]", 326 log.histogramAttachSessionStatus[0], 327 WifiMetricsProto.WifiAwareLog.SUCCESS, 5); 328 validateNanStatusProtoHistBucket("Bucket[INTERNAL_FAILURE]", 329 log.histogramAttachSessionStatus[1], 330 WifiMetricsProto.WifiAwareLog.INTERNAL_FAILURE, 2); 331 validateNanStatusProtoHistBucket("Bucket[UNKNOWN_HAL_STATUS]", 332 log.histogramAttachSessionStatus[2], 333 WifiMetricsProto.WifiAwareLog.UNKNOWN_HAL_STATUS, 1); 334 collector.checkThat("histogramAttachDurationMs.length", 335 log.histogramAttachDurationMs.length, equalTo(2)); 336 validateProtoHistBucket("Duration[0]", log.histogramAttachDurationMs[0], 5, 6, 1); 337 validateProtoHistBucket("Duration[1]", log.histogramAttachDurationMs[1], 10, 20, 1); 338 ExtendedMockito.verify(() -> WifiStatsLog.write( 339 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED, 340 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__STATUS__ST_SUCCESS, 341 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__CALLER_TYPE__OTHERS, tag1, uid1), 342 times(2)); 343 ExtendedMockito.verify(() -> WifiStatsLog.write( 344 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED, 345 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__STATUS__ST_SUCCESS, 346 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__CALLER_TYPE__OTHERS, tag2, uid2), 347 times(3)); 348 ExtendedMockito.verify(() -> WifiStatsLog.write( 349 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED, 350 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__STATUS__ST_INTERNAL_FAILURE, 351 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__CALLER_TYPE__OTHERS, tag1, uid1), 352 times(1)); 353 ExtendedMockito.verify(() -> WifiStatsLog.write( 354 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED, 355 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__STATUS__ST_INTERNAL_FAILURE, 356 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__CALLER_TYPE__OTHERS, tag2, uid2), 357 times(1)); 358 ExtendedMockito.verify(() -> WifiStatsLog.write( 359 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED, 360 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__STATUS__ST_GENERIC_FAILURE, 361 WifiStatsLog.WIFI_AWARE_ATTACH_REPORTED__CALLER_TYPE__OTHERS, tag2, uid2), 362 times(1)); 363 } 364 365 @Test testDiscoverySessionMetrics()366 public void testDiscoverySessionMetrics() { 367 final int uid1 = 1005; 368 final int uid2 = 1006; 369 final int uid3 = 1007; 370 final int sessionId = 1; 371 final String tag1 = "tag1"; 372 final String tag2 = "tag2"; 373 final String tag3 = "tag3"; 374 final SparseArray<WifiAwareClientState> clients = new SparseArray<>(); 375 WifiMetricsProto.WifiAwareLog log; 376 377 setTime(5); 378 WifiAwareClientState client1 = new WifiAwareClientState(mMockContext, 10, uid1, 0, null, 379 null, null, null, false, 0, mWifiPermissionsUtil, null, false, 6); 380 WifiAwareClientState client2 = new WifiAwareClientState(mMockContext, 11, uid2, 0, null, 381 null, null, null, false, 0, mWifiPermissionsUtil, null, false, 6); 382 WifiAwareClientState client3 = new WifiAwareClientState(mMockContext, 12, uid3, 0, null, 383 null, null, null, false, 0, mWifiPermissionsUtil, null, false, 6); 384 clients.put(10, client1); 385 clients.put(11, client2); 386 clients.put(12, client3); 387 388 // uid1: publish session 1 389 client1.addSession( 390 new WifiAwareDiscoverySessionState( 391 /* wifiAwareNativeApi= */ null, 392 /* sessionId= */ 100, 393 /* pubSubId= */ (byte) 0, 394 /* callback= */ null, 395 /* isPublishSession= */ true, 396 /* isRangingEnabled= */ false, 397 /* creationTime= */ mClock.getElapsedSinceBootMillis(), 398 /* instantModeEnabled= */ false, 399 /* instantModeBand= */ 0, 400 /* isSuspendable= */ false, 401 /* pairingConfig= */ null)); 402 mDut.recordDiscoverySession(uid1, clients); 403 mDut.recordDiscoveryStatus(uid1, NanStatusCode.SUCCESS, true, 100, 6, tag1); 404 405 // uid1: publish session 2 406 client1.addSession( 407 new WifiAwareDiscoverySessionState( 408 /* wifiAwareNativeApi= */ null, 409 /* sessionId= */ 101, 410 /* pubSubId= */ (byte) 0, 411 /* callback= */ null, 412 /* isPublishSession= */ true, 413 /* isRangingEnabled= */ false, 414 /* creationTime= */ mClock.getElapsedSinceBootMillis(), 415 /* instantModeEnabled= */ false, 416 /* instantModeBand= */ 0, 417 /* isSuspendable= */ false, 418 /* pairingConfig= */ null)); 419 mDut.recordDiscoverySession(uid1, clients); 420 mDut.recordDiscoveryStatus(uid1, NanStatusCode.SUCCESS, true, 101, 6, tag1); 421 422 // uid3: publish session 3 with ranging 423 client3.addSession( 424 new WifiAwareDiscoverySessionState( 425 /* wifiAwareNativeApi= */ null, 426 /* sessionId= */ 111, 427 /* pubSubId= */ (byte) 0, 428 /* callback= */ null, 429 /* isPublishSession= */ true, 430 /* isRangingEnabled= */ true, 431 /* creationTime= */ mClock.getElapsedSinceBootMillis(), 432 /* instantModeEnabled= */ false, 433 /* instantModeBand= */ 0, 434 /* isSuspendable= */ false, 435 /* pairingConfig= */ null)); 436 mDut.recordDiscoverySessionWithRanging(uid3, false, -1, -1, clients); 437 mDut.recordDiscoveryStatus(uid3, NanStatusCode.SUCCESS, true, 111, 6, tag3); 438 439 // uid2: subscribe session 1 440 client2.addSession( 441 new WifiAwareDiscoverySessionState( 442 /* wifiAwareNativeApi= */ null, 443 /* sessionId= */ 102, 444 /* pubSubId= */ (byte) 0, 445 /* callback= */ null, 446 /* isPublishSession= */ false, 447 /* isRangingEnabled= */ false, 448 /* creationTime= */ mClock.getElapsedSinceBootMillis(), 449 /* instantModeEnabled= */ false, 450 /* instantModeBand= */ 0, 451 /* isSuspendable= */ false, 452 /* pairingConfig= */ null)); 453 mDut.recordDiscoverySession(uid2, clients); 454 mDut.recordDiscoveryStatus(uid2, NanStatusCode.SUCCESS, false, 102, 6, tag2); 455 456 // uid2: publish session 2 457 client2.addSession( 458 new WifiAwareDiscoverySessionState( 459 /* wifiAwareNativeApi= */ null, 460 /* sessionId= */ 103, 461 /* pubSubId= */ (byte) 0, 462 /* callback= */ null, 463 /* isPublishSession= */ true, 464 /* isRangingEnabled= */ false, 465 /* creationTime= */ mClock.getElapsedSinceBootMillis(), 466 /* instantModeEnabled= */ false, 467 /* instantModeBand= */ 0, 468 /* isSuspendable= */ false, 469 /* pairingConfig= */ null)); 470 mDut.recordDiscoverySession(uid2, clients); 471 mDut.recordDiscoveryStatus(uid2, NanStatusCode.SUCCESS, false, 103, 6, tag2); 472 473 // uid3: subscribe session 3 with ranging: min 474 client3.addSession( 475 new WifiAwareDiscoverySessionState( 476 /* wifiAwareNativeApi= */ null, 477 /* sessionId= */ 112, 478 /* pubSubId= */ (byte) 0, 479 /* callback= */ null, 480 /* isPublishSession= */ false, 481 /* isRangingEnabled= */ true, 482 /* creationTime= */ mClock.getElapsedSinceBootMillis(), 483 /* instantModeEnabled= */ false, 484 /* instantModeBand= */ 0, 485 /* isSuspendable= */ false, 486 /* pairingConfig= */ null)); 487 mDut.recordDiscoverySessionWithRanging(uid3, true, 10, -1, clients); 488 mDut.recordDiscoveryStatus(uid3, NanStatusCode.SUCCESS, false, 112, 6, tag3); 489 490 // uid3: subscribe session 3 with ranging: max 491 client3.addSession( 492 new WifiAwareDiscoverySessionState( 493 /* wifiAwareNativeApi= */ null, 494 /* sessionId= */ 113, 495 /* pubSubId= */ (byte) 0, 496 /* callback= */ null, 497 /* isPublishSession= */ false, 498 /* isRangingEnabled= */ true, 499 /* creationTime= */ mClock.getElapsedSinceBootMillis(), 500 /* instantModeEnabled= */ false, 501 /* instantModeBand= */ 0, 502 /* isSuspendable= */ false, 503 /* pairingConfig= */ null)); 504 mDut.recordDiscoverySessionWithRanging(uid3, true, -1, 50, clients); 505 mDut.recordDiscoveryStatus(uid3, NanStatusCode.SUCCESS, false, 113, 6, tag3); 506 507 // uid3: subscribe session 3 with ranging: minmax 508 client3.addSession( 509 new WifiAwareDiscoverySessionState( 510 /* wifiAwareNativeApi= */ null, 511 /* sessionId= */ 114, 512 /* pubSubId= */ (byte) 0, 513 /* callback= */ null, 514 /* isPublishSession= */ false, 515 /* isRangingEnabled= */ true, 516 /* creationTime= */ mClock.getElapsedSinceBootMillis(), 517 /* instantModeEnabled= */ false, 518 /* instantModeBand= */ 0, 519 /* isSuspendable= */ false, 520 /* pairingConfig= */ null)); 521 mDut.recordDiscoverySessionWithRanging(uid3, true, 0, 110, clients); 522 mDut.recordDiscoveryStatus(uid3, NanStatusCode.SUCCESS, false, 114, 6, tag3); 523 524 // uid1: delete session 1 525 setTime(10); 526 mDut.recordDiscoverySessionDuration(client1.getSession(100).getCreationTime(), 527 client1.getSession(100).isPublishSession(), 0); 528 client1.removeSession(100); 529 530 // uid2: delete session 1 531 setTime(15); 532 mDut.recordDiscoverySessionDuration(client2.getSession(102).getCreationTime(), 533 client2.getSession(102).isPublishSession(), 0); 534 client2.removeSession(102); 535 536 // uid2: subscribe session 3 537 mDut.recordDiscoverySession(uid2, clients); 538 client2.addSession( 539 new WifiAwareDiscoverySessionState( 540 /* wifiAwareNativeApi= */ null, 541 /* sessionId= */ 104, 542 /* pubSubId= */ (byte) 0, 543 /* callback= */ null, 544 /* isPublishSession= */ false, 545 /* isRangingEnabled= */ false, 546 /* creationTime= */ mClock.getElapsedSinceBootMillis(), 547 /* instantModeEnabled= */ false, 548 /* instantModeBand= */ 0, 549 /* isSuspendable= */ false, 550 /* pairingConfig= */ null)); 551 552 // a few failures 553 mDut.recordDiscoveryStatus(uid1, NanStatusCode.INTERNAL_FAILURE, true, 6, tag1); 554 mDut.recordDiscoveryStatus(uid2, NanStatusCode.INTERNAL_FAILURE, false, 6, tag2); 555 mDut.recordDiscoveryStatus(uid2, NanStatusCode.NO_RESOURCES_AVAILABLE, false, 6, tag2); 556 mDut.recordAttachStatus(-5, 6, tag1, uid1); // invalid 557 558 // verify 559 log = mDut.consolidateProto(); 560 561 collector.checkThat("maxConcurrentPublishInApp", log.maxConcurrentPublishInApp, equalTo(2)); 562 collector.checkThat("maxConcurrentSubscribeInApp", log.maxConcurrentSubscribeInApp, 563 equalTo(3)); 564 collector.checkThat("maxConcurrentDiscoverySessionsInApp", 565 log.maxConcurrentDiscoverySessionsInApp, equalTo(4)); 566 collector.checkThat("maxConcurrentPublishInSystem", log.maxConcurrentPublishInSystem, 567 equalTo(4)); 568 collector.checkThat("maxConcurrentSubscribeInSystem", log.maxConcurrentSubscribeInSystem, 569 equalTo(4)); 570 collector.checkThat("maxConcurrentDiscoverySessionsInSystem", 571 log.maxConcurrentDiscoverySessionsInSystem, equalTo(8)); 572 collector.checkThat("histogramPublishStatus.length", 573 log.histogramPublishStatus.length, equalTo(2)); // 2 buckets 574 validateNanStatusProtoHistBucket("Bucket[SUCCESS]", 575 log.histogramPublishStatus[0], 576 WifiMetricsProto.WifiAwareLog.SUCCESS, 3); 577 validateNanStatusProtoHistBucket("Bucket[INTERNAL_FAILURE]", 578 log.histogramPublishStatus[1], 579 WifiMetricsProto.WifiAwareLog.INTERNAL_FAILURE, 1); 580 collector.checkThat("histogramSubscribeStatus.length", 581 log.histogramSubscribeStatus.length, equalTo(3)); // 3 buckets 582 validateNanStatusProtoHistBucket("Bucket[SUCCESS]", 583 log.histogramSubscribeStatus[0], 584 WifiMetricsProto.WifiAwareLog.SUCCESS, 5); 585 validateNanStatusProtoHistBucket("Bucket[INTERNAL_FAILURE]", 586 log.histogramSubscribeStatus[1], 587 WifiMetricsProto.WifiAwareLog.INTERNAL_FAILURE, 1); 588 validateNanStatusProtoHistBucket("Bucket[NO_RESOURCES_AVAILABLE]", 589 log.histogramSubscribeStatus[2], 590 WifiMetricsProto.WifiAwareLog.NO_RESOURCES_AVAILABLE, 1); 591 collector.checkThat("numAppsWithDiscoverySessionFailureOutOfResources", 592 log.numAppsWithDiscoverySessionFailureOutOfResources, equalTo(1)); 593 validateProtoHistBucket("Publish Duration[0]", log.histogramPublishSessionDurationMs[0], 5, 594 6, 1); 595 validateProtoHistBucket("Subscribe Duration[0]", log.histogramSubscribeSessionDurationMs[0], 596 10, 20, 1); 597 598 collector.checkThat("maxConcurrentPublishWithRangingInApp", 599 log.maxConcurrentPublishWithRangingInApp, equalTo(1)); 600 collector.checkThat("maxConcurrentSubscribeWithRangingInApp", 601 log.maxConcurrentSubscribeWithRangingInApp, equalTo(3)); 602 collector.checkThat("maxConcurrentPublishWithRangingInSystem", 603 log.maxConcurrentPublishWithRangingInSystem, equalTo(1)); 604 collector.checkThat("maxConcurrentSubscribeWithRangingInSystem", 605 log.maxConcurrentSubscribeWithRangingInSystem, equalTo(3)); 606 collector.checkThat("numSubscribesWithRanging", log.numSubscribesWithRanging, equalTo(3)); 607 collector.checkThat("histogramSubscribeGeofenceMin.length", 608 log.histogramSubscribeGeofenceMin.length, equalTo(2)); 609 collector.checkThat("histogramSubscribeGeofenceMax.length", 610 log.histogramSubscribeGeofenceMax.length, equalTo(2)); 611 validateProtoHistBucket("histogramSubscribeGeofenceMin[0]", 612 log.histogramSubscribeGeofenceMin[0], Integer.MIN_VALUE, 10, 1); 613 validateProtoHistBucket("histogramSubscribeGeofenceMin[1]", 614 log.histogramSubscribeGeofenceMin[1], 10, 30, 1); 615 validateProtoHistBucket("histogramSubscribeGeofenceMax[0]", 616 log.histogramSubscribeGeofenceMax[0], 30, 60, 1); 617 validateProtoHistBucket("histogramSubscribeGeofenceMax[1]", 618 log.histogramSubscribeGeofenceMax[1], 100, Integer.MAX_VALUE, 1); 619 } 620 621 /** 622 * Validate the data-path (NDP & NDI) metrics. 623 */ 624 @Test testDataPathMetrics()625 public void testDataPathMetrics() { 626 final int uid1 = 1005; 627 final String package1 = "com.test1"; 628 final int uid2 = 1006; 629 final String package2 = "com.test2"; 630 final String ndi0 = "aware_data0"; 631 final String ndi1 = "aware_data1"; 632 final String tag1 = "tag1"; 633 final String tag2 = "tag2"; 634 final String tag3 = "tag3"; 635 final int[] sessionIds = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 636 final int role_init = WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR; 637 final int role_resp = WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER; 638 Map<WifiAwareNetworkSpecifier, WifiAwareDataPathStateManager.AwareNetworkRequestInformation> 639 networkRequestCache = new HashMap<>(); 640 WifiMetricsProto.WifiAwareLog log; 641 642 setTime(0); 643 mDut.recordDiscoveryStatus(uid1, NanStatusCode.SUCCESS, true, sessionIds[0], 6, tag1); 644 645 setTime(5); 646 // uid1: ndp (non-secure) on ndi0 647 addNetworkInfoToCache(networkRequestCache, 10, uid1, package1, ndi0, null); 648 649 mDut.recordNdpCreation(uid1, package1, networkRequestCache); 650 setTime(7); // 2ms creation time, 7ms discovery + NDP latency 651 mDut.recordNdpStatus(NanStatusCode.SUCCESS, false, role_init, 5, sessionIds[0], 5120); 652 653 // uid2: ndp (non-secure) on ndi0 654 setTime(5); 655 mDut.recordDiscoveryStatus(uid1, NanStatusCode.SUCCESS, true, sessionIds[1], 6, tag1); 656 setTime(7); 657 WifiAwareNetworkSpecifier ns = addNetworkInfoToCache(networkRequestCache, 11, uid2, 658 package2, ndi0, null); 659 mDut.recordNdpCreation(uid2, package2, networkRequestCache); 660 setTime(10); // 3 ms creation time, 5ms discovery + NDP latency 661 mDut.recordNdpStatus(NanStatusCode.SUCCESS, false, role_resp, 7, sessionIds[1], 2412); 662 663 // uid2: ndp (secure) on ndi1 (OOB) 664 setTime(8); 665 mDut.recordDiscoveryStatus(uid2, NanStatusCode.SUCCESS, true, sessionIds[2], 6, tag2); 666 setTime(10); 667 addNetworkInfoToCache(networkRequestCache, 12, uid2, package2, ndi1, 668 "passphrase of some kind"); 669 mDut.recordNdpCreation(uid2, package2, networkRequestCache); 670 setTime(25); // 15 ms creation time, 17ms discovery + NDP latency 671 mDut.recordNdpStatus(NanStatusCode.SUCCESS, true, role_init, 10, sessionIds[2], 5180); 672 673 // uid2: ndp (secure) on ndi0 (OOB) 674 setTime(20); 675 mDut.recordDiscoveryStatus(uid2, NanStatusCode.SUCCESS, true, sessionIds[3], 6, tag2); 676 setTime(25); 677 addNetworkInfoToCache(networkRequestCache, 13, uid2, package2, ndi0, 678 "super secret password"); 679 mDut.recordNdpCreation(uid2, package2, networkRequestCache); 680 setTime(36); // 11 ms creation time 681 mDut.recordNdpStatus(NanStatusCode.SUCCESS, true, role_resp, 25, sessionIds[3], 2437); 682 683 // uid2: delete the first NDP 684 networkRequestCache.remove(ns); 685 686 // uid2: ndp (non-secure) on ndi0 687 setTime(32); 688 mDut.recordDiscoveryStatus(uid2, NanStatusCode.SUCCESS, true, sessionIds[4], 6, tag2); 689 setTime(36); 690 addNetworkInfoToCache(networkRequestCache, 14, uid2, package2, ndi0, null); 691 mDut.recordNdpCreation(uid2, package2, networkRequestCache); 692 setTime(37); // 1 ms creation time! 693 mDut.recordNdpStatus(NanStatusCode.SUCCESS, false, role_resp, 36, sessionIds[4], 5180); 694 695 // a few error codes 696 mDut.recordNdpStatus(NanStatusCode.INTERNAL_FAILURE, false, role_resp, 0, sessionIds[5]); 697 mDut.recordNdpStatus(NanStatusCode.INTERNAL_FAILURE, false, role_init, 0, sessionIds[6]); 698 mDut.recordNdpStatus(NanStatusCode.NO_RESOURCES_AVAILABLE, false, role_resp, 0, 699 sessionIds[7]); 700 701 // and some durations 702 setTime(150); 703 mDut.recordNdpSessionDuration(7); // 143ms 704 mDut.recordNdpSessionDuration(10); // 140ms 705 mDut.recordNdpSessionDuration(25); // 125ms 706 mDut.recordNdpSessionDuration(140); // 10ms 707 708 //verify 709 log = mDut.consolidateProto(); 710 711 collector.checkThat("maxConcurrentNdiInApp", log.maxConcurrentNdiInApp, equalTo(2)); 712 collector.checkThat("maxConcurrentNdiInSystem", log.maxConcurrentNdiInSystem, equalTo(2)); 713 collector.checkThat("maxConcurrentNdpInApp", log.maxConcurrentNdpInApp, equalTo(3)); 714 collector.checkThat("maxConcurrentNdpInSystem", log.maxConcurrentNdpInSystem, equalTo(4)); 715 collector.checkThat("maxConcurrentSecureNdpInApp", log.maxConcurrentSecureNdpInApp, 716 equalTo(2)); 717 collector.checkThat("maxConcurrentSecureNdpInSystem", log.maxConcurrentSecureNdpInSystem, 718 equalTo(2)); 719 collector.checkThat("maxConcurrentNdpPerNdi", log.maxConcurrentNdpPerNdi, equalTo(3)); 720 collector.checkThat("histogramRequestNdpStatus.length", 721 log.histogramRequestNdpStatus.length, equalTo(3)); 722 validateNanStatusProtoHistBucket("Bucket[SUCCESS]", 723 log.histogramRequestNdpStatus[0], 724 WifiMetricsProto.WifiAwareLog.SUCCESS, 3); 725 validateNanStatusProtoHistBucket("Bucket[INTERNAL_FAILURE]", 726 log.histogramRequestNdpStatus[1], 727 WifiMetricsProto.WifiAwareLog.INTERNAL_FAILURE, 2); 728 validateNanStatusProtoHistBucket("Bucket[UNKNOWN_HAL_STATUS]", 729 log.histogramRequestNdpStatus[2], 730 WifiMetricsProto.WifiAwareLog.NO_RESOURCES_AVAILABLE, 1); 731 collector.checkThat("histogramRequestNdpOobStatus.length", 732 log.histogramRequestNdpOobStatus.length, equalTo(1)); 733 validateNanStatusProtoHistBucket("Bucket[SUCCESS]", 734 log.histogramRequestNdpOobStatus[0], 735 WifiMetricsProto.WifiAwareLog.SUCCESS, 2); 736 737 collector.checkThat("ndpCreationTimeMsMin", log.ndpCreationTimeMsMin, equalTo(1L)); 738 collector.checkThat("ndpCreationTimeMsMax", log.ndpCreationTimeMsMax, equalTo(15L)); 739 collector.checkThat("ndpCreationTimeMsSum", log.ndpCreationTimeMsSum, equalTo(32L)); 740 collector.checkThat("ndpCreationTimeMsSumOfSq", log.ndpCreationTimeMsSumOfSq, 741 equalTo(360L)); 742 collector.checkThat("ndpCreationTimeMsNumSamples", log.ndpCreationTimeMsNumSamples, 743 equalTo(5L)); 744 validateProtoHistBucket("Creation[0]", log.histogramNdpCreationTimeMs[0], 1, 2, 1); 745 validateProtoHistBucket("Creation[1]", log.histogramNdpCreationTimeMs[1], 2, 3, 1); 746 validateProtoHistBucket("Creation[2]", log.histogramNdpCreationTimeMs[2], 3, 4, 1); 747 validateProtoHistBucket("Creation[3]", log.histogramNdpCreationTimeMs[3], 10, 20, 2); 748 749 validateProtoHistBucket("Duration[0]", log.histogramNdpSessionDurationMs[0], 10, 20, 1); 750 validateProtoHistBucket("Duration[1]", log.histogramNdpSessionDurationMs[1], 100, 200, 3); 751 ExtendedMockito.verify(() -> WifiStatsLog.write( 752 WifiStatsLog.WIFI_AWARE_NDP_REPORTED, 753 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__ROLE__ROLE_INITIATOR, 754 false, WifiStatsLog.WIFI_AWARE_NDP_REPORTED__STATUS__ST_SUCCESS, 755 2, 7, 5120, false, 756 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__CALLER_TYPE__OTHERS, tag1, uid1)); 757 ExtendedMockito.verify(() -> WifiStatsLog.write( 758 WifiStatsLog.WIFI_AWARE_NDP_REPORTED, 759 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__ROLE__ROLE_RESPONDER, 760 false, WifiStatsLog.WIFI_AWARE_NDP_REPORTED__STATUS__ST_SUCCESS, 761 3, 5, 2412, false, 762 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__CALLER_TYPE__OTHERS, tag1, uid1)); 763 ExtendedMockito.verify(() -> WifiStatsLog.write( 764 WifiStatsLog.WIFI_AWARE_NDP_REPORTED, 765 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__ROLE__ROLE_INITIATOR, 766 true, WifiStatsLog.WIFI_AWARE_NDP_REPORTED__STATUS__ST_SUCCESS, 767 15, 17, 5180, false, 768 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__CALLER_TYPE__OTHERS, tag2, uid2)); 769 ExtendedMockito.verify(() -> WifiStatsLog.write( 770 WifiStatsLog.WIFI_AWARE_NDP_REPORTED, 771 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__ROLE__ROLE_RESPONDER, 772 true, WifiStatsLog.WIFI_AWARE_NDP_REPORTED__STATUS__ST_SUCCESS, 773 11, 16, 2437, false, 774 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__CALLER_TYPE__OTHERS, tag2, uid2)); 775 ExtendedMockito.verify(() -> WifiStatsLog.write( 776 WifiStatsLog.WIFI_AWARE_NDP_REPORTED, 777 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__ROLE__ROLE_RESPONDER, 778 false, WifiStatsLog.WIFI_AWARE_NDP_REPORTED__STATUS__ST_SUCCESS, 779 1, 5, 5180, false, 780 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__CALLER_TYPE__OTHERS, tag2, uid2)); 781 ExtendedMockito.verify(() -> WifiStatsLog.write( 782 WifiStatsLog.WIFI_AWARE_NDP_REPORTED, 783 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__ROLE__ROLE_RESPONDER, 784 false, WifiStatsLog.WIFI_AWARE_NDP_REPORTED__STATUS__ST_INTERNAL_FAILURE, 785 37, 37, 0, false, 786 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__CALLER_TYPE__UNKNOWN, null, 0)); 787 ExtendedMockito.verify(() -> WifiStatsLog.write( 788 WifiStatsLog.WIFI_AWARE_NDP_REPORTED, 789 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__ROLE__ROLE_INITIATOR, 790 false, WifiStatsLog.WIFI_AWARE_NDP_REPORTED__STATUS__ST_INTERNAL_FAILURE, 791 37, 37, 0, false, 792 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__CALLER_TYPE__UNKNOWN, null, 0)); 793 ExtendedMockito.verify(() -> WifiStatsLog.write( 794 WifiStatsLog.WIFI_AWARE_NDP_REPORTED, 795 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__ROLE__ROLE_RESPONDER, 796 false, WifiStatsLog.WIFI_AWARE_NDP_REPORTED__STATUS__ST_NO_RESOURCES_AVAILABLE, 797 37, 37, 0, false, 798 WifiStatsLog.WIFI_AWARE_NDP_REPORTED__CALLER_TYPE__UNKNOWN, null, 0)); 799 } 800 801 /** 802 * Validate that the histogram configuration is initialized correctly: bucket starting points 803 * and sub-bucket widths. 804 */ 805 @Test testHistParamInit()806 public void testHistParamInit() { 807 collector.checkThat("HIST1.mLog", HIST1.mLog, equalTo(Math.log(10))); 808 collector.checkThat("HIST1.bb[0]", HIST1.bb[0], equalTo(1.0)); 809 collector.checkThat("HIST1.bb[1]", HIST1.bb[1], equalTo(10.0)); 810 collector.checkThat("HIST1.bb[2]", HIST1.bb[2], equalTo(100.0)); 811 collector.checkThat("HIST1.bb[3]", HIST1.bb[3], equalTo(1000.0)); 812 collector.checkThat("HIST1.bb[4]", HIST1.bb[4], equalTo(10000.0)); 813 collector.checkThat("HIST1.bb[5]", HIST1.bb[5], equalTo(100000.0)); 814 collector.checkThat("HIST1.sbw[0]", HIST1.sbw[0], equalTo(1.0)); 815 collector.checkThat("HIST1.sbw[1]", HIST1.sbw[1], equalTo(10.0)); 816 collector.checkThat("HIST1.sbw[2]", HIST1.sbw[2], equalTo(100.0)); 817 collector.checkThat("HIST1.sbw[3]", HIST1.sbw[3], equalTo(1000.0)); 818 collector.checkThat("HIST1.sbw[4]", HIST1.sbw[4], equalTo(10000.0)); 819 collector.checkThat("HIST1.sbw[5]", HIST1.sbw[5], equalTo(100000.0)); 820 821 collector.checkThat("HIST2.mLog", HIST1.mLog, equalTo(Math.log(10))); 822 collector.checkThat("HIST2.bb[0]", HIST2.bb[0], equalTo(-18.0)); 823 collector.checkThat("HIST2.bb[1]", HIST2.bb[1], equalTo(-10.0)); 824 collector.checkThat("HIST2.bb[2]", HIST2.bb[2], equalTo(30.0)); 825 collector.checkThat("HIST2.sbw[0]", HIST2.sbw[0], equalTo(0.2)); 826 collector.checkThat("HIST2.sbw[1]", HIST2.sbw[1], equalTo(1.0)); 827 collector.checkThat("HIST2.sbw[2]", HIST2.sbw[2], equalTo(5.0)); 828 } 829 830 /** 831 * Validate the conversion to a NanStatusType proto raw histogram. 832 */ 833 @Test testNanStatusTypeHistogram()834 public void testNanStatusTypeHistogram() { 835 SparseIntArray statusHistogram = new SparseIntArray(); 836 837 addNanHalStatusToHistogram(NanStatusCode.SUCCESS, statusHistogram); 838 addNanHalStatusToHistogram(-1, statusHistogram); 839 addNanHalStatusToHistogram(NanStatusCode.ALREADY_ENABLED, statusHistogram); 840 addNanHalStatusToHistogram(NanStatusCode.SUCCESS, statusHistogram); 841 addNanHalStatusToHistogram(NanStatusCode.INTERNAL_FAILURE, statusHistogram); 842 addNanHalStatusToHistogram(NanStatusCode.SUCCESS, statusHistogram); 843 addNanHalStatusToHistogram(NanStatusCode.INTERNAL_FAILURE, statusHistogram); 844 addNanHalStatusToHistogram(55, statusHistogram); 845 addNanHalStatusToHistogram(65, statusHistogram); 846 847 WifiMetricsProto.WifiAwareLog.NanStatusHistogramBucket[] sh = histogramToProtoArray( 848 statusHistogram); 849 collector.checkThat("Number of buckets", sh.length, equalTo(4)); 850 validateNanStatusProtoHistBucket("Bucket[SUCCESS]", sh[0], 851 WifiMetricsProto.WifiAwareLog.SUCCESS, 3); 852 validateNanStatusProtoHistBucket("Bucket[INTERNAL_FAILURE]", sh[1], 853 WifiMetricsProto.WifiAwareLog.INTERNAL_FAILURE, 2); 854 validateNanStatusProtoHistBucket("Bucket[ALREADY_ENABLED]", sh[2], 855 WifiMetricsProto.WifiAwareLog.ALREADY_ENABLED, 1); 856 validateNanStatusProtoHistBucket("Bucket[UNKNOWN_HAL_STATUS]", sh[3], 857 WifiMetricsProto.WifiAwareLog.UNKNOWN_HAL_STATUS, 3); 858 } 859 860 @Test testNdpRequestTypeHistogram()861 public void testNdpRequestTypeHistogram() { 862 mDut.recordNdpRequestType(NETWORK_SPECIFIER_TYPE_IB); 863 mDut.recordNdpRequestType(NETWORK_SPECIFIER_TYPE_IB); 864 mDut.recordNdpRequestType(NETWORK_SPECIFIER_TYPE_IB_ANY_PEER); 865 866 WifiMetricsProto.WifiAwareLog log; 867 log = mDut.consolidateProto(); 868 869 validateNdpRequestProtoHistBucket("", log.histogramNdpRequestType[0], 870 WifiMetricsProto.WifiAwareLog.NETWORK_SPECIFIER_TYPE_IB, 2); 871 validateNdpRequestProtoHistBucket("", log.histogramNdpRequestType[1], 872 WifiMetricsProto.WifiAwareLog.NETWORK_SPECIFIER_TYPE_IB_ANY_PEER, 1); 873 } 874 875 // utilities 876 877 /** 878 * Mock the elapsed time since boot to the input argument. 879 */ setTime(long timeMs)880 private void setTime(long timeMs) { 881 when(mClock.getElapsedSinceBootMillis()).thenReturn(timeMs); 882 } 883 884 /** 885 * Sum all the 'count' entries in the histogram array. 886 */ countAllHistogramSamples(WifiMetricsProto.WifiAwareLog.HistogramBucket[] hba)887 private int countAllHistogramSamples(WifiMetricsProto.WifiAwareLog.HistogramBucket[] hba) { 888 int sum = 0; 889 for (WifiMetricsProto.WifiAwareLog.HistogramBucket hb: hba) { 890 sum += hb.count; 891 } 892 return sum; 893 } 894 countAllHistogramSamples( WifiMetricsProto.WifiAwareLog.NanStatusHistogramBucket[] nshba)895 private int countAllHistogramSamples( 896 WifiMetricsProto.WifiAwareLog.NanStatusHistogramBucket[] nshba) { 897 int sum = 0; 898 for (WifiMetricsProto.WifiAwareLog.NanStatusHistogramBucket nshb: nshba) { 899 sum += nshb.count; 900 } 901 return sum; 902 } 903 validateProtoHistBucket(String logPrefix, WifiMetricsProto.WifiAwareLog.HistogramBucket bucket, long start, long end, int count)904 private void validateProtoHistBucket(String logPrefix, 905 WifiMetricsProto.WifiAwareLog.HistogramBucket bucket, long start, long end, int count) { 906 collector.checkThat(logPrefix + ": start", bucket.start, equalTo(start)); 907 collector.checkThat(logPrefix + ": end", bucket.end, equalTo(end)); 908 collector.checkThat(logPrefix + ": count", bucket.count, equalTo(count)); 909 } 910 validateNanStatusProtoHistBucket(String logPrefix, WifiMetricsProto.WifiAwareLog.NanStatusHistogramBucket bucket, int type, int count)911 private void validateNanStatusProtoHistBucket(String logPrefix, 912 WifiMetricsProto.WifiAwareLog.NanStatusHistogramBucket bucket, int type, int count) { 913 collector.checkThat(logPrefix + ": type", bucket.nanStatusType, equalTo(type)); 914 collector.checkThat(logPrefix + ": count", bucket.count, equalTo(count)); 915 } 916 validateNdpRequestProtoHistBucket(String logPrefix, WifiMetricsProto.WifiAwareLog.NdpRequestTypeHistogramBucket bucket, int type, int count)917 private void validateNdpRequestProtoHistBucket(String logPrefix, 918 WifiMetricsProto.WifiAwareLog.NdpRequestTypeHistogramBucket bucket, int type, 919 int count) { 920 collector.checkThat(logPrefix + ": type", bucket.ndpRequestType, equalTo(type)); 921 collector.checkThat(logPrefix + ": count", bucket.count, equalTo(count)); 922 } 923 addNetworkInfoToCache( Map<WifiAwareNetworkSpecifier, WifiAwareDataPathStateManager .AwareNetworkRequestInformation> networkRequestCache, int index, int uid, String packageName, String interfaceName, String passphrase)924 private WifiAwareNetworkSpecifier addNetworkInfoToCache( 925 Map<WifiAwareNetworkSpecifier, WifiAwareDataPathStateManager 926 .AwareNetworkRequestInformation> networkRequestCache, 927 int index, int uid, String packageName, String interfaceName, String passphrase) { 928 WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier(0, 0, 0, index, 0, null, null, 929 passphrase, 0, 0); 930 WifiAwareDataPathStateManager.AwareNetworkRequestInformation anri = 931 new WifiAwareDataPathStateManager.AwareNetworkRequestInformation(); 932 anri.networkSpecifier = ns; 933 anri.state = WifiAwareDataPathStateManager.AwareNetworkRequestInformation.STATE_CONFIRMED; 934 anri.uid = uid; 935 anri.packageName = packageName; 936 anri.interfaceName = interfaceName; 937 938 networkRequestCache.put(ns, anri); 939 return ns; 940 } 941 dumpDut(String prefix)942 private void dumpDut(String prefix) { 943 StringWriter sw = new StringWriter(); 944 mDut.dump(null, new PrintWriter(sw), null); 945 Log.e("WifiAwareMetrics", prefix + sw.toString()); 946 } 947 } 948