adaptive_charging_nudge_controller_unittest.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Copyright 2022 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 <string>
  5. #include "ash/constants/ash_pref_names.h"
  6. #include "ash/session/session_controller_impl.h"
  7. #include "ash/shell.h"
  8. #include "ash/system/power/adaptive_charging_nudge_controller.h"
  9. #include "ash/system/tray/system_nudge.h"
  10. #include "ash/test/ash_test_base.h"
  11. #include "base/run_loop.h"
  12. #include "ui/compositor/layer.h"
  13. #include "ui/compositor/layer_animator.h"
  14. #include "ui/compositor/scoped_animation_duration_scale_mode.h"
  15. #include "ui/views/controls/label.h"
  16. #include "ui/views/test/widget_test.h"
  17. #include "ui/views/widget/widget.h"
  18. namespace ash {
  19. namespace {
  20. // Enables or disables the user pref for the entire feature.
  21. void SetAdaptiveChargingPref(bool enabled) {
  22. Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean(
  23. prefs::kPowerAdaptiveChargingEnabled, enabled);
  24. base::RunLoop().RunUntilIdle();
  25. }
  26. } // namespace
  27. class AdaptiveChargingNudgeControllerTest : public AshTestBase {
  28. public:
  29. AdaptiveChargingNudgeControllerTest() = default;
  30. AdaptiveChargingNudgeControllerTest(
  31. const AdaptiveChargingNudgeControllerTest&) = delete;
  32. AdaptiveChargingNudgeControllerTest& operator=(
  33. const AdaptiveChargingNudgeControllerTest&) = delete;
  34. ~AdaptiveChargingNudgeControllerTest() override = default;
  35. // AshTestBase:
  36. void SetUp() override {
  37. AshTestBase::SetUp();
  38. controller_ = std::make_unique<AdaptiveChargingNudgeController>();
  39. }
  40. AdaptiveChargingNudgeController* GetController() { return controller_.get(); }
  41. void WaitForWidgetDestruction(AdaptiveChargingNudgeController* controller,
  42. SystemNudge* nudge) {
  43. views::Widget* nudge_widget = nudge->widget();
  44. ASSERT_TRUE(nudge_widget);
  45. EXPECT_FALSE(nudge_widget->IsClosed());
  46. // Slow down the duration of the nudge.
  47. ui::ScopedAnimationDurationScaleMode test_duration_mode(
  48. ui::ScopedAnimationDurationScaleMode::SLOW_DURATION);
  49. // Pretend the hide nudge timer has elapsed.
  50. controller->FireHideNudgeTimerForTesting();
  51. EXPECT_TRUE(nudge_widget->GetLayer()->GetAnimator()->is_animating());
  52. views::test::WidgetDestroyedWaiter widget_destroyed_waiter(nudge_widget);
  53. widget_destroyed_waiter.Wait();
  54. }
  55. private:
  56. std::unique_ptr<AdaptiveChargingNudgeController> controller_;
  57. };
  58. TEST_F(AdaptiveChargingNudgeControllerTest, ShowsAndHidesNudge) {
  59. AdaptiveChargingNudgeController* controller = GetController();
  60. ASSERT_TRUE(controller);
  61. SetAdaptiveChargingPref(true);
  62. controller->ShowNudge();
  63. ASSERT_TRUE(controller->GetNudgeDelayTimerForTesting()->IsRunning());
  64. controller->GetNudgeDelayTimerForTesting()->FireNow();
  65. SystemNudge* nudge = controller->GetSystemNudgeForTesting();
  66. ASSERT_TRUE(nudge);
  67. WaitForWidgetDestruction(controller, nudge);
  68. }
  69. TEST_F(AdaptiveChargingNudgeControllerTest, NoNudgeShowForDisabledFeature) {
  70. AdaptiveChargingNudgeController* controller = GetController();
  71. ASSERT_TRUE(controller);
  72. SetAdaptiveChargingPref(false);
  73. controller->ShowNudge();
  74. ASSERT_FALSE(controller->GetNudgeDelayTimerForTesting());
  75. SystemNudge* nudge = controller->GetSystemNudgeForTesting();
  76. ASSERT_FALSE(nudge);
  77. }
  78. TEST_F(AdaptiveChargingNudgeControllerTest, NudgeShowExactlyOnce) {
  79. AdaptiveChargingNudgeController* controller = GetController();
  80. ASSERT_TRUE(controller);
  81. SetAdaptiveChargingPref(true);
  82. // First time, nudge is shown.
  83. controller->ShowNudge();
  84. ASSERT_TRUE(controller->GetNudgeDelayTimerForTesting()->IsRunning());
  85. controller->GetNudgeDelayTimerForTesting()->FireNow();
  86. SystemNudge* nudge1 = controller->GetSystemNudgeForTesting();
  87. ASSERT_TRUE(nudge1);
  88. WaitForWidgetDestruction(controller, nudge1);
  89. // No nudge for the second time.
  90. controller->ShowNudge();
  91. ASSERT_FALSE(controller->GetNudgeDelayTimerForTesting()->IsRunning());
  92. SystemNudge* nudge2 = controller->GetSystemNudgeForTesting();
  93. ASSERT_FALSE(nudge2);
  94. }
  95. } // namespace ash