<html>
<head>
<script src="../inspector-test.js"></script>
<script src="../network-test.js"></script>
<script>

function test()
{
    function lastRequest()
    {
        return InspectorTest.networkRequests().pop();
    }

    function dumpRequest(request)
    {
        InspectorTest.addResult("Dumping request: ");
        InspectorTest.addResult("    url: " + request.url());
        if (request.requestFormData)
            InspectorTest.addResult("    requestFormData: " + request.requestFormData);
        InspectorTest.addResult("    requestMethod: " + request.requestMethod);
        InspectorTest.addResult("    test request header value: " + request.requestHeaderValue("headerName"));
    }

    function assertRequestEqual(request1, request2)
    {
        InspectorTest.assertEquals(request1.url(), request2.url(), "Requests have different url");
        InspectorTest.assertEquals(request1.requestFormData, request2.requestFormData, "Requests have different requestFormData");
        InspectorTest.assertEquals(request1.requestMethod, request2.requestMethod, "Requests have different requestMethod");
        InspectorTest.assertEquals(request1.requestHeadersText, request2.requestHeadersText, "Requests have different requestHeadersText");
    }

    function testXHRReplay(method, url, async, user, password, headers, withCredentials, payload, type, callback)
    {
        InspectorTest.makeXHR(method, url, async, user, password, headers, withCredentials, payload, type, step2);

        var originalRequest;
        function step2()
        {
            originalRequest = lastRequest();
            dumpRequest(originalRequest);
            InspectorTest.NetworkAgent.replayXHR(originalRequest.requestId());
            InspectorTest.addSniffer(Network.NetworkLogView.prototype, "_appendRequest", step3);
        }

        function step3()
        {
            var replayedRequest = lastRequest();
            assertRequestEqual(originalRequest, replayedRequest);
            callback();
        }
    }


    InspectorTest.runTestSuite([
        function testGetStaticAsync(next)
        {
            testXHRReplay("GET", "resources/empty.html", true, null, null, [["headerName", "headerValueA"]], false, undefined, undefined, next);
        },

        function testGetStaticSync(next)
        {
            testXHRReplay("GET", "resources/empty.html", false, null, null, [["headerName", "headerValueB"]], false, undefined, undefined, next);
        },

        function testGetCachedAsync(next)
        {
            testXHRReplay("GET", "resources/random-cached.php", true, null, null, [["headerName", "headerValueC"]], false, undefined, undefined, next);
        },

        function testGetCachedSync(next)
        {
            testXHRReplay("GET", "resources/random-cached.php", false, null, null, [["headerName", "headerValueD"]], false, undefined, undefined, next);
        },

        function testGetRandomAsync(next)
        {
            testXHRReplay("GET", "resources/random.php", true, null, null, [["headerName", "headerValueE"]], false, undefined, undefined, next);
        },

        function testGetRandomSync(next)
        {
            testXHRReplay("GET", "resources/random.php", false, null, null, [["headerName", "headerValueF"]], false, undefined, undefined, next);
        },

        function testPostAsync(next)
        {
            testXHRReplay("POST", "resources/random.php", true, null, null, [["headerName", "headerValueG"]], false, "payload", undefined, next);
        },

        function testPostSync(next)
        {
            testXHRReplay("POST", "resources/random.php", false, null, null, [["headerName", "headerValueH"]], false, "payload", undefined, next);
        }
    ]);
}
</script>
</head>
<body onload="runTest()">
Tests XHR replaying.
<a href="https://bugs.webkit.org/show_bug.cgi?id=95187">Bug 95187</a>
</body>
</html>
