shelf_button_pressed_metric_tracker_unittest.cc 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. // Copyright 2015 The Chromium 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. #include "ash/shelf/shelf_button_pressed_metric_tracker.h"
  5. #include <utility>
  6. #include "ash/shelf/shelf.h"
  7. #include "ash/shelf/shelf_button_pressed_metric_tracker_test_api.h"
  8. #include "ash/shelf/shelf_view_test_api.h"
  9. #include "ash/test/ash_test_base.h"
  10. #include "base/test/metrics/histogram_tester.h"
  11. #include "base/test/metrics/user_action_tester.h"
  12. #include "base/test/simple_test_tick_clock.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. #include "ui/events/event.h"
  15. #include "ui/events/test/test_event.h"
  16. #include "ui/views/controls/button/button.h"
  17. namespace ash {
  18. namespace {
  19. // A simple light weight test double dummy for a views::Button.
  20. class DummyButton : public views::Button {
  21. public:
  22. DummyButton();
  23. DummyButton(const DummyButton&) = delete;
  24. DummyButton& operator=(const DummyButton&) = delete;
  25. };
  26. DummyButton::DummyButton() : views::Button(views::Button::PressedCallback()) {}
  27. // Test fixture for the ShelfButtonPressedMetricTracker class. Relies on
  28. // AshTestBase to initilize the UserMetricsRecorder and it's dependencies.
  29. class ShelfButtonPressedMetricTrackerTest : public AshTestBase {
  30. public:
  31. static const char*
  32. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName;
  33. ShelfButtonPressedMetricTrackerTest();
  34. ShelfButtonPressedMetricTrackerTest(
  35. const ShelfButtonPressedMetricTrackerTest&) = delete;
  36. ShelfButtonPressedMetricTrackerTest& operator=(
  37. const ShelfButtonPressedMetricTrackerTest&) = delete;
  38. ~ShelfButtonPressedMetricTrackerTest() override;
  39. // AshTestBase:
  40. void SetUp() override;
  41. void TearDown() override;
  42. // Calls ButtonPressed on the test target with the given |event|
  43. // and dummy values for the |sender| and |performed_action| parameters.
  44. void ButtonPressed(const ui::Event& event);
  45. // Calls ButtonPressed on the test target with the given |performed_action|
  46. // and dummy values for the |event| and |sender| parameters.
  47. void ButtonPressed(ShelfAction performed_action);
  48. // Calls ButtonPressed on the test target with the given |sender| and
  49. // |performed_action| and a dummy value for the |event| parameter.
  50. void ButtonPressed(const views::Button* sender, ShelfAction performed_action);
  51. protected:
  52. // The test target. Not owned.
  53. ShelfButtonPressedMetricTracker* metric_tracker_;
  54. // The TickClock injected in to the test target.
  55. base::SimpleTestTickClock tick_clock_;
  56. };
  57. const char* ShelfButtonPressedMetricTrackerTest::
  58. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName =
  59. ShelfButtonPressedMetricTracker::
  60. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName;
  61. ShelfButtonPressedMetricTrackerTest::ShelfButtonPressedMetricTrackerTest() =
  62. default;
  63. ShelfButtonPressedMetricTrackerTest::~ShelfButtonPressedMetricTrackerTest() =
  64. default;
  65. void ShelfButtonPressedMetricTrackerTest::SetUp() {
  66. AshTestBase::SetUp();
  67. Shelf* shelf = GetPrimaryShelf();
  68. ShelfViewTestAPI shelf_view_test_api(shelf->GetShelfViewForTesting());
  69. metric_tracker_ = shelf_view_test_api.shelf_button_pressed_metric_tracker();
  70. ShelfButtonPressedMetricTrackerTestAPI test_api(metric_tracker_);
  71. test_api.SetTickClock(&tick_clock_);
  72. // Ensure the TickClock->NowTicks() doesn't return base::TimeTicks because
  73. // ShelfButtonPressedMetricTracker interprets that value as unset.
  74. tick_clock_.Advance(base::Milliseconds(100));
  75. }
  76. void ShelfButtonPressedMetricTrackerTest::TearDown() {
  77. AshTestBase::TearDown();
  78. }
  79. void ShelfButtonPressedMetricTrackerTest::ButtonPressed(
  80. const ui::Event& event) {
  81. const DummyButton kDummyButton;
  82. metric_tracker_->ButtonPressed(event, &kDummyButton, SHELF_ACTION_NONE);
  83. }
  84. void ShelfButtonPressedMetricTrackerTest::ButtonPressed(
  85. ShelfAction performed_action) {
  86. const ui::test::TestEvent kDummyEvent(ui::ET_GESTURE_TAP);
  87. const DummyButton kDummyButton;
  88. metric_tracker_->ButtonPressed(kDummyEvent, &kDummyButton, performed_action);
  89. }
  90. void ShelfButtonPressedMetricTrackerTest::ButtonPressed(
  91. const views::Button* sender,
  92. ShelfAction performed_action) {
  93. const ui::test::TestEvent kDummyEvent(ui::ET_GESTURE_TAP);
  94. metric_tracker_->ButtonPressed(kDummyEvent, sender, performed_action);
  95. }
  96. } // namespace
  97. // Verifies that a Launcher_ButtonPressed_Mouse UMA user action is recorded when
  98. // a button is pressed by a mouse event.
  99. TEST_F(ShelfButtonPressedMetricTrackerTest,
  100. Launcher_ButtonPressed_MouseIsRecordedWhenIconActivatedByMouse) {
  101. const ui::MouseEvent mouse_event(ui::ET_MOUSE_PRESSED, gfx::Point(),
  102. gfx::Point(), base::TimeTicks(), 0, 0);
  103. base::UserActionTester user_action_tester;
  104. ButtonPressed(mouse_event);
  105. EXPECT_EQ(1,
  106. user_action_tester.GetActionCount("Launcher_ButtonPressed_Mouse"));
  107. }
  108. // Verifies that a Launcher_ButtonPressed_Touch UMA user action is recorded when
  109. // a button is pressed by a touch event.
  110. TEST_F(ShelfButtonPressedMetricTrackerTest,
  111. Launcher_ButtonPressed_MouseIsRecordedWhenIconActivatedByTouch) {
  112. const ui::TouchEvent touch_event(
  113. ui::ET_GESTURE_TAP, gfx::Point(), base::TimeTicks(),
  114. ui::PointerDetails(ui::EventPointerType::kTouch, 0));
  115. base::UserActionTester user_action_tester;
  116. ButtonPressed(touch_event);
  117. EXPECT_EQ(1,
  118. user_action_tester.GetActionCount("Launcher_ButtonPressed_Touch"));
  119. }
  120. // Verifies that a Launcher_LaunchTask UMA user action is recorded when
  121. // pressing a button causes a new window to be created.
  122. TEST_F(ShelfButtonPressedMetricTrackerTest,
  123. Launcher_LaunchTaskIsRecordedWhenNewWindowIsCreated) {
  124. base::UserActionTester user_action_tester;
  125. ButtonPressed(SHELF_ACTION_NEW_WINDOW_CREATED);
  126. EXPECT_EQ(1, user_action_tester.GetActionCount("Launcher_LaunchTask"));
  127. }
  128. // Verifies that a Launcher_MinimizeTask UMA user action is recorded when
  129. // pressing a button causes an existing window to be minimized.
  130. TEST_F(ShelfButtonPressedMetricTrackerTest,
  131. Launcher_MinimizeTaskIsRecordedWhenWindowIsMinimized) {
  132. base::UserActionTester user_action_tester;
  133. ButtonPressed(SHELF_ACTION_WINDOW_MINIMIZED);
  134. EXPECT_EQ(1, user_action_tester.GetActionCount("Launcher_MinimizeTask"));
  135. }
  136. // Verifies that a Launcher_SwitchTask UMA user action is recorded when
  137. // pressing a button causes an existing window to be activated.
  138. TEST_F(ShelfButtonPressedMetricTrackerTest,
  139. Launcher_SwitchTaskIsRecordedWhenExistingWindowIsActivated) {
  140. base::UserActionTester user_action_tester;
  141. ButtonPressed(SHELF_ACTION_WINDOW_ACTIVATED);
  142. EXPECT_EQ(1, user_action_tester.GetActionCount("Launcher_SwitchTask"));
  143. }
  144. // Verify that a window activation action will record a data point if it was
  145. // subsequent to a minimize action.
  146. TEST_F(ShelfButtonPressedMetricTrackerTest,
  147. VerifyDataRecordedAfterMinimizedAndSubsequentActivatedAction) {
  148. const DummyButton kDummyButton;
  149. base::HistogramTester histogram_tester;
  150. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_MINIMIZED);
  151. histogram_tester.ExpectTotalCount(
  152. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName, 0);
  153. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_ACTIVATED);
  154. histogram_tester.ExpectTotalCount(
  155. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName, 1);
  156. }
  157. // Verify that a multiple window activation actions will record a single data
  158. // point if they are subsequent to a minimize action.
  159. TEST_F(ShelfButtonPressedMetricTrackerTest,
  160. VerifyDataRecordedAfterMinimizedAndMultipleSubsequentActivatedActions) {
  161. const DummyButton kDummyButton;
  162. base::HistogramTester histogram_tester;
  163. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_MINIMIZED);
  164. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_ACTIVATED);
  165. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_ACTIVATED);
  166. histogram_tester.ExpectTotalCount(
  167. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName, 1);
  168. }
  169. // Verify that a window activation action will not record a data point if it was
  170. // not subsequent to a minimize action.
  171. TEST_F(ShelfButtonPressedMetricTrackerTest,
  172. VerifyDataRecordedAfterMinimizedAndNonSubsequentActivatedAction) {
  173. const DummyButton kDummyButton;
  174. base::HistogramTester histogram_tester;
  175. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_MINIMIZED);
  176. ButtonPressed(&kDummyButton, SHELF_ACTION_APP_LIST_SHOWN);
  177. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_ACTIVATED);
  178. histogram_tester.ExpectTotalCount(
  179. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName, 0);
  180. }
  181. // Verify no data is recorded if a second source button is pressed in between
  182. // subsequent minimized and activated actions on the same source.
  183. TEST_F(ShelfButtonPressedMetricTrackerTest,
  184. VerifyDataRecordedAfterMinimizedButtonA) {
  185. const DummyButton kDummyButton;
  186. const DummyButton kSecondDummyButton;
  187. base::HistogramTester histogram_tester;
  188. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_MINIMIZED);
  189. ButtonPressed(&kSecondDummyButton, SHELF_ACTION_WINDOW_MINIMIZED);
  190. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_ACTIVATED);
  191. histogram_tester.ExpectTotalCount(
  192. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName, 0);
  193. }
  194. // Verify the data value recorded when a window activation action is subsequent
  195. // to a minimize action.
  196. TEST_F(ShelfButtonPressedMetricTrackerTest,
  197. VerifyTheValueRecordedBySubsequentMinimizedAndActivateActions) {
  198. const int kTimeDeltaInMilliseconds = 17;
  199. const DummyButton kDummyButton;
  200. base::HistogramTester histogram_tester;
  201. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_MINIMIZED);
  202. tick_clock_.Advance(base::Milliseconds(kTimeDeltaInMilliseconds));
  203. ButtonPressed(&kDummyButton, SHELF_ACTION_WINDOW_ACTIVATED);
  204. histogram_tester.ExpectTotalCount(
  205. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName, 1);
  206. histogram_tester.ExpectBucketCount(
  207. kTimeBetweenWindowMinimizedAndActivatedActionsHistogramName,
  208. kTimeDeltaInMilliseconds, 1);
  209. }
  210. } // namespace ash