Home | History | Annotate | Download | only in battery_status
      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 "content/browser/battery_status/battery_status_service.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/run_loop.h"
      9 #include "content/browser/battery_status/battery_status_manager.h"
     10 #include "content/public/test/test_browser_thread_bundle.h"
     11 
     12 namespace content {
     13 
     14 namespace {
     15 
     16 class FakeBatteryManager : public BatteryStatusManager {
     17  public:
     18   explicit FakeBatteryManager(
     19       const BatteryStatusService::BatteryUpdateCallback& callback)
     20       : start_invoked_count_(0),
     21         stop_invoked_count_(0) {
     22     callback_ = callback;
     23   }
     24   virtual ~FakeBatteryManager() { }
     25 
     26   // Methods from Battery Status Manager
     27   virtual bool StartListeningBatteryChange() OVERRIDE {
     28     start_invoked_count_++;
     29     return true;
     30   }
     31 
     32   virtual void StopListeningBatteryChange() OVERRIDE {
     33     stop_invoked_count_++;
     34   }
     35 
     36   void InvokeUpdateCallback(const blink::WebBatteryStatus& status) {
     37     callback_.Run(status);
     38   }
     39 
     40   int start_invoked_count() const { return start_invoked_count_; }
     41   int stop_invoked_count() const { return stop_invoked_count_; }
     42 
     43  private:
     44   int start_invoked_count_;
     45   int stop_invoked_count_;
     46 
     47   DISALLOW_COPY_AND_ASSIGN(FakeBatteryManager);
     48 };
     49 
     50 class BatteryStatusServiceTest : public testing::Test {
     51  public:
     52     BatteryStatusServiceTest()
     53         : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
     54           battery_service_(0),
     55           battery_manager_(0),
     56           callback1_invoked_count_(0),
     57           callback2_invoked_count_(0) {
     58     }
     59     virtual ~BatteryStatusServiceTest() { }
     60 
     61  protected:
     62   typedef BatteryStatusService::BatteryUpdateSubscription BatterySubscription;
     63 
     64   virtual void SetUp() OVERRIDE {
     65     callback1_ = base::Bind(&BatteryStatusServiceTest::Callback1,
     66                             base::Unretained(this));
     67     callback2_ = base::Bind(&BatteryStatusServiceTest::Callback2,
     68                             base::Unretained(this));
     69     battery_service_ = BatteryStatusService::GetInstance();
     70     battery_manager_ = new FakeBatteryManager(
     71         battery_service_->GetUpdateCallbackForTesting());
     72     battery_service_->SetBatteryManagerForTesting(battery_manager_);
     73   }
     74 
     75   virtual void TearDown() OVERRIDE {
     76     base::RunLoop().RunUntilIdle();
     77     battery_service_->SetBatteryManagerForTesting(0);
     78   }
     79 
     80   FakeBatteryManager* battery_manager() {
     81     return battery_manager_;
     82   }
     83 
     84   scoped_ptr<BatterySubscription> AddCallback(
     85       const BatteryStatusService::BatteryUpdateCallback& callback) {
     86     return battery_service_->AddCallback(callback);
     87   }
     88 
     89   int callback1_invoked_count() const {
     90     return callback1_invoked_count_;
     91   }
     92 
     93   int callback2_invoked_count() const {
     94     return callback2_invoked_count_;
     95   }
     96 
     97   const blink::WebBatteryStatus& battery_status() const {
     98     return battery_status_;
     99   }
    100 
    101   const BatteryStatusService::BatteryUpdateCallback& callback1() const {
    102     return callback1_;
    103   }
    104 
    105   const BatteryStatusService::BatteryUpdateCallback& callback2() const {
    106     return callback2_;
    107   }
    108 
    109  private:
    110   void Callback1(const blink::WebBatteryStatus& status) {
    111     callback1_invoked_count_++;
    112     battery_status_ = status;
    113   }
    114 
    115   void Callback2(const blink::WebBatteryStatus& status) {
    116     callback2_invoked_count_++;
    117     battery_status_ = status;
    118   }
    119 
    120   content::TestBrowserThreadBundle thread_bundle_;
    121   BatteryStatusService* battery_service_;
    122   FakeBatteryManager* battery_manager_;
    123   BatteryStatusService::BatteryUpdateCallback callback1_;
    124   BatteryStatusService::BatteryUpdateCallback callback2_;
    125   int callback1_invoked_count_;
    126   int callback2_invoked_count_;
    127   blink::WebBatteryStatus battery_status_;
    128 
    129   DISALLOW_COPY_AND_ASSIGN(BatteryStatusServiceTest);
    130 };
    131 
    132 TEST_F(BatteryStatusServiceTest, AddFirstCallback) {
    133   scoped_ptr<BatterySubscription> subscription1 = AddCallback(callback1());
    134   EXPECT_EQ(1, battery_manager()->start_invoked_count());
    135   EXPECT_EQ(0, battery_manager()->stop_invoked_count());
    136   subscription1.reset();
    137   EXPECT_EQ(1, battery_manager()->start_invoked_count());
    138   EXPECT_EQ(1, battery_manager()->stop_invoked_count());
    139 }
    140 
    141 TEST_F(BatteryStatusServiceTest, AddCallbackAfterUpdate) {
    142   scoped_ptr<BatterySubscription> subscription1 = AddCallback(callback1());
    143   blink::WebBatteryStatus status;
    144   battery_manager()->InvokeUpdateCallback(status);
    145   base::RunLoop().RunUntilIdle();
    146   EXPECT_EQ(1, callback1_invoked_count());
    147   EXPECT_EQ(0, callback2_invoked_count());
    148 
    149   scoped_ptr<BatterySubscription> subscription2 = AddCallback(callback2());
    150   EXPECT_EQ(1, callback1_invoked_count());
    151   EXPECT_EQ(1, callback2_invoked_count());
    152 }
    153 
    154 TEST_F(BatteryStatusServiceTest, TwoCallbacksUpdate) {
    155   scoped_ptr<BatterySubscription> subscription1 = AddCallback(callback1());
    156   scoped_ptr<BatterySubscription> subscription2 = AddCallback(callback2());
    157 
    158   blink::WebBatteryStatus status;
    159   status.charging = true;
    160   status.chargingTime = 100;
    161   status.dischargingTime = 200;
    162   status.level = 0.5;
    163   battery_manager()->InvokeUpdateCallback(status);
    164   base::RunLoop().RunUntilIdle();
    165 
    166   EXPECT_EQ(1, callback1_invoked_count());
    167   EXPECT_EQ(1, callback2_invoked_count());
    168   EXPECT_EQ(status.charging, battery_status().charging);
    169   EXPECT_EQ(status.chargingTime, battery_status().chargingTime);
    170   EXPECT_EQ(status.dischargingTime, battery_status().dischargingTime);
    171   EXPECT_EQ(status.level, battery_status().level);
    172 }
    173 
    174 TEST_F(BatteryStatusServiceTest, RemoveOneCallback) {
    175   scoped_ptr<BatterySubscription> subscription1 = AddCallback(callback1());
    176   scoped_ptr<BatterySubscription> subscription2 = AddCallback(callback2());
    177 
    178   blink::WebBatteryStatus status;
    179   battery_manager()->InvokeUpdateCallback(status);
    180   base::RunLoop().RunUntilIdle();
    181   EXPECT_EQ(1, callback1_invoked_count());
    182   EXPECT_EQ(1, callback2_invoked_count());
    183 
    184   subscription1.reset();
    185   battery_manager()->InvokeUpdateCallback(status);
    186   base::RunLoop().RunUntilIdle();
    187   EXPECT_EQ(1, callback1_invoked_count());
    188   EXPECT_EQ(2, callback2_invoked_count());
    189 }
    190 
    191 }  // namespace
    192 
    193 }  // namespace content
    194