1 /*
2  * Copyright (C) 2018 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 package com.android.cts.devicepolicy.metrics;
17 
18 import static com.google.common.truth.Truth.assertWithMessage;
19 
20 import com.android.os.AtomsProto.Atom;
21 import com.android.os.StatsLog.EventMetricData;
22 import com.android.tradefed.device.ITestDevice;
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Objects;
26 
27 /**
28  * Helper class to assert <code>DevicePolicyEvent</code> atoms were logged.
29  */
30 public final class DevicePolicyEventLogVerifier {
31 
32     public interface Action {
apply()33         void apply() throws Exception;
34     }
35 
36     private static final int WAIT_TIME_SHORT = 500;
37 
38     /**
39      * Asserts that <code>expectedLogs</code> were logged as a result of executing
40      * <code>action</code>, in the same order.
41      */
assertMetricsLogged(ITestDevice device, Action action, DevicePolicyEventWrapper... expectedLogs)42     public static void assertMetricsLogged(ITestDevice device, Action action,
43             DevicePolicyEventWrapper... expectedLogs) throws Exception {
44         final AtomMetricTester logVerifier = new AtomMetricTester(device);
45         if (logVerifier.isStatsdDisabled()) {
46             return;
47         }
48         try {
49             logVerifier.cleanLogs();
50             logVerifier.createAndUploadConfig(Atom.DEVICE_POLICY_EVENT_FIELD_NUMBER);
51             action.apply();
52 
53             Thread.sleep(WAIT_TIME_SHORT);
54 
55             final List<EventMetricData> data = logVerifier.getEventMetricDataList();
56             for (DevicePolicyEventWrapper expectedLog : expectedLogs) {
57                 assertExpectedMetricLogged(data, expectedLog);
58             }
59         } finally {
60             logVerifier.cleanLogs();
61         }
62     }
63 
assertExpectedMetricLogged(List<EventMetricData> data, DevicePolicyEventWrapper expectedLog)64     private static void assertExpectedMetricLogged(List<EventMetricData> data,
65             DevicePolicyEventWrapper expectedLog) {
66         final List<DevicePolicyEventWrapper> closestMatches = new ArrayList<>();
67         AtomMetricTester.dropWhileNot(data, atom -> {
68             final DevicePolicyEventWrapper actualLog =
69                     DevicePolicyEventWrapper.fromDevicePolicyAtom(atom.getDevicePolicyEvent());
70             if (actualLog.getEventId() == expectedLog.getEventId()) {
71                 closestMatches.add(actualLog);
72             }
73             return Objects.equals(actualLog, expectedLog);
74         });
75         assertWithMessage("Expected metric was not logged.")
76                 .that(closestMatches).contains(expectedLog);
77     }
78 }