Index: chrome/test/data/file_manager/unit_tests/metadata_cache_unittest.js |
diff --git a/chrome/test/data/file_manager/unit_tests/metadata_cache_unittest.js b/chrome/test/data/file_manager/unit_tests/metadata_cache_unittest.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5ecd44e4ded31ddc67535a77f61037a9106119ae |
--- /dev/null |
+++ b/chrome/test/data/file_manager/unit_tests/metadata_cache_unittest.js |
@@ -0,0 +1,118 @@ |
+// Copyright 2013 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. |
+ |
+var metadataCache; |
+var provider; |
+ |
+/** |
+ * Mock of MetadataProvider. |
+ * @constructor |
+ */ |
+function MockProvider() { |
+ MetadataProvider.call(this); |
+ this.callbackPool = []; |
+ Object.freeze(this); |
+} |
+ |
+MockProvider.prototype = { |
+ __proto__: MetadataProvider.prototype |
+}; |
+ |
+MockProvider.prototype.supportsEntry = function(entry) { |
+ return true; |
+}; |
+ |
+MockProvider.prototype.providesType = function(type) { |
+ return type === 'stub'; |
+}; |
+ |
+MockProvider.prototype.getId = function() { |
+ return 'stub'; |
+}; |
+ |
+MockProvider.prototype.fetch = function(entry, type, callback) { |
+ this.callbackPool.push(callback); |
+}; |
+ |
+/** |
+ * Short hand for the metadataCache.get. |
yoshiki
2014/06/20 05:02:47
nit: missing @param's
hirono
2014/06/20 10:01:05
Done.
|
+ */ |
+function get(entries, type) { |
yoshiki
2014/06/20 05:02:47
I think 'get' is too short. 'getMetadata' is more
hirono
2014/06/20 10:01:06
Done.
|
+ return new Promise(metadataCache.get.bind(metadataCache, entries, type)); |
+}; |
+ |
+/** |
+ * Invokes a callback function depending on the result of promise. |
+ * |
+ * @param {Promise} promise Promise. |
+ * @param {function(boolean)} calllback Callback function. True is passed if the |
+ * test failed. |
+ */ |
+function reportPromise(promise, callback) { |
+ promise.then(function() { |
+ callback(/* error */ false); |
+ }, function(error) { |
+ console.error(error.stack || error); |
+ callback(/* error */ true); |
+ }); |
+} |
+ |
+/** |
+ * Constructs the metadata cache and its provider. |
+ */ |
+function setUp() { |
+ provider = new MockProvider(); |
+ metadataCache = new MetadataCache([provider]); |
+} |
+ |
+/** |
+ * Confirms metadata is cached for the same entry. |
yoshiki
2014/06/20 05:02:47
nit: missing @param
hirono
2014/06/20 10:01:06
Done.
|
+ */ |
+function testCached(callback) { |
+ var entry = new MockFileEntry('volumeId', '/banjo.txt'); |
+ |
+ var promises = []; |
+ var firstPromise = get([entry], 'stub'); |
+ var cachedBeforeFetchingPromise = get([entry], 'stub'); |
+ provider.callbackPool[0]({stub: {value: 'banjo'}}); |
+ var cachedAfterFethingPromise = get([entry], 'stub'); |
+ |
+ // Provide should be called only once. |
+ assertEquals(1, provider.callbackPool.length); |
+ |
+ reportPromise(Promise.all([ |
+ firstPromise, |
+ cachedBeforeFetchingPromise, |
+ cachedAfterFethingPromise |
+ ]).then(function(metadata) { |
+ assertDeepEquals([{value: 'banjo'}], metadata[0]); |
+ assertDeepEquals([{value: 'banjo'}], metadata[1]); |
+ assertDeepEquals([{value: 'banjo'}], metadata[1]); |
+ }), callback); |
+} |
+ |
+/** |
+ * Confirms metadata is not cached for different entries. |
yoshiki
2014/06/20 05:02:47
nit: missing @param
hirono
2014/06/20 10:01:05
Done.
|
+ */ |
+function testNotCached(callback) { |
+ var entry1 = new MockFileEntry('volumeId', '/banjo.txt'); |
+ var entry2 = new MockFileEntry('volumeId', '/fiddle.txt'); |
+ |
+ var firstPromise = get([entry1], 'stub'); |
+ var anotherPromise = get([entry2], 'stub'); |
+ |
+ // Provide should be called for each entry. |
+ assertEquals(2, provider.callbackPool.length); |
+ |
+ provider.callbackPool[0]({stub: {value: 'banjo'}}); |
+ provider.callbackPool[1]({stub: {value: 'fiddle'}}); |
+ |
+ reportPromise(Promise.all([ |
+ firstPromise, |
+ anotherPromise |
+ ]).then(function(metadata) { |
+ assertDeepEquals([{value: 'banjo'}], metadata[0]); |
+ assertDeepEquals([{value: 'fiddle'}], metadata[1]); |
+ }), callback); |
+} |