1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "battery_status_dispatcher.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/common/battery_status_messages.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/test/mock_render_thread.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/test/test_utils.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebBatteryStatusListener.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class MockBatteryStatusListener : public blink::WebBatteryStatusListener {
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MockBatteryStatusListener() : did_change_battery_status_(false) { }
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~MockBatteryStatusListener() { }
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // blink::WebBatteryStatusListener method.
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void updateBatteryStatus(
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const blink::WebBatteryStatus& status) OVERRIDE {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    status_ = status;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    did_change_battery_status_ = true;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const blink::WebBatteryStatus& status() const { return status_; }
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool did_change_battery_status() const { return did_change_battery_status_; }
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool did_change_battery_status_;
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebBatteryStatus status_;
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockBatteryStatusListener);
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class BatteryStatusDispatcherTest : public testing::Test {
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // We need to create a MockRenderThread so RenderThread::Get() doesn't return
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // null.
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MockRenderThread render_thread_;
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(BatteryStatusDispatcherTest, UpdateListener) {
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MockBatteryStatusListener listener;
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  BatteryStatusDispatcher dispatcher(0);
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebBatteryStatus status;
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  status.charging = true;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  status.chargingTime = 100;
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  status.dischargingTime = 200;
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  status.level = 0.5;
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dispatcher.Start(&listener);
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BatteryStatusMsg_DidChange message(status);
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dispatcher.OnControlMessageReceived(message);
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const blink::WebBatteryStatus& received_status = listener.status();
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(listener.did_change_battery_status());
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(status.charging, received_status.charging);
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(status.chargingTime, received_status.chargingTime);
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(status.dischargingTime, received_status.dischargingTime);
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(status.level, received_status.level);
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dispatcher.Stop();
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(BatteryStatusDispatcherTest, NoUpdateWhenNullListener) {
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MockBatteryStatusListener listener;
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  BatteryStatusDispatcher dispatcher(0);
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dispatcher.Start(0);
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dispatcher.Stop();
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  blink::WebBatteryStatus status;
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BatteryStatusMsg_DidChange message(status);
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  dispatcher.OnControlMessageReceived(message);
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(listener.did_change_battery_status());
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace content
85