projecting_observer_chromeos_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom// Copyright 2014 The Chromium Authors. All rights reserved.
243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom// Use of this source code is governed by a BSD-style license that can be
343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom// found in the LICENSE file.
443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#include "ash/display/projecting_observer_chromeos.h"
643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#include "chromeos/dbus/fake_dbus_thread_manager.h"
843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#include "chromeos/dbus/fake_power_manager_client.h"
943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#include "testing/gtest/include/gtest/gtest.h"
1043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
1143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromnamespace ash {
1243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
1343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromnamespace internal {
1443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
1543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromnamespace {
1643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
1743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromui::OutputConfigurator::OutputSnapshot CreateInternalSnapshot() {
1843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  ui::OutputConfigurator::OutputSnapshot output;
1943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  output.type = ui::OUTPUT_TYPE_INTERNAL;
2043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  return output;
2143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
2243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
2343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromui::OutputConfigurator::OutputSnapshot CreateVGASnapshot() {
2443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  ui::OutputConfigurator::OutputSnapshot output;
2543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  output.type = ui::OUTPUT_TYPE_VGA;
2643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  return output;
2743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
2843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
2943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromclass ProjectingObserverTest : public testing::Test {
3043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom public:
3143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  ProjectingObserverTest() : observer_(new ProjectingObserver()) {
3243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    chromeos::FakeDBusThreadManager* dbus_manager =
3343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom        new chromeos::FakeDBusThreadManager();
3443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    fake_power_client_ = new chromeos::FakePowerManagerClient();
3543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
3643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    dbus_manager->SetPowerManagerClient(
3743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom        scoped_ptr<chromeos::PowerManagerClient>(fake_power_client_));
3843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
3943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    // Takes ownership of |dbus_manager|.
4043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    chromeos::DBusThreadManager::InitializeForTesting(dbus_manager);
4143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  }
4243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
4343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  virtual ~ProjectingObserverTest() {
4443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    chromeos::DBusThreadManager::Shutdown();
4543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  }
4643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
4743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom protected:
4843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  scoped_ptr<ProjectingObserver> observer_;
4943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  chromeos::FakePowerManagerClient* fake_power_client_;  //  Not owned.
5043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
5143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  DISALLOW_COPY_AND_ASSIGN(ProjectingObserverTest);
5243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom};
5343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
5443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}  // namespace
5543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
5643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromTEST_F(ProjectingObserverTest, CheckNoDisplay) {
5743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
5843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  observer_->OnDisplayModeChanged(outputs);
5943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
6043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
6143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_FALSE(fake_power_client_->is_projecting());
6243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
6343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
6443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromTEST_F(ProjectingObserverTest, CheckWithoutInternalDisplay) {
6543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
6643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  outputs.push_back(CreateVGASnapshot());
6743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  observer_->OnDisplayModeChanged(outputs);
6843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
6943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
7043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_FALSE(fake_power_client_->is_projecting());
7143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
7243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
7343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromTEST_F(ProjectingObserverTest, CheckWithInternalDisplay) {
7443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
7543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  outputs.push_back(CreateInternalSnapshot());
7643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  observer_->OnDisplayModeChanged(outputs);
7743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
7843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
7943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_FALSE(fake_power_client_->is_projecting());
8043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
8143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
8243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromTEST_F(ProjectingObserverTest, CheckWithTwoVGADisplays) {
8343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
8443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  outputs.push_back(CreateVGASnapshot());
8543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  outputs.push_back(CreateVGASnapshot());
8643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  observer_->OnDisplayModeChanged(outputs);
8743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
8843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
8943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  // We need at least 1 internal display to set projecting to on.
9043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_FALSE(fake_power_client_->is_projecting());
9143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
9243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
9343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromTEST_F(ProjectingObserverTest, CheckWithInternalAndVGADisplays) {
9443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
9543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  outputs.push_back(CreateInternalSnapshot());
9643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  outputs.push_back(CreateVGASnapshot());
9743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  observer_->OnDisplayModeChanged(outputs);
9843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
9943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
10043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_TRUE(fake_power_client_->is_projecting());
10143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
102ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom
10343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromTEST_F(ProjectingObserverTest, CheckWithVGADisplayAndOneCastingSession) {
10443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
10543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  outputs.push_back(CreateVGASnapshot());
10643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  observer_->OnDisplayModeChanged(outputs);
10743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
10843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  observer_->OnCastingSessionStartedOrStopped(true);
109ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom
11043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_EQ(2, fake_power_client_->num_set_is_projecting_calls());
11143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  // Need at least one internal display to set projecting state to |true|.
11243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_FALSE(fake_power_client_->is_projecting());
11343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
11443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
11543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromTEST_F(ProjectingObserverTest, CheckWithInternalDisplayAndOneCastingSession) {
11643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
11743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  outputs.push_back(CreateInternalSnapshot());
11843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  observer_->OnDisplayModeChanged(outputs);
11943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
12043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  observer_->OnCastingSessionStartedOrStopped(true);
12143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
12243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  EXPECT_EQ(2, fake_power_client_->num_set_is_projecting_calls());
123ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom  EXPECT_TRUE(fake_power_client_->is_projecting());
12443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
12543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
12643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromTEST_F(ProjectingObserverTest, CheckProjectingAfterClosingACastingSession) {
127  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
128  outputs.push_back(CreateInternalSnapshot());
129  observer_->OnDisplayModeChanged(outputs);
130
131  observer_->OnCastingSessionStartedOrStopped(true);
132  observer_->OnCastingSessionStartedOrStopped(true);
133
134  EXPECT_EQ(3, fake_power_client_->num_set_is_projecting_calls());
135  EXPECT_TRUE(fake_power_client_->is_projecting());
136
137  observer_->OnCastingSessionStartedOrStopped(false);
138
139  EXPECT_EQ(4, fake_power_client_->num_set_is_projecting_calls());
140  EXPECT_TRUE(fake_power_client_->is_projecting());
141}
142
143TEST_F(ProjectingObserverTest,
144       CheckStopProjectingAfterClosingAllCastingSessions) {
145  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
146  outputs.push_back(CreateInternalSnapshot());
147  observer_->OnDisplayModeChanged(outputs);
148
149  observer_->OnCastingSessionStartedOrStopped(true);
150  observer_->OnCastingSessionStartedOrStopped(false);
151
152  EXPECT_EQ(3, fake_power_client_->num_set_is_projecting_calls());
153  EXPECT_FALSE(fake_power_client_->is_projecting());
154}
155
156TEST_F(ProjectingObserverTest,
157       CheckStopProjectingAfterDisconnectingSecondOutput) {
158  std::vector<ui::OutputConfigurator::OutputSnapshot> outputs;
159  outputs.push_back(CreateInternalSnapshot());
160  outputs.push_back(CreateVGASnapshot());
161  observer_->OnDisplayModeChanged(outputs);
162
163  // Remove VGA output.
164  outputs.erase(outputs.begin() + 1);
165  observer_->OnDisplayModeChanged(outputs);
166
167  EXPECT_EQ(2, fake_power_client_->num_set_is_projecting_calls());
168  EXPECT_FALSE(fake_power_client_->is_projecting());
169}
170
171}  // namespace internal
172
173}  // namespace ash
174