Index: ui/file_manager/file_manager/background/js/media_import_handler_unittest.js |
diff --git a/ui/file_manager/file_manager/background/js/media_import_handler_unittest.js b/ui/file_manager/file_manager/background/js/media_import_handler_unittest.js |
index 16a17f1c57c592968e1a03e13aa866cf0637cfb9..ca7c7bc2d888541bef8f1627893625fe60a9517d 100644 |
--- a/ui/file_manager/file_manager/background/js/media_import_handler_unittest.js |
+++ b/ui/file_manager/file_manager/background/js/media_import_handler_unittest.js |
@@ -20,40 +20,21 @@ var drive; |
/** @type {!MockFileSystem} */ |
var fileSystem; |
-/** |
- * @typedef {{ |
- * source: source, |
- * destination: parent, |
- * newName: newName |
- * }} |
- */ |
-var CopyCapture; |
+/** @type {!MockCopyTo} */ |
+var mockCopier; |
-/** |
- * @type {!Array<!CopyCapture>} |
- */ |
-var importedMedia = []; |
+// Set up string assets. |
+loadTimeData.data = { |
+ CLOUD_IMPORT_ITEMS_REMAINING: '', |
+ DRIVE_DIRECTORY_LABEL: 'My Drive', |
+ DOWNLOADS_DIRECTORY_LABEL: 'Downloads' |
+}; |
function setUp() { |
- // Set up string assets. |
- loadTimeData.data = { |
- DRIVE_DIRECTORY_LABEL: 'My Drive', |
- DOWNLOADS_DIRECTORY_LABEL: 'Downloads' |
- }; |
- |
progressCenter = new MockProgressCenter(); |
- // Replace with test function. |
- fileOperationUtil.copyTo = function(source, parent, newName, |
- entryChangedCallback, progressCallback, successCallback, errorCallback) { |
- importedMedia.push({ |
- source: source, |
- destination: parent, |
- newName: newName |
- }); |
- successCallback(); |
- }; |
- importedMedia = []; |
+ // Replaces fileOperationUtil.copyTo with test function. |
+ mockCopier = new MockCopyTo(); |
var volumeManager = new MockVolumeManager(); |
drive = volumeManager.getCurrentProfileVolumeInfo( |
@@ -98,7 +79,7 @@ function testImportMedia(callback) { |
function(updateType, task) { |
switch (updateType) { |
case importer.TaskQueue.UpdateType.SUCCESS: |
- resolve(importedMedia); |
+ resolve(); |
break; |
case importer.TaskQueue.UpdateType.ERROR: |
reject(new Error(importer.TaskQueue.UpdateType.ERROR)); |
@@ -109,16 +90,15 @@ function testImportMedia(callback) { |
reportPromise( |
whenImportDone.then( |
- /** @param {!Array<!CopyCapture>} importedMedia */ |
- function(importedMedia) { |
- assertEquals(media.length, importedMedia.length); |
- importedMedia.forEach( |
- /** @param {!CopyCapture} imported */ |
- function(imported) { |
+ function() { |
+ assertEquals(media.length, mockCopier.copiedFiles.length); |
+ mockCopier.copiedFiles.forEach( |
+ /** @param {!MockCopyTo.CopyInfo} copy */ |
+ function(copy) { |
// Verify the copied file is one of the expected files. |
- assertTrue(media.indexOf(imported.source) >= 0); |
+ assertTrue(media.indexOf(copy.source) >= 0); |
// Verify that the files are being copied to the right locations. |
- assertEquals(destination(), imported.destination); |
+ assertEquals(destination(), copy.destination); |
}); |
}), |
callback); |
@@ -147,7 +127,7 @@ function testUpdatesHistoryAfterImport(callback) { |
function(updateType, task) { |
switch (updateType) { |
case importer.TaskQueue.UpdateType.SUCCESS: |
- resolve(importedMedia); |
+ resolve(); |
break; |
case importer.TaskQueue.UpdateType.ERROR: |
reject(new Error(importer.TaskQueue.UpdateType.ERROR)); |
@@ -158,13 +138,12 @@ function testUpdatesHistoryAfterImport(callback) { |
reportPromise( |
whenImportDone.then( |
- /** @param {!Array<!CopyCapture>} importedMedia */ |
- function(importedMedia) { |
- importedMedia.forEach( |
- /** @param {!CopyCapture} */ |
- function(capture) { |
+ function() { |
+ mockCopier.copiedFiles.forEach( |
+ /** @param {!MockCopyTo.CopyInfo} copy */ |
+ function(copy) { |
importHistory.assertCopied( |
- capture.source, importer.Destination.GOOGLE_DRIVE); |
+ copy.source, importer.Destination.GOOGLE_DRIVE); |
}); |
}), |
callback); |
@@ -172,6 +151,68 @@ function testUpdatesHistoryAfterImport(callback) { |
scanResult.finalize(); |
} |
+// Tests that cancelling an import works properly. |
+function testImportCancellation(callback) { |
+ var media = setupFileSystem([ |
+ '/DCIM/photos0/IMG00001.jpg', |
+ '/DCIM/photos0/IMG00002.jpg', |
+ '/DCIM/photos0/IMG00003.jpg', |
+ '/DCIM/photos1/IMG00001.jpg', |
+ '/DCIM/photos1/IMG00002.jpg', |
+ '/DCIM/photos1/IMG00003.jpg' |
+ ]); |
+ |
+ /** @const {number} */ |
+ var EXPECTED_COPY_COUNT = 3; |
+ |
+ var destinationFileSystem = new MockFileSystem('fake-destination'); |
+ var destination = function() { return destinationFileSystem.root; }; |
+ |
+ var scanResult = new TestScanResult(media); |
+ var importTask = mediaImporter.importFromScanResult(scanResult, destination); |
+ var whenImportCancelled = new Promise( |
+ function(resolve, reject) { |
+ importTask.addObserver( |
+ /** |
+ * @param {!importer.TaskQueue.UpdateType} updateType |
+ * @param {!importer.TaskQueue.Task} task |
+ */ |
+ function(updateType, task) { |
+ if (updateType === importer.TaskQueue.UpdateType.CANCELED) { |
+ resolve(); |
+ } |
+ }); |
+ }); |
+ |
+ reportPromise( |
+ whenImportCancelled.then( |
+ function() { |
+ assertEquals(EXPECTED_COPY_COUNT, mockCopier.copiedFiles.length); |
+ mockCopier.copiedFiles.forEach( |
+ /** @param {!MockCopyTo.CopyInfo} copy */ |
+ function(copy) { |
+ // Verify the copied file is one of the expected files. |
+ assertTrue(media.indexOf(copy.source) >= 0); |
+ // Verify that the files are being copied to the right locations. |
+ assertEquals(destination(), copy.destination); |
+ }); |
+ }), |
+ callback); |
+ |
+ // Simulate cancellation after the expected number of copies is done. |
+ var copyCount = 0; |
+ mockCopier.onCopy( |
+ /** @param {!MockCopyTo.CopyInfo} copy */ |
+ function(copy) { |
+ mockCopier.doCopy(copy); |
+ if (++copyCount === EXPECTED_COPY_COUNT) { |
+ importTask.requestCancel(); |
+ } |
+ }); |
+ |
+ scanResult.finalize(); |
+} |
+ |
/** |
* @param {!Array.<string>} fileNames |
* @return {!Array.<!Entry>} |
@@ -186,3 +227,80 @@ function setupFileSystem(fileNames) { |
return fileSystem.entries[filename]; |
}); |
} |
+ |
+ |
+/** |
+ * Replaces fileOperationUtil.copyTo with some mock functionality for testing. |
+ * @constructor |
+ */ |
+function MockCopyTo() { |
+ /** @type {!Array<!MockCopyTo.CopyInfo>} */ |
+ this.copiedFiles = []; |
+ |
+ // Replace with test function. |
+ fileOperationUtil.copyTo = this.copyTo_.bind(this); |
+ |
+ this.entryChangedCallback_ = null; |
+ this.progressCallback_ = null; |
+ this.successCallback_ = null; |
+ this.errorCallback_ = null; |
+ |
+ // Default copy callback just does the copy. |
+ this.copyCallback_ = this.doCopy.bind(this); |
+} |
+ |
+/** |
+ * @typedef {{ |
+ * source: source, |
+ * destination: parent, |
+ * newName: newName |
+ * }} |
+ */ |
+MockCopyTo.CopyInfo; |
+ |
+/** |
+ * A mock to replace fileOperationUtil.copyTo. See the original for details. |
+ * @param {Entry} source |
+ * @param {DirectoryEntry} parent |
+ * @param {string} newName |
+ * @param {function(string, Entry)} entryChangedCallback |
+ * @param {function(string, number)} progressCallback |
+ * @param {function(Entry)} successCallback |
+ * @param {function(DOMError)} errorCallback |
+ * @return {function()} |
+ */ |
+MockCopyTo.prototype.copyTo_ = function(source, parent, newName, |
+ entryChangedCallback, progressCallback, successCallback, errorCallback) { |
+ this.entryChangedCallback_ = entryChangedCallback; |
+ this.progressCallback_ = progressCallback; |
+ this.successCallback_ = successCallback; |
+ this.errorCallback_ = errorCallback; |
+ |
+ this.copyCallback_({ |
+ source: source, |
+ destination: parent, |
+ newName: newName |
+ }); |
+}; |
+ |
+/** |
+ * Set a callback to be called whenever #copyTo_ is called. This can be used to |
+ * simulate errors, etc, during copying. The default copy callback just calls |
+ * #doCopy. |
+ * @param {!function(!MockCopyTo.CopyInfo)} copyCallback |
+ */ |
+MockCopyTo.prototype.onCopy = function(copyCallback) { |
+ this.copyCallback_ = copyCallback; |
+}; |
+ |
+/** |
+ * Completes the given copy. Call this in the callback passed to #onCopy, to |
+ * simulate the current copy operation completing successfully. |
+ * @param {!MockCopyTo.CopyInfo} copy |
+ */ |
+MockCopyTo.prototype.doCopy = function(copy) { |
+ this.copiedFiles.push(copy); |
+ this.entryChangedCallback_(copy.source.toURL(), |
+ copy.destination); |
+ this.successCallback_(); |
+}; |