• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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