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