DevTools: Create end-to-end test for chrome://inspect

BUG=354854

Review URL: https://codereview.chromium.org/208013003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@260153 0039d316-1c4b-4281-b951-d872f2087c98
parent e1b2d73a
...@@ -80,6 +80,8 @@ class AndroidDeviceProvider ...@@ -80,6 +80,8 @@ class AndroidDeviceProvider
#if defined(DEBUG_DEVTOOLS) #if defined(DEBUG_DEVTOOLS)
static scoped_refptr<AndroidDeviceProvider> GetSelfAsDeviceProvider(); static scoped_refptr<AndroidDeviceProvider> GetSelfAsDeviceProvider();
#endif #endif
// Implemented in browser_tests.
static scoped_refptr<AndroidDeviceProvider> GetMockDeviceProviderForTest();
protected: protected:
friend struct friend struct
......
...@@ -1101,6 +1101,12 @@ DevToolsAdbBridge::DevToolsAdbBridge() ...@@ -1101,6 +1101,12 @@ DevToolsAdbBridge::DevToolsAdbBridge()
has_message_loop_(adb_thread_->message_loop() != NULL) { has_message_loop_(adb_thread_->message_loop() != NULL) {
} }
void DevToolsAdbBridge::set_device_provider_for_test(
scoped_refptr<AndroidDeviceProvider> device_provider) {
device_providers_for_test_.clear();
device_providers_for_test_.push_back(device_provider);
}
void DevToolsAdbBridge::AddListener(Listener* listener) { void DevToolsAdbBridge::AddListener(Listener* listener) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (listeners_.empty()) if (listeners_.empty())
...@@ -1132,7 +1138,10 @@ void DevToolsAdbBridge::RequestRemoteDevices() { ...@@ -1132,7 +1138,10 @@ void DevToolsAdbBridge::RequestRemoteDevices() {
return; return;
new AdbPagesCommand( new AdbPagesCommand(
adb_thread_, device_providers_, adb_thread_,
device_providers_for_test_.size() ?
device_providers_for_test_ :
device_providers_,
base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this)); base::Bind(&DevToolsAdbBridge::ReceivedRemoteDevices, this));
} }
......
...@@ -180,6 +180,11 @@ class DevToolsAdbBridge ...@@ -180,6 +180,11 @@ class DevToolsAdbBridge
void set_device_providers(DeviceProviders device_providers) { void set_device_providers(DeviceProviders device_providers) {
device_providers_ = device_providers; device_providers_ = device_providers;
} }
// If the test device provider is set all other providers are ignored.
void set_device_provider_for_test(
scoped_refptr<AndroidDeviceProvider> device_provider);
static bool HasDevToolsWindow(const std::string& agent_id); static bool HasDevToolsWindow(const std::string& agent_id);
private: private:
...@@ -197,6 +202,7 @@ class DevToolsAdbBridge ...@@ -197,6 +202,7 @@ class DevToolsAdbBridge
typedef std::vector<Listener*> Listeners; typedef std::vector<Listener*> Listeners;
Listeners listeners_; Listeners listeners_;
DeviceProviders device_providers_; DeviceProviders device_providers_;
DeviceProviders device_providers_for_test_;
DISALLOW_COPY_AND_ASSIGN(DevToolsAdbBridge); DISALLOW_COPY_AND_ASSIGN(DevToolsAdbBridge);
}; };
......
...@@ -247,6 +247,12 @@ class MockDeviceProvider : public AndroidDeviceProvider { ...@@ -247,6 +247,12 @@ class MockDeviceProvider : public AndroidDeviceProvider {
} }
}; };
// static
scoped_refptr<AndroidDeviceProvider>
AndroidDeviceProvider::GetMockDeviceProviderForTest() {
return new MockDeviceProvider();
}
static scoped_refptr<DevToolsAdbBridge::RemoteBrowser> static scoped_refptr<DevToolsAdbBridge::RemoteBrowser>
FindBrowserByDisplayName(DevToolsAdbBridge::RemoteBrowsers browsers, FindBrowserByDisplayName(DevToolsAdbBridge::RemoteBrowsers browsers,
const std::string& name) { const std::string& name) {
...@@ -355,7 +361,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsAdbBridgeTest, DiscoverAndroidBrowsers) { ...@@ -355,7 +361,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsAdbBridgeTest, DiscoverAndroidBrowsers) {
DevToolsAdbBridge::Factory::GetForProfile(browser()->profile()); DevToolsAdbBridge::Factory::GetForProfile(browser()->profile());
DevToolsAdbBridge::DeviceProviders providers; DevToolsAdbBridge::DeviceProviders providers;
providers.push_back(new MockDeviceProvider()); providers.push_back(AndroidDeviceProvider::GetMockDeviceProviderForTest());
adb_bridge->set_device_providers(providers); adb_bridge->set_device_providers(providers);
......
...@@ -2,11 +2,12 @@ ...@@ -2,11 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/devtools/devtools_adb_bridge.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/url_constants.h" #include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h" #include "chrome/test/base/ui_test_utils.h"
#include "chrome/test/base/web_ui_browsertest.h"
#include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_details.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h" #include "content/public/test/browser_test_utils.h"
...@@ -20,17 +21,29 @@ const char kSharedWorkerTestPage[] = ...@@ -20,17 +21,29 @@ const char kSharedWorkerTestPage[] =
const char kSharedWorkerJs[] = const char kSharedWorkerJs[] =
"files/workers/workers_ui_shared_worker.js"; "files/workers/workers_ui_shared_worker.js";
class InspectUITest : public InProcessBrowserTest { class InspectUITest : public WebUIBrowserTest {
public: public:
InspectUITest() {} InspectUITest() {}
virtual void SetUpOnMainThread() OVERRIDE {
WebUIBrowserTest::SetUpOnMainThread();
AddLibrary(base::FilePath(FILE_PATH_LITERAL("inspect_ui_test.js")));
}
private: private:
DISALLOW_COPY_AND_ASSIGN(InspectUITest); DISALLOW_COPY_AND_ASSIGN(InspectUITest);
}; };
// The test fails on Mac OS X and Windows, see crbug.com/89583 IN_PROC_BROWSER_TEST_F(InspectUITest, InspectUIPage) {
// Intermittently fails on Linux. ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIInspectURL));
IN_PROC_BROWSER_TEST_F(InspectUITest, DISABLED_SharedWorkersList) { ASSERT_TRUE(WebUIBrowserTest::RunJavascriptAsyncTest(
"testTargetListed",
new base::StringValue("#pages"),
new base::StringValue("populateWebContentsTargets"),
new base::StringValue(chrome::kChromeUIInspectURL)));
}
IN_PROC_BROWSER_TEST_F(InspectUITest, SharedWorker) {
ASSERT_TRUE(test_server()->Start()); ASSERT_TRUE(test_server()->Start());
GURL url = test_server()->GetURL(kSharedWorkerTestPage); GURL url = test_server()->GetURL(kSharedWorkerTestPage);
ui_test_utils::NavigateToURL(browser(), url); ui_test_utils::NavigateToURL(browser(), url);
...@@ -41,25 +54,32 @@ IN_PROC_BROWSER_TEST_F(InspectUITest, DISABLED_SharedWorkersList) { ...@@ -41,25 +54,32 @@ IN_PROC_BROWSER_TEST_F(InspectUITest, DISABLED_SharedWorkersList) {
NEW_FOREGROUND_TAB, NEW_FOREGROUND_TAB,
ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
WebContents* web_contents = ASSERT_TRUE(WebUIBrowserTest::RunJavascriptAsyncTest(
browser()->tab_strip_model()->GetActiveWebContents(); "testTargetListed",
ASSERT_TRUE(web_contents != NULL); new base::StringValue("#workers"),
new base::StringValue("populateWorkerTargets"),
std::string result; new base::StringValue(kSharedWorkerJs)));
ASSERT_TRUE(
content::ExecuteScriptAndExtractString( ASSERT_TRUE(WebUIBrowserTest::RunJavascriptAsyncTest(
web_contents, "testTargetListed",
"window.domAutomationController.send(" new base::StringValue("#pages"),
" '' + document.body.textContent);", new base::StringValue("populateWebContentsTargets"),
&result)); new base::StringValue(kSharedWorkerTestPage)));
ASSERT_TRUE(result.find(kSharedWorkerJs) != std::string::npos); }
ASSERT_TRUE(result.find(kSharedWorkerTestPage) != std::string::npos);
IN_PROC_BROWSER_TEST_F(InspectUITest, AdbTargets) {
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIInspectURL));
scoped_refptr<DevToolsAdbBridge> adb_bridge =
DevToolsAdbBridge::Factory::GetForProfile(browser()->profile());
adb_bridge->set_device_provider_for_test(
AndroidDeviceProvider::GetMockDeviceProviderForTest());
ASSERT_TRUE(WebUIBrowserTest::RunJavascriptAsyncTest("testAdbTargetsListed"));
} }
IN_PROC_BROWSER_TEST_F(InspectUITest, ReloadCrash) { IN_PROC_BROWSER_TEST_F(InspectUITest, ReloadCrash) {
ASSERT_TRUE(test_server()->Start()); ASSERT_TRUE(test_server()->Start());
// Make sure that loading the inspect UI twice in the same tab
// connects/disconnects listeners without crashing.
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIInspectURL)); ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIInspectURL));
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIInspectURL)); ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIInspectURL));
} }
......
// Copyright 2014 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.
function waitForElements(selector, populateFunctionName, callback) {
var elements = document.querySelectorAll(selector);
if (elements.length) {
callback(elements);
return;
}
var originalFunction = window[populateFunctionName];
expectNotEquals(undefined, originalFunction);
expectEquals(undefined, originalFunction.__isSniffer);
var interceptFunction = function() {
originalFunction.apply(window, arguments);
var elements = document.querySelectorAll(selector);
if (elements.length) {
window[populateFunctionName] = originalFunction;
callback(elements);
}
};
interceptFunction.__isSniffer = true;
window[populateFunctionName] = interceptFunction;
}
function findByContentSubstring(elements, content, childSelector) {
return Array.prototype.filter.call(elements, function(element) {
if (childSelector)
element = element.querySelector(childSelector);
return element && element.textContent.indexOf(content) >= 0;
})[0];
}
function testTargetListed(sectionSelector, populateFunctionName, url) {
waitForElements(
sectionSelector + ' .row',
populateFunctionName,
function(elements) {
var urlElement = findByContentSubstring(elements, url, '.url');
expectNotEquals(undefined, urlElement);
testDone();
});
}
function testAdbTargetsListed() {
waitForElements('.device', 'populateRemoteTargets', function(devices) {
expectEquals(2, devices.length);
var offlineDevice = findByContentSubstring(
devices, 'Offline', '.device-name');
expectNotEquals(undefined, offlineDevice);
var onlineDevice = findByContentSubstring(
devices, 'Nexus 6', '.device-name');
expectNotEquals(undefined, onlineDevice);
var browsers = onlineDevice.querySelectorAll('.browser');
expectEquals(4, browsers.length);
var chromeBrowser = findByContentSubstring(
browsers, 'Chrome (32.0.1679.0)', '.browser-name');
expectNotEquals(undefined, chromeBrowser);
var chromePages = chromeBrowser.querySelectorAll('.pages');
var chromiumPage = findByContentSubstring(
chromePages, 'http://www.chromium.org/', '.url');
expectNotEquals(undefined, chromiumPage);
var webView = findByContentSubstring(
browsers, 'WebView in com.sample.feed (4.0)', '.browser-name');
expectNotEquals(undefined, webView);
testDone();
});
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment