blob: 0e58e0190da7aa7c570bd87eaf0905b470e06cc6 [file] [log] [blame]
Darin Petkov11b8eb32010-05-18 11:00:59 -07001// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Darin Petkov11b8eb32010-05-18 11:00:59 -07005#include <cstring>
6
7#include <base/file_util.h>
Ken Mixterb2f17092011-07-22 14:59:51 -07008#include <gmock/gmock.h>
Darin Petkov11b8eb32010-05-18 11:00:59 -07009#include <gtest/gtest.h>
Ken Mixterb2f17092011-07-22 14:59:51 -070010#include <policy/mock_device_policy.h>
11#include <policy/libpolicy.h>
Darin Petkov11b8eb32010-05-18 11:00:59 -070012
Sam Leffler10b301d2010-06-17 14:22:43 -070013#include "c_metrics_library.h"
14#include "metrics_library.h"
15
Darin Petkov11b8eb32010-05-18 11:00:59 -070016static const FilePath kTestUMAEventsFile("test-uma-events");
Ken Mixtereafbbdf2010-10-01 15:38:42 -070017static const char kTestMounts[] = "test-mounts";
Ken Mixter4c5daa42010-08-26 18:35:06 -070018
Ken Mixterb2f17092011-07-22 14:59:51 -070019using ::testing::_;
20using ::testing::Return;
21using ::testing::AnyNumber;
22
23ACTION_P(SetMetricsPolicy, enabled) {
24 *arg0 = enabled;
25 return true;
Ken Mixter4c5daa42010-08-26 18:35:06 -070026}
27
Darin Petkov11b8eb32010-05-18 11:00:59 -070028class MetricsLibraryTest : public testing::Test {
29 protected:
30 virtual void SetUp() {
31 EXPECT_EQ(NULL, lib_.uma_events_file_);
32 lib_.Init();
33 EXPECT_TRUE(NULL != lib_.uma_events_file_);
34 lib_.uma_events_file_ = kTestUMAEventsFile.value().c_str();
Ken Mixterb2f17092011-07-22 14:59:51 -070035 device_policy_ = new policy::MockDevicePolicy();
36 EXPECT_CALL(*device_policy_, LoadPolicy())
37 .Times(AnyNumber())
38 .WillRepeatedly(Return(true));
39 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
40 .Times(AnyNumber())
41 .WillRepeatedly(SetMetricsPolicy(true));
42 provider_ = new policy::PolicyProvider(device_policy_);
43 lib_.SetPolicyProvider(provider_);
Ken Mixter4c5daa42010-08-26 18:35:06 -070044 // Defeat metrics enabled caching between tests.
45 lib_.cached_enabled_time_ = 0;
Darin Petkov11b8eb32010-05-18 11:00:59 -070046 }
47
48 virtual void TearDown() {
Ken Mixtereafbbdf2010-10-01 15:38:42 -070049 file_util::Delete(FilePath(kTestMounts), false);
Darin Petkov11b8eb32010-05-18 11:00:59 -070050 file_util::Delete(kTestUMAEventsFile, false);
51 }
52
Ken Mixter4c5daa42010-08-26 18:35:06 -070053 void VerifyEnabledCacheHit(bool to_value);
54 void VerifyEnabledCacheEviction(bool to_value);
55
Darin Petkov11b8eb32010-05-18 11:00:59 -070056 MetricsLibrary lib_;
Ken Mixterb2f17092011-07-22 14:59:51 -070057 policy::MockDevicePolicy* device_policy_;
58 policy::PolicyProvider* provider_;
Darin Petkov11b8eb32010-05-18 11:00:59 -070059};
60
Ken Mixtereafbbdf2010-10-01 15:38:42 -070061TEST_F(MetricsLibraryTest, IsDeviceMounted) {
62 static const char kTestContents[] =
63 "0123456789abcde 0123456789abcde\nguestfs foo bar\n";
64 char buffer[1024];
65 int block_sizes[] = { 1, 2, 3, 4, 5, 6, 8, 12, 14, 16, 32, 1024 };
66 bool result;
67 EXPECT_FALSE(lib_.IsDeviceMounted("guestfs",
68 "nonexistent",
69 buffer,
70 1,
71 &result));
72 ASSERT_TRUE(file_util::WriteFile(FilePath(kTestMounts),
73 kTestContents,
74 strlen(kTestContents)));
75 EXPECT_FALSE(lib_.IsDeviceMounted("guestfs",
76 kTestMounts,
77 buffer,
78 0,
79 &result));
80 for (size_t i = 0; i < arraysize(block_sizes); ++i) {
81 EXPECT_TRUE(lib_.IsDeviceMounted("0123456789abcde",
82 kTestMounts,
83 buffer,
84 block_sizes[i],
85 &result));
86 EXPECT_TRUE(result);
87 EXPECT_TRUE(lib_.IsDeviceMounted("guestfs",
88 kTestMounts,
89 buffer,
90 block_sizes[i],
91 &result));
92 EXPECT_TRUE(result);
93 EXPECT_TRUE(lib_.IsDeviceMounted("0123456",
94 kTestMounts,
95 buffer,
96 block_sizes[i],
97 &result));
98 EXPECT_FALSE(result);
99 EXPECT_TRUE(lib_.IsDeviceMounted("9abcde",
100 kTestMounts,
101 buffer,
102 block_sizes[i],
103 &result));
104 EXPECT_FALSE(result);
105 EXPECT_TRUE(lib_.IsDeviceMounted("foo",
106 kTestMounts,
107 buffer,
108 block_sizes[i],
109 &result));
110 EXPECT_FALSE(result);
111 EXPECT_TRUE(lib_.IsDeviceMounted("bar",
112 kTestMounts,
113 buffer,
114 block_sizes[i],
115 &result));
116 EXPECT_FALSE(result);
117 }
118}
119
Ken Mixter4c5daa42010-08-26 18:35:06 -0700120TEST_F(MetricsLibraryTest, AreMetricsEnabledFalse) {
Ken Mixterb2f17092011-07-22 14:59:51 -0700121 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
122 .WillOnce(SetMetricsPolicy(false));
Ken Mixter4c5daa42010-08-26 18:35:06 -0700123 EXPECT_FALSE(lib_.AreMetricsEnabled());
124}
125
126TEST_F(MetricsLibraryTest, AreMetricsEnabledTrue) {
127 EXPECT_TRUE(lib_.AreMetricsEnabled());
128}
129
130void MetricsLibraryTest::VerifyEnabledCacheHit(bool to_value) {
131 // We might step from one second to the next one time, but not 100
132 // times in a row.
133 for (int i = 0; i < 100; ++i) {
134 lib_.cached_enabled_time_ = 0;
Ken Mixterb2f17092011-07-22 14:59:51 -0700135 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
136 .WillOnce(SetMetricsPolicy(!to_value));
Ken Mixter4c5daa42010-08-26 18:35:06 -0700137 ASSERT_EQ(!to_value, lib_.AreMetricsEnabled());
Julian Pastarmov0e5debf2011-08-04 11:15:13 +0200138 ON_CALL(*device_policy_, GetMetricsEnabled(_))
139 .WillByDefault(SetMetricsPolicy(to_value));
Ken Mixter4c5daa42010-08-26 18:35:06 -0700140 if (lib_.AreMetricsEnabled() == !to_value)
141 return;
142 }
143 ADD_FAILURE() << "Did not see evidence of caching";
144}
145
146void MetricsLibraryTest::VerifyEnabledCacheEviction(bool to_value) {
147 lib_.cached_enabled_time_ = 0;
Ken Mixterb2f17092011-07-22 14:59:51 -0700148 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
149 .WillOnce(SetMetricsPolicy(!to_value));
Ken Mixter4c5daa42010-08-26 18:35:06 -0700150 ASSERT_EQ(!to_value, lib_.AreMetricsEnabled());
Ken Mixterb2f17092011-07-22 14:59:51 -0700151 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
152 .WillOnce(SetMetricsPolicy(to_value));
Ken Mixter4c5daa42010-08-26 18:35:06 -0700153 ASSERT_LT(abs(time(NULL) - lib_.cached_enabled_time_), 5);
154 // Sleep one second (or cheat to be faster).
155 --lib_.cached_enabled_time_;
156 ASSERT_EQ(to_value, lib_.AreMetricsEnabled());
157}
158
159TEST_F(MetricsLibraryTest, AreMetricsEnabledCaching) {
160 VerifyEnabledCacheHit(false);
161 VerifyEnabledCacheHit(true);
162 VerifyEnabledCacheEviction(false);
163 VerifyEnabledCacheEviction(true);
164}
165
Darin Petkov11b8eb32010-05-18 11:00:59 -0700166TEST_F(MetricsLibraryTest, FormatChromeMessage) {
167 char buf[7];
168 const int kLen = 6;
169 EXPECT_EQ(kLen, lib_.FormatChromeMessage(7, buf, "%d", 1));
170
171 char exp[kLen];
172 sprintf(exp, "%c%c%c%c1", kLen, 0, 0, 0);
173 EXPECT_EQ(0, memcmp(exp, buf, kLen));
174}
175
176TEST_F(MetricsLibraryTest, FormatChromeMessageTooLong) {
177 char buf[7];
178 EXPECT_EQ(-1, lib_.FormatChromeMessage(7, buf, "test"));
179}
180
181TEST_F(MetricsLibraryTest, SendEnumToUMA) {
182 char buf[100];
183 const int kLen = 40;
184 EXPECT_TRUE(lib_.SendEnumToUMA("Test.EnumMetric", 1, 3));
185 EXPECT_EQ(kLen, file_util::ReadFile(kTestUMAEventsFile, buf, 100));
186
187 char exp[kLen];
188 sprintf(exp, "%c%c%c%clinearhistogram%cTest.EnumMetric 1 3",
189 kLen, 0, 0, 0, 0);
190 EXPECT_EQ(0, memcmp(exp, buf, kLen));
191}
192
Ken Mixter4c5daa42010-08-26 18:35:06 -0700193TEST_F(MetricsLibraryTest, SendEnumToUMANotEnabled) {
Ken Mixterb2f17092011-07-22 14:59:51 -0700194 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
195 .WillOnce(SetMetricsPolicy(false));
Ken Mixter4c5daa42010-08-26 18:35:06 -0700196 EXPECT_TRUE(lib_.SendEnumToUMA("Test.EnumMetric", 1, 3));
197 EXPECT_FALSE(file_util::PathExists(kTestUMAEventsFile));
198}
199
Darin Petkov11b8eb32010-05-18 11:00:59 -0700200TEST_F(MetricsLibraryTest, SendMessageToChrome) {
201 EXPECT_TRUE(lib_.SendMessageToChrome(4, "test"));
202 EXPECT_TRUE(lib_.SendMessageToChrome(7, "content"));
203 std::string uma_events;
204 EXPECT_TRUE(file_util::ReadFileToString(kTestUMAEventsFile, &uma_events));
205 EXPECT_EQ("testcontent", uma_events);
206}
207
208TEST_F(MetricsLibraryTest, SendMessageToChromeUMAEventsBadFileLocation) {
209 // Checks that the library doesn't die badly if the file can't be
210 // created.
211 static const char kDoesNotExistFile[] = "/does/not/exist";
212 lib_.uma_events_file_ = kDoesNotExistFile;
213 static const char kDummyMessage[] = "Dummy Message";
214 EXPECT_FALSE(lib_.SendMessageToChrome(strlen(kDummyMessage), kDummyMessage));
215 file_util::Delete(FilePath(kDoesNotExistFile), false);
216}
217
218TEST_F(MetricsLibraryTest, SendToUMA) {
219 char buf[100];
220 const int kLen = 37;
221 EXPECT_TRUE(lib_.SendToUMA("Test.Metric", 2, 1, 100, 50));
222 EXPECT_EQ(kLen, file_util::ReadFile(kTestUMAEventsFile, buf, 100));
223
224 char exp[kLen];
225 sprintf(exp, "%c%c%c%chistogram%cTest.Metric 2 1 100 50", kLen, 0, 0, 0, 0);
226 EXPECT_EQ(0, memcmp(exp, buf, kLen));
227}
228
Ken Mixter4c5daa42010-08-26 18:35:06 -0700229TEST_F(MetricsLibraryTest, SendToUMANotEnabled) {
Ken Mixterb2f17092011-07-22 14:59:51 -0700230 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
231 .WillOnce(SetMetricsPolicy(false));
Ken Mixter4c5daa42010-08-26 18:35:06 -0700232 EXPECT_TRUE(lib_.SendToUMA("Test.Metric", 2, 1, 100, 50));
233 EXPECT_FALSE(file_util::PathExists(kTestUMAEventsFile));
234}
235
Darin Petkoved824852011-01-06 10:51:47 -0800236TEST_F(MetricsLibraryTest, SendUserActionToUMA) {
237 char buf[100];
238 const int kLen = 30;
239 EXPECT_TRUE(lib_.SendUserActionToUMA("SomeKeyPressed"));
240 EXPECT_EQ(kLen, file_util::ReadFile(kTestUMAEventsFile, buf, 100));
241
242 char exp[kLen];
243 sprintf(exp, "%c%c%c%cuseraction%cSomeKeyPressed", kLen, 0, 0, 0, 0);
244 EXPECT_EQ(0, memcmp(exp, buf, kLen));
245}
246
247TEST_F(MetricsLibraryTest, SendUserActionToUMANotEnabled) {
Ken Mixterb2f17092011-07-22 14:59:51 -0700248 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
249 .WillOnce(SetMetricsPolicy(false));
Darin Petkoved824852011-01-06 10:51:47 -0800250 EXPECT_TRUE(lib_.SendUserActionToUMA("SomeOtherKeyPressed"));
251 EXPECT_FALSE(file_util::PathExists(kTestUMAEventsFile));
252}
253
Ken Mixterbe2e13b2011-01-22 06:15:56 -0800254TEST_F(MetricsLibraryTest, SendCrashToUMAEnabled) {
255 EXPECT_TRUE(lib_.SendCrashToUMA("kernel"));
256 char exp[100];
257 int len = sprintf(exp, "%c%c%c%ccrash%ckernel",
258 0, 0, 0, 0, 0) + 1;
259 exp[0] = len;
260 char buf[100];
261 EXPECT_EQ(len, file_util::ReadFile(kTestUMAEventsFile, buf, 100));
262 EXPECT_EQ(0, memcmp(exp, buf, len));
263}
264
265TEST_F(MetricsLibraryTest, SendCrashToUMANotEnabled) {
Ken Mixterb2f17092011-07-22 14:59:51 -0700266 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
267 .WillOnce(SetMetricsPolicy(false));
Ken Mixterbe2e13b2011-01-22 06:15:56 -0800268 EXPECT_TRUE(lib_.SendCrashToUMA("kernel"));
269 EXPECT_FALSE(file_util::PathExists(kTestUMAEventsFile));
270}
271
Sam Leffler10b301d2010-06-17 14:22:43 -0700272class CMetricsLibraryTest : public testing::Test {
273 protected:
274 virtual void SetUp() {
275 lib_ = CMetricsLibraryNew();
276 MetricsLibrary& ml = *reinterpret_cast<MetricsLibrary*>(lib_);
277 EXPECT_EQ(NULL, ml.uma_events_file_);
278 CMetricsLibraryInit(lib_);
279 EXPECT_TRUE(NULL != ml.uma_events_file_);
280 ml.uma_events_file_ = kTestUMAEventsFile.value().c_str();
Ken Mixterb2f17092011-07-22 14:59:51 -0700281 device_policy_ = new policy::MockDevicePolicy();
282 EXPECT_CALL(*device_policy_, LoadPolicy())
283 .Times(AnyNumber())
284 .WillRepeatedly(Return(true));
285 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
286 .Times(AnyNumber())
287 .WillRepeatedly(SetMetricsPolicy(true));
288 provider_ = new policy::PolicyProvider(device_policy_);
289 ml.SetPolicyProvider(provider_);
Ken Mixter4c5daa42010-08-26 18:35:06 -0700290 reinterpret_cast<MetricsLibrary*>(lib_)->cached_enabled_time_ = 0;
Sam Leffler10b301d2010-06-17 14:22:43 -0700291 }
292
293 virtual void TearDown() {
294 CMetricsLibraryDelete(lib_);
295 file_util::Delete(kTestUMAEventsFile, false);
296 }
297
298 CMetricsLibrary lib_;
Ken Mixterb2f17092011-07-22 14:59:51 -0700299 policy::MockDevicePolicy* device_policy_;
300 policy::PolicyProvider* provider_;
Sam Leffler10b301d2010-06-17 14:22:43 -0700301};
302
Ken Mixter4c5daa42010-08-26 18:35:06 -0700303TEST_F(CMetricsLibraryTest, AreMetricsEnabledFalse) {
Ken Mixterb2f17092011-07-22 14:59:51 -0700304 EXPECT_CALL(*device_policy_, GetMetricsEnabled(_))
305 .WillOnce(SetMetricsPolicy(false));
Ken Mixter4c5daa42010-08-26 18:35:06 -0700306 EXPECT_FALSE(CMetricsLibraryAreMetricsEnabled(lib_));
307}
308
309TEST_F(CMetricsLibraryTest, AreMetricsEnabledTrue) {
310 EXPECT_TRUE(CMetricsLibraryAreMetricsEnabled(lib_));
311}
312
Sam Leffler10b301d2010-06-17 14:22:43 -0700313TEST_F(CMetricsLibraryTest, SendEnumToUMA) {
314 char buf[100];
315 const int kLen = 40;
316 EXPECT_TRUE(CMetricsLibrarySendEnumToUMA(lib_, "Test.EnumMetric", 1, 3));
317 EXPECT_EQ(kLen, file_util::ReadFile(kTestUMAEventsFile, buf, 100));
318
319 char exp[kLen];
320 sprintf(exp, "%c%c%c%clinearhistogram%cTest.EnumMetric 1 3",
321 kLen, 0, 0, 0, 0);
322 EXPECT_EQ(0, memcmp(exp, buf, kLen));
323}
324
325TEST_F(CMetricsLibraryTest, SendToUMA) {
326 char buf[100];
327 const int kLen = 37;
328 EXPECT_TRUE(CMetricsLibrarySendToUMA(lib_, "Test.Metric", 2, 1, 100, 50));
329 EXPECT_EQ(kLen, file_util::ReadFile(kTestUMAEventsFile, buf, 100));
330
331 char exp[kLen];
332 sprintf(exp, "%c%c%c%chistogram%cTest.Metric 2 1 100 50", kLen, 0, 0, 0, 0);
333 EXPECT_EQ(0, memcmp(exp, buf, kLen));
334}
335
Darin Petkoved824852011-01-06 10:51:47 -0800336TEST_F(CMetricsLibraryTest, SendUserActionToUMA) {
337 char buf[100];
338 const int kLen = 30;
339 EXPECT_TRUE(CMetricsLibrarySendUserActionToUMA(lib_, "SomeKeyPressed"));
340 EXPECT_EQ(kLen, file_util::ReadFile(kTestUMAEventsFile, buf, 100));
341
342 char exp[kLen];
343 sprintf(exp, "%c%c%c%cuseraction%cSomeKeyPressed", kLen, 0, 0, 0, 0);
344 EXPECT_EQ(0, memcmp(exp, buf, kLen));
345}
346
Ken Mixterbe2e13b2011-01-22 06:15:56 -0800347TEST_F(CMetricsLibraryTest, SendCrashToUMA) {
348 char buf[100];
349 char exp[100];
350 int len = sprintf(exp, "%c%c%c%ccrash%cuser", 0, 0, 0, 0, 0) + 1;
351 exp[0] = len;
352 EXPECT_TRUE(CMetricsLibrarySendCrashToUMA(lib_, "user"));
353 EXPECT_EQ(len, file_util::ReadFile(kTestUMAEventsFile, buf, 100));
354
355 EXPECT_EQ(0, memcmp(exp, buf, len));
356}
357
Darin Petkov11b8eb32010-05-18 11:00:59 -0700358int main(int argc, char** argv) {
359 testing::InitGoogleTest(&argc, argv);
360 return RUN_ALL_TESTS();
361}