Commit d7c35a5b authored by yoshiki@chromium.org's avatar yoshiki@chromium.org

Video Player: Add a test to open a single video file

BUG=405415
TEST=browser_test passes

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

Cr-Commit-Position: refs/heads/master@{#290791}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@290791 0039d316-1c4b-4281-b951-d872f2087c98
parent e01a94d6
......@@ -1267,6 +1267,7 @@ class GalleryBrowserTestBase : public FileManagerBrowserTestBase {
protected:
virtual void SetUp() OVERRIDE {
AddScript("common/test_util_common.js");
AddScript("gallery/test_util.js");
FileManagerBrowserTestBase::SetUp();
}
......@@ -1458,5 +1459,68 @@ IN_PROC_BROWSER_TEST_F(GalleryBrowserTest, ExposureImageOnDrive) {
StartTest();
}
template<GuestMode M>
class VideoPlayerBrowserTestBase : public FileManagerBrowserTestBase {
public:
virtual GuestMode GetGuestModeParam() const OVERRIDE { return M; }
virtual const char* GetTestCaseNameParam() const OVERRIDE {
return test_case_name_.c_str();
}
protected:
virtual void SetUp() OVERRIDE {
AddScript("common/test_util_common.js");
AddScript("video_player/test_util.js");
FileManagerBrowserTestBase::SetUp();
}
virtual std::string OnMessage(const std::string& name,
const base::Value* value) OVERRIDE;
virtual const char* GetTestManifestName() const OVERRIDE {
return "video_player_test_manifest.json";
}
void AddScript(const std::string& name) {
scripts_.AppendString(
"chrome-extension://ljoplibgfehghmibaoaepfagnmbbfiga/" + name);
}
void set_test_case_name(const std::string& name) {
test_case_name_ = name;
}
private:
base::ListValue scripts_;
std::string test_case_name_;
};
template<GuestMode M>
std::string VideoPlayerBrowserTestBase<M>::OnMessage(const std::string& name,
const base::Value* value) {
if (name == "getScripts") {
std::string jsonString;
base::JSONWriter::Write(&scripts_, &jsonString);
return jsonString;
}
return FileManagerBrowserTestBase::OnMessage(name, value);
}
typedef VideoPlayerBrowserTestBase<NOT_IN_GUEST_MODE> VideoPlayerBrowserTest;
typedef VideoPlayerBrowserTestBase<IN_GUEST_MODE>
VideoPlayerBrowserTestInGuestMode;
IN_PROC_BROWSER_TEST_F(VideoPlayerBrowserTest, OpenSingleVideoOnDownloads) {
AddScript("video_player/open_video_files.js");
set_test_case_name("openSingleVideoOnDownloads");
StartTest();
}
IN_PROC_BROWSER_TEST_F(VideoPlayerBrowserTest, OpenSingleVideoOnDrive) {
AddScript("video_player/open_video_files.js");
set_test_case_name("openSingleVideoOnDrive");
StartTest();
}
} // namespace
} // namespace file_manager
......@@ -22,7 +22,7 @@ function loadScript(url) {
}
var testUtilPromise = loadScript(
'chrome-extension:///ejhcmmdhhpdhhgmifplfmjobgegbibkn/test_util.js');
'chrome-extension:///' + window.testExtensionId + '/test_util.js');
testUtilPromise.then(function() {
var inGuestModePromise = sendTestMessage({name: 'isInGuestMode'});
......
// 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.
'use strict';
/**
* Gets file entries just under the volume.
*
* @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
* @param {Array.<string>} names File name list.
* @return {Promise} Promise to be fulflled with Array.<FileEntry>.
*/
function getFilesUnderVolume(volumeType, names) {
var displayRootPromise =
VolumeManager.getInstance().then(function(volumeManager) {
var volumeInfo = volumeManager.getCurrentProfileVolumeInfo(volumeType);
return volumeInfo.resolveDisplayRoot();
});
return displayRootPromise.then(function(displayRoot) {
var filesPromise = names.map(function(name) {
return new Promise(
displayRoot.getFile.bind(displayRoot, name, {}));
});
return Promise.all(filesPromise);
});
}
/**
* Waits until an element appears and returns it.
*
* @param {AppWindow} appWindow Application window.
* @param {string} query Query for the element.
* @return {Promise} Promise to be fulfilled with the element.
*/
function waitForElement(appWindow, query) {
return repeatUntil(function() {
var element = appWindow.contentWindow.document.querySelector(query);
if (element)
return element;
else
return pending('The element %s is not found.', query);
});
}
/**
* Waits until an element disappears.
*
* @param {AppWindow} appWindow Application window.
* @param {string} query Query for the element.
* @return {Promise} Promise to be fulfilled with the element.
*/
function waitForElementLost(appWindow, query) {
return repeatUntil(function() {
var element = appWindow.contentWindow.document.querySelector(query);
if (element)
return pending('The element %s does not disappear.', query);
else
return true;
});
}
/**
* Shorthand for clicking an element.
* @param {AppWindow} appWindow Application window.
* @param {string} query Query for the element.
* @param {Promise} Promise to be fulfilled with the clicked element.
*/
function waitAndClickElement(appWindow, query) {
return waitForElement(appWindow, query).then(function(element) {
element.click();
return element;
});
}
/**
* Sends a fake key down event.
*
* @param {AppWindow} appWindow Application window.
* @param {string} query Query for the element to be dispatched an event to.
* @param {string} keyIdentifier Key identifier.
* @return {boolean} True on success.
*/
function sendKeyDown(appWindow, query, keyIdentifier) {
return appWindow.contentWindow.document.querySelector(query).dispatchEvent(
new KeyboardEvent(
'keydown',
{bubbles: true, keyIdentifier: keyIdentifier}));
}
/**
* Observes window errors that should fail the browser tests.
* @param {DOMWindow} window Windows to be obserbed.
*/
function observeWindowError(window) {
window.onerror = function(error) {
chrome.test.fail('window.onerror: ' + error);
};
}
......@@ -4,65 +4,6 @@
'use strict';
/**
* Gets file entries just under the volume.
*
* @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
* @param {Array.<string>} names File name list.
* @return {Promise} Promise to be fulflled with Array.<FileEntry>.
*/
function getFilesUnderVolume(volumeType, names) {
var displayRootPromise = backgroundComponentsPromise.then(
function(backgroundComponent) {
var volumeManager = backgroundComponent.volumeManager;
var volumeInfo = volumeManager.getCurrentProfileVolumeInfo(volumeType);
return new Promise(function(fulfill, reject) {
volumeInfo.resolveDisplayRoot(fulfill, reject);
});
});
return displayRootPromise.then(function(displayRoot) {
var filesPromise = names.map(function(name) {
return new Promise(
displayRoot.getFile.bind(displayRoot, name, {}));
});
return Promise.all(filesPromise);
});
}
/**
* Waits until an element appears and returns it.
*
* @param {AppWindow} appWindow Application window.
* @param {string} query Query for the element.
* @return {Promise} Promise to be fulfilled with the element.
*/
function waitForElement(appWindow, query) {
return repeatUntil(function() {
var element = appWindow.contentWindow.document.querySelector(query);
if (element)
return element;
else
return pending('The element %s is not found.', query);
});
}
/**
* Waits until an element disappears.
*
* @param {AppWindow} appWindow Application window.
* @param {string} query Query for the element.
* @return {Promise} Promise to be fulfilled with the element.
*/
function waitForElementLost(appWindow, query) {
return repeatUntil(function() {
var element = appWindow.contentWindow.document.querySelector(query);
if (element)
return pending('The element %s does not disappear.', query);
else
return true;
});
}
/**
* Launches the Gallery app with the test entries.
*
......@@ -82,6 +23,7 @@ function launchWithTestEntries(
volumeType,
selectedEntries.map(function(entry) { return entry.nameText; }));
});
return launch(entriesPromise).then(function() {
var launchedPromise = Promise.all([appWindowPromise, entriesPromise]);
return launchedPromise.then(function(results) {
......@@ -117,41 +59,3 @@ function waitForSlideImage(document, width, height, name) {
return actual;
});
}
/**
* Shorthand for clicking an element.
* @param {AppWindow} appWindow Application window.
* @param {string} query Query for the element.
* @param {Promise} Promise to be fulfilled with the clicked element.
*/
function waitAndClickElement(appWindow, query) {
return waitForElement(appWindow, query).then(function(element) {
element.click();
return element;
});
}
/**
* Sends a fake key down event.
*
* @param {AppWindow} appWindow Application window.
* @param {string} query Query for the element to be dispatched an event to.
* @param {string} keyIdentifier Key identifier.
* @return {boolean} True on success.
*/
function sendKeyDown(appWindow, query, keyIdentifier) {
return appWindow.contentWindow.document.querySelector(query).dispatchEvent(
new KeyboardEvent(
'keydown',
{bubbles: true, keyIdentifier: keyIdentifier}));
}
/**
* Observes window errors that should fail the browser tests.
* @param {DOMWindow} window Windows to be obserbed.
*/
function observeWindowError(window) {
window.onerror = function(error) {
chrome.test.fail('window.onerror: ' + error);
};
}
// 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.
'use strict';
chrome.runtime.sendMessage(
'jcgeabjmjgoblfofpppfkcoakmfobdko',
{name: 'testResourceLoaded'});
// 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.
'use strict';
/**
* Opens video player with a single video.
* @param {string} volumeName Test volume name passed to the addEntries
* function. Either 'drive' or 'local'.
* @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
* @return {Promise} Promise to be fulfilled with the video player element.
*/
function openSingleVideo(volumeName, volumeType) {
var entries = [ENTRIES.world];
return launch(volumeName, volumeType, entries).then(function(videoPlayer) {
chrome.test.assertTrue(videoPlayer.hasAttribute('first-video'));
chrome.test.assertTrue(videoPlayer.hasAttribute('last-video'));
chrome.test.assertFalse(videoPlayer.hasAttribute('multiple'));
chrome.test.assertFalse(videoPlayer.hasAttribute('disabled'));
return videoPlayer;
});
}
/**
* The openSingleImage test for Downloads.
* @return {Promise} Promise to be fulfilled with on success.
*/
function openSingleVideoOnDownloads() {
var test = openSingleVideo('local', VolumeManagerCommon.VolumeType.DOWNLOADS);
return test.then(function(videoPlayer) {
chrome.test.assertFalse(videoPlayer.hasAttribute('cast-available'));
});
}
/**
* The openSingleImage test for Drive.
* @return {Promise} Promise to be fulfilled with on success.
*/
function openSingleVideoOnDrive() {
var test = openSingleVideo('drive', VolumeManagerCommon.VolumeType.DRIVE);
return test.then(function(videoPlayer) {
// TODO(yoshiki): flip this after launching the feature.
chrome.test.assertFalse(videoPlayer.hasAttribute('cast-available'));
});
}
// 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.
'use strict';
/**
* Launches the video player with the given entries.
*
* @param {string} testVolumeName Test volume name passed to the addEntries
* function. Either 'drive' or 'local'.
* @param {VolumeManagerCommon.VolumeType} volumeType Volume type.
* @param {Array.<TestEntryInfo>} entries Entries to be parepared and passed to
* the application.
* @param {Array.<TestEntryInfo>=} opt_selected Entries to be selected. Should
* be a sub-set of the entries argument.
* @return {Promise} Promise to be fulfilled with the video player element.
*/
function launch(testVolumeName, volumeType, entries, opt_selected) {
var entriesPromise = addEntries([testVolumeName], entries).then(function() {
var selectedEntries = opt_selected || entries;
return getFilesUnderVolume(
volumeType,
selectedEntries.map(function(entry) { return entry.nameText; }));
});
var appWindow = null;
return entriesPromise.then(function(entries) {
return open(entries.map(function(entry) {
return {entry: entry, title: entry.name, url: entry.toURL()};
})).then(function() {
appWindow = appWindowsForTest[entries[0].name];
});
}).then(function() {
return Promise.all([
waitForElement(appWindow, '#video-player[first-video][last-video]'),
waitForElement(appWindow, '.play.media-button[state="playing"]'),
]).then(function(args) {
return args[0];
});
});
}
{
// chrome-extension://ljoplibgfehghmibaoaepfagnmbbfiga
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvT+IcKSOCmrC9IOpAGaNaUX2pbJSJchiYUuE9YilghsxGTWA8nC34k5/+BycWnBOEUow2pQmTRHuxt9E/CBzH15ah7NmikclL6UsoRgDb0Sj3zmhVNLXWX2jbFnECjTBPPbASj8Xnf20n6HNX3Yp9nnAJKzk5d/xzSgFz8uL9defwlZQB7t0E28+3DD9IoOWkEJWz6FRzhiY07TC2n6tjo0CPS150x1jEHyZF2oVLn8Cus28hBkoZ70GPWB6BQCxzGLcYWUJ6EKgE4iO9tcSDC2MMvA++n18JMb1APtxH3MIqQyGE/2cydjxEhhNLiD5Mp4tYHKObGWFefKQ0WlmEwIDAQAB",
"name": "chrome os video player browser tests",
"version": "0.1",
"manifest_version": 2,
"web_accessible_resources": ["*"],
"background": {"scripts": ["video_player/background.js"]},
"incognito" : "split"
}
......@@ -203,13 +203,14 @@ chrome.app.runtime.onLaunched.addListener(function(launchData) {
// If is is run in the browser test, wait for the test resources are installed
// as a component extension, and then load the test resources.
if (chrome.test) {
window.testExtensionId = 'ejhcmmdhhpdhhgmifplfmjobgegbibkn';
chrome.runtime.onMessageExternal.addListener(function(message) {
if (message.name !== 'testResourceLoaded')
return;
var script = document.createElement('script');
script.src =
'chrome-extension://ejhcmmdhhpdhhgmifplfmjobgegbibkn' +
'/gallery/test_loader.js';
'chrome-extension://' + window.testExtensionId +
'/common/test_loader.js';
document.documentElement.appendChild(script);
});
}
......@@ -68,21 +68,42 @@ function onLaunched(launchData) {
/**
* Opens player window.
* @param {Array.<Object>} videos List of videos to play.
* @param {Promise} Promise to be fulfilled on success, or rejected on error.
*/
function open(videos) {
chrome.app.window.create('video_player.html', {
id: 'video',
frame: 'none',
singleton: false,
minWidth: 480,
minHeight: 270
},
function(createdWindow) {
return new Promise(function(fulfill, reject) {
chrome.app.window.create('video_player.html', {
id: 'video',
frame: 'none',
singleton: false,
minWidth: 480,
minHeight: 270
},
fulfill);
}).then(function(createdWindow) {
// Stores the window for test purpose.
appWindowsForTest[videos[0].entry.name] = createdWindow;
createdWindow.setIcon('images/icon/video-player-64.png');
createdWindow.contentWindow.videos = videos;
chrome.runtime.sendMessage({ready: true}, function() {});
}.wrap());
}).catch(function(error) {
console.error('Launch failed', error.stack || error);
return Promise.reject(error);
});
}
// If is is run in the browser test, wait for the test resources are installed
// as a component extension, and then load the test resources.
if (chrome.test) {
window.testExtensionId = 'ljoplibgfehghmibaoaepfagnmbbfiga';
chrome.runtime.onMessageExternal.addListener(function(message) {
if (message.name !== 'testResourceLoaded')
return;
var script = document.createElement('script');
script.src =
'chrome-extension://' + window.testExtensionId +
'/common/test_loader.js';
document.documentElement.appendChild(script);
});
}
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