Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(429)

Unified Diff: chrome/test/data/file_manager/unit_tests/file_operation_manager_unittest.js

Issue 460963002: Files.app: Add more unit tests for FileOperationManager class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/test/data/file_manager/unit_tests/mocks/mock_entry.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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']]);
}
« no previous file with comments | « no previous file | chrome/test/data/file_manager/unit_tests/mocks/mock_entry.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698