blob: 49eca60c1c6a904c553ee9dbbe05b94ea897047b [file] [log] [blame]
/// <reference path="../src/datajs.js" />
/// <reference path="../src/odata-utils.js" />
/// <reference path="../src/cache.js" />
/// <reference path="common/djstest.js" />
(function (window, undefined) {
OData.defaultHandler.accept = "application/atomsvc+xml;q=0.9, application/json;odata=verbose;q=0.8, application/json;odata=fullmetadata;q=0.7, application/json;q=0.5, */*;q=0.1";
var largeCollectionFeed = "./endpoints/LargeCollectionService.svc/Customers";
var itemsInCollection = 2 * 1024 * 1024;
var cleanDomStorage = function (done) {
/// <summary>Cleans all the data saved in the browser's DOM Storage. Needs to be called asynchronously in the
/// setup and teardown methods to be consistent with indexedDb's cleanup method.</summary>
/// <param name="done" type="Function">Function to be called after DOM storage is cleared.</param>
if (window.localStorage) {
window.localStorage.clear();
}
done();
};
var cleanIndexedDb = function (done) {
/// <summary>Cleans all the data saved in the browser's IndexedDb Storage.</summary>
/// <param name="done" type="Function">Function to be called after DOM storage is cleared.</param>
var caches = this.caches;
djstest.cleanStoreOnIndexedDb(caches, done);
};
var makeUnexpectedErrorHandler = function () {
return function (err) {
djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
};
};
var storageMechanisms = {
indexeddb: { cleanup: cleanIndexedDb },
dom: { cleanup: cleanDomStorage }
};
var cleanupAllStorage = function (done) {
/// <summary>Cleans up all available storage mechanisms in the browser.</summary>
/// <param name="done" type="Function">Function to be called by each cleanup function after storage is cleared.</param>
var that = this;
var storeCleanup = [];
$.each(CacheOracle.mechanisms, function (_, mechanism) {
if (CacheOracle.isMechanismAvailable(mechanism)) {
storeCleanup.push(function (done) {
if (storageMechanisms[mechanism]) {
storageMechanisms[mechanism].cleanup.call(that, done);
} else {
done();
}
});
}
});
djstest.asyncDo(storeCleanup, done);
}
module("Functional", {
setup: function () {
this.observableHttpClient = new ObservableHttpClient();
OData.defaultHttpClient = this.observableHttpClient;
this.caches = [];
var that = this;
djstest.wait(function (done) {
cleanupAllStorage.call(that, done);
});
},
teardown: function () {
OData.defaultHttpClient = this.observableHttpClient.provider;
var clearActions = [];
var that = this;
$.each(this.caches, function (_, cacheObject) {
cacheObject.cache.onidle = undefined;
clearActions.push(function (done) {
cacheObject.cache.clear().then(function () {
done();
},
function (err) {
djstest.assert(false, "Unexpected call to error handler while attempting to clear with error: " + djstest.toString(err));
})
});
});
djstest.wait(function (done) {
djstest.asyncDo(clearActions, function () {
cleanupAllStorage.call(that, function () {
that.caches = [];
done();
});
});
});
}
});
$.each(["dom", "indexeddb"], function (_, mechanism) {
if (CacheOracle.isMechanismAvailable(mechanism)) {
$.each([-1, 10 * 1024 * 1024, 1024 * 10248], function (_, cacheSize) {
var prefetchParameters = { mechanism: mechanism, feed: largeCollectionFeed, skip: 0, take: 5, pageSize: 1024, prefetchSize: -1, cacheSize: cacheSize };
djstest.addTest(function (params) {
djstest.assertsExpected(3);
var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize,
mechanism: params.mechanism, cacheSize: params.cacheSize
};
var cache = datajs.createDataCache(options);
this.caches.push({ name: options.name,
cache: cache
});
cache.onidle = function () {
djstest.assert(true, "onidle Called");
djstest.done();
};
var cacheOracle = new CacheOracle(params.feed, params.pageSize, itemsInCollection);
var session = this.observableHttpClient.newSession();
cache.readRange(params.skip, params.take).then(function (data) {
var expectedRangeUrl = params.feed + "?$skip=" + params.skip + "&$top=" + params.take;
cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "largeCollection requests with prefetch", false, true);
window.ODataReadOracle.readJsonAcrossServerPages(expectedRangeUrl, function (expectedData) {
djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
});
}, function (err) {
makeUnexpectedErrorHandler(err)();
});
}, "readRange and prefetch all to fill store on " + prefetchParameters.mechanism + " with cacheSize=" + prefetchParameters.cacheSize, prefetchParameters, 600000);
$.each([500, 1024 * 10 /*Test reduced from 100 to 10 to work around slow running script error in IE8 and Safari (bug 2200)*/], function (_, pageSize) {
var largeReadParameters = { mechanism: mechanism, feed: largeCollectionFeed, skip: 0, take: 1024, pageSize: pageSize, prefetchSize: 0, cacheSize: cacheSize };
djstest.addTest(function (params) {
djstest.assertsExpected(2);
var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize,
mechanism: params.mechanism, cacheSize: params.cacheSize
};
var cache = datajs.createDataCache(options);
this.caches.push({ name: options.name, cache: cache });
var cacheOracle = new CacheOracle(params.feed, params.pageSize, itemsInCollection);
var session = this.observableHttpClient.newSession();
cache.readRange(params.skip, params.take).then(function (data) {
var expectedRangeUrl = params.feed + "?$skip=" + params.skip + "&$top=" + params.take;
cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "largeCollection requests without prefetch", false, false);
window.ODataReadOracle.readJsonAcrossServerPages(expectedRangeUrl, function (expectedData) {
djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
djstest.done();
});
}, function (err) {
makeUnexpectedErrorHandler(err)();
djstest.done();
});
}, "readRange of skip=" + largeReadParameters.skip + " take=" + largeReadParameters.take + " cacheSize=" + largeReadParameters.cacheSize + " and pageSize=" + largeReadParameters.pageSize +
" to fill store on " + largeReadParameters.mechanism, largeReadParameters, 600000);
});
});
}
});
})(this);