blob: f75cbf8652599ff261af3c51927f7e5d00f462e0 [file] [log] [blame]
// 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';
(function() {
/**
* Obtains track text.
* @param {string} audioAppId Window ID.
* @param {query} query Query for the track.
* @return {Promise} Promise to be fulfilled with {title:string, artist:string}
* object.
*/
function getTrackText(audioAppId, query) {
var titleElements = audioPlayerApp.callRemoteTestUtil(
'queryAllElements',
audioAppId,
[query + ' > .data > .data-title']);
var artistElements = audioPlayerApp.callRemoteTestUtil(
'queryAllElements',
audioAppId,
[query + ' > .data > .data-artist']);
return Promise.all([titleElements, artistElements]).then(function(data) {
return {
title: data[0][0] && data[0][0].text,
artist: data[1][0] && data[1][0].text
};
});
}
/**
* Tests if the audio player shows up for the selected image and that the audio
* is loaded successfully.
*
* @param {string} path Directory path to be tested.
*/
function audioOpen(path) {
var appId;
var audioAppId;
var expectedFilesBefore =
TestEntryInfo.getExpectedRows(path == RootPath.DRIVE ?
BASIC_DRIVE_ENTRY_SET : BASIC_LOCAL_ENTRY_SET).sort();
var expectedFilesAfter =
expectedFilesBefore.concat([ENTRIES.newlyAdded.getExpectedRow()]).sort();
StepsRunner.run([
function() {
setupAndWaitUntilReady(null, path, this.next);
},
// Select the song.
function(results) {
appId = results.windowId;
// Add an additional audio file.
addEntries(['local', 'drive'], [ENTRIES.newlyAdded], this.next);
},
function(result) {
chrome.test.assertTrue(result);
remoteCall.waitForFileListChange(appId, expectedFilesBefore.length).
then(this.next);
},
function(actualFilesAfter) {
chrome.test.assertEq(expectedFilesAfter, actualFilesAfter);
remoteCall.callRemoteTestUtil(
'openFile', appId, ['Beautiful Song.ogg'], this.next);
},
// Wait for the audio player window.
function(result) {
chrome.test.assertTrue(result);
audioPlayerApp.waitForWindow('audio_player.html').then(this.next);
},
// Wait for the changes of the player status.
function(inAppId) {
audioAppId = inAppId;
audioPlayerApp.waitForElement(audioAppId, 'audio-player[playing]').
then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/Beautiful%20Song.ogg',
element.attributes.currenttrackurl);
var query1 = 'audio-player /deep/ .track[index="0"][active]';
var query2 = 'audio-player /deep/ .track[index="1"]:not([active])';
repeatUntil(function() {
var trackText1 = getTrackText(audioAppId, query1);
var trackText2 = getTrackText(audioAppId, query2);
return Promise.all([trackText1, trackText2]).then(function(tracks) {
var expected = [
{title: 'Beautiful Song', artist: 'Unknown Artist'},
{title: 'newly added file', artist: 'Unknown Artist'}
];
if (!chrome.test.checkDeepEq(expected, tracks)) {
return pending('Tracks are expected as: %j, but is %j.',
expected, tracks);
}
});
}).then(this.next, function(e) { chrome.test.fail(e); });
},
// Open another file.
function() {
remoteCall.callRemoteTestUtil(
'openFile', appId, ['newly added file.ogg'], this.next);
},
// Wait for the changes of the player status.
function(result) {
chrome.test.assertTrue(result, 'Fail to open the 2nd file');
var query = 'audio-player' +
'[playing]' +
'[currenttrackurl$="newly%20added%20file.ogg"]';
audioPlayerApp.waitForElement(audioAppId, query).then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/newly%20added%20file.ogg',
element.attributes.currenttrackurl);
var query1 = 'audio-player /deep/ .track[index="0"]:not([active])';
var query2 = 'audio-player /deep/ .track[index="1"][active]';
repeatUntil(function() {
var trackText1 = getTrackText(audioAppId, query1);
var trackText2 = getTrackText(audioAppId, query2);
return Promise.all([trackText1, trackText2]).then(function(tracks) {
var expected = [
{title: 'Beautiful Song', artist: 'Unknown Artist'},
{title: 'newly added file', artist: 'Unknown Artist'}
];
if (!chrome.test.checkDeepEq(expected, tracks)) {
return pending('Tracks are expected as: %j, but is %j.',
expected, tracks);
}
});
}).then(this.next, function(e) { chrome.test.fail(e); });
},
// Wait for the changes of the player status.
function() {
// Close window
audioPlayerApp.closeWindowAndWait(audioAppId).then(this.next);
},
// Wait for the audio player.
function(result) {
chrome.test.assertTrue(result, 'Fail to close the window');
checkIfNoErrorsOccured(this.next);
}
]);
}
/**
* Tests if the audio player play the next file after the current file.
*
* @param {string} path Directory path to be tested.
*/
function audioAutoAdvance(path) {
var appId;
var audioAppId;
var expectedFilesBefore =
TestEntryInfo.getExpectedRows(path == RootPath.DRIVE ?
BASIC_DRIVE_ENTRY_SET : BASIC_LOCAL_ENTRY_SET).sort();
var expectedFilesAfter =
expectedFilesBefore.concat([ENTRIES.newlyAdded.getExpectedRow()]).sort();
StepsRunner.run([
function() {
setupAndWaitUntilReady(null, path, this.next);
},
// Select the song.
function(results) {
appId = results.windowId;
// Add an additional audio file.
addEntries(['local', 'drive'], [ENTRIES.newlyAdded], this.next);
},
function(result) {
chrome.test.assertTrue(result);
remoteCall.waitForFileListChange(appId, expectedFilesBefore.length).
then(this.next);
},
function(actualFilesAfter) {
chrome.test.assertEq(expectedFilesAfter, actualFilesAfter);
remoteCall.callRemoteTestUtil(
'openFile', appId, ['Beautiful Song.ogg'], this.next);
},
// Wait for the audio player window.
function(result) {
chrome.test.assertTrue(result);
audioPlayerApp.waitForWindow('audio_player.html').then(this.next);
},
// Wait for the changes of the player status.
function(inAppId) {
audioAppId = inAppId;
audioPlayerApp.waitForElement(audioAppId, 'audio-player[playing]').
then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/Beautiful%20Song.ogg',
element.attributes.currenttrackurl);
// Wait for next song.
var query = 'audio-player' +
'[playing]' +
'[currenttrackurl$="newly%20added%20file.ogg"]';
audioPlayerApp.waitForElement(audioAppId, query).then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/newly%20added%20file.ogg',
element.attributes.currenttrackurl);
// Close window
audioPlayerApp.closeWindowAndWait(audioAppId).then(this.next);
},
function(result) {
chrome.test.assertTrue(result);
checkIfNoErrorsOccured(this.next);
}
]);
}
/**
* Tests if the audio player play the next file after the current file.
*
* @param {string} path Directory path to be tested.
*/
function audioRepeatSingleFile(path) {
var appId;
var audioAppId;
StepsRunner.run([
function() {
setupAndWaitUntilReady(null, path, this.next);
},
// Select the song.
function(results) {
appId = results.windowId;
remoteCall.callRemoteTestUtil(
'openFile', appId, ['Beautiful Song.ogg'], this.next);
},
// Wait for the audio player window.
function(result) {
chrome.test.assertTrue(result);
audioPlayerApp.waitForWindow('audio_player.html').then(this.next);
},
// Wait for the changes of the player status.
function(inAppId) {
audioAppId = inAppId;
audioPlayerApp.waitForElement(audioAppId, 'audio-player[playing]').
then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/Beautiful%20Song.ogg',
element.attributes.currenttrackurl);
audioPlayerApp.callRemoteTestUtil(
'fakeMouseClick',
audioAppId,
['audio-player /deep/ files-icon-button.repeat'],
this.next);
},
function(result) {
chrome.test.assertTrue(result, 'Failed to click the repeat button');
var selector = 'audio-player[playing][playcount="1"]';
audioPlayerApp.waitForElement(audioAppId, selector).then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/Beautiful%20Song.ogg',
element.attributes.currenttrackurl);
// Close window
audioPlayerApp.closeWindowAndWait(audioAppId).then(this.next);
},
// Wait for the audio player.
function(result) {
chrome.test.assertTrue(result);
checkIfNoErrorsOccured(this.next);
}
]);
}
/**
* Tests if the audio player play the next file after the current file.
*
* @param {string} path Directory path to be tested.
*/
function audioNoRepeatSingleFile(path) {
var appId;
var audioAppId;
StepsRunner.run([
function() {
setupAndWaitUntilReady(null, path, this.next);
},
// Select the song.
function(results) {
appId = results.windowId;
remoteCall.callRemoteTestUtil(
'openFile', appId, ['Beautiful Song.ogg'], this.next);
},
// Wait for the audio player window.
function(result) {
chrome.test.assertTrue(result);
audioPlayerApp.waitForWindow('audio_player.html').then(this.next);
},
// Wait for the changes of the player status.
function(inAppId) {
audioAppId = inAppId;
audioPlayerApp.waitForElement(audioAppId, 'audio-player[playing]').
then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/Beautiful%20Song.ogg',
element.attributes.currenttrackurl);
var selector = 'audio-player[playcount="1"]:not([playing])';
audioPlayerApp.waitForElement(audioAppId, selector).then(this.next);
},
// Get the source file name.
function(element) {
// Close window
audioPlayerApp.closeWindowAndWait(audioAppId).then(this.next);
},
// Wait for the audio player.
function(result) {
chrome.test.assertTrue(result);
checkIfNoErrorsOccured(this.next);
}
]);
}
/**
* Tests if the audio player play the next file after the current file.
*
* @param {string} path Directory path to be tested.
*/
function audioRepeatMultipleFile(path) {
var appId;
var audioAppId;
var expectedFilesBefore =
TestEntryInfo.getExpectedRows(path == RootPath.DRIVE ?
BASIC_DRIVE_ENTRY_SET : BASIC_LOCAL_ENTRY_SET);
var expectedFilesAfter =
expectedFilesBefore.concat([ENTRIES.newlyAdded.getExpectedRow()]);
StepsRunner.run([
function() {
setupAndWaitUntilReady(null, path, this.next);
},
// Select the song.
function(results) {
appId = results.windowId;
// Add an additional audio file.
addEntries(['local', 'drive'], [ENTRIES.newlyAdded], this.next);
},
function(result) {
chrome.test.assertTrue(result);
remoteCall.waitForFiles(appId, expectedFilesAfter).then(this.next);
},
function(/* no result */) {
remoteCall.callRemoteTestUtil(
'openFile', appId, ['newly added file.ogg'], this.next);
},
// Wait for the audio player window.
function(result) {
chrome.test.assertTrue(result);
audioPlayerApp.waitForWindow('audio_player.html').then(this.next);
},
// Wait for the changes of the player status.
function(inAppId) {
audioAppId = inAppId;
audioPlayerApp.waitForElement(audioAppId, 'audio-player[playing]').
then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/newly%20added%20file.ogg',
element.attributes.currenttrackurl);
audioPlayerApp.callRemoteTestUtil(
'fakeMouseClick',
audioAppId,
['audio-player /deep/ files-icon-button.repeat'],
this.next);
},
function(result) {
chrome.test.assertTrue(result, 'Failed to click the repeat button');
// Wait for next song.
var query = 'audio-player' +
'[playing]' +
'[currenttrackurl$="Beautiful%20Song.ogg"]';
audioPlayerApp.waitForElement(audioAppId, query).then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/Beautiful%20Song.ogg',
element.attributes.currenttrackurl);
// Close window
audioPlayerApp.closeWindowAndWait(audioAppId).then(this.next);
},
// Wait for the audio player.
function(result) {
chrome.test.assertTrue(result);
checkIfNoErrorsOccured(this.next);
}
]);
}
/**
* Tests if the audio player play the next file after the current file.
*
* @param {string} path Directory path to be tested.
*/
function audioNoRepeatMultipleFile(path) {
var appId;
var audioAppId;
var expectedFilesBefore =
TestEntryInfo.getExpectedRows(path == RootPath.DRIVE ?
BASIC_DRIVE_ENTRY_SET : BASIC_LOCAL_ENTRY_SET);
var expectedFilesAfter =
expectedFilesBefore.concat([ENTRIES.newlyAdded.getExpectedRow()]);
StepsRunner.run([
function() {
setupAndWaitUntilReady(null, path, this.next);
},
// Select the song.
function(results) {
appId = results.windowId;
// Add an additional audio file.
addEntries(['local', 'drive'], [ENTRIES.newlyAdded], this.next);
},
function(result) {
chrome.test.assertTrue(result);
remoteCall.waitForFiles(appId, expectedFilesAfter).then(this.next);
},
function(/* no result */) {
remoteCall.callRemoteTestUtil(
'openFile', appId, ['newly added file.ogg'], this.next);
},
// Wait for the audio player window.
function(result) {
chrome.test.assertTrue(result);
audioPlayerApp.waitForWindow('audio_player.html').then(this.next);
},
// Wait for the changes of the player status.
function(inAppId) {
audioAppId = inAppId;
audioPlayerApp.waitForElement(audioAppId, 'audio-player[playing]').
then(this.next);
},
// Get the source file name.
function(element) {
chrome.test.assertEq(
'filesystem:chrome-extension://' + AUDIO_PLAYER_APP_ID + '/' +
'external' + path + '/newly%20added%20file.ogg',
element.attributes.currenttrackurl);
// Wait for next song.
var query = 'audio-player:not([playing])';
audioPlayerApp.waitForElement(audioAppId, query).then(this.next);
},
// Get the source file name.
function(element) {
// Close window
audioPlayerApp.closeWindowAndWait(audioAppId).then(this.next);
},
// Wait for the audio player.
function(result) {
chrome.test.assertTrue(result);
checkIfNoErrorsOccured(this.next);
}
]);
}
testcase.audioOpenDownloads = function() {
audioOpen(RootPath.DOWNLOADS);
};
testcase.audioOpenDrive = function() {
audioOpen(RootPath.DRIVE);
};
testcase.audioAutoAdvanceDrive = function() {
audioAutoAdvance(RootPath.DRIVE);
};
testcase.audioRepeatSingleFileDrive = function() {
audioRepeatSingleFile(RootPath.DRIVE);
};
testcase.audioNoRepeatSingleFileDrive = function() {
audioNoRepeatSingleFile(RootPath.DRIVE);
};
testcase.audioRepeatMultipleFileDrive = function() {
audioRepeatMultipleFile(RootPath.DRIVE);
};
testcase.audioNoRepeatMultipleFileDrive = function() {
audioNoRepeatMultipleFile(RootPath.DRIVE);
};
})();