| // Copyright (c) 2013 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 addTests() { |
| var currentTest = null; |
| |
| function dispatchClick(element) { |
| element.dispatchEvent(new MouseEvent('click')); |
| } |
| |
| function getVisibleElementByTagName(tag) { |
| var selector = '.function:not([hidden]) ' + tag; |
| return document.querySelector(selector); |
| } |
| |
| function clickRadio(name) { |
| currentTest.log('Clicking ' + name + ' radio button.'); |
| dispatchClick(document.getElementById('radio_' + name)); |
| } |
| |
| function setInputValue(value, selector) { |
| if (!selector) { |
| selector = 'input'; |
| } |
| |
| currentTest.log('Setting input box to "' + value + '".'); |
| getVisibleElementByTagName(selector).value = value; |
| } |
| |
| function setTextareaValue(value) { |
| currentTest.log('Setting textarea to "' + value + '".'); |
| getVisibleElementByTagName('textarea').value = value; |
| } |
| |
| function getTextareaValue() { |
| return getVisibleElementByTagName('textarea').value; |
| } |
| |
| function getLastLogMessage() { |
| var logEl = document.getElementById('log'); |
| var logLines = logEl.textContent.split('\n'); |
| return logLines[logLines.length - 1]; |
| } |
| |
| function waitForLog(logMessage, onLogChanged, onError) { |
| // Clear the log. This prevents a previous failure from propagating to the |
| // current check. (NOTE: the log is backed by an array, so as soon as a |
| // message is logged it will be refilled with its previous data in addition |
| // to the new message.) |
| document.getElementById('log').textContent = ''; |
| |
| // Poll for log changes. |
| var intervalId = window.setInterval(function() { |
| var lastLogMessage = getLastLogMessage(); |
| |
| if (lastLogMessage.lastIndexOf('Error:', 0) === 0) { |
| window.clearInterval(intervalId); |
| if (onError) { |
| currentTest.log('Got error message, continuing.'); |
| onError(); |
| } else { |
| currentTest.fail('Unexpected failure waiting for log change.'); |
| } |
| |
| return; |
| } |
| |
| if (logMessage !== lastLogMessage) |
| return; |
| |
| currentTest.log('Got log message, continuing.'); |
| window.clearInterval(intervalId); |
| onLogChanged(); |
| }, 100); |
| } |
| |
| function clickExecuteButtonAndWaitForLog(logMessage, onLogChanged, onError) { |
| waitForLog(logMessage, onLogChanged, onError); |
| currentTest.log('Clicking button.'); |
| dispatchClick(getVisibleElementByTagName('button')); |
| currentTest.log('Waiting for log message: "' + logMessage + '".'); |
| } |
| |
| function isFilenameInDirectoryList(filename) { |
| var listItemEls = document.querySelectorAll('#listDirOutput li'); |
| |
| currentTest.log('Looking for ' + filename); |
| for (var i = 0; i < listItemEls.length; ++i) { |
| var itemText = listItemEls[i].textContent; |
| currentTest.log('Found ' + itemText); |
| if (itemText === filename) { |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| function saveFile(filename, fileText, onFileSaved, onError) { |
| clickRadio('saveFile'); |
| setInputValue(filename); |
| setTextareaValue(fileText); |
| clickExecuteButtonAndWaitForLog('Save success', onFileSaved, onError); |
| } |
| |
| function loadFile(filename, onFileLoaded, onError) { |
| clickRadio('loadFile'); |
| setInputValue(filename); |
| setTextareaValue(''); // Clear the textarea. |
| clickExecuteButtonAndWaitForLog('Load success', onFileLoaded, onError); |
| } |
| |
| function deleteFile(filename, onFileDeleted, onError) { |
| clickRadio('delete'); |
| setInputValue(filename); |
| clickExecuteButtonAndWaitForLog('Delete success', onFileDeleted, onError); |
| } |
| |
| function listDir(dirname, onDirectoryListed, onError) { |
| clickRadio('listDir'); |
| setInputValue(dirname); |
| clickExecuteButtonAndWaitForLog('List success', onDirectoryListed, onError); |
| } |
| |
| function makeDir(dirname, onDirectoryMade, onError) { |
| clickRadio('makeDir'); |
| setInputValue(dirname); |
| clickExecuteButtonAndWaitForLog('Make directory success', |
| onDirectoryMade, onError); |
| } |
| |
| function rename(oldname, newname, onRenamed, onError) { |
| clickRadio('rename'); |
| setInputValue(oldname, '#renameOld'); |
| setInputValue(newname, '#renameNew'); |
| clickExecuteButtonAndWaitForLog('Rename success', onRenamed, onError); |
| } |
| |
| function expectEq(expected, actual, additionalInfo) { |
| var message; |
| if (expected !== actual) { |
| if (additionalInfo) |
| message = additionalInfo + ': '; |
| message += 'Expected "' + expected + '", got "' + actual + '".'; |
| currentTest.fail(message); |
| } else { |
| message = 'OK, "' + expected + '" === "' + actual + '".'; |
| currentTest.log(message); |
| } |
| } |
| |
| function expectContains(needle, haystack, additionalInfo) { |
| if (haystack.indexOf(needle) === -1) { |
| if (additionalInfo) |
| message = additionalInfo + ': '; |
| message += 'Expected to find "' + needle + '" in "' + haystack + '".'; |
| currentTest.fail(message); |
| } else { |
| message = 'OK, "' + needle + '" in "' + haystack + '".'; |
| currentTest.log(message); |
| } |
| } |
| |
| function expectFilenameInDirectoryList(filename, additionalInfo) { |
| if (!isFilenameInDirectoryList(filename)) { |
| if (additionalInfo) |
| message = additionalInfo + ': '; |
| message += 'Expected to find "' + filename + '" in directory list.'; |
| currentTest.fail(message); |
| } else { |
| message = 'OK, found "' + filename + ' in the directory list.'; |
| currentTest.log(message); |
| } |
| } |
| |
| common.tester.addAsyncTest('filesystem_ready', function(test) { |
| // This is a bit fragile; we rely on this test being run first (and |
| // completing) before we can run any of the other tests. |
| currentTest = test; |
| var message = 'Filesystem ready!'; |
| |
| // This message may already be logged. |
| if (getLastLogMessage() == message) { |
| test.pass(); |
| return; |
| } |
| |
| waitForLog('Filesystem ready!', function() { |
| test.pass(); |
| }, function() { |
| test.fail('Got unexpected error waiting for filesystem: '); |
| }); |
| }); |
| |
| common.tester.addAsyncTest('save_and_load', function(test) { |
| currentTest = test; |
| var filename = '/save_and_load.txt'; |
| var fileText = 'A penny saved is a penny earned.'; |
| |
| // Save the file. |
| saveFile(filename, fileText, function() { |
| // Now try to load it. |
| loadFile(filename, function() { |
| // Make sure the text matches. |
| expectEq(fileText, getTextareaValue(), 'Incorrect textarea'); |
| test.pass(); |
| }); |
| }); |
| }); |
| |
| common.tester.addAsyncTest('delete_file', function(test) { |
| currentTest = test; |
| var filename = '/delete_file.txt'; |
| |
| saveFile(filename, 'Here today, gone tomorrow.', function() { |
| deleteFile(filename, function() { |
| loadFile(filename, function() { |
| test.fail('Unexpected load success.'); |
| }, |
| function() { |
| expectEq('', getTextareaValue(), 'Unexpected data in file'); |
| expectContains('File not found', getLastLogMessage(), |
| 'Unexpected log message'); |
| test.pass(); |
| }); |
| }); |
| }); |
| }); |
| |
| common.tester.addAsyncTest('list_directory', function(test) { |
| currentTest = test; |
| var filename = '/list_directory.txt'; |
| |
| saveFile(filename, 'I\'ve got a little list...', function() { |
| listDir('/', function() { |
| // Directory listings are relative, so it will not have the leading |
| // slash. |
| var relativeFilename = filename.slice(1); |
| expectFilenameInDirectoryList(relativeFilename); |
| test.pass(); |
| }); |
| }); |
| }); |
| |
| common.tester.addAsyncTest('make_directory', function(test) { |
| currentTest = test; |
| var dirname = '/new_directory'; |
| |
| makeDir(dirname, function() { |
| listDir('/', function() { |
| // Directory listings are relative, so it will not have the leading |
| // slash. |
| var relativeDirname = dirname.slice(1); |
| expectFilenameInDirectoryList(relativeDirname); |
| |
| // Let's see if the file can be written to this directory. |
| var filename = dirname + '/file.txt'; |
| var fileText = 'A file within a directory.'; |
| saveFile(filename, fileText, function() { |
| test.pass(); |
| }); |
| }); |
| }); |
| }); |
| |
| common.tester.addAsyncTest('rename_file', function(test) { |
| currentTest = test; |
| var filename = '/rename_old.txt'; |
| var newFilename = '/rename_new.txt'; |
| var fileText = 'What\'s in a name? that which we call a rose ' + |
| 'by any other name would smell as sweet;'; |
| |
| // Save the file. |
| saveFile(filename, fileText, function() { |
| // Now rename it. |
| rename(filename, newFilename, function() { |
| // Now try to load it. |
| loadFile(newFilename, function() { |
| // Make sure the text matches. |
| expectEq(fileText, getTextareaValue(), 'Incorrect textarea'); |
| |
| // Make sure the old file no longer exists. |
| loadFile(filename, function() { |
| test.fail('Unexpected load success.'); |
| }, |
| function() { |
| expectEq('', getTextareaValue(), 'Unexpected data in file'); |
| expectContains('File not found', getLastLogMessage(), |
| 'Unexpected log message'); |
| test.pass(); |
| }); |
| }); |
| }); |
| }); |
| }); |
| } |