summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbruthig <bruthig@chromium.org>2015-04-13 17:01:13 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-14 00:01:49 +0000
commit965a17ddac517f913ef767454521727ac6f5107d (patch)
tree2dbdd97655c1196d0b7a7a5392fa6ed9350f29c2
parentfc88a24cc7b2f7ba2b7f7f9e21a20bf85ce0db9e (diff)
downloadchromium_src-965a17ddac517f913ef767454521727ac6f5107d.zip
chromium_src-965a17ddac517f913ef767454521727ac6f5107d.tar.gz
chromium_src-965a17ddac517f913ef767454521727ac6f5107d.tar.bz2
Added test support to observe and verify UMA user actions during tests.
There are currently a few custom user action observers to record and verify UMA user actions during tests. This patch adds that support to a common location. TEST=UserActionTesterTest.GetActionCountWhenNoActionsHaveBeenRecorded TEST=UserActionTesterTest.GetActionCountWhenActionsHaveBeenRecorded TEST=UserActionTesterTest.ResetCountsWhenNoActionsHaveBeenRecorded TEST=UserActionTesterTest.ResetCountsWhenActionsHaveBeenRecorded TEST=UserActionTesterTest.VerifyUserActionTesterListensForUserActions BUG=475181 Review URL: https://codereview.chromium.org/1073613002 Cr-Commit-Position: refs/heads/master@{#324953}
-rw-r--r--base/BUILD.gn1
-rw-r--r--base/base.gyp3
-rw-r--r--base/test/BUILD.gn2
-rw-r--r--base/test/user_action_tester.cc35
-rw-r--r--base/test/user_action_tester.h46
-rw-r--r--base/test/user_action_tester_unittest.cc86
6 files changed, 173 insertions, 0 deletions
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 6223378..b9f134e 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1250,6 +1250,7 @@ test("base_unittests") {
"test/histogram_tester_unittest.cc",
"test/test_reg_util_win_unittest.cc",
"test/trace_event_analyzer_unittest.cc",
+ "test/user_action_tester_unittest.cc",
"threading/non_thread_safe_unittest.cc",
"threading/platform_thread_unittest.cc",
"threading/sequenced_worker_pool_unittest.cc",
diff --git a/base/base.gyp b/base/base.gyp
index bea8bc9..b9362b4 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -632,6 +632,7 @@
'test/test_pending_task_unittest.cc',
'test/test_reg_util_win_unittest.cc',
'test/trace_event_analyzer_unittest.cc',
+ 'test/user_action_tester_unittest.cc',
'threading/non_thread_safe_unittest.cc',
'threading/platform_thread_unittest.cc',
'threading/sequenced_worker_pool_unittest.cc',
@@ -1010,6 +1011,8 @@
'test/trace_event_analyzer.h',
'test/trace_to_file.cc',
'test/trace_to_file.h',
+ 'test/user_action_tester.cc',
+ 'test/user_action_tester.h',
'test/values_test_util.cc',
'test/values_test_util.h',
],
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index 6872aff..8baeb14 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -116,6 +116,8 @@ source_set("test_support") {
"trace_event_analyzer.h",
"trace_to_file.cc",
"trace_to_file.h",
+ "user_action_tester.cc",
+ "user_action_tester.h",
"values_test_util.cc",
"values_test_util.h",
]
diff --git a/base/test/user_action_tester.cc b/base/test/user_action_tester.cc
new file mode 100644
index 0000000..3fdab12
--- /dev/null
+++ b/base/test/user_action_tester.cc
@@ -0,0 +1,35 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/test/user_action_tester.h"
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+
+namespace base {
+
+UserActionTester::UserActionTester()
+ : action_callback_(
+ base::Bind(&UserActionTester::OnUserAction, base::Unretained(this))) {
+ base::AddActionCallback(action_callback_);
+}
+
+UserActionTester::~UserActionTester() {
+ base::RemoveActionCallback(action_callback_);
+}
+
+int UserActionTester::GetActionCount(const std::string& user_action) const {
+ UserActionCountMap::const_iterator iter = count_map_.find(user_action);
+ return iter == count_map_.end() ? 0 : iter->second;
+}
+
+void UserActionTester::ResetCounts() {
+ count_map_.clear();
+}
+
+void UserActionTester::OnUserAction(const std::string& user_action) {
+ ++(count_map_[user_action]);
+}
+
+} // namespace base
diff --git a/base/test/user_action_tester.h b/base/test/user_action_tester.h
new file mode 100644
index 0000000..6b0efc5
--- /dev/null
+++ b/base/test/user_action_tester.h
@@ -0,0 +1,46 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TEST_USER_ACTION_TESTER_H_
+#define BASE_TEST_USER_ACTION_TESTER_H_
+
+#include <map>
+#include <string>
+
+#include "base/metrics/user_metrics.h"
+
+namespace base {
+
+// This class observes and collects user action notifications that are sent
+// by the tests, so that they can be examined afterwards for correctness.
+// Note: This class is NOT thread-safe.
+class UserActionTester {
+ public:
+ UserActionTester();
+ ~UserActionTester();
+
+ // Returns the number of times the given |user_action| occurred.
+ int GetActionCount(const std::string& user_action) const;
+
+ // Resets all user action counts to 0.
+ void ResetCounts();
+
+ private:
+ typedef std::map<std::string, int> UserActionCountMap;
+
+ // The callback that is notified when a user actions occurs.
+ void OnUserAction(const std::string& user_action);
+
+ // A map that tracks the number of times a user action has occurred.
+ UserActionCountMap count_map_;
+
+ // The callback that is added to the global action callback list.
+ base::ActionCallback action_callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(UserActionTester);
+};
+
+} // namespace base
+
+#endif // BASE_TEST_USER_ACTION_TESTER_H_
diff --git a/base/test/user_action_tester_unittest.cc b/base/test/user_action_tester_unittest.cc
new file mode 100644
index 0000000..a51849f
--- /dev/null
+++ b/base/test/user_action_tester_unittest.cc
@@ -0,0 +1,86 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/test/user_action_tester.h"
+
+#include "base/metrics/user_metrics.h"
+#include "base/metrics/user_metrics_action.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+
+namespace {
+
+const char kUserAction1[] = "user.action.1";
+const char kUserAction2[] = "user.action.2";
+const char kUserAction3[] = "user.action.3";
+
+// Record an action and cause all ActionCallback observers to be notified.
+void RecordAction(const char user_action[]) {
+ base::RecordAction(base::UserMetricsAction(user_action));
+}
+
+} // namespace
+
+// Verify user action counts are zero initially.
+TEST(UserActionTesterTest, GetActionCountWhenNoActionsHaveBeenRecorded) {
+ UserActionTester user_action_tester;
+ EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction1));
+}
+
+// Verify user action counts are tracked properly.
+TEST(UserActionTesterTest, GetActionCountWhenActionsHaveBeenRecorded) {
+ UserActionTester user_action_tester;
+
+ RecordAction(kUserAction1);
+ RecordAction(kUserAction2);
+ RecordAction(kUserAction2);
+
+ EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
+ EXPECT_EQ(2, user_action_tester.GetActionCount(kUserAction2));
+ EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction3));
+}
+
+// Verify no seg faults occur when resetting action counts when none have been
+// recorded.
+TEST(UserActionTesterTest, ResetCountsWhenNoActionsHaveBeenRecorded) {
+ UserActionTester user_action_tester;
+ user_action_tester.ResetCounts();
+}
+
+// Verify user action counts are set to zero on a ResetCounts.
+TEST(UserActionTesterTest, ResetCountsWhenActionsHaveBeenRecorded) {
+ UserActionTester user_action_tester;
+
+ RecordAction(kUserAction1);
+ RecordAction(kUserAction1);
+ RecordAction(kUserAction2);
+ user_action_tester.ResetCounts();
+
+ EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction1));
+ EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction2));
+ EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction3));
+}
+
+// Verify the UserActionsTester is notified when base::RecordAction is called.
+TEST(UserActionTesterTest, VerifyUserActionTesterListensForUserActions) {
+ UserActionTester user_action_tester;
+
+ base::RecordAction(base::UserMetricsAction(kUserAction1));
+
+ EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
+}
+
+// Verify the UserActionsTester is notified when base::RecordComputedAction is
+// called.
+TEST(UserActionTesterTest,
+ VerifyUserActionTesterListensForComputedUserActions) {
+ UserActionTester user_action_tester;
+
+ base::RecordComputedAction(kUserAction1);
+
+ EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
+}
+
+} // namespace base