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

Unified Diff: ui/file_manager/file_manager/foreground/js/import_controller_unittest.js

Issue 888693002: Correctly handle out of storage space and "actively importing" states in controller. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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 | « ui/file_manager/file_manager/foreground/js/import_controller.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/file_manager/file_manager/foreground/js/import_controller_unittest.js
diff --git a/ui/file_manager/file_manager/foreground/js/import_controller_unittest.js b/ui/file_manager/file_manager/foreground/js/import_controller_unittest.js
index 6a41ea4b4cb3c80133bece09485c01ee09effb57..89d72efb9e04711818a1af3de59ddb84f5b80af8 100644
--- a/ui/file_manager/file_manager/foreground/js/import_controller_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/import_controller_unittest.js
@@ -26,6 +26,7 @@ var widget;
// Set up string assets.
loadTimeData.data = {
CLOUD_IMPORT_BUTTON_LABEL: 'Import it!',
+ CLOUD_IMPORT_ACTIVE_IMPORT_BUTTON_LABEL: 'Already importing!',
CLOUD_IMPORT_EMPTY_SCAN_BUTTON_LABEL: 'No new media',
CLOUD_IMPORT_INSUFFICIENT_SPACE_BUTTON_LABEL: 'Not enough space!',
CLOUD_IMPORT_SCANNING_BUTTON_LABEL: 'Scanning... ...!',
@@ -51,7 +52,7 @@ function setUp() {
mediaImporter = new TestImportRunner();
}
-function testGetCommandUpdate_HiddenWhenDriveUnmounted() {
+function testGetCommandUpdate_HiddenWhenDriveUnmounted(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'mtp-volume',
@@ -63,15 +64,18 @@ function testGetCommandUpdate_HiddenWhenDriveUnmounted() {
'/DCIM');
environment.isDriveMounted = false;
+ var promise = controller.getCommandUpdate().then(
+ function(response) {
+ assertFalse(response.visible);
+ assertFalse(response.executable);
- var response = controller.getCommandUpdate();
- assertFalse(response.visible);
- assertFalse(response.executable);
+ mediaScanner.assertScanCount(0);
+ });
- mediaScanner.assertScanCount(0);
+ reportPromise(promise, callback);
}
-function testGetCommandUpdate_HiddenForNonMediaVolume() {
+function testGetCommandUpdate_HiddenForNonMediaVolume(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'drive',
@@ -84,14 +88,18 @@ function testGetCommandUpdate_HiddenForNonMediaVolume() {
environment.isDriveMounted = false;
- var response = controller.getCommandUpdate();
- assertFalse(response.visible);
- assertFalse(response.executable);
+ var promise = controller.getCommandUpdate().then(
+ function(response) {
+ assertFalse(response.visible);
+ assertFalse(response.executable);
- mediaScanner.assertScanCount(0);
+ mediaScanner.assertScanCount(0);
+ });
+
+ reportPromise(promise, callback);
}
-function testGetCommandUpdate_InitiatesScan() {
+function testGetCommandUpdate_InitiatesScan(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'mtp-volume',
@@ -106,14 +114,17 @@ function testGetCommandUpdate_InitiatesScan() {
],
'/DCIM');
- var response = controller.getCommandUpdate();
- assertTrue(response.visible);
- assertFalse(response.executable);
+ var promise = controller.getCommandUpdate().then(
+ function(response) {
+ assertTrue(response.visible);
+ assertFalse(response.executable);
- mediaScanner.assertScanCount(1);
+ mediaScanner.assertScanCount(1);
+ });
+ reportPromise(promise, callback);
}
-function testDirectoryChange_PushesUpdate() {
+function testGetCommandUpdate_CanExecuteAfterScanIsFinalized(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'mtp-volume',
@@ -121,14 +132,89 @@ function testDirectoryChange_PushesUpdate() {
'/DCIM/',
'/DCIM/photos0/',
'/DCIM/photos0/IMG00001.jpg',
+ '/DCIM/photos0/IMG00002.jpg',
+ '/DCIM/photos1/',
+ '/DCIM/photos1/IMG00001.jpg',
+ '/DCIM/photos1/IMG00003.jpg'
],
'/DCIM');
+ var fileSystem = new MockFileSystem('testFs');
+ mediaScanner.fileEntries.push(
+ new MockFileEntry(fileSystem, '/DCIM/photos0/IMG00001.jpg', {size: 0}));
+
+ environment.directoryChangedListener_(); // initiates a scan.
+ var promise = widget.updatePromise.then(
+ function() {
+ widget.resetPromise();
+ mediaScanner.finalizeScans();
+ return widget.updatePromise;
+ }).then(
+ function(response) {
+ assertTrue(response.visible);
+ assertTrue(response.executable);
+ });
+
+ reportPromise(promise, callback);
+}
+
+function testGetCommandUpdate_CannotExecuteEmptyScanResult(callback) {
+ var controller = createController(
+ VolumeManagerCommon.VolumeType.MTP,
+ 'mtp-volume',
+ [
+ '/DCIM/',
+ '/DCIM/photos0/',
+ '/DCIM/photos0/IMG00001.trader',
+ '/DCIM/photos0/IMG00002.joes',
+ '/DCIM/photos1/',
+ '/DCIM/photos1/IMG00001.parking',
+ '/DCIM/photos1/IMG00003.lots'
+ ],
+ '/DCIM');
+
+ controller.getCommandUpdate();
+ mediaScanner.finalizeScans();
+
+ var promise = controller.getCommandUpdate().then(
+ function(response) {
+ assertTrue(response.visible);
+ assertFalse(response.executable);
+ });
+
+ reportPromise(promise, callback);
+}
+
+function testClick_StartsImport(callback) {
+ var controller = createController(
+ VolumeManagerCommon.VolumeType.MTP,
+ 'mtp-volume',
+ [
+ '/DCIM/',
+ '/DCIM/photos0/',
+ '/DCIM/photos0/IMG00001.jpg',
+ '/DCIM/photos0/IMG00002.jpg',
+ ],
+ '/DCIM');
+
+ // First we need to force the controller into a scanning state.
environment.directoryChangedListener_();
- widget.updates.assertCallCount(1);
+
+ reportPromise(
+ widget.updatePromise.then(
+ function() {
+ widget.resetPromise();
+ widget.executeListener();
+ mediaImporter.assertImportsStarted(1);
+ // return the reset promise so as to allow execution
+ // to complete before the test is finished...even though
+ // we're not waiting on anything in particular.
+ return widget.updatePromise;
+ }),
+ callback);
}
-function testUnmountInvalidatesScans() {
+function testVolumeUnmount_InvalidatesScans(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'mtp-volume',
@@ -143,17 +229,43 @@ function testUnmountInvalidatesScans() {
],
'/DCIM');
- controller.getCommandUpdate();
- mediaScanner.assertScanCount(1);
+ environment.directoryChangedListener_();
+ var promise = widget.updatePromise.then(
+ function() {
+ // Reset the promise so we can wait on a second widget update.
+ widget.resetPromise();
+
+ // Faux unmount the volume, then request an update again.
+ // A fresh new scan should be started.
+ environment.simulateUnmount();
+
+ // Return the new promise, so subsequent "thens" only
+ // fire once the widget has been updated again.
+ return widget.updatePromise;
+ }).then(
+ function() {
+ mediaScanner.assertScanCount(2);
+ });
+
+ reportPromise(promise, callback);
+}
- // Faux unmount the volume, then request an update again.
- // A fresh new scan should be started.
- environment.simulateUnmount();
- controller.getCommandUpdate();
- mediaScanner.assertScanCount(2);
+function testDirectoryChange_TriggersUpdate(callback) {
+ var controller = createController(
+ VolumeManagerCommon.VolumeType.MTP,
+ 'mtp-volume',
+ [
+ '/DCIM/',
+ '/DCIM/photos0/',
+ '/DCIM/photos0/IMG00001.jpg',
+ ],
+ '/DCIM');
+
+ environment.directoryChangedListener_();
+ reportPromise(widget.updatePromise, callback);
}
-function testVolumeUnmount_PushesUpdate() {
+function testVolumeUnmount_TriggersUpdate(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'mtp-volume',
@@ -167,10 +279,10 @@ function testVolumeUnmount_PushesUpdate() {
// Faux unmount the volume, then request an update again.
// A fresh new scan should be started.
environment.simulateUnmount();
- widget.updates.assertCallCount(1);
+ reportPromise(widget.updatePromise, callback);
}
-function testGetCommandUpdate_CanExecuteAfterScanIsFinalized() {
+function testFinalizeScans_TriggersUpdate(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'mtp-volume',
@@ -178,25 +290,22 @@ function testGetCommandUpdate_CanExecuteAfterScanIsFinalized() {
'/DCIM/',
'/DCIM/photos0/',
'/DCIM/photos0/IMG00001.jpg',
- '/DCIM/photos0/IMG00002.jpg',
- '/DCIM/photos1/',
- '/DCIM/photos1/IMG00001.jpg',
- '/DCIM/photos1/IMG00003.jpg'
],
'/DCIM');
var fileSystem = new MockFileSystem('testFs');
+ // ensure there is some content in the scan so the code that depends
+ // on this state doesn't croak which it finds it missing.
mediaScanner.fileEntries.push(
new MockFileEntry(fileSystem, '/DCIM/photos0/IMG00001.jpg', {size: 0}));
- controller.getCommandUpdate();
+
+ environment.directoryChangedListener_(); // initiates a scan.
mediaScanner.finalizeScans();
- var response = controller.getCommandUpdate();
- assertTrue(response.visible);
- assertTrue(response.executable);
+ reportPromise(widget.updatePromise, callback);
}
-function testFinalizeScans_PushesUpdate() {
+function testExecuteImport_TriggersUpdate(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'mtp-volume',
@@ -204,42 +313,60 @@ function testFinalizeScans_PushesUpdate() {
'/DCIM/',
'/DCIM/photos0/',
'/DCIM/photos0/IMG00001.jpg',
+ '/DCIM/photos0/IMG00002.jpg',
],
'/DCIM');
- var fileSystem = new MockFileSystem('testFs');
- mediaScanner.fileEntries.push(
- new MockFileEntry(fileSystem, '/DCIM/photos0/IMG00001.jpg', {size: 0}));
- controller.getCommandUpdate();
+ // First we need to force the controller into a scanning state.
+ environment.directoryChangedListener_();
mediaScanner.finalizeScans();
- widget.updates.assertCallCount(1);
+ var promise = widget.updatePromise.then(
+ function() {
+ widget.resetPromise();
+ widget.executeListener();
+ // By returning the new update promise, "reportPromise" will
+ // hang unless an update occurs.
+ return widget.updatePromise;
+ });
+
+ reportPromise(promise, callback);
}
-function testGetCommandUpdate_CannotExecuteEmptyScanResult() {
+function testFinishImport_TriggersUpdate(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'mtp-volume',
[
'/DCIM/',
'/DCIM/photos0/',
- '/DCIM/photos0/IMG00001.trader',
- '/DCIM/photos0/IMG00002.joes',
- '/DCIM/photos1/',
- '/DCIM/photos1/IMG00001.parking',
- '/DCIM/photos1/IMG00003.lots'
+ '/DCIM/photos0/IMG00001.jpg',
+ '/DCIM/photos0/IMG00002.jpg',
],
'/DCIM');
- controller.getCommandUpdate();
+ // First we need to force the controller into a scanning state.
+ environment.directoryChangedListener_();
mediaScanner.finalizeScans();
- var response = controller.getCommandUpdate();
- assertTrue(response.visible);
- assertFalse(response.executable);
+ var promise = widget.updatePromise.then(
+ function() {
+ widget.resetPromise();
+ widget.executeListener();
+ // By returning the new update promise, "reportPromise" will
+ // hang unless an update occurs.
+ return widget.updatePromise;
+ }).then(
+ function() {
+ widget.resetPromise();
+ mediaImporter.finishImportTasks();
+ return widget.updatePromise;
+ });
+
+ reportPromise(promise, callback);
}
-function testClick_StartsImport() {
+function testCancelImport_TriggersUpdate(callback) {
var controller = createController(
VolumeManagerCommon.VolumeType.MTP,
'mtp-volume',
@@ -253,8 +380,23 @@ function testClick_StartsImport() {
// First we need to force the controller into a scanning state.
environment.directoryChangedListener_();
- widget.executeListener();
- mediaImporter.assertImportsStarted(1);
+ mediaScanner.finalizeScans();
+
+ var promise = widget.updatePromise.then(
+ function() {
+ widget.resetPromise();
+ widget.executeListener();
+ // By returning the new update promise, "reportPromise" will
+ // hang unless an update occurs.
+ return widget.updatePromise;
+ }).then(
+ function() {
+ widget.resetPromise();
+ mediaImporter.cancelImportTasks();
+ return widget.updatePromise;
+ });
+
+ reportPromise(promise, callback);
}
/**
@@ -265,9 +407,20 @@ function testClick_StartsImport() {
*/
function TestImportTask(destination) {
this.destination_ = destination;
+
+ /** @private {!importer.Resolver} */
+ this.finishedResolver_ = new importer.Resolver();
+
+ /** @public {!Promise} */
+ this.whenFinished = this.finishedResolver_.promise;
}
/** @return {!Promise<DirectoryEntry>} */
+TestImportTask.prototype.finish = function() {
+ this.finishedResolver_.resolve();
+};
+
+/** @return {!Promise<DirectoryEntry>} */
TestImportTask.prototype.getDestination = function() {
return Promise.resolve(this.destination_);
};
@@ -281,14 +434,20 @@ function TestImportRunner() {
/** @type {!Array.<!importer.ScanResult>} */
this.imported = [];
+ /** @type {!Array.<!TestImportTask>} */
+ this.tasks_ = [];
+
/** @type {DirectoryEntry} */
this.destination_ = null;
}
/** @override */
-TestImportRunner.prototype.importFromScanResult = function(scanResult) {
+TestImportRunner.prototype.importFromScanResult =
+ function(scanResult, destination) {
this.imported.push(scanResult);
- return new TestImportTask(this.destination_);
+ var task = new TestImportTask(this.destination_);
+ this.tasks_.push(task);
+ return task;
};
/**
@@ -299,6 +458,24 @@ TestImportRunner.prototype.setDestination = function(destination) {
};
/**
+ * @param {!DirectoryEntry} destination
+ */
+TestImportRunner.prototype.finishImportTasks = function() {
+ this.tasks_.forEach(
+ function(task) {
+ task.finish();
+ });
+};
+
+/**
+ * @param {!DirectoryEntry} destination
+ */
+TestImportRunner.prototype.cancelImportTasks = function() {
+ // No diff to us.
+ this.finishImportTasks();
+};
+
+/**
* @param {number} expected
*/
TestImportRunner.prototype.assertImportsStarted = function(expected) {
@@ -338,6 +515,9 @@ TestControllerEnvironment = function(volumeInfo, directory) {
/** @private {function(!DirectoryEntry)} */
this.directoryWasSet_;
+ /** @private {number} */
+ this.freeStorageSpace = 123456789; // bytes
+
/** @private {!Promise<!DirectoryEntry>} */
this.directoryWasSetPromise_ = new Promise(function(resolve, reject) {
this.directoryWasSet_ = resolve;
@@ -375,6 +555,12 @@ TestControllerEnvironment.prototype.isGoogleDriveMounted =
};
/** @override */
+TestControllerEnvironment.prototype.getFreeStorageSpace =
+ function() {
+ return Promise.resolve(this.freeStorageSpace);
+};
+
+/** @override */
TestControllerEnvironment.prototype.addVolumeUnmountListener =
function(listener) {
this.volumeUnmountListener_ = listener;
@@ -409,12 +595,20 @@ TestControllerEnvironment.prototype.whenCurrentDirectoryIsSet = function() {
* @struct
*/
importer.TestCommandWidget = function() {
-
/** @public {function()} */
this.executeListener;
- /** @public {!TestCallRecorder} */
- this.updates = new TestCallRecorder();
+ /** @private {!importer.Resolver.<!importer.CommandUpdate>} */
+ this.updateResolver_ = new importer.Resolver();
+
+ /** @public {!importer.Resolver.<!importer.CommandUpdate>} */
+ this.updatePromise = this.updateResolver_.promise;
+};
+
+/** Resets the widget */
+importer.TestCommandWidget.prototype.resetPromise = function() {
+ this.updateResolver_ = new importer.Resolver();
+ this.updatePromise = this.updateResolver_.promise;
};
/** @override */
@@ -424,7 +618,8 @@ importer.TestCommandWidget.prototype.addExecuteListener = function(listener) {
/** @override */
importer.TestCommandWidget.prototype.update = function(update) {
- this.updates.callback(update);
+ assertFalse(this.updateResolver_.settled, 'Should not have been settled.');
+ this.updateResolver_.resolve(update);
};
/**
« no previous file with comments | « ui/file_manager/file_manager/foreground/js/import_controller.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698