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