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

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

Issue 885323002: Initial implementation for ListThumbnailLoader. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase again. 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
Index: ui/file_manager/file_manager/foreground/js/list_thumbnail_loader_unittest.js
diff --git a/ui/file_manager/file_manager/foreground/js/list_thumbnail_loader_unittest.js b/ui/file_manager/file_manager/foreground/js/list_thumbnail_loader_unittest.js
new file mode 100644
index 0000000000000000000000000000000000000000..5c288ce4d4baaa2dda54841e1414058a6d8e0416
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/list_thumbnail_loader_unittest.js
@@ -0,0 +1,145 @@
+// 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.
+
+/**
+ * Wait until the condition is met.
+ *
+ * @param {function()} condition Condition.
+ * @return {Promise} A promise which is resolved when condition is met.
+ */
+function waitUntil(condition) {
+ return new Promise(function(resolve, reject) {
+ var checkCondition = function() {
+ if (condition())
+ resolve();
+ else
+ setTimeout(checkCondition, 100);
+ };
+ checkCondition();
+ });
+}
+
+/**
+ * Generates a data url of a sample image for testing.
+ * TODO(yawano) Consider to share image generation logic with
+ * gallery/js/image_editor/test_util.js.
+ *
+ * @param {Document} document Document.
+ * @return {string} Data url of a sample image.
+ */
+function generateSampleImageDataUrl(document) {
+ var canvas = document.createElement('canvas');
+ canvas.width = 160;
+ canvas.height = 160;
+
+ var context = canvas.getContext('2d');
+ context.fillStyle = 'black';
+ context.fillRect(0, 0, 80, 80);
+ context.fillRect(80, 80, 80, 80);
+
+ return canvas.toDataURL('image/jpeg', 0.5);
+}
+
+/**
+ * Story test for list thumbnail loader.
+ */
+function testStory(callback) {
+ ListThumbnailLoader.NUM_OF_MAX_ACTIVE_TASKS = 2;
+ MockThumbnailLoader.setTestImageDataUrl(generateSampleImageDataUrl(document));
+
+ var getOneCallbacks = {};
+ var metadataCache = {
+ getOne: function(entry, type, callback) {
+ getOneCallbacks[entry.toURL()] = callback;
+ }
+ };
+
+ var fileListModel = new FileListModel(metadataCache);
+
+ var listThumbnailLoader = new ListThumbnailLoader(fileListModel,
+ metadataCache, document, MockThumbnailLoader);
+ var thumbnailLoadedEvents = [];
+ listThumbnailLoader.addEventListener('thumbnailLoaded', function(event) {
+ thumbnailLoadedEvents.push(event);
+ });
+
+ // Add 1 directory and 5 entries.
+ var fileSystem = new MockFileSystem('volume-id');
+ var directory1 = new MockDirectoryEntry(fileSystem, '/TestDirectory');
+ var entry1 = new MockEntry(fileSystem, '/Test1.jpg');
+ var entry2 = new MockEntry(fileSystem, '/Test2.jpg');
+ var entry3 = new MockEntry(fileSystem, '/Test3.jpg');
+ var entry4 = new MockEntry(fileSystem, '/Test4.jpg');
+ var entry5 = new MockEntry(fileSystem, '/Test5.jpg');
+ fileListModel.push(directory1, entry1, entry2, entry3, entry4, entry5);
+
+ // Set high priority range to 0 - 2.
+ listThumbnailLoader.setHighPriorityRange(0, 2);
+
+ // Assert that 2 fetch tasks are running.
+ assertArrayEquals([entry1.toURL(), entry2.toURL()],
+ Object.keys(getOneCallbacks));
+
+ // Fails to get thumbnail from cache for Test2.jpg.
+ assertEquals(null, listThumbnailLoader.getThumbnailFromCache(entry2));
+
+ // Set high priority range to 4 - 6.
+ listThumbnailLoader.setHighPriorityRange(4, 6);
+
+ // Assert that no new tasks are enqueued.
+ assertArrayEquals([entry1.toURL(), entry2.toURL()],
+ Object.keys(getOneCallbacks));
+
+ // Resolve metadataCache.getOne for Test2.jpg.
+ getOneCallbacks[entry2.toURL()]();
+ delete getOneCallbacks[entry2.toURL()];
+
+ reportPromise(waitUntil(function() {
+ // Assert that thumbnailLoaded event is fired for Test2.jpg.
+ return thumbnailLoadedEvents.length === 1;
+ }).then(function() {
+ var event = thumbnailLoadedEvents.shift();
+ assertEquals('filesystem:volume-id/Test2.jpg', event.fileUrl);
+ assertTrue(event.dataUrl.length > 0);
+ assertEquals(160, event.width);
+ assertEquals(160, event.height);
+
+ // Since thumbnail of Test2.jpg is loaded into the cache,
+ // getThumbnailFromCache returns thumbnail for the image.
+ var thumbnail = listThumbnailLoader.getThumbnailFromCache(entry2);
+ assertEquals('filesystem:volume-id/Test2.jpg', thumbnail.fileUrl);
+ assertTrue(thumbnail.dataUrl.length > 0);
+ assertEquals(160, thumbnail.width);
+ assertEquals(160, thumbnail.height);
+
+ // Assert that new task is enqueued.
+ return waitUntil(function() {
+ return !!getOneCallbacks[entry1.toURL()] &&
+ !!getOneCallbacks[entry4.toURL()] &&
+ Object.keys(getOneCallbacks).length === 2;
+ });
+ }).then(function() {
+ // Set high priority range to 2 - 4.
+ listThumbnailLoader.setHighPriorityRange(2, 4);
+
+ // Resolve metadataCache.getOne for Test1.jpg.
+ getOneCallbacks[entry1.toURL()]();
+ delete getOneCallbacks[entry1.toURL()];
+
+ // Assert that task for (Test3.jpg) is enqueued.
+ return waitUntil(function() {
+ return !!getOneCallbacks[entry3.toURL()] &&
+ !!getOneCallbacks[entry4.toURL()] &&
+ Object.keys(getOneCallbacks).length === 2;
+ });
+ }).then(function() {
+ // Cache is deleted when the item is removed from the list.
+ var result = fileListModel.splice(2, 1); // Remove Test2.jpg.
+
+ // Fail to fetch thumbnail from cache.
+ return waitUntil(function() {
+ return listThumbnailLoader.getThumbnailFromCache(entry2) === null;
+ });
+ }), callback);
+}

Powered by Google App Engine
This is Rietveld 408576698