screen_state_enabled_provider_unittest.cc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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/quick_pair/feature_status_tracker/screen_state_enabled_provider.h"
  5. #include <memory>
  6. #include "ash/test/ash_test_base.h"
  7. #include "base/test/mock_callback.h"
  8. #include "ui/display/fake/fake_display_snapshot.h"
  9. #include "ui/display/manager/display_manager.h"
  10. #include "ui/display/types/display_constants.h"
  11. namespace ash {
  12. namespace quick_pair {
  13. namespace {
  14. constexpr gfx::Size kDisplaySize{1024, 768};
  15. } // namespace
  16. class ScreenStateEnabledProviderTest : public AshTestBase {
  17. public:
  18. void SetUp() override {
  19. AshTestBase::SetUp();
  20. InitDisplaySnapshots();
  21. provider_ = std::make_unique<ScreenStateEnabledProvider>();
  22. }
  23. void InitDisplaySnapshots() {
  24. internal_on_snapshot_ =
  25. display::FakeDisplaySnapshot::Builder()
  26. .SetId(123u)
  27. .SetType(display::DISPLAY_CONNECTION_TYPE_INTERNAL)
  28. .SetNativeMode(kDisplaySize)
  29. .SetCurrentMode(kDisplaySize)
  30. .Build();
  31. // Null current_mode() is the signal for a disconnected internal display.
  32. EXPECT_TRUE(internal_on_snapshot_->current_mode() != nullptr);
  33. internal_off_snapshot_ =
  34. display::FakeDisplaySnapshot::Builder()
  35. .SetId(123u)
  36. .SetType(display::DISPLAY_CONNECTION_TYPE_INTERNAL)
  37. .SetNativeMode(kDisplaySize)
  38. .Build();
  39. EXPECT_FALSE(internal_off_snapshot_->current_mode() != nullptr);
  40. external_snapshot_ = display::FakeDisplaySnapshot::Builder()
  41. .SetId(456u)
  42. .SetType(display::DISPLAY_CONNECTION_TYPE_HDMI)
  43. .SetNativeMode(kDisplaySize)
  44. .AddMode(kDisplaySize)
  45. .Build();
  46. external_snapshot_->set_current_mode(external_snapshot_->native_mode());
  47. EXPECT_TRUE(external_snapshot_->current_mode() != nullptr);
  48. }
  49. void UpdateDisplays(bool external_on, bool internal_on) {
  50. std::vector<display::DisplaySnapshot*> outputs;
  51. if (internal_on) {
  52. outputs.push_back(internal_on_snapshot_.get());
  53. } else {
  54. outputs.push_back(internal_off_snapshot_.get());
  55. }
  56. if (external_on) {
  57. outputs.push_back(external_snapshot_.get());
  58. }
  59. provider_->OnDisplayModeChanged(outputs);
  60. }
  61. void TearDown() override {
  62. // Ensure our provider is destroyed before Ash TearDown
  63. provider_.reset();
  64. internal_on_snapshot_.reset();
  65. internal_off_snapshot_.reset();
  66. external_snapshot_.reset();
  67. AshTestBase::TearDown();
  68. }
  69. protected:
  70. std::unique_ptr<display::DisplaySnapshot> internal_on_snapshot_;
  71. std::unique_ptr<display::DisplaySnapshot> internal_off_snapshot_;
  72. std::unique_ptr<display::DisplaySnapshot> external_snapshot_;
  73. std::unique_ptr<ScreenStateEnabledProvider> provider_;
  74. };
  75. TEST_F(ScreenStateEnabledProviderTest, IsInitallyEnabled) {
  76. base::MockCallback<base::RepeatingCallback<void(bool)>> callback;
  77. EXPECT_CALL(callback, Run).Times(0);
  78. provider_->SetCallback(callback.Get());
  79. EXPECT_TRUE(provider_->is_enabled());
  80. }
  81. TEST_F(ScreenStateEnabledProviderTest, ExternalOffInternalOff) {
  82. base::MockCallback<base::RepeatingCallback<void(bool)>> callback;
  83. EXPECT_CALL(callback, Run(false));
  84. provider_->SetCallback(callback.Get());
  85. UpdateDisplays(/*external_on=*/false, /*internal_on=*/false);
  86. EXPECT_FALSE(provider_->is_enabled());
  87. }
  88. TEST_F(ScreenStateEnabledProviderTest, ExternalOnInternalOff) {
  89. // Start with screens disabled.
  90. UpdateDisplays(/*external_on=*/false, /*internal_on=*/false);
  91. EXPECT_FALSE(provider_->is_enabled());
  92. base::MockCallback<base::RepeatingCallback<void(bool)>> callback;
  93. EXPECT_CALL(callback, Run(true));
  94. provider_->SetCallback(callback.Get());
  95. UpdateDisplays(/*external_on=*/true, /*internal_on=*/false);
  96. EXPECT_TRUE(provider_->is_enabled());
  97. }
  98. TEST_F(ScreenStateEnabledProviderTest, ExternalOffInternalOn) {
  99. // Start with screens disabled.
  100. UpdateDisplays(/*external_on=*/false, /*internal_on=*/false);
  101. EXPECT_FALSE(provider_->is_enabled());
  102. base::MockCallback<base::RepeatingCallback<void(bool)>> callback;
  103. EXPECT_CALL(callback, Run(true));
  104. provider_->SetCallback(callback.Get());
  105. UpdateDisplays(/*external_on=*/false, /*internal_on=*/true);
  106. EXPECT_TRUE(provider_->is_enabled());
  107. }
  108. TEST_F(ScreenStateEnabledProviderTest, ExternalOnInternalOn) {
  109. // Start with screens disabled.
  110. UpdateDisplays(/*external_on=*/false, /*internal_on=*/false);
  111. EXPECT_FALSE(provider_->is_enabled());
  112. base::MockCallback<base::RepeatingCallback<void(bool)>> callback;
  113. EXPECT_CALL(callback, Run(true));
  114. provider_->SetCallback(callback.Get());
  115. UpdateDisplays(/*external_on=*/true, /*internal_on=*/true);
  116. EXPECT_TRUE(provider_->is_enabled());
  117. }
  118. } // namespace quick_pair
  119. } // namespace ash