﻿/// <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/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
    var CustomDataSource = function (baseUri) {
        this.baseUri = baseUri;
    };

    CustomDataSource.prototype.read = function (index, count, success, error) {
        var that = this;
        var url = this.baseUri + "?$skip=" + index + "&$top=" + count;
        $(this).triggerHandler("request", { requestUri: url });
        $.ajax({
            url: url,
            dataType: "json",
            success: function (results) {
                $(that).triggerHandler("success", { data: results });
                success(results);
            },
            error: error
        });
    };

    CustomDataSource.prototype.count = function (success, error) {
        $.ajax({
            url: "./endpoints/CustomDataService.svc/Count",
            dataType: "json",
            success: success,
            error: error
        });
    },
    CustomDataSource.prototype.toString = function () {
        return this.baseUri;
    };

    var sources = [
        { source: "./endpoints/FoodStoreDataServiceV4.svc/Foods", countSupported: true },
        { source: new CustomDataSource("./endpoints/CustomDataService.svc/ReadRange"), countSupported: true }
    ];

    var itemsInCollection = 16;

    // Cache config variations for single readRange with fixed skip/take that spans the entire collection
    var pageSizes = [
        1,
        4,  // factor of total, <= server page size
        5,  // non-factor of total, <= server page size
        6,  // non-factor of total, > server page size
        8,  // factor of total, > server page size
        itemsInCollection,
        itemsInCollection + 1
    ];

    var cacheSizes = [
        -5,           // All you can store 
         0,           // Store nothing
         1024,        // 1 KB
         2.5 * 1024,  // 2.5 KB
         100 * 1024,  // 10 KB
         512 * 1024,  // 512 KB
         100 * 1024 * 1024, // 100 MB
         undefined    // Default to 1 MB
    ];

    // Skip/take variations for single readRange with fixed cache config
    var fixedPageSize = 6;

    var skipValues = [
        0,
        fixedPageSize - 1,
        fixedPageSize,
        fixedPageSize + 1,
        fixedPageSize * 2,
        itemsInCollection + 1,
        itemsInCollection + fixedPageSize + 1
    ];

    var takeValues = [
        0,
        fixedPageSize - 1,
        fixedPageSize,
        fixedPageSize + 1,
        fixedPageSize * 2,
        itemsInCollection + 1
    ];

    // Skip/take variations for multiple readRanges with fixed cache config
    var multipleReads = [
        { skip: 1, take: 2 },   // page 1
        {skip: 2, take: 7 },   // page 1, 2
        {skip: 3, take: 10 },  // page 1, 2, 3
        {skip: 6, take: 2}    // page 2
    ];

    var invalidSkipValues = [-5, NaN, undefined, Infinity, "not a valid value"];
    var invalidTakeValues = [-5, NaN, undefined, Infinity, "not a valid value"];
    var invalidPageSizes = [-5, NaN, Infinity, 0, "not a valid value"];

    // Prefetchsize variations for a single readRange
    var prefetchSizes = [
        -5,
        1,
        5,
        itemsInCollection,
        itemsInCollection + 1
    ];

    var expectException = function (cache) {
        djstest.assert(false, "We should not get here because the an exception is expected.");
        djstest.destroyCacheAndDone(cache);
    };

    var makeUnexpectedErrorHandler = function (cache) {
        return function (err) {
            djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
            if (cache) {
                djstest.destroyCacheAndDone(cache);
            } else {
                djstest.done();
            }
        };
    };

    var validateExpectedRange = function (cache, data, source, skipValue, takeValue, finished) {
        /// <summary>Validates the data returned by readRange</summary>
        /// <param name="cache" type="Object">The cache object</param>
        /// <param name="data" type="Object">The data returned by the cache</param>
        /// <param name="source" type="Object">The base URI of the feed, or the custom data source</param>
        /// <param name="skipValue type="Integer">The skip value</param>
        /// <param name="takeValue" type="Integer">The take value</param>
        /// <param name="finished" type="Function">Callback function called after data is verified</param>
        var assertData = function (expectedData) {
            djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
            finished();
        };

        if (typeof source === "string") {
            var expectedRangeUrl = source + "?$skip=" + skipValue + "&$top=" + takeValue;
            window.ODataReadOracle.readJsonAcrossServerPages(expectedRangeUrl, assertData);
        } else {
            source.read(skipValue, takeValue, assertData);
        }
    };

    var onidleValidation = function () {
        djstest.assert(true, "expected call to onidle");
        djstest.done();
    };

    var createSingleReadTestName = function (params) {
        return "Testing readRange of " + params.source + " [skip " + params.skip + " take " + params.take + "] with pageSize " +
            params.pageSize + ", prefetch " + params.prefetchSize + " and cacheSize " + params.cacheSize;
    };

    var createMultipleReadTestName = function (params) {
        return "Testing readRange of " + params.source + " [skip " + params.firstSkip + " take " + params.firstTake + ", " +
            (params.destroyCacheBetweenReads ? "cache.destroy(), " : "") +
            "skip " + params.secondSkip + " take " + params.secondTake + "] with pageSize " +
            params.pageSize + ", prefetch " + params.prefetchSize + " and cacheSize " + params.cacheSize;
    };

    var dataCacheSingleReadRangeTest = function (params) {
        djstest.assertsExpected(2);
        var options = { name: "cache" + new Date().valueOf(), source: params.source, pageSize: params.pageSize, prefetchSize: params.prefetchSize, cacheSize: params.cacheSize };

        if (params.mechanism) {
            options.mechanism = params.mechanism;
        }

        var cache = this.createAndAddCache(options);
        var session = typeof params.source === "string" ? this.observableHttpClient.newSession() : new Session(params.source);
        var cacheOracle = new CacheOracle(params.source, params.pageSize, itemsInCollection, params.cacheSize);
        cache.readRange(params.skip, params.take).then(function (data) {
            cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "readRange requests");
            validateExpectedRange(cache, data, params.source, params.skip, params.take, function () {
                djstest.destroyCacheAndDone(cache);
            });
        }, makeUnexpectedErrorHandler(cache));
    };

    var dataCacheParallelReadRangeTest = function (params) {
        djstest.assertsExpected(2);
        var options = { name: "cache" + new Date().valueOf(), source: params.source, pageSize: params.pageSize, prefetchSize: params.prefetchSize, cacheSize: params.cacheSize };

        var cache = this.createAndAddCache(options);

        var firstReadRange = function (finished) {
            cache.readRange(params.firstSkip, params.firstTake).then(function (data) {
                validateExpectedRange(cache, data, params.source, params.firstSkip, params.firstTake, finished);
            }, makeUnexpectedErrorHandler(cache));
        };

        var secondReadRange = function (finished) {
            cache.readRange(params.secondSkip, params.secondTake).then(function (data) {
                validateExpectedRange(cache, data, params.source, params.secondSkip, params.secondTake, finished);
            }, makeUnexpectedErrorHandler(cache));
        };

        djstest.asyncDo([firstReadRange, secondReadRange], function () {
            djstest.destroyCacheAndDone(cache);
        });
    };

    var dataCacheSerialReadRangeTest = function (params) {
        djstest.assertsExpected(4);
        var options = { name: "cache" + new Date().valueOf(), source: params.source, pageSize: params.pageSize, prefetchSize: params.prefetchSize, cacheSize: params.cacheSize };

        var cacheOracle = new CacheOracle(params.source, params.pageSize, itemsInCollection, params.cacheSize);
        var secondRead = function () {
            session.clear();
            cache.readRange(params.secondSkip, params.secondTake).then(function (data) {
                cacheOracle.verifyRequests(session.requests, session.responses, params.secondSkip, params.secondTake, "Second readRange requests");
                validateExpectedRange(cache, data, params.source, params.secondSkip, params.secondTake, djstest.done);
            }, makeUnexpectedErrorHandler(cache));
        };

        var cache = this.createAndAddCache(options);
        var session = typeof params.source === "string" ? this.observableHttpClient.newSession() : new Session(params.source);
        cache.readRange(params.firstSkip, params.firstTake).then(function (data) {
            cacheOracle.verifyRequests(session.requests, session.responses, params.firstSkip, params.firstTake, "First readRange requests");
            validateExpectedRange(cache, data, params.source, params.firstSkip, params.firstTake, function () {
                if (params.destroyCacheBetweenReads === true) {
                    cache.clear().then(function () {
                        cacheOracle.clear();
                        secondRead();
                    }, function (err) {
                        djstest.fail("Error destroying the cache: " + djstest.toString(err));
                    });
                } else {
                    secondRead();
                }
            });
        }, makeUnexpectedErrorHandler(cache));
    };

    var dataCachePrefetchTest = function (params) {
        djstest.assertsExpected(2);
        var options = {
            name: "cache" + new Date().valueOf(),
            source: params.source,
            pageSize: params.pageSize,
            prefetchSize: params.prefetchSize,
            cacheSize: params.cacheSize,
            user: params.user,
            password: params.password
        };

        var cache = this.createAndAddCache(options);
        var session = typeof params.source === "string" ? this.observableHttpClient.newSession() : new Session(params.source);
        var cacheOracle = new CacheOracle(params.source, params.pageSize, itemsInCollection, params.cacheSize);

        cache.readRange(params.skip, params.take).then(function (data) {
            cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "readRange requests");
            session.clear();
        }, makeUnexpectedErrorHandler(cache));

        cache.onidle = function () {
            var prefetchSize = params.prefetchSize < 0 ? itemsInCollection : params.prefetchSize;
            cacheOracle.verifyRequests(session.requests, session.responses, params.skip + params.take, prefetchSize, "prefetch requests", false, true);
            cache.onidle = false;
            djstest.destroyCacheAndDone(cache);
        };
    };

    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 indexedDb is cleared.</param>
        var caches = this.caches;

        djstest.cleanStoreOnIndexedDb(caches, done);
    };

    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);
    };

    var storageMechanisms = {
        indexeddb: { cleanup: cleanIndexedDb },
        dom: { cleanup: cleanDomStorage },
        memory: { cleanup: function (done) { done(); } },
        best: { cleanup: function (done) { done(); } }
    };

    module("Functional", {
        setup: function () {
            this.createAndAddCache = function (options) {
                /// <summary>Returns a cache created from the options object and </summary>
                /// <param name="options" type="Object">Object to create a cache from.</param> 
                var cache = odatajs.createDataCache(options);
                this.caches.push({ name: options.name, cache: cache });
                return cache;
            };

            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(CacheOracle.mechanisms, function (_, mechanism) {
        var parameters = { mechanism: mechanism, source: sources[1].source, take: 5, skip: 0, pageSize: 5, prefetchSize: 5 };
        if (CacheOracle.isMechanismAvailable(mechanism)) {
            djstest.addTest(dataCacheSingleReadRangeTest, "Specified mechanism: " + parameters.mechanism + createSingleReadTestName(parameters), parameters);
        }
        else {
            djstest.addTest(function (params) {
                djstest.assertsExpected(1);
                var options = { name: "cache" + new Date().valueOf(), mechanism: params.mechanism, source: params.source };
                try {
                    var cache = this.createAndAddCache(options);
                    expectException(cache);
                }
                catch (e) {
                    if (mechanism === "indexeddb") {
                        djstest.assertAreEqual(e.message, "IndexedDB is not supported on this browser", "Validating expected error");
                    } else if (mechanism === "dom") {
                        djstest.assertAreEqual(e.message, "Web Storage not supported by the browser", "Validating expected error");
                    } else {
                        djstest.fail("Creating cache with mechanism " + mechanism + " should not fail: " + djstest.toString(e));
                    }

                    djstest.done();
                }
            }, "Invalid mechanism for browser: " + parameters.mechanism + createSingleReadTestName(parameters), parameters);
        }
    });

    $.each(sources, function (_, sourceObject) {
        $.each(pageSizes, function (_, pageSizeValue) {
            $.each(cacheSizes, function (_, cacheSizeValue) {
                var parameters = { source: sourceObject.source, skip: 0, take: itemsInCollection, pageSize: pageSizeValue, prefetchSize: 0, cacheSize: cacheSizeValue };
                djstest.addTest(dataCacheSingleReadRangeTest, createSingleReadTestName(parameters), parameters);
            });
        });

        $.each(skipValues, function (_, skipValue) {
            $.each(takeValues, function (_, takeValue) {
                var parameters = { source: sourceObject.source, take: takeValue, skip: skipValue, pageSize: 4, prefetchSize: 0, cacheSize: 0 };
                djstest.addTest(dataCacheSingleReadRangeTest, createSingleReadTestName(parameters), parameters);
            });
        });

        $.each(multipleReads, function (_, firstRange) {
            $.each(multipleReads, function (_, secondRange) {
                var parallelReadParams = { source: sourceObject.source, firstTake: firstRange.take, firstSkip: firstRange.skip, secondTake: secondRange.take, secondSkip: secondRange.skip, pageSize: 5, prefetchSize: 0, cacheSize: 0 };
                djstest.addTest(dataCacheParallelReadRangeTest, "Parallel: " + createMultipleReadTestName(parallelReadParams), parallelReadParams);

                $.each([false, true], function (_, destroyCacheBetweenReads) {
                    var serialReadParams = $.extend({}, parallelReadParams, { destroyCacheBetweenReads: destroyCacheBetweenReads });
                    djstest.addTest(dataCacheSerialReadRangeTest, "Serial: " + createMultipleReadTestName(serialReadParams), serialReadParams);
                });
            });
        });

        var getInvalidValueErrorMessage = function (invalidValue, parameterName) {
            /// <summary>Returns the expected error message for the specified invalid value.</summary>
            /// <param name="invalidValue type="Object">invalid value (anything other than zero or positive integer) to determine the error message from.</param>
            /// <param name="parameterName" type="String">The name of the parameter being verified.</param>
            /// <returns type="String">Error message expected.</returns>
            return (invalidValue === undefined || typeof invalidValue !== "number") ?
                        "'" + parameterName + "' must be a number." :
                        "'" + parameterName + "' must be greater than or equal to zero.";
        };

        $.each(invalidSkipValues, function (_, invalidSkipValue) {
            var parameters = { source: sourceObject.source, skip: invalidSkipValue, take: 1 };
            djstest.addTest(function (params) {
                djstest.assertsExpected(1);
                var options = { name: "cache" + new Date().valueOf(), source: params.source };
                var cache = this.createAndAddCache(options);
                try {
                    cache.readRange(params.skip, params.take);
                    expectException(cache);
                } catch (e) {
                    djstest.assertAreEqual(e.message, getInvalidValueErrorMessage(invalidSkipValue, "index"), "Error message validation");
                    djstest.destroyCacheAndDone(cache);
                }
            }, "Invalid skip: " + createSingleReadTestName(parameters), parameters);
        });

        $.each(invalidTakeValues, function (_, invalidTakeValue) {
            var parameters = { source: sourceObject.source, skip: 0, take: invalidTakeValue };
            djstest.addTest(function (params) {
                djstest.assertsExpected(1);
                var options = { name: "cache" + new Date().valueOf(), source: params.source };
                var cache = this.createAndAddCache(options);
                try {
                    cache.readRange(params.skip, params.take);
                    expectException(cache);
                } catch (e) {
                    djstest.assertAreEqual(e.message, getInvalidValueErrorMessage(invalidTakeValue, "count"), "Error message validation");
                    djstest.destroyCacheAndDone(cache);
                }
            }, "Invalid take: " + createSingleReadTestName(parameters), parameters);
        });

        $.each(invalidPageSizes, function (_, invalidPageSize) {
            var parameters = { source: sourceObject.source, skip: 0, take: 5, pageSize: invalidPageSize };
            djstest.addTest(function (params) {
                var options = { name: "cache", source: params.source, pageSize: params.pageSize };
                try {
                    var cache = this.createAndAddCache(options);
                    expectException(cache);
                } catch (e) {
                    var expectedError = typeof invalidPageSize === "number" ? "'pageSize' must be greater than zero." : getInvalidValueErrorMessage(invalidPageSize, "pageSize");
                    djstest.assertAreEqual(e.message, expectedError, "Error message validation");
                }
                djstest.done();
            }, "Invalid pageSize: " + createSingleReadTestName(parameters), parameters);
        });

        $.each(pageSizes, function (_, pageSize) {
            $.each(cacheSizes, function (_, cacheSize) {
                var parameters = { source: sourceObject.source, skip: 0, take: pageSize, pageSize: pageSize, prefetchSize: -1, cacheSize: cacheSize };
                djstest.addTest(dataCachePrefetchTest, "Prefetch: " + createSingleReadTestName(parameters), parameters);
            });
        });

        $.each(skipValues, function (_, skipValue) {
            var parameters = { source: sourceObject.source, skip: skipValue, take: fixedPageSize, pageSize: fixedPageSize, prefetchSize: -1, cacheSize: -1 };
            djstest.addTest(dataCachePrefetchTest, "Prefetch: " + createSingleReadTestName(parameters), parameters);
        });

        $.each(takeValues, function (_, takeValue) {
            var parameters = { source: sourceObject.source, skip: 0, take: takeValue, pageSize: fixedPageSize, prefetchSize: -1, cacheSize: -1 };
            djstest.addTest(dataCachePrefetchTest, "Prefetch: " + createSingleReadTestName(parameters), parameters);
        });

        $.each(prefetchSizes, function (_, prefetchSize) {
            var parameters = { source: sourceObject.source, skip: 0, take: fixedPageSize, pageSize: fixedPageSize, prefetchSize: prefetchSize, cacheSize: -1 };
            djstest.addTest(dataCachePrefetchTest, "Prefetch: " + createSingleReadTestName(parameters), parameters);
        });

        var fixedPrefetchSize = 5;

        djstest.addTest(function (params) {
            djstest.assertsExpected(1);
            var cache = this.createAndAddCache({
                name: "cache" + new Date().valueOf(),
                source: params.source,
                prefetchSize: fixedPrefetchSize,
                idle: onidleValidation,
                pageSize: 2,
                mechanism: "memory"
            });
            cache.readRange(0, 5);

        }, "onidle in constructor, prefetch size = " + fixedPrefetchSize + " on " + sourceObject.source, { source: sourceObject.source });

        djstest.addTest(function (params) {
            djstest.assertsExpected(1);
            var cache = this.createAndAddCache({
                name: "cache" + new Date().valueOf(),
                source: params.source,
                prefetchSize: fixedPrefetchSize,
                pageSize: 2,
                mechanism: "memory"
            });
            cache.onidle = onidleValidation;
            cache.readRange(0, 5);
        }, "onidle, prefetch size = " + fixedPrefetchSize + " on " + sourceObject.source, { source: sourceObject.source });

        djstest.addTest(function (params) {
            djstest.assertsExpected(1);
            var cache = this.createAndAddCache({
                name: "cache" + new Date().valueOf(),
                source: params.source,
                prefetchSize: fixedPrefetchSize,
                idle: function () { djstest.assert(false, "unexpected onidle call") },
                pageSize: 2,
                mechanism: "memory"
            });
            cache.onidle = onidleValidation;
            cache.readRange(0, 5);
        }, "onidle override, prefetch size = " + fixedPrefetchSize + " on " + sourceObject.source, { source: sourceObject.source });

        djstest.addTest(function (params) {
            var cache = this.createAndAddCache({ name: "cache" + new Date().valueOf(), source: params.source, pageSize: 1, prefetchSize: -1 });
            var observableSource = typeof params.source === "string" ? this.observableHttpClient : params.source;
            cache.readRange(0, 1).then(function (data) {
                // Let one prefetch request go out, to make sure the prefetcher is started, and then destroy the cache
                $(observableSource).one("success", function () {
                    var session = new Session(observableSource);
                    cache.clear().then(function () {
                        setTimeout(function () {
                            djstest.assertAreEqualDeep(session.requests, [], "Verify no prefetch requests are sent out after cache.clear() callback");
                            djstest.done();
                        }, 1000);
                    }, function (err) {
                        djstest.fail("Error destroying the cache: " + djstest.toString(err));
                    });
                });
            });
        }, "Testing cache.clear() halts the prefetcher" + sourceObject.source, { source: sourceObject.source });

        djstest.addTest(function (params) {
            var cache = this.createAndAddCache({ name: "cache" + new Date().valueOf(), source: params.source });
            if (params.countSupported) {
                cache.count().then(function (count) {
                    djstest.assertAreEqual(count, itemsInCollection, "All items accounted for");
                    djstest.destroyCacheAndDone(cache);
                }, makeUnexpectedErrorHandler(cache));
            }
            else {
                cache.count().then(function (count) {
                    djstest.assert(false, "Success should not be called, count not supported");
                    djstest.destroyCacheAndDone(cache);
                }, function (err) {
                    djstest.assertAreEqual(err.message, "HTTP request failed", "Validating expected error");
                    djstest.destroyCacheAndDone(cache);
                });
            }
        }, "Testing cache.count() on " + sourceObject.source, { source: sourceObject.source, countSupported: sourceObject.countSupported });

        djstest.addTest(function (params) {
            var cache = this.createAndAddCache({ name: "cache" + new Date().valueOf(), source: params.source, pageSize: 1, prefetchSize: 0 });
            var session = typeof params.source === "string" ? this.observableHttpClient.newSession() : new Session(params.source);
            cache.readRange(0, 1).cancel();
            setTimeout(function () {
                djstest.assertAreEqualDeep(session.requests, [], "Verify no requests are sent out after readRange is cancelled");
                djstest.done();
            }, 1000);
        }, "Testing cancel()" + sourceObject.source, { source: sourceObject.source });

        djstest.addTest(function (params) {
            djstest.assertsExpected(1);
            var cache = this.createAndAddCache({ name: "cache" + new Date().valueOf(), source: params.source, pageSize: 1, prefetchSize: 0 });
            cache.clear().then(function () {
                cache.clear().then(function () {
                    djstest.pass("Second clear succeeded");
                    djstest.done();
                }, makeUnexpectedErrorHandler(cache));
            }, makeUnexpectedErrorHandler(cache));
        }, "Testing .clear().then(cache.clear())" + sourceObject.source, { source: sourceObject.source });
    });

    var params = {
        source: "./endpoints/BasicAuthDataService.svc/Customers",
        skip: 0,
        take: 5,
        pageSize: 5,
        prefetchSize: -1,
        cacheSize: -1,
        user: "djsUser",
        password: "djsPassword"
    };
    djstest.addTest(dataCachePrefetchTest, createSingleReadTestName(params), params);
})(this);
