| 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..06a9e8eeae59fd4aca7ec7dca06776919bbedce5
|
| --- /dev/null
|
| +++ b/chrome/test/data/file_manager/unit_tests/metadata_cache_unittest.js
|
| @@ -0,0 +1,128 @@
|
| +// 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.
|
| + *
|
| + * @param {Array.<Entry>} entries Entries.
|
| + * @param {string} type Metadata type.
|
| + * @return {Promise} Promise to be fulfilled with the result metadata.
|
| + */
|
| +function getMetadata(entries, type) {
|
| + 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.
|
| + *
|
| + * @param {function(boolean=)} callback Callback to be called when test
|
| + * completes. If the test fails, true is passed to the function.
|
| + */
|
| +function testCached(callback) {
|
| + var entry = new MockFileEntry('volumeId', '/banjo.txt');
|
| +
|
| + var promises = [];
|
| + var firstPromise = getMetadata([entry], 'stub');
|
| + var cachedBeforeFetchingPromise = getMetadata([entry], 'stub');
|
| + provider.callbackPool[0]({stub: {value: 'banjo'}});
|
| + var cachedAfterFethingPromise = getMetadata([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.
|
| + *
|
| + * @param {function(boolean=)} callback Callback to be called when test
|
| + * completes. If the test fails, true is passed to the function.
|
| + */
|
| +function testNotCached(callback) {
|
| + var entry1 = new MockFileEntry('volumeId', '/banjo.txt');
|
| + var entry2 = new MockFileEntry('volumeId', '/fiddle.txt');
|
| +
|
| + var firstPromise = getMetadata([entry1], 'stub');
|
| + var anotherPromise = getMetadata([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);
|
| +}
|
|
|