Home | History | Annotate | Download | only in power
      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/system/chromeos/power/power_status_view.h"
      6 
      7 #include "ash/system/chromeos/power/power_status.h"
      8 #include "ash/test/ash_test_base.h"
      9 #include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
     10 #include "grit/ash_strings.h"
     11 #include "ui/base/l10n/l10n_util.h"
     12 #include "ui/base/l10n/time_format.h"
     13 #include "ui/views/controls/label.h"
     14 
     15 using power_manager::PowerSupplyProperties;
     16 
     17 namespace ash {
     18 
     19 class PowerStatusViewTest : public test::AshTestBase {
     20  public:
     21   PowerStatusViewTest() {}
     22   virtual ~PowerStatusViewTest() {}
     23 
     24   // Overridden from testing::Test:
     25   virtual void SetUp() OVERRIDE {
     26     test::AshTestBase::SetUp();
     27     view_.reset(new PowerStatusView(GetViewType(), false));
     28   }
     29 
     30   virtual void TearDown() OVERRIDE {
     31     view_.reset();
     32     test::AshTestBase::TearDown();
     33   }
     34 
     35  protected:
     36   virtual PowerStatusView::ViewType GetViewType() = 0;
     37   PowerStatusView* view() { return view_.get(); }
     38 
     39   void UpdatePowerStatus(const power_manager::PowerSupplyProperties& proto) {
     40     PowerStatus::Get()->SetProtoForTesting(proto);
     41     view_->OnPowerStatusChanged();
     42   }
     43 
     44  private:
     45   scoped_ptr<PowerStatusView> view_;
     46 
     47   DISALLOW_COPY_AND_ASSIGN(PowerStatusViewTest);
     48 };
     49 
     50 class PowerStatusDefaultViewTest : public PowerStatusViewTest {
     51  public:
     52   PowerStatusDefaultViewTest() {}
     53   virtual ~PowerStatusDefaultViewTest() {}
     54 
     55  protected:
     56   virtual PowerStatusView::ViewType GetViewType() OVERRIDE {
     57     return PowerStatusView::VIEW_DEFAULT;
     58   }
     59 
     60   bool IsPercentageVisible() {
     61     return view()->percentage_label_->visible();
     62   }
     63 
     64   bool IsTimeStatusVisible() {
     65     return view()->time_status_label_->visible();
     66   }
     67 
     68   base::string16 RemainingTimeInView() {
     69     return view()->time_status_label_->text();
     70   }
     71 
     72  private:
     73   DISALLOW_COPY_AND_ASSIGN(PowerStatusDefaultViewTest);
     74 };
     75 
     76 class PowerStatusNotificationViewTest : public PowerStatusViewTest {
     77  public:
     78   PowerStatusNotificationViewTest() {}
     79   virtual ~PowerStatusNotificationViewTest() {}
     80 
     81  protected:
     82   virtual PowerStatusView::ViewType GetViewType() OVERRIDE {
     83     return PowerStatusView::VIEW_NOTIFICATION;
     84   }
     85 
     86   base::string16 StatusInView() {
     87     return view()->status_label_->text();
     88   }
     89 
     90   base::string16 RemainingTimeInView() {
     91     return view()->time_label_->text();
     92   }
     93 
     94  private:
     95   DISALLOW_COPY_AND_ASSIGN(PowerStatusNotificationViewTest);
     96 };
     97 
     98 TEST_F(PowerStatusDefaultViewTest, Basic) {
     99   EXPECT_FALSE(IsPercentageVisible());
    100   EXPECT_TRUE(IsTimeStatusVisible());
    101 
    102   // Disconnect the power.
    103   PowerSupplyProperties prop;
    104   prop.set_external_power(PowerSupplyProperties::DISCONNECTED);
    105   prop.set_battery_state(PowerSupplyProperties::DISCHARGING);
    106   prop.set_battery_percent(99.0);
    107   prop.set_battery_time_to_empty_sec(120);
    108   prop.set_is_calculating_battery_time(true);
    109   UpdatePowerStatus(prop);
    110 
    111   EXPECT_TRUE(IsPercentageVisible());
    112   EXPECT_TRUE(IsTimeStatusVisible());
    113   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING),
    114             RemainingTimeInView());
    115 
    116   prop.set_is_calculating_battery_time(false);
    117   UpdatePowerStatus(prop);
    118   EXPECT_NE(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING),
    119             RemainingTimeInView());
    120   EXPECT_NE(
    121       l10n_util::GetStringUTF16(
    122           IDS_ASH_STATUS_TRAY_BATTERY_CHARGING_UNRELIABLE),
    123       RemainingTimeInView());
    124 
    125   prop.set_external_power(PowerSupplyProperties::AC);
    126   prop.set_battery_state(PowerSupplyProperties::CHARGING);
    127   prop.set_battery_time_to_full_sec(120);
    128   UpdatePowerStatus(prop);
    129   EXPECT_TRUE(IsPercentageVisible());
    130   EXPECT_TRUE(IsTimeStatusVisible());
    131   EXPECT_NE(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING),
    132             RemainingTimeInView());
    133   EXPECT_NE(
    134       l10n_util::GetStringUTF16(
    135           IDS_ASH_STATUS_TRAY_BATTERY_CHARGING_UNRELIABLE),
    136       RemainingTimeInView());
    137 
    138   prop.set_external_power(PowerSupplyProperties::USB);
    139   UpdatePowerStatus(prop);
    140   EXPECT_TRUE(IsPercentageVisible());
    141   EXPECT_TRUE(IsTimeStatusVisible());
    142   EXPECT_EQ(
    143       l10n_util::GetStringUTF16(
    144           IDS_ASH_STATUS_TRAY_BATTERY_CHARGING_UNRELIABLE),
    145       RemainingTimeInView());
    146 
    147   // Tricky -- connected to non-USB but still discharging. Not likely happening
    148   // on production though.
    149   prop.set_external_power(PowerSupplyProperties::AC);
    150   prop.set_battery_state(PowerSupplyProperties::DISCHARGING);
    151   prop.set_battery_time_to_full_sec(120);
    152   UpdatePowerStatus(prop);
    153   EXPECT_TRUE(IsPercentageVisible());
    154   EXPECT_FALSE(IsTimeStatusVisible());
    155 }
    156 
    157 TEST_F(PowerStatusNotificationViewTest, Basic) {
    158   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BATTERY_FULL),
    159             StatusInView());
    160   EXPECT_TRUE(RemainingTimeInView().empty());
    161 
    162   // Disconnect the power.
    163   PowerSupplyProperties prop;
    164   prop.set_external_power(PowerSupplyProperties::DISCONNECTED);
    165   prop.set_battery_state(PowerSupplyProperties::DISCHARGING);
    166   prop.set_battery_percent(99.0);
    167   prop.set_battery_time_to_empty_sec(125);
    168   prop.set_is_calculating_battery_time(true);
    169   UpdatePowerStatus(prop);
    170 
    171   EXPECT_NE(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BATTERY_FULL),
    172             StatusInView());
    173   EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BATTERY_CALCULATING),
    174             RemainingTimeInView());
    175 
    176   prop.set_is_calculating_battery_time(false);
    177   UpdatePowerStatus(prop);
    178   // Low power warning has to be calculated by ui::TimeFormat, but ignore
    179   // seconds.
    180   EXPECT_EQ(ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_REMAINING,
    181                                    ui::TimeFormat::LENGTH_LONG,
    182                                    base::TimeDelta::FromMinutes(2)),
    183             RemainingTimeInView());
    184 
    185   prop.set_external_power(PowerSupplyProperties::AC);
    186   prop.set_battery_state(PowerSupplyProperties::CHARGING);
    187   prop.set_battery_time_to_full_sec(120);
    188   UpdatePowerStatus(prop);
    189   EXPECT_NE(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BATTERY_FULL),
    190             StatusInView());
    191   // Charging time is somehow using another format?
    192   EXPECT_NE(ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_REMAINING,
    193                                    ui::TimeFormat::LENGTH_LONG,
    194                                    base::TimeDelta::FromMinutes(2)),
    195             RemainingTimeInView());
    196 
    197   // Unreliable connection.
    198   prop.set_external_power(PowerSupplyProperties::USB);
    199   UpdatePowerStatus(prop);
    200   EXPECT_EQ(
    201       l10n_util::GetStringUTF16(
    202           IDS_ASH_STATUS_TRAY_BATTERY_CHARGING_UNRELIABLE),
    203       RemainingTimeInView());
    204 
    205   // Tricky -- connected to non-USB but still discharging. Not likely happening
    206   // on production though.
    207   prop.set_external_power(PowerSupplyProperties::AC);
    208   prop.set_battery_state(PowerSupplyProperties::DISCHARGING);
    209   prop.set_battery_time_to_full_sec(120);
    210   UpdatePowerStatus(prop);
    211   EXPECT_TRUE(RemainingTimeInView().empty());
    212 }
    213 
    214 }  // namespace ash
    215