blob: 8ce4bfff8d9138c56b4c8f5d9081ee3cf12c6798 [file] [log] [blame]
// Copyright 2015 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.
/**
* Mock of ImageUtil.
*/
var ImageUtil = {
getMetricName: function() {},
metrics: {
recordEnum: function() {},
recordInterval: function() {},
startInterval: function() {}
}
};
/**
* Mock of ImageEncoder. Since some test changes the behavior of ImageEncoder,
* this is initialized in setUp().
*/
var ImageEncoder;
/**
* Load time data.
*/
loadTimeData.data = {
DRIVE_DIRECTORY_LABEL: '',
DOWNLOADS_DIRECTORY_LABEL: ''
};
function setUp() {
ImageEncoder = {
encodeMetadata: function() {},
getBlob: function() {}
};
}
/**
* Returns a mock of metadata model.
* @private
* @return {!MetadataModel}
*/
function getMockMetadataModel() {
return {
get: function(entries, names) {
return Promise.resolve([
{size: 200}
]);
},
notifyEntriesChanged: function() {
}
};
}
/**
* Tests for GalleryItem#saveToFile.
*/
function testSaveToFile(callback) {
var fileSystem = new MockFileSystem('volumeId');
fileSystem.populate(['/test.jpg']);
var entry = fileSystem.entries['/test.jpg'];
entry.createWriter = function(callback) {
callback({
write: function() {
Promise.resolve().then(function() {
this.onwriteend();
}.bind(this));
},
truncate: function() {
this.write();
}
});
};
var entryChanged = false;
var metadataModel = getMockMetadataModel();
metadataModel.notifyEntriesChanged = function() {
entryChanged = true;
};
var item = new GalleryItem(
entry,
{isReadOnly: false},
{size: 100},
{},
/* original */ true);
assertEquals(100, item.getMetadataItem().size);
assertFalse(entryChanged);
reportPromise(
new Promise(item.saveToFile.bind(
item,
{
getLocationInfo: function() { return {}; },
getVolumeInfo: function() { return {}; }
},
metadataModel,
/* fallbackDir */ null,
document.createElement('canvas'),
true /* overwrite */)).then(function() {
assertEquals(200, item.getMetadataItem().size);
assertTrue(entryChanged);
}), callback);
}
/**
* Tests for GalleryItem#saveToFile. In this test case, fileWriter.write fails
* with an error.
*/
function testSaveToFileWriteFailCase(callback) {
var fileSystem = new MockFileSystem('volumeId');
fileSystem.populate(['/test.jpg']);
var entry = fileSystem.entries['/test.jpg'];
entry.createWriter = function(callback) {
callback({
write: function() {
Promise.resolve().then(function() {
this.onerror(new Error());
}.bind(this));
},
truncate: function() {
Promise.resolve().then(function() {
this.onwriteend();
}.bind(this));
}
});
};
var item = new GalleryItem(
entry,
{isReadOnly: false},
{size: 100},
{},
/* original */ true);
reportPromise(
new Promise(item.saveToFile.bind(
item,
{
getLocationInfo: function() { return {}; },
getVolumeInfo: function() { return {}; }
},
getMockMetadataModel(),
/* fallbackDir */ null,
document.createElement('canvas'),
true /* overwrite */)).then(function(result) {
assertFalse(result);
}), callback);
}
/**
* Tests for GalleryItem#saveToFile. In this test case, ImageEncoder.getBlob
* fails with an error. This test case confirms that no write operation runs
* when it fails to get a blob of new image.
*/
function testSaveToFileGetBlobFailCase(callback) {
ImageEncoder.getBlob = function() {
throw new Error();
};
var fileSystem = new MockFileSystem('volumeId');
fileSystem.populate(['/test.jpg']);
var entry = fileSystem.entries['/test.jpg'];
var writeOperationRun = false;
entry.createWriter = function(callback) {
callback({
write: function() {
Promise.resolve().then(function() {
writeOperationRun = true;
this.onwriteend();
}.bind(this));
},
truncate: function() {
Promise.resolve().then(function() {
writeOperationRun = true;
this.onwriteend();
}.bind(this));
}
});
};
var item = new GalleryItem(
entry,
{isReadOnly: false},
{size: 100},
{},
/* original */ true);
reportPromise(
new Promise(item.saveToFile.bind(
item,
{
getLocationInfo: function() { return {}; },
getVolumeInfo: function() { return {}; }
},
getMockMetadataModel(),
/* fallbackDir */ null,
document.createElement('canvas'),
true /* overwrite*/)).then(function(result) {
assertFalse(result);
assertFalse(writeOperationRun);
}), callback);
}
function testSaveToFileRaw(callback) {
var fileSystem = new MockFileSystem('volumeId');
fileSystem.populate(['/test.arw']);
fileSystem.entries['/'].getFile = function(name, options, success, error) {
if (options.create) {
assertEquals('test - Edited.jpg', name);
fileSystem.populate(['/test - Edited.jpg']);
var entry = fileSystem.entries['/test - Edited.jpg'];
entry.createWriter = function(callback) {
callback({
write: function() {
Promise.resolve().then(function() {
this.onwriteend();
}.bind(this));
},
truncate: function() {
this.write();
}
});
};
}
MockDirectoryEntry.prototype.getFile.apply(this, arguments);
};
var entryChanged = false;
var metadataModel = getMockMetadataModel();
metadataModel.notifyEntriesChanged = function() {
entryChanged = true;
};
var item = new GalleryItem(
fileSystem.entries['/test.arw'],
{isReadOnly: false},
{size: 100},
{},
/* original */ true);
assertEquals(100, item.getMetadataItem().size);
assertFalse(entryChanged);
reportPromise(
new Promise(item.saveToFile.bind(
item,
{
getLocationInfo: function() { return {}; },
getVolumeInfo: function() { return {}; }
},
metadataModel,
/* fallbackDir */ null,
document.createElement('canvas'),
false /* not overwrite */)).then(function(success) {
assertTrue(success);
assertEquals(200, item.getMetadataItem().size);
assertTrue(entryChanged);
assertFalse(item.isOriginal());
}), callback);
}
function testIsWritableFile() {
var downloads = new MockFileSystem('downloads');
var removable = new MockFileSystem('removable');
var mtp = new MockFileSystem('mtp');
var volumeTypes = {
downloads: VolumeManagerCommon.VolumeType.DOWNLOADS,
removable: VolumeManagerCommon.VolumeType.REMOVABLE,
mtp: VolumeManagerCommon.VolumeType.MTP
};
// Mock volume manager.
var volumeManager = {
getVolumeInfo: function(entry) {
return {
volumeType: volumeTypes[entry.filesystem.name]
};
}
};
var getGalleryItem = function(path, fileSystem, isReadOnly) {
return new GalleryItem(new MockEntry(fileSystem, path),
{isReadOnly: isReadOnly},
{size: 100},
{},
true /* original */);
};
// Jpeg file on downloads.
assertTrue(getGalleryItem(
'/test.jpg', downloads, false /* not read only */).
isWritableFile(volumeManager));
// Png file on downloads.
assertTrue(getGalleryItem(
'/test.png', downloads, false /* not read only */).
isWritableFile(volumeManager));
// Webp file on downloads.
assertFalse(getGalleryItem(
'/test.webp', downloads, false /* not read only */).
isWritableFile(volumeManager));
// Jpeg file on non-writable volume.
assertFalse(getGalleryItem(
'/test.jpg', removable, true /* read only */).
isWritableFile(volumeManager));
// Jpeg file on mtp volume.
assertFalse(getGalleryItem(
'/test.jpg', mtp, false /* not read only */).
isWritableFile(volumeManager));
};