Index: content/browser/battery_status/battery_status_browsertest.cc |
diff --git a/content/browser/battery_status/battery_status_browsertest.cc b/content/browser/battery_status/battery_status_browsertest.cc |
index 7da7f86d082d0b238390d04db3a07c70fb2235f1..022eb359b74d291683f4b41e53e8d90a9babc259 100644 |
--- a/content/browser/battery_status/battery_status_browsertest.cc |
+++ b/content/browser/battery_status/battery_status_browsertest.cc |
@@ -2,16 +2,22 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "base/callback_list.h" |
#include "base/command_line.h" |
+#include "base/lazy_instance.h" |
#include "base/synchronization/waitable_event.h" |
#include "base/thread_task_runner_handle.h" |
+#include "content/public/browser/content_browser_client.h" |
#include "content/public/browser/web_contents.h" |
+#include "content/public/common/content_client.h" |
#include "content/public/common/content_switches.h" |
#include "content/public/test/content_browser_test.h" |
#include "content/public/test/content_browser_test_utils.h" |
#include "content/public/test/test_navigation_observer.h" |
#include "content/public/test/test_utils.h" |
#include "content/shell/browser/shell.h" |
+#include "content/shell/browser/shell_content_browser_client.h" |
+#include "device/battery/battery_monitor.mojom.h" |
#include "device/battery/battery_status_manager.h" |
#include "device/battery/battery_status_service.h" |
@@ -19,57 +25,62 @@ namespace content { |
namespace { |
-class FakeBatteryManager : public device::BatteryStatusManager { |
+typedef base::CallbackList<void(const device::BatteryStatus&)> |
+ BatteryUpdateCallbackList; |
qsr
2014/11/18 09:24:44
format seems wrong, I expect 4 character indentati
ppi
2014/11/18 11:08:33
Done.
|
+typedef BatteryUpdateCallbackList::Subscription BatteryUpdateSubscription; |
+ |
+// Global battery state used in the tests. |
+device::BatteryStatus g_battery_status; |
+// Global list of test battery monitors to notify when |g_battery_status| |
+// changes. |
+base::LazyInstance<BatteryUpdateCallbackList> g_callback_list = |
+ LAZY_INSTANCE_INITIALIZER; |
+ |
+// Updates the global battery state and notifies existing test monitors. |
+void UpdateBattery(const device::BatteryStatus& battery_status) { |
+ g_battery_status = battery_status; |
+ g_callback_list.Get().Notify(battery_status); |
+} |
+ |
+class TestBatteryMonitor : public mojo::InterfaceImpl<device::BatteryMonitor> { |
public: |
- explicit FakeBatteryManager( |
- const device::BatteryStatusService::BatteryUpdateCallback& callback) |
- : callback_(callback), battery_status_available_(true), started_(false) {} |
- ~FakeBatteryManager() override {} |
- |
- // Methods from BatteryStatusManager. |
- bool StartListeningBatteryChange() override { |
- started_ = true; |
- if (battery_status_available_) |
- InvokeUpdateCallback(); |
- return battery_status_available_; |
+ static void Create( |
+ mojo::InterfaceRequest<BatteryMonitor> request) { |
+ BindToRequest(new TestBatteryMonitor(), &request); |
} |
- void StopListeningBatteryChange() override {} |
- |
- void InvokeUpdateCallback() { |
- // Invoke asynchronously to mimic the OS-specific battery managers. |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, |
- base::Bind(callback_, status_)); |
+ private: |
+ TestBatteryMonitor() {} |
+ ~TestBatteryMonitor() override {} |
+ |
+ // mojo::InterfaceImpl<..> methods: |
+ void OnConnectionEstablished() override { |
+ DidChange(g_battery_status); |
+ subscription_ = g_callback_list.Get().Add( |
+ base::Bind(&TestBatteryMonitor::DidChange, base::Unretained(this))); |
} |
- void set_battery_status(const device::BatteryStatus& status) { |
- status_ = status; |
+ void DidChange(const device::BatteryStatus& battery_status) { |
+ device::BatteryStatusPtr status(device::BatteryStatus::New()); |
+ *status = battery_status; |
+ client()->DidChange(status.Pass()); |
} |
- void set_battery_status_available(bool value) { |
- battery_status_available_ = value; |
- } |
+ scoped_ptr<BatteryUpdateSubscription> subscription_; |
+}; |
- bool started() { |
- return started_; |
+// Overrides the default battery monitor implementation with the test |
+// implementation declared above. |
+class TestContentBrowserClient : public ContentBrowserClient { |
+public: |
+ void OverridePerProcessMojoServices(ServiceRegistry* registry) override { |
+ registry->AddService(base::Bind(&TestBatteryMonitor::Create)); |
} |
- |
- private: |
- device::BatteryStatusService::BatteryUpdateCallback callback_; |
- bool battery_status_available_; |
- bool started_; |
- device::BatteryStatus status_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FakeBatteryManager); |
}; |
class BatteryStatusBrowserTest : public ContentBrowserTest { |
public: |
- BatteryStatusBrowserTest() |
- : battery_manager_(NULL), |
- battery_service_(NULL) { |
- } |
+ BatteryStatusBrowserTest() {} |
void SetUpCommandLine(CommandLine* command_line) override { |
command_line->AppendSwitch( |
@@ -77,45 +88,28 @@ class BatteryStatusBrowserTest : public ContentBrowserTest { |
} |
void SetUpOnMainThread() override { |
- battery_service_ = device::BatteryStatusService::GetInstance(); |
- |
- // We keep a raw pointer to the FakeBatteryManager, which we expect to |
- // remain valid for the lifetime of the BatteryStatusService. |
- scoped_ptr<FakeBatteryManager> battery_manager(new FakeBatteryManager( |
- battery_service_->GetUpdateCallbackForTesting())); |
- battery_manager_ = battery_manager.get(); |
- |
- battery_service_->SetBatteryManagerForTesting( |
- battery_manager.Pass()); |
+ old_client_ = SetBrowserClientForTesting(&test_client_); |
} |
void TearDown() override { |
- battery_service_->SetBatteryManagerForTesting( |
- scoped_ptr<device::BatteryStatusManager>()); |
- battery_manager_ = NULL; |
- } |
- |
- FakeBatteryManager* battery_manager() { |
- return battery_manager_; |
+ SetBrowserClientForTesting(old_client_); |
} |
private: |
- FakeBatteryManager* battery_manager_; |
- device::BatteryStatusService* battery_service_; |
+ TestContentBrowserClient test_client_; |
+ ContentBrowserClient* old_client_; |
DISALLOW_COPY_AND_ASSIGN(BatteryStatusBrowserTest); |
}; |
IN_PROC_BROWSER_TEST_F(BatteryStatusBrowserTest, BatteryManagerDefaultValues) { |
- // Set the fake battery manager to return false on start. From JavaScript |
- // request a promise for the battery status information and once it resolves |
- // check the default values and navigate to #pass. |
- battery_manager()->set_battery_status_available(false); |
+ // From JavaScript request a promise for the battery status information and |
+ // once it resolves check the default values and navigate to #pass. |
+ UpdateBattery(device::BatteryStatus()); |
GURL test_url = GetTestUrl( |
"battery_status", "battery_status_default_test.html"); |
NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2); |
EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref()); |
- EXPECT_TRUE(battery_manager()->started()); |
} |
IN_PROC_BROWSER_TEST_F(BatteryStatusBrowserTest, BatteryManagerResolvePromise) { |
@@ -127,13 +121,12 @@ IN_PROC_BROWSER_TEST_F(BatteryStatusBrowserTest, BatteryManagerResolvePromise) { |
status.charging_time = 100; |
status.discharging_time = std::numeric_limits<double>::infinity(); |
status.level = 0.5; |
- battery_manager()->set_battery_status(status); |
+ UpdateBattery(status); |
GURL test_url = GetTestUrl( |
"battery_status", "battery_status_promise_resolution_test.html"); |
NavigateToURLBlockUntilNavigationsComplete(shell(), test_url, 2); |
EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref()); |
- EXPECT_TRUE(battery_manager()->started()); |
} |
IN_PROC_BROWSER_TEST_F(BatteryStatusBrowserTest, |
@@ -144,7 +137,7 @@ IN_PROC_BROWSER_TEST_F(BatteryStatusBrowserTest, |
// battery level to 0.6 and invoke update. Check that the event listener |
// is invoked with the correct value for level and navigate to #pass. |
device::BatteryStatus status; |
- battery_manager()->set_battery_status(status); |
+ UpdateBattery(status); |
TestNavigationObserver same_tab_observer(shell()->web_contents(), 2); |
GURL test_url = GetTestUrl( |
@@ -155,11 +148,9 @@ IN_PROC_BROWSER_TEST_F(BatteryStatusBrowserTest, |
TestNavigationObserver same_tab_observer2(shell()->web_contents(), 1); |
status.level = 0.6; |
- battery_manager()->set_battery_status(status); |
- battery_manager()->InvokeUpdateCallback(); |
+ UpdateBattery(status); |
same_tab_observer2.Wait(); |
EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref()); |
- EXPECT_TRUE(battery_manager()->started()); |
} |
} // namespace |