Home | History | Annotate | Download | only in display
      1 // Copyright 2014 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 
      5 #include "ash/display/projecting_observer_chromeos.h"
      6 
      7 #include "base/memory/scoped_vector.h"
      8 #include "chromeos/dbus/fake_dbus_thread_manager.h"
      9 #include "chromeos/dbus/fake_power_manager_client.h"
     10 #include "testing/gtest/include/gtest/gtest.h"
     11 #include "ui/display/chromeos/test/test_display_snapshot.h"
     12 
     13 namespace ash {
     14 namespace {
     15 
     16 ui::TestDisplaySnapshot* CreateInternalSnapshot() {
     17   ui::TestDisplaySnapshot* output = new ui::TestDisplaySnapshot();
     18   output->set_type(ui::DISPLAY_CONNECTION_TYPE_INTERNAL);
     19   return output;
     20 }
     21 
     22 ui::TestDisplaySnapshot* CreateVGASnapshot() {
     23   ui::TestDisplaySnapshot* output = new ui::TestDisplaySnapshot();
     24   output->set_type(ui::DISPLAY_CONNECTION_TYPE_VGA);
     25   return output;
     26 }
     27 
     28 ui::DisplayConfigurator::DisplayStateList CreateOutputs(
     29     const ScopedVector<ui::TestDisplaySnapshot>& displays) {
     30   ui::DisplayConfigurator::DisplayStateList outputs;
     31   for (size_t i = 0; i < displays.size(); ++i) {
     32     ui::DisplayConfigurator::DisplayState state;
     33     state.display = displays[i];
     34     outputs.push_back(state);
     35   }
     36 
     37   return outputs;
     38 }
     39 
     40 class ProjectingObserverTest : public testing::Test {
     41  public:
     42   ProjectingObserverTest() : observer_(new ProjectingObserver()) {
     43     chromeos::FakeDBusThreadManager* dbus_manager =
     44         new chromeos::FakeDBusThreadManager();
     45     fake_power_client_ = new chromeos::FakePowerManagerClient();
     46 
     47     dbus_manager->SetPowerManagerClient(
     48         scoped_ptr<chromeos::PowerManagerClient>(fake_power_client_));
     49 
     50     // Takes ownership of |dbus_manager|.
     51     chromeos::DBusThreadManager::InitializeForTesting(dbus_manager);
     52   }
     53 
     54   virtual ~ProjectingObserverTest() {
     55     chromeos::DBusThreadManager::Shutdown();
     56   }
     57 
     58  protected:
     59   scoped_ptr<ProjectingObserver> observer_;
     60   chromeos::FakePowerManagerClient* fake_power_client_;  //  Not owned.
     61 
     62   DISALLOW_COPY_AND_ASSIGN(ProjectingObserverTest);
     63 };
     64 
     65 }  // namespace
     66 
     67 TEST_F(ProjectingObserverTest, CheckNoDisplay) {
     68   ScopedVector<ui::TestDisplaySnapshot> displays;
     69   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
     70   observer_->OnDisplayModeChanged(outputs);
     71 
     72   EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
     73   EXPECT_FALSE(fake_power_client_->is_projecting());
     74 }
     75 
     76 TEST_F(ProjectingObserverTest, CheckWithoutInternalDisplay) {
     77   ScopedVector<ui::TestDisplaySnapshot> displays;
     78   displays.push_back(CreateVGASnapshot());
     79   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
     80   observer_->OnDisplayModeChanged(outputs);
     81 
     82   EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
     83   EXPECT_FALSE(fake_power_client_->is_projecting());
     84 }
     85 
     86 TEST_F(ProjectingObserverTest, CheckWithInternalDisplay) {
     87   ScopedVector<ui::TestDisplaySnapshot> displays;
     88   displays.push_back(CreateInternalSnapshot());
     89   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
     90   observer_->OnDisplayModeChanged(outputs);
     91 
     92   EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
     93   EXPECT_FALSE(fake_power_client_->is_projecting());
     94 }
     95 
     96 TEST_F(ProjectingObserverTest, CheckWithTwoVGADisplays) {
     97   ScopedVector<ui::TestDisplaySnapshot> displays;
     98   displays.push_back(CreateVGASnapshot());
     99   displays.push_back(CreateVGASnapshot());
    100   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
    101   observer_->OnDisplayModeChanged(outputs);
    102 
    103   EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
    104   // We need at least 1 internal display to set projecting to on.
    105   EXPECT_FALSE(fake_power_client_->is_projecting());
    106 }
    107 
    108 TEST_F(ProjectingObserverTest, CheckWithInternalAndVGADisplays) {
    109   ScopedVector<ui::TestDisplaySnapshot> displays;
    110   displays.push_back(CreateInternalSnapshot());
    111   displays.push_back(CreateVGASnapshot());
    112   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
    113   observer_->OnDisplayModeChanged(outputs);
    114 
    115   EXPECT_EQ(1, fake_power_client_->num_set_is_projecting_calls());
    116   EXPECT_TRUE(fake_power_client_->is_projecting());
    117 }
    118 
    119 TEST_F(ProjectingObserverTest, CheckWithVGADisplayAndOneCastingSession) {
    120   ScopedVector<ui::TestDisplaySnapshot> displays;
    121   displays.push_back(CreateVGASnapshot());
    122   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
    123   observer_->OnDisplayModeChanged(outputs);
    124 
    125   observer_->OnCastingSessionStartedOrStopped(true);
    126 
    127   EXPECT_EQ(2, fake_power_client_->num_set_is_projecting_calls());
    128   // Need at least one internal display to set projecting state to |true|.
    129   EXPECT_FALSE(fake_power_client_->is_projecting());
    130 }
    131 
    132 TEST_F(ProjectingObserverTest, CheckWithInternalDisplayAndOneCastingSession) {
    133   ScopedVector<ui::TestDisplaySnapshot> displays;
    134   displays.push_back(CreateInternalSnapshot());
    135   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
    136   observer_->OnDisplayModeChanged(outputs);
    137 
    138   observer_->OnCastingSessionStartedOrStopped(true);
    139 
    140   EXPECT_EQ(2, fake_power_client_->num_set_is_projecting_calls());
    141   EXPECT_TRUE(fake_power_client_->is_projecting());
    142 }
    143 
    144 TEST_F(ProjectingObserverTest, CheckProjectingAfterClosingACastingSession) {
    145   ScopedVector<ui::TestDisplaySnapshot> displays;
    146   displays.push_back(CreateInternalSnapshot());
    147   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
    148   observer_->OnDisplayModeChanged(outputs);
    149 
    150   observer_->OnCastingSessionStartedOrStopped(true);
    151   observer_->OnCastingSessionStartedOrStopped(true);
    152 
    153   EXPECT_EQ(3, fake_power_client_->num_set_is_projecting_calls());
    154   EXPECT_TRUE(fake_power_client_->is_projecting());
    155 
    156   observer_->OnCastingSessionStartedOrStopped(false);
    157 
    158   EXPECT_EQ(4, fake_power_client_->num_set_is_projecting_calls());
    159   EXPECT_TRUE(fake_power_client_->is_projecting());
    160 }
    161 
    162 TEST_F(ProjectingObserverTest,
    163        CheckStopProjectingAfterClosingAllCastingSessions) {
    164   ScopedVector<ui::TestDisplaySnapshot> displays;
    165   displays.push_back(CreateInternalSnapshot());
    166   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
    167   observer_->OnDisplayModeChanged(outputs);
    168 
    169   observer_->OnCastingSessionStartedOrStopped(true);
    170   observer_->OnCastingSessionStartedOrStopped(false);
    171 
    172   EXPECT_EQ(3, fake_power_client_->num_set_is_projecting_calls());
    173   EXPECT_FALSE(fake_power_client_->is_projecting());
    174 }
    175 
    176 TEST_F(ProjectingObserverTest,
    177        CheckStopProjectingAfterDisconnectingSecondOutput) {
    178   ScopedVector<ui::TestDisplaySnapshot> displays;
    179   displays.push_back(CreateInternalSnapshot());
    180   displays.push_back(CreateVGASnapshot());
    181   ui::DisplayConfigurator::DisplayStateList outputs = CreateOutputs(displays);
    182   observer_->OnDisplayModeChanged(outputs);
    183 
    184   // Remove VGA output.
    185   outputs.erase(outputs.begin() + 1);
    186   observer_->OnDisplayModeChanged(outputs);
    187 
    188   EXPECT_EQ(2, fake_power_client_->num_set_is_projecting_calls());
    189   EXPECT_FALSE(fake_power_client_->is_projecting());
    190 }
    191 
    192 }  // namespace ash
    193