Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / battery_status / battery_status_browsertest.cc
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 "base/command_line.h"
6 #include "base/synchronization/waitable_event.h"
7 #include "base/thread_task_runner_handle.h"
8 #include "content/public/browser/web_contents.h"
9 #include "content/public/common/content_switches.h"
10 #include "content/public/test/content_browser_test.h"
11 #include "content/public/test/content_browser_test_utils.h"
12 #include "content/public/test/test_navigation_observer.h"
13 #include "content/public/test/test_utils.h"
14 #include "content/shell/browser/shell.h"
15 #include "device/battery/battery_status_manager.h"
16 #include "device/battery/battery_status_service.h"
17
18 namespace content {
19
20 namespace {
21
22 class FakeBatteryManager : public device::BatteryStatusManager {
23  public:
24   explicit FakeBatteryManager(
25       const device::BatteryStatusService::BatteryUpdateCallback& callback)
26       : callback_(callback), battery_status_available_(true), started_(false) {}
27   ~FakeBatteryManager() override {}
28
29   // Methods from BatteryStatusManager.
30   bool StartListeningBatteryChange() override {
31     started_ = true;
32     if (battery_status_available_)
33       InvokeUpdateCallback();
34     return battery_status_available_;
35   }
36
37   void StopListeningBatteryChange() override {}
38
39   void InvokeUpdateCallback() {
40     // Invoke asynchronously to mimic the OS-specific battery managers.
41     base::ThreadTaskRunnerHandle::Get()->PostTask(
42         FROM_HERE,
43         base::Bind(callback_, status_));
44   }
45
46   void set_battery_status(const device::BatteryStatus& status) {
47     status_ = status;
48   }
49
50   void set_battery_status_available(bool value) {
51     battery_status_available_ = value;
52   }
53
54   bool started() {
55     return started_;
56   }
57
58  private:
59   device::BatteryStatusService::BatteryUpdateCallback callback_;
60   bool battery_status_available_;
61   bool started_;
62   device::BatteryStatus status_;
63
64   DISALLOW_COPY_AND_ASSIGN(FakeBatteryManager);
65 };
66
67 class BatteryStatusBrowserTest : public ContentBrowserTest  {
68  public:
69     BatteryStatusBrowserTest()
70       : battery_manager_(NULL),
71         battery_service_(NULL) {
72   }
73
74     void SetUpCommandLine(CommandLine* command_line) override {
75     command_line->AppendSwitch(
76         switches::kEnableExperimentalWebPlatformFeatures);
77   }
78
79   void SetUpOnMainThread() override {
80     battery_service_ = device::BatteryStatusService::GetInstance();
81
82     // We keep a raw pointer to the FakeBatteryManager, which we expect to
83     // remain valid for the lifetime of the BatteryStatusService.
84     scoped_ptr<FakeBatteryManager> battery_manager(new FakeBatteryManager(
85         battery_service_->GetUpdateCallbackForTesting()));
86     battery_manager_ = battery_manager.get();
87
88     battery_service_->SetBatteryManagerForTesting(
89         battery_manager.Pass());
90   }
91
92   void TearDown() override {
93     battery_service_->SetBatteryManagerForTesting(
94         scoped_ptr<device::BatteryStatusManager>());
95     battery_manager_ = NULL;
96   }
97
98   FakeBatteryManager* battery_manager() {
99     return battery_manager_;
100   }
101
102  private:
103   FakeBatteryManager* battery_manager_;
104   device::BatteryStatusService* battery_service_;
105
106   DISALLOW_COPY_AND_ASSIGN(BatteryStatusBrowserTest);
107 };
108
109 IN_PROC_BROWSER_TEST_F(BatteryStatusBrowserTest, BatteryManagerDefaultValues) {
110   // Set the fake battery manager to return false on start. From JavaScript
111   // request a promise for the battery status information and once it resolves
112   // check the default values and navigate to #pass.
113   battery_manager()->set_battery_status_available(false);
114   GURL test_url = GetTestUrl(
115       "battery_status", "battery_status_default_test.html");
116   NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2);
117   EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
118   EXPECT_TRUE(battery_manager()->started());
119 }
120
121 IN_PROC_BROWSER_TEST_F(BatteryStatusBrowserTest, BatteryManagerResolvePromise) {
122   // Set the fake battery manager to return predefined battery status values.
123   // From JavaScript request a promise for the battery status information and
124   // once it resolves check the values and navigate to #pass.
125   device::BatteryStatus status;
126   status.charging = true;
127   status.charging_time = 100;
128   status.discharging_time = std::numeric_limits<double>::infinity();
129   status.level = 0.5;
130   battery_manager()->set_battery_status(status);
131
132   GURL test_url = GetTestUrl(
133       "battery_status", "battery_status_promise_resolution_test.html");
134   NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2);
135   EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
136   EXPECT_TRUE(battery_manager()->started());
137 }
138
139 IN_PROC_BROWSER_TEST_F(BatteryStatusBrowserTest,
140     BatteryManagerWithEventListener) {
141   // Set the fake battery manager to return default battery status values.
142   // From JavaScript request a promise for the battery status information.
143   // Once it resolves add an event listener for battery level change. Set
144   // battery level to 0.6 and invoke update. Check that the event listener
145   // is invoked with the correct value for level and navigate to #pass.
146   device::BatteryStatus status;
147   battery_manager()->set_battery_status(status);
148
149   TestNavigationObserver same_tab_observer(shell()->web_contents(), 2);
150   GURL test_url = GetTestUrl(
151       "battery_status", "battery_status_event_listener_test.html");
152   shell()->LoadURL(test_url);
153   same_tab_observer.Wait();
154   EXPECT_EQ("resolved", shell()->web_contents()->GetLastCommittedURL().ref());
155
156   TestNavigationObserver same_tab_observer2(shell()->web_contents(), 1);
157   status.level = 0.6;
158   battery_manager()->set_battery_status(status);
159   battery_manager()->InvokeUpdateCallback();
160   same_tab_observer2.Wait();
161   EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
162   EXPECT_TRUE(battery_manager()->started());
163 }
164
165 }  //  namespace
166
167 }  //  namespace content