local_discovery_ui_browsertest.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/basictypes.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/bind.h"
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/callback.h"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/command_line.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/compiler_specific.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/message_loop/message_loop.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/url_constants.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.cc"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/web_ui_browsertest.h"
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace local_discovery {
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kSampleServiceName[] = "myService._privet._tcp.local";
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kSampleDeviceID[] = "MyFakeID";
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kSampleDeviceHost[] = "myservice.local";
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class TestMessageLoopCondition {
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TestMessageLoopCondition() : signaled_(false),
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                               waiting_(false) {
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ~TestMessageLoopCondition() {
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Signal a waiting method that it can continue executing.
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void Signal() {
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    signaled_ = true;
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (waiting_)
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::MessageLoop::current()->Quit();
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Pause execution and recursively run the message loop until |Signal()| is
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // called. Do not pause if |Signal()| has already been called.
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void Wait() {
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!signaled_) {
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      waiting_ = true;
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      base::MessageLoop::current()->Run();
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      waiting_ = false;
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool signaled_;
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool waiting_;
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestMessageLoopCondition);
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakePrivetDeviceLister : public PrivetDeviceLister {
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  explicit FakePrivetDeviceLister(const base::Closure& discover_devices_called)
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : discover_devices_called_(discover_devices_called) {
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~FakePrivetDeviceLister() {
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // PrivetDeviceLister implementation.
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void Start() OVERRIDE {
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void DiscoverNewDevices(bool force_referesh) OVERRIDE {
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    discover_devices_called_.Run();
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void set_delegate(Delegate* delegate) { delegate_ = delegate; }
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Delegate* delegate() { return delegate_; }
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Delegate* delegate_;
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::Closure discover_devices_called_;
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakePrivetDeviceLister);
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeLocalDiscoveryUIFactory : public LocalDiscoveryUIHandler::Factory {
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  explicit FakeLocalDiscoveryUIFactory(
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_ptr<FakePrivetDeviceLister> privet_lister) {
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    owned_privet_lister_ = privet_lister.Pass();
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    privet_lister_ = owned_privet_lister_.get();
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    LocalDiscoveryUIHandler::SetFactory(this);
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~FakeLocalDiscoveryUIFactory() {
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    LocalDiscoveryUIHandler::SetFactory(NULL);
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // LocalDiscoveryUIHandler::Factory implementation.
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual LocalDiscoveryUIHandler* CreateLocalDiscoveryUIHandler() OVERRIDE {
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DCHECK(owned_privet_lister_);  // This factory is a one-use factory.
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<LocalDiscoveryUIHandler> handler(
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        new LocalDiscoveryUIHandler(
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            owned_privet_lister_.PassAs<PrivetDeviceLister>()));
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    privet_lister_->set_delegate(handler.get());
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return handler.release();
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakePrivetDeviceLister* privet_lister() { return privet_lister_; }
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // FakePrivetDeviceLister is owned either by the factory or, once it creates a
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // LocalDiscoveryUI, by the LocalDiscoveryUI.  |privet_lister_| points to the
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // FakePrivetDeviceLister whereas |owned_privet_lister_| manages the ownership
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // of the pointer when it is owned by the factory.
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<FakePrivetDeviceLister> owned_privet_lister_;
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakePrivetDeviceLister* privet_lister_;
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeLocalDiscoveryUIFactory);
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LocalDiscoveryUITest : public WebUIBrowserTest {
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LocalDiscoveryUITest() {
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~LocalDiscoveryUITest() {
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    WebUIBrowserTest::SetUpOnMainThread();
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<FakePrivetDeviceLister> fake_lister;
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    fake_lister.reset(new FakePrivetDeviceLister(
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        base::Bind(&TestMessageLoopCondition::Signal,
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   base::Unretained(&condition_devices_listed_))));
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ui_factory_.reset(new FakeLocalDiscoveryUIFactory(
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        fake_lister.Pass()));
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    AddLibrary(base::FilePath(FILE_PATH_LITERAL("local_discovery_ui_test.js")));
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    WebUIBrowserTest::SetUpCommandLine(command_line);
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeLocalDiscoveryUIFactory* ui_factory() { return ui_factory_.get(); }
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TestMessageLoopCondition& condition_devices_listed() {
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return condition_devices_listed_;
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<FakeLocalDiscoveryUIFactory> ui_factory_;
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TestMessageLoopCondition condition_devices_listed_;
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LocalDiscoveryUITest);
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, EmptyTest) {
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(
161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      chrome::kChromeUIDevicesURL));
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  condition_devices_listed().Wait();
163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkNoDevices"));
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, AddRowTest) {
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(
168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      chrome::kChromeUIDevicesURL));
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  condition_devices_listed().Wait();
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DeviceDescription description;
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  description.name = "Sample device";
173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  description.description = "Sample device description";
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ui_factory()->privet_lister()->delegate()->DeviceChanged(
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      true, kSampleServiceName, description);
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkOneDevice"));
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ui_factory()->privet_lister()->delegate()->DeviceRemoved(
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kSampleServiceName);
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkNoDevices"));
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace local_discovery
189