application_breadcrumbs_logger_unittest.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright 2020 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 "components/breadcrumbs/core/application_breadcrumbs_logger.h"
  5. #include "base/files/scoped_temp_dir.h"
  6. #include "base/memory/memory_pressure_listener.h"
  7. #include "base/metrics/user_metrics_action.h"
  8. #include "base/run_loop.h"
  9. #include "base/test/task_environment.h"
  10. #include "components/breadcrumbs/core/breadcrumb_manager.h"
  11. #include "components/breadcrumbs/core/breadcrumb_util.h"
  12. #include "testing/gtest/include/gtest/gtest.h"
  13. #include "testing/platform_test.h"
  14. namespace breadcrumbs {
  15. namespace {
  16. // The particular UserActions used here are not important, but real UserAction
  17. // names are used to prevent a presubmit warning.
  18. const char kUserAction1Name[] = "MobileMenuNewTab";
  19. const char kUserAction2Name[] = "OverscrollActionCloseTab";
  20. // An "InProductHelp.*" user action.
  21. const char kInProductHelpUserActionName[] = "InProductHelp.Dismissed";
  22. } // namespace
  23. // Test fixture for testing ApplicationBreadcrumbsLogger class.
  24. class ApplicationBreadcrumbsLoggerTest : public PlatformTest {
  25. protected:
  26. ApplicationBreadcrumbsLoggerTest() {
  27. base::SetRecordActionTaskRunner(
  28. task_environment_.GetMainThreadTaskRunner());
  29. CHECK(temp_dir_.CreateUniqueTempDir());
  30. logger_ = std::make_unique<ApplicationBreadcrumbsLogger>(
  31. temp_dir_.GetPath(),
  32. /*is_metrics_enabled_callback=*/base::BindRepeating(
  33. [] { return true; }));
  34. }
  35. // This must be created before `task_environment_`, to ensure that any tasks
  36. // that depend on the directory existing (e.g., those posted by `logger_`)
  37. // have finished.
  38. base::ScopedTempDir temp_dir_;
  39. base::test::TaskEnvironment task_environment_;
  40. std::unique_ptr<ApplicationBreadcrumbsLogger> logger_;
  41. };
  42. // Tests that a recorded UserAction is logged by the
  43. // ApplicationBreadcrumbsLogger.
  44. TEST_F(ApplicationBreadcrumbsLoggerTest, UserAction) {
  45. ASSERT_EQ(1U, logger_->GetEventsForTesting().size()); // startup event
  46. base::RecordAction(base::UserMetricsAction(kUserAction1Name));
  47. base::RecordAction(base::UserMetricsAction(kUserAction2Name));
  48. std::list<std::string> events = logger_->GetEventsForTesting();
  49. ASSERT_EQ(3ul, events.size());
  50. events.pop_front();
  51. EXPECT_NE(std::string::npos, events.front().find(kUserAction1Name));
  52. events.pop_front();
  53. EXPECT_NE(std::string::npos, events.front().find(kUserAction2Name));
  54. }
  55. // Tests that not_user_triggered User Action does not show up in breadcrumbs.
  56. TEST_F(ApplicationBreadcrumbsLoggerTest, LogNotUserTriggeredAction) {
  57. ASSERT_EQ(1U, logger_->GetEventsForTesting().size()); // startup event
  58. base::RecordAction(base::UserMetricsAction("ActiveTabChanged"));
  59. EXPECT_EQ(1U, logger_->GetEventsForTesting().size());
  60. }
  61. // Tests that "InProductHelp" UserActions are not logged by
  62. // ApplicationBreadcrumbsLogger as they are very noisy.
  63. TEST_F(ApplicationBreadcrumbsLoggerTest, SkipInProductHelpUserActions) {
  64. ASSERT_EQ(1U, logger_->GetEventsForTesting().size()); // startup event
  65. base::RecordAction(base::UserMetricsAction(kInProductHelpUserActionName));
  66. const std::list<std::string>& events = logger_->GetEventsForTesting();
  67. ASSERT_EQ(1ul, events.size());
  68. }
  69. // Tests that memory pressure events are logged by ApplicationBreadcrumbsLogger.
  70. // Test is flaky (https://crbug.com/1305253)
  71. TEST_F(ApplicationBreadcrumbsLoggerTest, MemoryPressure) {
  72. ASSERT_EQ(1U, logger_->GetEventsForTesting().size()); // startup event
  73. base::MemoryPressureListener::SimulatePressureNotification(
  74. base::MemoryPressureListener::MemoryPressureLevel::
  75. MEMORY_PRESSURE_LEVEL_MODERATE);
  76. base::MemoryPressureListener::SimulatePressureNotification(
  77. base::MemoryPressureListener::MemoryPressureLevel::
  78. MEMORY_PRESSURE_LEVEL_CRITICAL);
  79. base::RunLoop().RunUntilIdle();
  80. std::list<std::string> events = logger_->GetEventsForTesting();
  81. ASSERT_EQ(3ul, events.size());
  82. // Pop startup.
  83. events.pop_front();
  84. EXPECT_NE(std::string::npos, events.front().find("Moderate"));
  85. // Ensure UserAction events are labeled as such.
  86. EXPECT_NE(std::string::npos, events.front().find("Memory Pressure: "));
  87. events.pop_front();
  88. EXPECT_NE(std::string::npos, events.front().find("Critical"));
  89. }
  90. } // namespace breadcrumbs