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