diagnostics_metrics_message_handler_unittest.cc 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. // Copyright 2021 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/webui/diagnostics_ui/diagnostics_metrics_message_handler.h"
  5. #include "base/test/metrics/histogram_tester.h"
  6. #include "base/test/task_environment.h"
  7. #include "base/time/time.h"
  8. #include "content/public/test/test_web_ui.h"
  9. #include "testing/gtest/include/gtest/gtest.h"
  10. namespace ash {
  11. namespace diagnostics {
  12. namespace metrics {
  13. namespace {
  14. const base::TimeDelta kDefaultTimeDelta = base::Minutes(1);
  15. // Handler names:
  16. const char kRecordNavigation[] = "recordNavigation";
  17. // Metrics:
  18. const char kConnectivityOpenDurationMetric[] =
  19. "ChromeOS.DiagnosticsUi.Connectivity.OpenDuration";
  20. const char kInputOpenDurationMetric[] =
  21. "ChromeOS.DiagnosticsUi.Input.OpenDuration";
  22. const char kSystemOpenDurationMetric[] =
  23. "ChromeOS.DiagnosticsUi.System.OpenDuration";
  24. class DiagnosticsMetricsMessageHandlerTest : public testing::Test {
  25. public:
  26. DiagnosticsMetricsMessageHandlerTest()
  27. : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME),
  28. web_ui_(),
  29. histograms() {}
  30. ~DiagnosticsMetricsMessageHandlerTest() override = default;
  31. void InitializeHandler(NavigationView view) {
  32. handler_ = std::make_unique<DiagnosticsMetricsMessageHandler>(view);
  33. handler_->SetWebUiForTesting(&web_ui_);
  34. handler_->RegisterMessages();
  35. }
  36. void SendRecordNavigation(NavigationView from, NavigationView to) {
  37. base::Value::List args;
  38. args.Append(base::Value(static_cast<int>(from)));
  39. args.Append(base::Value(static_cast<int>(to)));
  40. web_ui_.HandleReceivedMessage(kRecordNavigation, args);
  41. task_environment_.RunUntilIdle();
  42. }
  43. protected:
  44. void AdvanceClock(base::TimeDelta delta) {
  45. task_environment_.FastForwardBy(delta);
  46. }
  47. base::test::TaskEnvironment task_environment_;
  48. content::TestWebUI web_ui_;
  49. std::unique_ptr<DiagnosticsMetricsMessageHandler> handler_;
  50. base::HistogramTester histograms;
  51. };
  52. } // namespace
  53. TEST_F(DiagnosticsMetricsMessageHandlerTest, AbleToRegisterMessages) {
  54. EXPECT_NO_FATAL_FAILURE(InitializeHandler(NavigationView::kInput));
  55. }
  56. TEST_F(DiagnosticsMetricsMessageHandlerTest, InitializedCorrectly) {
  57. NavigationView expected_view = NavigationView::kSystem;
  58. InitializeHandler(expected_view);
  59. AdvanceClock(kDefaultTimeDelta);
  60. EXPECT_EQ(expected_view, handler_->GetCurrentViewForTesting());
  61. EXPECT_EQ(kDefaultTimeDelta,
  62. handler_->GetElapsedNavigationTimeDeltaForTesting());
  63. }
  64. TEST_F(DiagnosticsMetricsMessageHandlerTest, HandleNoRecordNavigationMessage) {
  65. NavigationView expected_initial_view = NavigationView::kSystem;
  66. InitializeHandler(expected_initial_view);
  67. AdvanceClock(kDefaultTimeDelta);
  68. histograms.ExpectTotalCount(
  69. ash::diagnostics::metrics::kConnectivityOpenDurationMetric,
  70. /** count= */ 0);
  71. histograms.ExpectTotalCount(
  72. ash::diagnostics::metrics::kConnectivityOpenDurationMetric,
  73. /** count= */ 0);
  74. histograms.ExpectTotalCount(
  75. ash::diagnostics::metrics::kInputOpenDurationMetric, /** count= */ 0);
  76. EXPECT_EQ(expected_initial_view, handler_->GetCurrentViewForTesting());
  77. EXPECT_EQ(kDefaultTimeDelta,
  78. handler_->GetElapsedNavigationTimeDeltaForTesting());
  79. // Application shutdown should trigger metrics.
  80. handler_.reset();
  81. task_environment_.RunUntilIdle();
  82. histograms.ExpectTimeBucketCount(kSystemOpenDurationMetric,
  83. /** elapsed_time */ kDefaultTimeDelta,
  84. /** count= */ 1);
  85. histograms.ExpectTotalCount(
  86. ash::diagnostics::metrics::kSystemOpenDurationMetric, /** count= */ 1);
  87. histograms.ExpectTotalCount(
  88. ash::diagnostics::metrics::kConnectivityOpenDurationMetric,
  89. /** count= */ 0);
  90. histograms.ExpectTotalCount(
  91. ash::diagnostics::metrics::kInputOpenDurationMetric, /** count= */ 0);
  92. }
  93. TEST_F(DiagnosticsMetricsMessageHandlerTest, HandleRecordNavigationMessage) {
  94. NavigationView expected_initial_view = NavigationView::kSystem;
  95. InitializeHandler(expected_initial_view);
  96. EXPECT_EQ(expected_initial_view, handler_->GetCurrentViewForTesting());
  97. AdvanceClock(kDefaultTimeDelta);
  98. SendRecordNavigation(expected_initial_view, NavigationView::kConnectivity);
  99. EXPECT_EQ(NavigationView::kConnectivity,
  100. handler_->GetCurrentViewForTesting());
  101. EXPECT_EQ(base::Minutes(0),
  102. handler_->GetElapsedNavigationTimeDeltaForTesting());
  103. }
  104. TEST_F(DiagnosticsMetricsMessageHandlerTest,
  105. HandleRecordNavigationMultipleEvents) {
  106. NavigationView initial_view = NavigationView::kConnectivity;
  107. InitializeHandler(initial_view);
  108. AdvanceClock(kDefaultTimeDelta);
  109. histograms.ExpectTotalCount(kSystemOpenDurationMetric, /** count= */ 0);
  110. histograms.ExpectTotalCount(kConnectivityOpenDurationMetric, /** count= */ 0);
  111. histograms.ExpectTotalCount(kInputOpenDurationMetric, /** count= */ 0);
  112. EXPECT_EQ(NavigationView::kConnectivity,
  113. handler_->GetCurrentViewForTesting());
  114. EXPECT_EQ(kDefaultTimeDelta,
  115. handler_->GetElapsedNavigationTimeDeltaForTesting());
  116. // Subsequent record navigations will trigger metric recording.
  117. SendRecordNavigation(NavigationView::kConnectivity, NavigationView::kInput);
  118. AdvanceClock(kDefaultTimeDelta);
  119. histograms.ExpectTimeBucketCount(kConnectivityOpenDurationMetric,
  120. /** elapsed_time */ kDefaultTimeDelta,
  121. /** count= */ 1);
  122. EXPECT_EQ(NavigationView::kInput, handler_->GetCurrentViewForTesting());
  123. EXPECT_EQ(kDefaultTimeDelta,
  124. handler_->GetElapsedNavigationTimeDeltaForTesting());
  125. SendRecordNavigation(NavigationView::kInput, NavigationView::kSystem);
  126. AdvanceClock(kDefaultTimeDelta);
  127. histograms.ExpectTimeBucketCount(kInputOpenDurationMetric,
  128. /** elapsed_time */ kDefaultTimeDelta,
  129. /** count= */ 1);
  130. EXPECT_EQ(NavigationView::kSystem, handler_->GetCurrentViewForTesting());
  131. EXPECT_EQ(kDefaultTimeDelta,
  132. handler_->GetElapsedNavigationTimeDeltaForTesting());
  133. // Navigating to a screen you viewed before also updates metrics.
  134. SendRecordNavigation(NavigationView::kSystem, NavigationView::kConnectivity);
  135. AdvanceClock(kDefaultTimeDelta);
  136. histograms.ExpectTimeBucketCount(kSystemOpenDurationMetric,
  137. /** elapsed_time */ kDefaultTimeDelta,
  138. /** count= */ 1);
  139. EXPECT_EQ(NavigationView::kConnectivity,
  140. handler_->GetCurrentViewForTesting());
  141. EXPECT_EQ(kDefaultTimeDelta,
  142. handler_->GetElapsedNavigationTimeDeltaForTesting());
  143. // Application shutdown should trigger metrics.
  144. AdvanceClock(kDefaultTimeDelta);
  145. handler_.reset();
  146. histograms.ExpectTimeBucketCount(kConnectivityOpenDurationMetric,
  147. /** elapsed_time */ kDefaultTimeDelta,
  148. /** count= */ 1);
  149. histograms.ExpectTotalCount(kSystemOpenDurationMetric, /** count= */ 1);
  150. histograms.ExpectTotalCount(kConnectivityOpenDurationMetric, /** count= */ 2);
  151. histograms.ExpectTotalCount(kInputOpenDurationMetric, /** count= */ 1);
  152. }
  153. TEST_F(DiagnosticsMetricsMessageHandlerTest,
  154. HandleRecordNavigationWithoutArgs) {
  155. base::Value::List args;
  156. NavigationView expected_view = NavigationView::kSystem;
  157. InitializeHandler(expected_view);
  158. EXPECT_NO_FATAL_FAILURE(
  159. web_ui_.HandleReceivedMessage(kRecordNavigation, args));
  160. EXPECT_EQ(expected_view, handler_->GetCurrentViewForTesting());
  161. }
  162. TEST_F(DiagnosticsMetricsMessageHandlerTest, HandleRecordNavigationWithOneArg) {
  163. base::Value::List args;
  164. args.Append(base::Value(0));
  165. NavigationView expected_view = NavigationView::kSystem;
  166. InitializeHandler(expected_view);
  167. EXPECT_NO_FATAL_FAILURE(
  168. web_ui_.HandleReceivedMessage(kRecordNavigation, args));
  169. EXPECT_EQ(expected_view, handler_->GetCurrentViewForTesting());
  170. }
  171. TEST_F(DiagnosticsMetricsMessageHandlerTest,
  172. HandleRecordNavigationWithInvalidArgs) {
  173. base::Value::List args;
  174. args.Append(base::Value("0"));
  175. args.Append(base::Value());
  176. NavigationView expected_view = NavigationView::kSystem;
  177. InitializeHandler(expected_view);
  178. EXPECT_NO_FATAL_FAILURE(
  179. web_ui_.HandleReceivedMessage(kRecordNavigation, args));
  180. EXPECT_EQ(expected_view, handler_->GetCurrentViewForTesting());
  181. }
  182. TEST_F(DiagnosticsMetricsMessageHandlerTest,
  183. HandleRecordNavigationWithMatchingArgs) {
  184. base::Value::List args;
  185. args.Append(base::Value(1));
  186. args.Append(base::Value(1));
  187. NavigationView expected_view = NavigationView::kSystem;
  188. InitializeHandler(expected_view);
  189. EXPECT_NO_FATAL_FAILURE(
  190. web_ui_.HandleReceivedMessage(kRecordNavigation, args));
  191. EXPECT_EQ(expected_view, handler_->GetCurrentViewForTesting());
  192. }
  193. TEST_F(DiagnosticsMetricsMessageHandlerTest,
  194. HandleRecordNavigationWithOutOfRangeArgs) {
  195. base::Value::List args;
  196. args.Append(base::Value(-100));
  197. args.Append(base::Value(100));
  198. NavigationView expected_view = NavigationView::kSystem;
  199. InitializeHandler(expected_view);
  200. EXPECT_NO_FATAL_FAILURE(
  201. web_ui_.HandleReceivedMessage(kRecordNavigation, args));
  202. EXPECT_EQ(expected_view, handler_->GetCurrentViewForTesting());
  203. }
  204. } // namespace metrics
  205. } // namespace diagnostics
  206. } // namespace ash