blob: d774eae6ed3610fa21764b69ebdf9902f84b9bf2 [file] [log] [blame]
Adam Stonecea91ce2018-01-22 19:23:28 -08001/*
2 * Copyright 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
Adam Stone568b3c42018-01-31 12:57:16 -080017#include <binder/PersistableBundle.h>
Adam Stonecea91ce2018-01-22 19:23:28 -080018#include <gtest/gtest.h>
19
20#include "DrmMetrics.h"
21
22using ::android::hardware::drm::V1_0::EventType;
23using ::android::hardware::drm::V1_0::KeyStatusType;
Adam Stone568b3c42018-01-31 12:57:16 -080024using ::android::os::PersistableBundle;
Adam Stonecea91ce2018-01-22 19:23:28 -080025
26namespace android {
27
28/**
29 * Unit tests for the MediaDrmMetrics class.
30 */
31class MediaDrmMetricsTest : public ::testing::Test {
32};
33
34TEST_F(MediaDrmMetricsTest, EmptySuccess) {
35 MediaDrmMetrics metrics;
Adam Stone568b3c42018-01-31 12:57:16 -080036 PersistableBundle bundle;
Adam Stonecea91ce2018-01-22 19:23:28 -080037
Adam Stone568b3c42018-01-31 12:57:16 -080038 metrics.Export(&bundle);
39 EXPECT_TRUE(bundle.empty());
Adam Stonecea91ce2018-01-22 19:23:28 -080040}
41
42TEST_F(MediaDrmMetricsTest, AllValuesSuccessCounts) {
43 MediaDrmMetrics metrics;
44
45 metrics.mOpenSessionCounter.Increment(OK);
46 metrics.mCloseSessionCounter.Increment(OK);
47
48 {
49 EventTimer<status_t> get_key_request_timer(&metrics.mGetKeyRequestTiming);
50 EventTimer<status_t> provide_key_response_timer(
51 &metrics.mProvideKeyResponseTiming);
52 get_key_request_timer.SetAttribute(OK);
53 provide_key_response_timer.SetAttribute(OK);
54 }
55
56 metrics.mGetProvisionRequestCounter.Increment(OK);
57 metrics.mProvideProvisionResponseCounter.Increment(OK);
58 metrics.mGetDeviceUniqueIdCounter.Increment(OK);
59
60 metrics.mKeyStatusChangeCounter.Increment(KeyStatusType::USABLE);
61 metrics.mEventCounter.Increment(EventType::PROVISION_REQUIRED);
62
Adam Stone568b3c42018-01-31 12:57:16 -080063 PersistableBundle bundle;
Adam Stonecea91ce2018-01-22 19:23:28 -080064
Adam Stone568b3c42018-01-31 12:57:16 -080065 metrics.Export(&bundle);
66 EXPECT_EQ(11U, bundle.size());
Adam Stonecea91ce2018-01-22 19:23:28 -080067
68 // Verify the list of pairs of int64 metrics.
69 std::vector<std::pair<std::string, int64_t>> expected_values = {
Adam Stone4bea53c2018-01-24 21:44:58 -080070 { "drm.mediadrm.open_session.ok.count", 1 },
71 { "drm.mediadrm.close_session.ok.count", 1 },
72 { "drm.mediadrm.get_key_request.ok.count", 1 },
73 { "drm.mediadrm.provide_key_response.ok.count", 1 },
74 { "drm.mediadrm.get_provision_request.ok.count", 1 },
75 { "drm.mediadrm.provide_provision_response.ok.count", 1 },
76 { "drm.mediadrm.key_status_change.USABLE.count", 1 },
77 { "drm.mediadrm.event.PROVISION_REQUIRED.count", 1 },
78 { "drm.mediadrm.get_device_unique_id.ok.count", 1 }};
Adam Stonecea91ce2018-01-22 19:23:28 -080079 for (const auto& expected_pair : expected_values) {
Adam Stone568b3c42018-01-31 12:57:16 -080080 String16 key(expected_pair.first.c_str());
Adam Stonecea91ce2018-01-22 19:23:28 -080081 int64_t value = -1;
Adam Stone568b3c42018-01-31 12:57:16 -080082 EXPECT_TRUE(bundle.getLong(key, &value))
83 << "Unexpected error retrieviing key: " << key;
Adam Stonecea91ce2018-01-22 19:23:28 -080084 EXPECT_EQ(expected_pair.second, value)
Adam Stone568b3c42018-01-31 12:57:16 -080085 << "Unexpected value for " << expected_pair.first << ". " << value;
Adam Stonecea91ce2018-01-22 19:23:28 -080086 }
87
88 // Validate timing values exist.
Adam Stone568b3c42018-01-31 12:57:16 -080089 String16 get_key_request_key(
90 "drm.mediadrm.get_key_request.ok.average_time_micros");
91 String16 provide_key_response_key(
92 "drm.mediadrm.provide_key_response.ok.average_time_micros");
Adam Stonecea91ce2018-01-22 19:23:28 -080093 int64_t value = -1;
Adam Stone568b3c42018-01-31 12:57:16 -080094 EXPECT_TRUE(bundle.getLong(get_key_request_key, &value));
Adam Stonecea91ce2018-01-22 19:23:28 -080095 EXPECT_GE(value, 0);
Adam Stonecea91ce2018-01-22 19:23:28 -080096 value = -1;
Adam Stone568b3c42018-01-31 12:57:16 -080097 EXPECT_TRUE(bundle.getLong(provide_key_response_key, &value));
Adam Stonecea91ce2018-01-22 19:23:28 -080098 EXPECT_GE(value, 0);
99}
100
101TEST_F(MediaDrmMetricsTest, AllValuesFull) {
102 MediaDrmMetrics metrics;
103
104 metrics.mOpenSessionCounter.Increment(OK);
105 metrics.mOpenSessionCounter.Increment(UNEXPECTED_NULL);
106
107 metrics.mCloseSessionCounter.Increment(OK);
108 metrics.mCloseSessionCounter.Increment(UNEXPECTED_NULL);
109
110 for (status_t s : {OK, UNEXPECTED_NULL}) {
111 {
112 EventTimer<status_t> get_key_request_timer(&metrics.mGetKeyRequestTiming);
113 EventTimer<status_t> provide_key_response_timer(
114 &metrics.mProvideKeyResponseTiming);
115 get_key_request_timer.SetAttribute(s);
116 provide_key_response_timer.SetAttribute(s);
117 }
118 }
119
120 metrics.mGetProvisionRequestCounter.Increment(OK);
121 metrics.mGetProvisionRequestCounter.Increment(UNEXPECTED_NULL);
122 metrics.mProvideProvisionResponseCounter.Increment(OK);
123 metrics.mProvideProvisionResponseCounter.Increment(UNEXPECTED_NULL);
124 metrics.mGetDeviceUniqueIdCounter.Increment(OK);
125 metrics.mGetDeviceUniqueIdCounter.Increment(UNEXPECTED_NULL);
126
127 metrics.mKeyStatusChangeCounter.Increment(KeyStatusType::USABLE);
128 metrics.mKeyStatusChangeCounter.Increment(KeyStatusType::EXPIRED);
129 metrics.mKeyStatusChangeCounter.Increment(KeyStatusType::OUTPUTNOTALLOWED);
130 metrics.mKeyStatusChangeCounter.Increment(KeyStatusType::STATUSPENDING);
131 metrics.mKeyStatusChangeCounter.Increment(KeyStatusType::INTERNALERROR);
132 metrics.mEventCounter.Increment(EventType::PROVISION_REQUIRED);
133 metrics.mEventCounter.Increment(EventType::KEY_NEEDED);
134 metrics.mEventCounter.Increment(EventType::KEY_EXPIRED);
135 metrics.mEventCounter.Increment(EventType::VENDOR_DEFINED);
136 metrics.mEventCounter.Increment(EventType::SESSION_RECLAIMED);
137
Adam Stone568b3c42018-01-31 12:57:16 -0800138 PersistableBundle bundle;
139 metrics.Export(&bundle);
140 EXPECT_EQ(33U, bundle.size());
Adam Stonecea91ce2018-01-22 19:23:28 -0800141
142 // Verify the list of pairs of int64 metrics.
143 std::vector<std::pair<std::string, int64_t>> expected_values = {
Adam Stone4bea53c2018-01-24 21:44:58 -0800144 { "drm.mediadrm.open_session.ok.count", 1 },
145 { "drm.mediadrm.close_session.ok.count", 1 },
146 { "drm.mediadrm.get_key_request.ok.count", 1 },
147 { "drm.mediadrm.provide_key_response.ok.count", 1 },
148 { "drm.mediadrm.get_provision_request.ok.count", 1 },
149 { "drm.mediadrm.provide_provision_response.ok.count", 1 },
150 { "drm.mediadrm.get_device_unique_id.ok.count", 1 },
151 { "drm.mediadrm.open_session.error.count", 1 },
152 { "drm.mediadrm.close_session.error.count", 1 },
153 { "drm.mediadrm.get_key_request.error.count", 1 },
154 { "drm.mediadrm.provide_key_response.error.count", 1 },
155 { "drm.mediadrm.get_provision_request.error.count", 1 },
156 { "drm.mediadrm.provide_provision_response.error.count", 1 },
157 { "drm.mediadrm.get_device_unique_id.error.count", 1 },
158 { "drm.mediadrm.key_status_change.USABLE.count", 1 },
159 { "drm.mediadrm.key_status_change.EXPIRED.count", 1 },
160 { "drm.mediadrm.key_status_change.OUTPUT_NOT_ALLOWED.count", 1 },
161 { "drm.mediadrm.key_status_change.STATUS_PENDING.count", 1 },
162 { "drm.mediadrm.key_status_change.INTERNAL_ERROR.count", 1 },
163 { "drm.mediadrm.event.PROVISION_REQUIRED.count", 1 },
164 { "drm.mediadrm.event.KEY_NEEDED.count", 1 },
165 { "drm.mediadrm.event.KEY_EXPIRED.count", 1 },
166 { "drm.mediadrm.event.VENDOR_DEFINED.count", 1 },
167 { "drm.mediadrm.event.SESSION_RECLAIMED.count", 1 }};
Adam Stonecea91ce2018-01-22 19:23:28 -0800168 for (const auto& expected_pair : expected_values) {
Adam Stone568b3c42018-01-31 12:57:16 -0800169 String16 key(expected_pair.first.c_str());
Adam Stonecea91ce2018-01-22 19:23:28 -0800170 int64_t value = -1;
Adam Stone568b3c42018-01-31 12:57:16 -0800171 EXPECT_TRUE(bundle.getLong(key, &value))
172 << "Unexpected error retrieviing key: " << key;
Adam Stonecea91ce2018-01-22 19:23:28 -0800173 EXPECT_EQ(expected_pair.second, value)
Adam Stone568b3c42018-01-31 12:57:16 -0800174 << "Unexpected value for " << expected_pair.first << ". " << value;
175 }
176
177 // Verify the error lists
178 std::vector<std::pair<std::string, std::vector<int64_t>>> expected_vector_values = {
179 { "drm.mediadrm.close_session.error.list", { UNEXPECTED_NULL } },
180 { "drm.mediadrm.get_device_unique_id.error.list", { UNEXPECTED_NULL } },
181 { "drm.mediadrm.get_key_request.error.list", { UNEXPECTED_NULL } },
182 { "drm.mediadrm.get_provision_request.error.list", { UNEXPECTED_NULL } },
183 { "drm.mediadrm.open_session.error.list", { UNEXPECTED_NULL } },
184 { "drm.mediadrm.provide_key_response.error.list", { UNEXPECTED_NULL } },
185 { "drm.mediadrm.provide_provision_response.error.list", { UNEXPECTED_NULL } }};
186 for (const auto& expected_pair : expected_vector_values) {
187 String16 key(expected_pair.first.c_str());
188 std::vector<int64_t> values;
189 EXPECT_TRUE(bundle.getLongVector(key, &values))
190 << "Unexpected error retrieviing key: " << key;
191 for (auto expected : expected_pair.second) {
192 EXPECT_TRUE(std::find(values.begin(), values.end(), expected) != values.end())
193 << "Could not find " << expected << " for key " << expected_pair.first;
194 }
Adam Stonecea91ce2018-01-22 19:23:28 -0800195 }
196
197 // Validate timing values exist.
Adam Stone568b3c42018-01-31 12:57:16 -0800198 String16 get_key_request_key(
199 "drm.mediadrm.get_key_request.ok.average_time_micros");
200 String16 provide_key_response_key(
201 "drm.mediadrm.provide_key_response.ok.average_time_micros");
Adam Stonecea91ce2018-01-22 19:23:28 -0800202 int64_t value = -1;
Adam Stone568b3c42018-01-31 12:57:16 -0800203 EXPECT_TRUE(bundle.getLong(get_key_request_key, &value));
Adam Stonecea91ce2018-01-22 19:23:28 -0800204 EXPECT_GE(value, 0);
Adam Stonecea91ce2018-01-22 19:23:28 -0800205 value = -1;
Adam Stone568b3c42018-01-31 12:57:16 -0800206 EXPECT_TRUE(bundle.getLong(provide_key_response_key, &value));
Adam Stonecea91ce2018-01-22 19:23:28 -0800207 EXPECT_GE(value, 0);
208}
209
Adam Stonecea91ce2018-01-22 19:23:28 -0800210} // namespace android