Skip to content
Snippets Groups Projects
Commit d328413b authored by rafaelw@chromium.org's avatar rafaelw@chromium.org
Browse files

Address ExtensionApiTest.Tabs flakiness

This addresses two problems. (1) relativeUrlTabsUpdate could fail because it was depending on testTabId getting set from relativeUrlTabsCreate, which may have happened out of order. I have refactored the callback blocking so additional blocks can be created with chrome.test.callbackAdded().

(2) tabs.update({url:}) is still failing intermitantly. This changes addeds valid html files in the extension which can be navitation targets (previously, non-existent urls had been used), in the hopes that the random failures had to do with load errors.

BUG=20828

Review URL: http://codereview.chromium.org/195090

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26258 0039d316-1c4b-4281-b951-d872f2087c98
parent ad6d2c43
No related merge requests found
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_apitest.h"
// TODO(asargent): http://crbug.com/20828 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Tabs) {
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_Tabs) {
ASSERT_TRUE(RunExtensionTest("tabs")) << message_; ASSERT_TRUE(RunExtensionTest("tabs")) << message_;
} }
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- This comment is only here because changes to resources are not picked up <!-- This comment is only here because changes to resources are not picked up
without changes to the corresponding grd file. rw --> without changes to the corresponding grd file. rw2 -->
<grit latest_public_release="0" current_release="1"> <grit latest_public_release="0" current_release="1">
<outputs> <outputs>
<output filename="grit/renderer_resources.h" type="rc_header"> <output filename="grit/renderer_resources.h" type="rc_header">
......
...@@ -48,17 +48,17 @@ var chrome = chrome || {}; ...@@ -48,17 +48,17 @@ var chrome = chrome || {};
chrome.test.notifyPass(); chrome.test.notifyPass();
complete(); complete();
} }
var pendingCallbacks = 0; var pendingCallbacks = 0;
function callbackAdded() { chrome.test.callbackAdded = function () {
pendingCallbacks++; pendingCallbacks++;
};
function callbackCompleted() { return function() {
pendingCallbacks--; pendingCallbacks--;
if (pendingCallbacks == 0) { if (pendingCallbacks == 0) {
chrome.test.succeed(); chrome.test.succeed();
}
} }
}; };
...@@ -148,7 +148,7 @@ var chrome = chrome || {}; ...@@ -148,7 +148,7 @@ var chrome = chrome || {};
if (func) { if (func) {
chrome.test.assertEq(typeof(func), 'function'); chrome.test.assertEq(typeof(func), 'function');
} }
callbackAdded(); var callbackCompleted = chrome.test.callbackAdded();
return function() { return function() {
if (expectedError == null) { if (expectedError == null) {
...@@ -167,7 +167,7 @@ var chrome = chrome || {}; ...@@ -167,7 +167,7 @@ var chrome = chrome || {};
}; };
chrome.test.listenOnce = function(event, func) { chrome.test.listenOnce = function(event, func) {
callbackAdded(); var callbackCompleted = chrome.test.callbackAdded();
var listener = function() { var listener = function() {
event.removeListener(listener); event.removeListener(listener);
safeFunctionApply(func, arguments); safeFunctionApply(func, arguments);
...@@ -177,14 +177,13 @@ var chrome = chrome || {}; ...@@ -177,14 +177,13 @@ var chrome = chrome || {};
}; };
chrome.test.listenForever = function(event, func) { chrome.test.listenForever = function(event, func) {
callbackAdded(); var callbackCompleted = chrome.test.callbackAdded();
var listener = function() { var listener = function() {
safeFunctionApply(func, arguments); safeFunctionApply(func, arguments);
}; };
var done = {}; var done = function() {
done.doneListening = function() {
event.removeListener(listener); event.removeListener(listener);
callbackCompleted(); callbackCompleted();
}; };
......
<html>
<body>
<h1>A</h1>
</body>
</html>
\ No newline at end of file
<html>
<body>
<h1>B</h1>
</body>
</html>
\ No newline at end of file
<html>
<body>
<h1>C</h1>
</body>
</html>
\ No newline at end of file
<html>
<body>
<h1>D</h1>
</body>
</html>
\ No newline at end of file
<html>
<body>
<h1>E</h1>
</body>
</html>
\ No newline at end of file
<html>
<body>
<h1>F</h1>
</body>
</html>
\ No newline at end of file
...@@ -16,9 +16,8 @@ var pass = chrome.test.callbackPass; ...@@ -16,9 +16,8 @@ var pass = chrome.test.callbackPass;
var assertEq = chrome.test.assertEq; var assertEq = chrome.test.assertEq;
var assertTrue = chrome.test.assertTrue; var assertTrue = chrome.test.assertTrue;
// Called by relative.html during onload. function pageUrl(letter) {
function relativePageLoaded() { return chrome.extension.getURL(letter + ".html");
chrome.test.succeed();
} }
chrome.test.runTests([ chrome.test.runTests([
...@@ -56,10 +55,10 @@ chrome.test.runTests([ ...@@ -56,10 +55,10 @@ chrome.test.runTests([
assertTrue(win.id > 0); assertTrue(win.id > 0);
secondWindowId = win.id; secondWindowId = win.id;
// Create first window. // Create first window.
chrome.tabs.create({"windowId" : firstWindowId, "url" : "chrome://a"}, chrome.tabs.create({"windowId" : firstWindowId, "url" : pageUrl("a")},
pass(function() { pass(function() {
// Create second window. // Create second window.
chrome.tabs.create({"windowId" : secondWindowId, "url" : "chrome://b"}, chrome.tabs.create({"windowId" : secondWindowId, "url" :pageUrl("b")},
pass()); pass());
})); }));
})); }));
...@@ -80,7 +79,7 @@ chrome.test.runTests([ ...@@ -80,7 +79,7 @@ chrome.test.runTests([
} }
assertEq("about:blank", tabs[0].url); assertEq("about:blank", tabs[0].url);
assertEq("chrome://newtab/", tabs[1].url); assertEq("chrome://newtab/", tabs[1].url);
assertEq("chrome://a/", tabs[2].url); assertEq(pageUrl("a"), tabs[2].url);
testTabId = tabs[2].id; testTabId = tabs[2].id;
})); }));
}, },
...@@ -94,20 +93,20 @@ chrome.test.runTests([ ...@@ -94,20 +93,20 @@ chrome.test.runTests([
assertEq(i, tabs[i].index); assertEq(i, tabs[i].index);
} }
assertEq("chrome://newtab/", tabs[0].url); assertEq("chrome://newtab/", tabs[0].url);
assertEq("chrome://b/", tabs[1].url); assertEq(pageUrl("b"), tabs[1].url);
})); }));
}, },
function updateUrl() { function updateUrl() {
chrome.tabs.get(testTabId, pass(function(tab) { chrome.tabs.get(testTabId, pass(function(tab) {
assertEq("chrome://a/", tab.url); assertEq(pageUrl("a"), tab.url);
// Update url. // Update url.
chrome.tabs.update(testTabId, {"url": "chrome://c/"}, chrome.tabs.update(testTabId, {"url": pageUrl("c")},
pass(function(tab){ pass(function(tab){
chrome.test.assertEq("chrome://c/", tab.url); chrome.test.assertEq(pageUrl("c"), tab.url);
// Check url. // Check url.
chrome.tabs.get(testTabId, pass(function(tab) { chrome.tabs.get(testTabId, pass(function(tab) {
assertEq("chrome://c/", tab.url); assertEq(pageUrl("c"), tab.url);
})); }));
})); }));
})); }));
...@@ -158,9 +157,9 @@ chrome.test.runTests([ ...@@ -158,9 +157,9 @@ chrome.test.runTests([
var letters = ['a', 'b', 'c', 'd', 'e']; var letters = ['a', 'b', 'c', 'd', 'e'];
for (var i in letters) { for (var i in letters) {
chrome.tabs.create({"windowId": moveWindow1, chrome.tabs.create({"windowId": moveWindow1,
"url": "chrome://" + letters[i]}, "url": pageUrl(letters[i])},
pass(function(tab) { pass(function(tab) {
var letter = tab.url[tab.url.length-2]; var letter = tab.url[tab.url.length-6];
moveTabIds[letter] = tab.id; moveTabIds[letter] = tab.id;
// Assert on last callback that tabs were added in the order we created // Assert on last callback that tabs were added in the order we created
...@@ -169,11 +168,11 @@ chrome.test.runTests([ ...@@ -169,11 +168,11 @@ chrome.test.runTests([
chrome.tabs.getAllInWindow(moveWindow1, pass(function(tabs) { chrome.tabs.getAllInWindow(moveWindow1, pass(function(tabs) {
assertEq(6, tabs.length); assertEq(6, tabs.length);
assertEq("chrome://newtab/", tabs[0].url); assertEq("chrome://newtab/", tabs[0].url);
assertEq("chrome://a/", tabs[1].url); assertEq(pageUrl("a"), tabs[1].url);
assertEq("chrome://b/", tabs[2].url); assertEq(pageUrl("b"), tabs[2].url);
assertEq("chrome://c/", tabs[3].url); assertEq(pageUrl("c"), tabs[3].url);
assertEq("chrome://d/", tabs[4].url); assertEq(pageUrl("d"), tabs[4].url);
assertEq("chrome://e/", tabs[5].url); assertEq(pageUrl("e"), tabs[5].url);
})); }));
} }
})); }));
...@@ -209,15 +208,15 @@ chrome.test.runTests([ ...@@ -209,15 +208,15 @@ chrome.test.runTests([
chrome.tabs.getAllInWindow(moveWindow1, pass(function(tabs) { chrome.tabs.getAllInWindow(moveWindow1, pass(function(tabs) {
assertEq(4, tabs.length); assertEq(4, tabs.length);
assertEq("chrome://newtab/", tabs[0].url); assertEq("chrome://newtab/", tabs[0].url);
assertEq("chrome://a/", tabs[1].url); assertEq(pageUrl("a"), tabs[1].url);
assertEq("chrome://e/", tabs[2].url); assertEq(pageUrl("e"), tabs[2].url);
assertEq("chrome://c/", tabs[3].url); assertEq(pageUrl("c"), tabs[3].url);
chrome.tabs.getAllInWindow(moveWindow2, pass(function(tabs) { chrome.tabs.getAllInWindow(moveWindow2, pass(function(tabs) {
assertEq(3, tabs.length); assertEq(3, tabs.length);
assertEq("chrome://b/", tabs[0].url); assertEq(pageUrl("b"), tabs[0].url);
assertEq("chrome://newtab/", tabs[1].url); assertEq("chrome://newtab/", tabs[1].url);
assertEq("chrome://d/", tabs[2].url); assertEq(pageUrl("d"), tabs[2].url);
})); }));
})); }));
}, },
...@@ -227,7 +226,7 @@ chrome.test.runTests([ ...@@ -227,7 +226,7 @@ chrome.test.runTests([
chrome.tabs.getAllInWindow(moveWindow2, chrome.tabs.getAllInWindow(moveWindow2,
pass(function(tabs) { pass(function(tabs) {
assertEq(2, tabs.length); assertEq(2, tabs.length);
assertEq("chrome://b/", tabs[0].url); assertEq(pageUrl("b"), tabs[0].url);
assertEq("chrome://newtab/", tabs[1].url); assertEq("chrome://newtab/", tabs[1].url);
})); }));
})); }));
...@@ -276,23 +275,23 @@ chrome.test.runTests([ ...@@ -276,23 +275,23 @@ chrome.test.runTests([
function onCreated() { function onCreated() {
chrome.test.listenOnce(chrome.tabs.onCreated, function(tab) { chrome.test.listenOnce(chrome.tabs.onCreated, function(tab) {
assertEq("chrome://f/", tab.url); assertEq(pageUrl("f"), tab.url);
}); });
chrome.tabs.create({"windowId": moveWindow1, "url": "chrome://f", chrome.tabs.create({"windowId": moveWindow1, "url": pageUrl("f"),
"selected": true}, pass(function(tab) {})); "selected": true}, pass(function(tab) {}));
}, },
function onUpdated() { function onUpdated() {
var listener = chrome.test.listenForever(chrome.tabs.onUpdated, var onUpdatedCompleted = chrome.test.listenForever(chrome.tabs.onUpdated,
function(tabid, info) { function(tabid, info) {
if (tabid == moveTabIds['a'] && info.status == "complete") { if (tabid == moveTabIds['a'] && info.status == "complete") {
listener.doneListening(); onUpdatedCompleted();
} }
} }
); );
chrome.tabs.update(moveTabIds['a'], {"url": "chrome://aa"}, chrome.tabs.update(moveTabIds['a'], {"url": pageUrl("f")},
pass()); pass());
}, },
...@@ -338,25 +337,34 @@ chrome.test.runTests([ ...@@ -338,25 +337,34 @@ chrome.test.runTests([
})); }));
}, },
// The subsequent three tests all load relative.html, which calls
// this page's relativePageLoad(), which ends the test.
function relativeUrlTabsCreate() { function relativeUrlTabsCreate() {
// Will be called from relative.html
window.relativePageLoaded = chrome.test.callbackAdded();
var createCompleted = chrome.test.callbackAdded();
chrome.tabs.create({windowId: firstWindowId, url: 'relative.html'}, chrome.tabs.create({windowId: firstWindowId, url: 'relative.html'},
function(tab){ function(tab){
testTabId = tab.id; testTabId = tab.id;
createCompleted();
} }
); );
}, },
function relativeUrlTabsUpdate() { function relativeUrlTabsUpdate() {
chrome.tabs.update(testTabId, {url: "chrome://a/"}, function(tab) { // Will be called from relative.html
chrome.test.assertEq("chrome://a/", tab.url); window.relativePageLoaded = chrome.test.callbackAdded();
chrome.tabs.update(testTabId, {url: pageUrl("a")}, function(tab) {
chrome.test.assertEq(pageUrl("a"), tab.url);
chrome.tabs.update(tab.id, {url: "relative.html"}, function(tab) { chrome.tabs.update(tab.id, {url: "relative.html"}, function(tab) {
}); });
}); });
}, },
function relativeUrlWindowsCreate() { function relativeUrlWindowsCreate() {
// Will be called from relative.html
window.relativePageLoaded = chrome.test.callbackAdded();
chrome.windows.create({url: "relative.html"}); chrome.windows.create({url: "relative.html"});
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment