﻿/// <reference path="common/djstest.js" />
/// <reference path="../src/odata.js" />
/// <reference path="common/Instrument.js" />
/// <reference path="common/ODataReadOracle.js" />

(function (window, undefined) {
    var unexpectedErrorHandler = function (err) {
        djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
        djstest.done();
    };

    var timedHttpClient = {
        duration: 0,
        provider: OData.defaultHttpClient,
        request: function (request, success, error) {
            var startTime = new Date();
            return timedHttpClient.provider.request(request, function () {
                timedHttpClient.duration = new Date() - startTime;
                success.apply(this, arguments);
            }, error);
        }
    };

    var largeCollectionService = "./endpoints/LargeCollectionService.svc/";

    // null "service" indicates the feed is read-only
    var feeds = [
        // will add atom format test after enabling atom scenario
        { service: largeCollectionService, uri: largeCollectionService + "Customers", mimeType: "application/json;odata.metadata=minimal" },
        { service: largeCollectionService, uri: largeCollectionService + "Customers", mimeType: "application/json;odata.metadata=full" },
        { service: largeCollectionService, uri: largeCollectionService + "Customers", mimeType: "application/json;odata.metadata=none" },
        { service: largeCollectionService, uri: largeCollectionService + "Suppliers", mimeType: "application/json" },
        { service: null, uri: "http://odata.netflix.com/Catalog/Titles", mimeType: "application/json" }
    ];

    module("Performance", {
        setup: function () {
            djstest.wait(function (done) {
                $.post(largeCollectionService + "ResetData", done);
            });
        },
        teardown: function () {
            OData.defaultHttpClient = timedHttpClient.provider;
        }
    });

    OData.defaultHttpClient.enableJsonpCallback = true;
    $.each(feeds, function (_, feed) {
        $.each([5, 500], function (_, items) {
            var params = $.extend({}, feed, { items: items, readUri: feed.uri + "?$top=" + items });
            djstest.addTest(function readPerfTest(params) {
                var measureRead = function (metadata) {
                    var startTime = new Date();
                    odatajs.oData.read({ requestUri: params.readUri, headers: { Accept: params.mimeType }, enableJsonpCallback: true }, function () {
                        var duration = new Date() - startTime - timedHttpClient.duration;
                        djstest.pass("Duration: " + duration + " ms (Network: " + timedHttpClient.duration + " ms)");
                        djstest.done();
                    }, unexpectedErrorHandler, undefined, undefined, metadata);
                };

                OData.defaultHttpClient = timedHttpClient;
                djstest.assertsExpected(1);
                if (params.metadata) {
                    odatajs.oData.read(params.service + "$metadata", measureRead, unexpectedErrorHandler, OData.metadataHandler);
                } else {
                    measureRead();
                }
            }, "Time to read (once) " + params.readUri + " with " + params.mimeType, params);

            djstest.addTest(function readParallelMemoryTest(params) {
                var total = 10;
                var count = 0;
                var measureRead = function (metadata) {
                    Instrument.getBrowserMemorySize(function (memoryBefore) {
                        for (var i = 0; i < total; i++) {
                            odatajs.oData.read({ requestUri: params.readUri, headers: { Accept: params.mimeType }, enableJsonpCallback: true }, function (_, response) {
                                count++;
                                if (count >= total) {
                                    Instrument.getBrowserMemorySize(function (memoryAfter) {
                                        var memory = memoryAfter - memoryBefore;
                                        djstest.pass("Memory: " + memory + " bytes (Network: " + response.headers["Content-Length"] + " bytes)");
                                        djstest.done();
                                    });
                                }
                            }, unexpectedErrorHandler, undefined, undefined, metadata);
                        }
                    });
                };

                djstest.assertsExpected(1);
                if (params.metadata) {
                    odatajs.oData.read(params.service + "$metadata", measureRead, unexpectedErrorHandler, OData.metadataHandler);
                } else {
                    measureRead();
                }
            }, "Memory to read (x10 parallel) " + params.readUri + " with " + params.mimeType, params, 300000);

            djstest.addTest(function readSerialMemoryTest(params) {
                var total = 10;
                var count = 0;
                var measureRead = function (metadata) {
                    Instrument.getBrowserMemorySize(function (memoryBefore) {
                        var makeRequest = function () {
                            odatajs.oData.read({ requestUri: params.readUri, headers: { Accept: params.mimeType }, enableJsonpCallback: true }, function (_, response) {
                                count++;
                                if (count < total) {
                                    setTimeout(makeRequest, 0);
                                } else {
                                    Instrument.getBrowserMemorySize(function (memoryAfter) {
                                        var memory = memoryAfter - memoryBefore;
                                        djstest.pass("Memory: " + memory + " bytes (Network: " + response.headers["Content-Length"] + " bytes)");
                                        djstest.done();
                                    });
                                }
                            }, unexpectedErrorHandler, undefined, undefined, metadata);
                        };

                        makeRequest();
                    });
                };

                djstest.assertsExpected(1);
                if (params.metadata) {
                    odatajs.oData.read(params.service + "$metadata", measureRead, unexpectedErrorHandler, OData.metadataHandler);
                } else {
                    measureRead();
                }
            }, "Memory to read (x10 serial) " + params.readUri + " with " + params.mimeType, params, 300000);
        });

        if (feed.service) {
            var params = $.extend({}, feed, {
                request: {
                    requestUri: feed.uri,
                    method: "POST",
                    headers: { "Content-Type": feed.mimeType, Accept: feed.mimeType },
                    data: {
                        ID: -1,
                        Name: "New Entity"
                    }
                }
            });

            djstest.addTest(function postPerfTest(params) {
                var measurePost = function (metadata) {
                    var startTime = new Date();
                    odatajs.oData.request(params.request, function () {
                        var duration = new Date() - startTime - timedHttpClient.duration;
                        djstest.pass("Duration: " + duration + " ms (Network: " + timedHttpClient.duration + " ms)");
                        djstest.done();
                    }, unexpectedErrorHandler, undefined, undefined, metadata);
                };

                OData.defaultHttpClient = timedHttpClient;
                djstest.assertsExpected(1);

                if (params.metadata) {
                    odatajs.oData.read(params.service + "$metadata", measurePost, unexpectedErrorHandler, OData.metadataHandler);
                } else {
                    measurePost();
                }
            }, "Time to POST " + params.uri + " with " + params.mimeType, params);

            djstest.addTest(function postParallelMemoryTest(params) {
                var total = 10;
                var count = 0;
                var measurePost = function (metadata) {
                    Instrument.getBrowserMemorySize(function (memoryBefore) {
                        for (var i = 0; i < total; i++) {
                            odatajs.oData.request(params.request, function (_, response) {
                                count++;
                                if (count >= total) {
                                    Instrument.getBrowserMemorySize(function (memoryAfter) {
                                        var memory = memoryAfter - memoryBefore;
                                        djstest.pass("Memory: " + memory + " bytes (Network: " + response.headers["Content-Length"] + " bytes)");
                                        djstest.done();
                                    });
                                }
                            }, unexpectedErrorHandler, undefined, undefined, metadata);
                        }
                    });
                };

                OData.defaultHttpClient = timedHttpClient;
                djstest.assertsExpected(1);

                if (params.metadata) {
                    odatajs.oData.read(params.service + "$metadata", measurePost, unexpectedErrorHandler, OData.metadataHandler);
                } else {
                    measurePost();
                }
            }, "Memory to POST (x10 parallel) " + params.uri + " with " + params.mimeType, params);

            djstest.addTest(function postSerialMemoryTest(params) {
                var total = 10;
                var count = 0;
                var measurePost = function (metadata) {
                    Instrument.getBrowserMemorySize(function (memoryBefore) {
                        var makeRequest = function () {
                            odatajs.oData.request(params.request, function (_, response) {
                                count++;
                                if (count < total) {
                                    setTimeout(makeRequest, 0);
                                } else {
                                    Instrument.getBrowserMemorySize(function (memoryAfter) {
                                        var memory = memoryAfter - memoryBefore;
                                        djstest.pass("Memory: " + memory + " bytes (Network: " + response.headers["Content-Length"] + " bytes)");
                                        djstest.done();
                                    });
                                }
                            }, unexpectedErrorHandler, undefined, undefined, metadata);
                        };

                        makeRequest();
                    });
                };

                OData.defaultHttpClient = timedHttpClient;
                djstest.assertsExpected(1);

                if (params.metadata) {
                    odatajs.oData.read(params.service + "$metadata", measurePost, unexpectedErrorHandler, OData.metadataHandler);
                } else {
                    measurePost();
                }
            }, "Memory to POST (x10 serial) " + params.uri + " with " + params.mimeType, params);
        }
    });
})(this);