Index: chrome/browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc |
diff --git a/chrome/browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc b/chrome/browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8282ece1c607153c2885479d06afa0725139f501 |
--- /dev/null |
+++ b/chrome/browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc |
@@ -0,0 +1,191 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/basictypes.h" |
+#include "base/bind.h" |
+#include "base/callback.h" |
+#include "base/command_line.h" |
+#include "base/compiler_specific.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/message_loop/message_loop.h" |
+#include "chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.h" |
+#include "chrome/common/chrome_switches.h" |
+#include "chrome/test/base/ui_test_utils.cc" |
+#include "chrome/test/base/web_ui_browsertest.h" |
+ |
+namespace local_discovery { |
+ |
+namespace { |
+ |
+const char kChromeDevicesPage[] = "chrome://devices"; |
+const char kSampleServiceName[] = "myService._privet._tcp.local"; |
+const char kSampleDeviceID[] = "MyFakeID"; |
+const char kSampleDeviceHost[] = "myservice.local"; |
+ |
+class TestMessageLoopCondition { |
+ public: |
+ TestMessageLoopCondition() : signaled_(false), |
+ waiting_(false) { |
+ } |
+ |
+ ~TestMessageLoopCondition() { |
+ } |
+ |
+ // Signal a waiting method that it can continue executing. |
+ void Signal() { |
+ signaled_ = true; |
+ if (waiting_) |
+ base::MessageLoop::current()->Quit(); |
+ } |
+ |
+ // Pause execution and recursively run the message loop until |Signal()| is |
+ // called. Do not pause if |Signal()| has already been called. |
+ void Wait() { |
+ if (!signaled_) { |
+ waiting_ = true; |
+ base::MessageLoop::current()->Run(); |
+ waiting_ = false; |
+ } |
+ } |
+ |
+ private: |
+ bool signaled_; |
+ bool waiting_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestMessageLoopCondition); |
+}; |
+ |
+class FakePrivetDeviceLister : public PrivetDeviceLister { |
+ public: |
+ explicit FakePrivetDeviceLister(const base::Closure& discover_devices_called) |
+ : discover_devices_called_(discover_devices_called) { |
+ } |
+ |
+ virtual ~FakePrivetDeviceLister() { |
+ } |
+ |
+ // PrivetDeviceLister implementation. |
+ virtual void Start() OVERRIDE { |
+ } |
+ |
+ virtual void DiscoverNewDevices(bool force_referesh) OVERRIDE { |
+ discover_devices_called_.Run(); |
+ } |
+ |
+ void set_delegate(Delegate* delegate) { delegate_ = delegate; } |
+ Delegate* delegate() { return delegate_; } |
+ |
+ private: |
+ Delegate* delegate_; |
+ base::Closure discover_devices_called_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakePrivetDeviceLister); |
+}; |
+ |
+class FakeLocalDiscoveryUIFactory : public LocalDiscoveryUIHandler::Factory { |
+ public: |
+ explicit FakeLocalDiscoveryUIFactory( |
+ scoped_ptr<FakePrivetDeviceLister> privet_lister) { |
+ owned_privet_lister_ = privet_lister.Pass(); |
+ privet_lister_ = owned_privet_lister_.get(); |
+ LocalDiscoveryUIHandler::SetFactory(this); |
+ } |
+ |
+ virtual ~FakeLocalDiscoveryUIFactory() { |
+ LocalDiscoveryUIHandler::SetFactory(NULL); |
+ } |
+ |
+ // LocalDiscoveryUIHandler::Factory implementation. |
+ virtual LocalDiscoveryUIHandler* CreateLocalDiscoveryUIHandler() OVERRIDE { |
+ DCHECK(owned_privet_lister_); // This factory is a one-use factory. |
+ scoped_ptr<LocalDiscoveryUIHandler> handler( |
+ new LocalDiscoveryUIHandler( |
+ owned_privet_lister_.PassAs<PrivetDeviceLister>())); |
+ privet_lister_->set_delegate(handler.get()); |
+ return handler.release(); |
+ } |
+ |
+ FakePrivetDeviceLister* privet_lister() { return privet_lister_; } |
+ |
+ private: |
+ // FakePrivetDeviceLister is owned either by the factory or, once it creates a |
+ // LocalDiscoveryUI, by the LocalDiscoveryUI. |privet_lister_| points to the |
+ // FakePrivetDeviceLister whereas |owned_privet_lister_| manages the ownership |
+ // of the pointer when it is owned by the factory. |
+ scoped_ptr<FakePrivetDeviceLister> owned_privet_lister_; |
+ FakePrivetDeviceLister* privet_lister_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeLocalDiscoveryUIFactory); |
+}; |
+ |
+class LocalDiscoveryUITest : public WebUIBrowserTest { |
+ public: |
+ LocalDiscoveryUITest() { |
+ } |
+ virtual ~LocalDiscoveryUITest() { |
+ } |
+ |
+ virtual void SetUpOnMainThread() OVERRIDE { |
+ WebUIBrowserTest::SetUpOnMainThread(); |
+ |
+ scoped_ptr<FakePrivetDeviceLister> fake_lister; |
+ fake_lister.reset(new FakePrivetDeviceLister( |
+ base::Bind(&TestMessageLoopCondition::Signal, |
+ base::Unretained(&condition_devices_listed_)))); |
+ |
+ ui_factory_.reset(new FakeLocalDiscoveryUIFactory( |
+ fake_lister.Pass())); |
+ |
+ AddLibrary(base::FilePath(FILE_PATH_LITERAL("local_discovery_ui_test.js"))); |
+ } |
+ |
+ virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
+ WebUIBrowserTest::SetUpCommandLine(command_line); |
+ command_line->AppendSwitch(switches::kEnableDeviceDiscovery); |
+ } |
+ |
+ FakeLocalDiscoveryUIFactory* ui_factory() { return ui_factory_.get(); } |
+ TestMessageLoopCondition& condition_devices_listed() { |
+ return condition_devices_listed_; |
+ } |
+ |
+ private: |
+ scoped_ptr<FakeLocalDiscoveryUIFactory> ui_factory_; |
+ TestMessageLoopCondition condition_devices_listed_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LocalDiscoveryUITest); |
+}; |
+ |
+IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, EmptyTest) { |
+ ui_test_utils::NavigateToURL(browser(), GURL(kChromeDevicesPage)); |
+ condition_devices_listed().Wait(); |
+ EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkTableHasNoRows")); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, AddRowTest) { |
+ ui_test_utils::NavigateToURL(browser(), GURL(kChromeDevicesPage)); |
+ condition_devices_listed().Wait(); |
+ DeviceDescription description; |
+ |
+ description.id = kSampleDeviceID; |
+ description.address = net::HostPortPair(kSampleDeviceHost, 8888); |
+ description.ip_address.push_back(1); |
+ description.ip_address.push_back(2); |
+ description.ip_address.push_back(3); |
+ description.ip_address.push_back(4); |
+ |
+ ui_factory()->privet_lister()->delegate()->DeviceChanged( |
+ true, kSampleServiceName, description); |
+ |
+ EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkTableHasOneRow")); |
+ |
+ ui_factory()->privet_lister()->delegate()->DeviceRemoved( |
+ kSampleServiceName); |
+ |
+ EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkTableHasNoRows")); |
+} |
+ |
+} // namespace |
+ |
+} // namespace local_discovery |