Index: chrome/test/data/file_manager/unit_tests/file_operation_manager_unittest.js |
diff --git a/chrome/test/data/file_manager/unit_tests/file_operation_manager_unittest.js b/chrome/test/data/file_manager/unit_tests/file_operation_manager_unittest.js |
index 3cde729d6bc2eddd9004a161ebdc5f34cfb26741..23bf5e6658ce033083e42e25e883a6a4961e974f 100644 |
--- a/chrome/test/data/file_manager/unit_tests/file_operation_manager_unittest.js |
+++ b/chrome/test/data/file_manager/unit_tests/file_operation_manager_unittest.js |
@@ -41,33 +41,6 @@ chrome.fileBrowserPrivate = { |
chrome.fileBrowserPrivate.onCopyProgress.listener_ = null; |
}, |
listener_: null |
- }, |
- startCopy: function(source, destination, newName, callback) { |
- var id = 1; |
- var events = [ |
- 'begin_copy_entry', |
- 'progress', |
- 'end_copy_entry', |
- 'success' |
- ].map(function(type) { |
- return [id, {type: type, sourceUrl: source, destinationUrl: destination}]; |
- }); |
- var sendEvent = function(index) { |
- // Call the function asynchronously. |
- return Promise.resolve().then(function() { |
- chrome.fileBrowserPrivate.onCopyProgress.listener_.apply( |
- null, events[index]); |
- if (index + 1 < events.length) |
- return sendEvent(index + 1); |
- else |
- return null; |
- }.bind(this)); |
- }.bind(this); |
- callback(id); |
- sendEvent(0).catch(function(error) { |
- console.log(error.stack || error); |
- window.onerror(); |
- }); |
} |
}; |
@@ -82,15 +55,83 @@ function reportPromise(promise, callback) { |
callback.bind(null, false), |
function(error) { |
if (error instanceof FileOperationManager.Error) { |
- console.log('FileOperationManager.Error: code=' + error.code); |
+ console.error('FileOperationManager.Error: code=' + error.code); |
} else { |
- console.log(error.stack || error.name || error); |
+ console.error(error.stack || error.name || error); |
} |
callback(true); |
}); |
} |
/** |
+ * Size of directory. |
+ * @type {number} |
+ * @const |
+ */ |
+var DIRECTORY_SIZE = -1; |
+ |
+/** |
+ * Creates test file system. |
+ * @param {string} id File system ID. |
+ * @param {Object.<string, number>} entries Map of entries' paths and their |
+ * size. If the size is equals to DIRECTORY_SIZE, the entry is derectory. |
+ */ |
+function createTestFileSystem(id, entries) { |
+ var fileSystem = new TestFileSystem(id); |
+ for (var path in entries) { |
+ if (entries[path] === DIRECTORY_SIZE) { |
+ fileSystem.entries[path] = new MockDirectoryEntry(fileSystem, path); |
+ } else { |
+ fileSystem.entries[path] = |
+ new MockFileEntry(fileSystem, path, {size: entries[path]}); |
+ } |
+ } |
+ return fileSystem; |
+} |
+ |
+/** |
+ * Resolves URL on the file system. |
+ * @param {FakeFileSystem} fileSystem Fake file system. |
+ * @param {string} url URL. |
+ * @param {function(MockEntry)} success Success callback. |
+ * @param {function()} failure Failure callback. |
+ */ |
+function resolveTestFileSystemURL(fileSystem, url, success, failure) { |
+ for (var name in fileSystem.entries) { |
+ var entry = fileSystem.entries[name]; |
+ if (entry.toURL() == url) { |
+ success(entry); |
+ return; |
+ } |
+ } |
+ failure(); |
+} |
+ |
+/** |
+ * Waits for events until 'success'. |
+ * @param {FileOperationManager} fileOperationManager File operation manager. |
+ * @return {Promise} Promise to be fulfilled with an event list. |
+ */ |
+function waitForEvents(fileOperationManager) { |
+ return new Promise(function(fulfill) { |
+ var events = []; |
+ fileOperationManager.addEventListener('copy-progress', function(event) { |
+ events.push(event); |
+ if (event.reason === 'SUCCESS') |
+ fulfill(events); |
+ }); |
+ fileOperationManager.addEventListener('entry-changed', function(event) { |
+ events.push(event); |
+ }); |
+ fileOperationManager.addEventListener('delete', function(event) { |
+ events.push(event); |
+ if (event.reason === 'SUCCESS') |
+ fulfill(events); |
+ }); |
+ }); |
+} |
+ |
+/** |
* Test target. |
* @type {FileOperationManager} |
*/ |
@@ -109,22 +150,18 @@ function setUp() { |
* error. |
*/ |
function testResolvePath(callback) { |
- var fileEntry = new MockFileEntry('testVolume', '/file', {}); |
- var directoryEntry = new MockDirectoryEntry('testVolume', '/directory', {}); |
- var root = new MockDirectoryEntry('testVolume', '/', { |
- '/file': fileEntry, |
- '/directory': directoryEntry |
+ var fileSystem = createTestFileSystem('testVolume', { |
+ '/': DIRECTORY_SIZE, |
+ '/file': 10, |
+ '/directory': DIRECTORY_SIZE |
}); |
+ var root = fileSystem.root; |
var rootPromise = fileOperationUtil.resolvePath(root, '/'); |
var filePromise = fileOperationUtil.resolvePath(root, '/file'); |
var directoryPromise = fileOperationUtil.resolvePath(root, '/directory'); |
var errorPromise = fileOperationUtil.resolvePath(root, '/not_found').then( |
- function() { |
- assertTrue(false, 'The NOT_FOUND error is not reported.'); |
- }, |
- function(error) { |
- assertEquals('NotFoundError', error.name); |
- }); |
+ function() { assertTrue(false, 'The NOT_FOUND error is not reported.'); }, |
+ function(error) { return error.name; }); |
reportPromise(Promise.all([ |
rootPromise, |
filePromise, |
@@ -132,10 +169,10 @@ function testResolvePath(callback) { |
errorPromise |
]).then(function(results) { |
assertArrayEquals([ |
- root, |
- fileEntry, |
- directoryEntry, |
- undefined |
+ fileSystem.entries['/'], |
+ fileSystem.entries['/file'], |
+ fileSystem.entries['/directory'], |
+ 'NotFoundError' |
], results); |
}), callback); |
} |
@@ -146,39 +183,37 @@ function testResolvePath(callback) { |
* error. |
*/ |
function testDeduplicatePath(callback) { |
- var directoryEntry1 = new MockDirectoryEntry('testVolume', '/directory', {}); |
- var directoryEntry2 = new MockDirectoryEntry( |
- 'testVolume', |
- '/directory', |
- {'file.txt': new MockFileEntry('testVolume', '/file.txt', {})}); |
- var directoryEntry3 = new MockDirectoryEntry( |
- 'testVolume', |
- '/directory', |
- { |
- 'file.txt': new MockFileEntry('testVolume', '/file.txt', {}), |
- 'file (1).txt': new MockFileEntry('testVolume', '/file (1).txt', {}), |
- 'file (2).txt': new MockFileEntry('testVolume', '/file (2).txt', {}), |
- 'file (3).txt': new MockFileEntry('testVolume', '/file (3).txt', {}), |
- 'file (4).txt': new MockFileEntry('testVolume', '/file (4).txt', {}), |
- 'file (5).txt': new MockFileEntry('testVolume', '/file (5).txt', {}), |
- 'file (6).txt': new MockFileEntry('testVolume', '/file (6).txt', {}), |
- 'file (7).txt': new MockFileEntry('testVolume', '/file (7).txt', {}), |
- 'file (8).txt': new MockFileEntry('testVolume', '/file (8).txt', {}), |
- 'file (9).txt': new MockFileEntry('testVolume', '/file (9).txt', {}) |
- }); |
+ var fileSystem1 = createTestFileSystem('testVolume', {'/': DIRECTORY_SIZE}); |
+ var fileSystem2 = createTestFileSystem('testVolume', { |
+ '/': DIRECTORY_SIZE, |
+ '/file.txt': 10 |
+ }); |
+ var fileSystem3 = createTestFileSystem('testVolume', { |
+ '/': DIRECTORY_SIZE, |
+ '/file.txt': 10, |
+ '/file (1).txt': 10, |
+ '/file (2).txt': 10, |
+ '/file (3).txt': 10, |
+ '/file (4).txt': 10, |
+ '/file (5).txt': 10, |
+ '/file (6).txt': 10, |
+ '/file (7).txt': 10, |
+ '/file (8).txt': 10, |
+ '/file (9).txt': 10, |
+ }); |
var nonExistingPromise = |
- fileOperationUtil.deduplicatePath(directoryEntry1, 'file.txt'). |
+ fileOperationUtil.deduplicatePath(fileSystem1.root, 'file.txt'). |
then(function(path) { |
assertEquals('file.txt', path); |
}); |
var existingPathPromise = |
- fileOperationUtil.deduplicatePath(directoryEntry2, 'file.txt'). |
+ fileOperationUtil.deduplicatePath(fileSystem2.root, 'file.txt'). |
then(function(path) { |
assertEquals('file (1).txt', path); |
}); |
var failedPromise = |
- fileOperationUtil.deduplicatePath(directoryEntry3, 'file.txt'). |
+ fileOperationUtil.deduplicatePath(fileSystem3.root, 'file.txt'). |
then(function() { |
assertTrue(false, 'FileOperationManager.Error is not reported.'); |
}, function(error) { |
@@ -196,33 +231,36 @@ function testDeduplicatePath(callback) { |
/** |
* Tests the fileOperationUtil.paste. |
+ * @param {function(boolean:hasError)} callback Callback to be passed true on |
+ * error. |
*/ |
function testCopy(callback) { |
// Prepare entries and their resolver. |
- var sourceEntries = |
- [new MockFileEntry('testVolume', '/test.txt', {size: 10})]; |
- var targetEntry = new MockDirectoryEntry('testVolume', '/', {}); |
- window.webkitResolveLocalFileSystemURL = function(url, success, failure) { |
- if (url === sourceEntries[0].toURL()) |
- success(sourceEntries[0]); |
- else if (url === targetEntry.toURL()) |
- success(targetEntry); |
- else |
- failure(); |
- }; |
+ var fileSystem = createTestFileSystem('testVolume', { |
+ '/': DIRECTORY_SIZE, |
+ '/test.txt': 10, |
+ }); |
+ window.webkitResolveLocalFileSystemURL = |
+ resolveTestFileSystemURL.bind(null, fileSystem); |
+ |
+ chrome.fileBrowserPrivate.startCopy = |
+ function(source, destination, newName, callback) { |
+ var makeStatus = function(type) { |
+ return {type: type, sourceUrl: source, destinationUrl: destination}; |
+ }; |
+ callback(1); |
+ var listener = chrome.fileBrowserPrivate.onCopyProgress.listener_; |
+ listener(1, makeStatus('begin_copy_entry')); |
+ listener(1, makeStatus('progress')); |
+ var newPath = joinPath('/', newName); |
+ fileSystem.entries[newPath] = |
+ fileSystem.entries['/test.txt'].clone(newPath); |
+ listener(1, makeStatus('end_copy_entry')); |
+ listener(1, makeStatus('success')); |
+ }; |
// Observing manager's events. |
- var eventsPromise = new Promise(function(fulfill) { |
- var events = []; |
- fileOperationManager.addEventListener('copy-progress', function(event) { |
- events.push(event); |
- if (event.reason === 'SUCCESS') |
- fulfill(events); |
- }); |
- fileOperationManager.addEventListener('entry-changed', function(event) { |
- events.push(event); |
- }); |
- }); |
+ var eventsPromise = waitForEvents(fileOperationManager); |
// Verify the events. |
reportPromise(eventsPromise.then(function(events) { |
@@ -237,7 +275,159 @@ function testCopy(callback) { |
assertEquals(0, lastEvent.status.numRemainingItems); |
assertEquals(10, lastEvent.status.processedBytes); |
assertEquals(10, lastEvent.status.totalBytes); |
+ |
+ assertTrue(events.some(function(event) { |
+ return event.type === 'entry-changed' && |
+ event.kind === util.EntryChangedKind.CREATED && |
+ event.entry.fullPath === '/test (1).txt'; |
+ })); |
+ |
+ assertFalse(events.some(function(event) { |
+ return event.type === 'delete'; |
+ })); |
+ }), callback); |
+ |
+ fileOperationManager.paste( |
+ [fileSystem.entries['/test.txt']], |
+ fileSystem.entries['/'], |
+ false); |
+} |
+ |
+/** |
+ * Tests the fileOperationUtil.paste for move. |
+ * @param {function(boolean:hasError)} callback Callback to be passed true on |
+ * error. |
+ */ |
+function testMove(callback) { |
+ // Prepare entries and their resolver. |
+ var fileSystem = createTestFileSystem('testVolume', { |
+ '/': DIRECTORY_SIZE, |
+ '/directory': DIRECTORY_SIZE, |
+ '/test.txt': 10, |
+ }); |
+ window.webkitResolveLocalFileSystemURL = |
+ resolveTestFileSystemURL.bind(null, fileSystem); |
+ |
+ // Observing manager's events. |
+ var eventsPromise = waitForEvents(fileOperationManager); |
+ |
+ // Verify the events. |
+ reportPromise(eventsPromise.then(function(events) { |
+ var firstEvent = events[0]; |
+ assertEquals('BEGIN', firstEvent.reason); |
+ assertEquals(1, firstEvent.status.numRemainingItems); |
+ assertEquals(0, firstEvent.status.processedBytes); |
+ assertEquals(1, firstEvent.status.totalBytes); |
+ |
+ var lastEvent = events[events.length - 1]; |
+ assertEquals('SUCCESS', lastEvent.reason); |
+ assertEquals(0, lastEvent.status.numRemainingItems); |
+ assertEquals(1, lastEvent.status.processedBytes); |
+ assertEquals(1, lastEvent.status.totalBytes); |
+ |
+ assertTrue(events.some(function(event) { |
+ return event.type === 'entry-changed' && |
+ event.kind === util.EntryChangedKind.DELETED && |
+ event.entry.fullPath === '/test.txt'; |
+ })); |
+ |
+ assertTrue(events.some(function(event) { |
+ return event.type === 'entry-changed' && |
+ event.kind === util.EntryChangedKind.CREATED && |
+ event.entry.fullPath === '/directory/test.txt'; |
+ })); |
+ |
+ assertFalse(events.some(function(event) { |
+ return event.type === 'delete'; |
+ })); |
+ }), callback); |
+ |
+ fileOperationManager.paste( |
+ [fileSystem.entries['/test.txt']], |
+ fileSystem.entries['/directory'], |
+ true); |
+} |
+ |
+/** |
+ * Tests the fileOperationUtil.deleteEntries. |
+ * @param {function(boolean:hasError)} callback Callback to be passed true on |
+ * error. |
+ */ |
+function testDelete(callback) { |
+ // Prepare entries and their resolver. |
+ var fileSystem = createTestFileSystem('testVolume', { |
+ '/': DIRECTORY_SIZE, |
+ '/test.txt': 10, |
+ }); |
+ window.webkitResolveLocalFileSystemURL = |
+ resolveTestFileSystemURL.bind(null, fileSystem); |
+ |
+ // Observing manager's events. |
+ reportPromise(waitForEvents(fileOperationManager).then(function(events) { |
+ assertEquals('delete', events[0].type); |
+ assertEquals('BEGIN', events[0].reason); |
+ assertEquals(10, events[0].totalBytes); |
+ assertEquals(0, events[0].processedBytes); |
+ |
+ var lastEvent = events[events.length - 1]; |
+ assertEquals('delete', lastEvent.type); |
+ assertEquals('SUCCESS', lastEvent.reason); |
+ assertEquals(10, lastEvent.totalBytes); |
+ assertEquals(10, lastEvent.processedBytes); |
+ |
+ assertFalse(events.some(function(event) { |
+ return event.type === 'copy-progress'; |
+ })); |
+ }), callback); |
+ |
+ fileOperationManager.deleteEntries([fileSystem.entries['/test.txt']]); |
+} |
+ |
+/** |
+ * Tests the fileOperationUtil.zipSelection. |
+ * @param {function(boolean:hasError)} callback Callback to be passed true on |
+ * error. |
+ */ |
+function testZip(callback) { |
+ // Prepare entries and their resolver. |
+ var fileSystem = createTestFileSystem('testVolume', { |
+ '/': DIRECTORY_SIZE, |
+ '/test.txt': 10, |
+ }); |
+ window.webkitResolveLocalFileSystemURL = |
+ resolveTestFileSystemURL.bind(null, fileSystem); |
+ chrome.fileBrowserPrivate.zipSelection = |
+ function(parentURL, sources, newName, success, error) { |
+ var newPath = joinPath('/', newName); |
+ var newEntry = new MockFileEntry(fileSystem, newPath, {size: 10}); |
+ fileSystem.entries[newPath] = newEntry; |
+ success(newEntry); |
+ }; |
+ |
+ // Observing manager's events. |
+ reportPromise(waitForEvents(fileOperationManager).then(function(events) { |
+ assertEquals('copy-progress', events[0].type); |
+ assertEquals('BEGIN', events[0].reason); |
+ assertEquals(1, events[0].status.totalBytes); |
+ assertEquals(0, events[0].status.processedBytes); |
+ |
+ var lastEvent = events[events.length - 1]; |
+ assertEquals('copy-progress', lastEvent.type); |
+ assertEquals('SUCCESS', lastEvent.reason); |
+ assertEquals(10, lastEvent.status.totalBytes); |
+ assertEquals(10, lastEvent.status.processedBytes); |
+ |
+ assertFalse(events.some(function(event) { |
+ return event.type === 'delete'; |
+ })); |
+ |
+ assertTrue(events.some(function(event) { |
+ return event.type === 'entry-changed' && |
+ event.entry.fullPath === '/test.zip'; |
+ })); |
}), callback); |
- fileOperationManager.paste(sourceEntries, targetEntry, false); |
+ fileOperationManager.zipSelection( |
+ fileSystem.entries['/'], |
+ [fileSystem.entries['/test.txt']]); |
} |