diff options
author | bruthig <bruthig@chromium.org> | 2015-04-13 17:01:13 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-14 00:01:49 +0000 |
commit | 965a17ddac517f913ef767454521727ac6f5107d (patch) | |
tree | 2dbdd97655c1196d0b7a7a5392fa6ed9350f29c2 | |
parent | fc88a24cc7b2f7ba2b7f7f9e21a20bf85ce0db9e (diff) | |
download | chromium_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.gn | 1 | ||||
-rw-r--r-- | base/base.gyp | 3 | ||||
-rw-r--r-- | base/test/BUILD.gn | 2 | ||||
-rw-r--r-- | base/test/user_action_tester.cc | 35 | ||||
-rw-r--r-- | base/test/user_action_tester.h | 46 | ||||
-rw-r--r-- | base/test/user_action_tester_unittest.cc | 86 |
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 |