<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/timeline-test.js"></script>
<script>

function test()
{
    function runTestWithDataAndCheck(input, expectedOutput)
    {
        WebInspector.showPanel("timeline");
        var model = new WebInspector.TimelineModel();

        function createFileReader(file, delegate)
        {
            return new InspectorTest.FakeFileReader(input, delegate, model.saveToFile.bind(model));
        }

        function createFileWriter(fileName, callback)
        {
            callback(new InspectorTest.StringOutputStream(checkSaveData));
        }

        function checkSaveData(output)
        {
            var saveData = JSON.parse(output);
            saveData.shift(); // strip version info
            expectedOutput.shift();
            InspectorTest.assertEquals(JSON.stringify(expectedOutput), JSON.stringify(saveData), "saved data is not equal to restored");
            InspectorTest.addResult("passed");
        }

        InspectorTest.override(model, "_createFileReader", createFileReader);
        InspectorTest.override(model, "_createFileWriter", createFileWriter);

        model.loadFromFile({}, new WebInspector.Progress());
    }

    InspectorTest.runTestSuite([
        function testNormal(next)
        {
            var data = ["Version",
                {"startTime":1310749854316.8408,"data":{"requestId":43,"url":"http://www.webkit.org/","requestMethod":"GET"},"type":"ResourceSendRequest","usedHeapSize":1819936,"totalHeapSize":7629120},
                {"startTime":1310749855118.9329,"data":{"requestId":43,"statusCode":200,"mimeType":"text/html"},"children":[],"endTime":1310749855118.968,"type":"ResourceReceiveResponse","usedHeapSize":1819936,"totalHeapSize":7629120},
                {"startTime":1310749855136.245,"data":{"requestId":44,"url":"http://www.webkit.org/css/main.css","requestMethod":"GET"},"type":"ResourceSendRequest","usedHeapSize":2367192,"totalHeapSize":7629120},
                {"startTime":1310749855136.655,"data":{"requestId":45,"url":"http://www.webkit.org/css/green.css","requestMethod":"GET"},"type":"ResourceSendRequest","usedHeapSize":2367192,"totalHeapSize":7629120},
                {"startTime":1310749855137.023,"data":{"requestId":46,"url":"http://www.webkit.org/css/blue.css","requestMethod":"GET"},"type":"ResourceSendRequest","usedHeapSize":2367192,"totalHeapSize":7629120},
                {"startTime":1310749855137.342,"data":{"requestId":47,"url":"http://www.webkit.org/css/yellow.css","requestMethod":"GET"},"type":"ResourceSendRequest","usedHeapSize":2367192,"totalHeapSize":7629120},
                {"startTime":1310749855137.656,"data":{"requestId":48,"url":"http://www.webkit.org/css/pink.css","requestMethod":"GET"},"type":"ResourceSendRequest","usedHeapSize":2367192,"totalHeapSize":7629120},
                {"startTime":1310749855137.989,"data":{"requestId":49,"url":"http://www.webkit.org/css/purple.css","requestMethod":"GET"},"type":"ResourceSendRequest","usedHeapSize":2367192,"totalHeapSize":7629120},
                {"startTime":1310749855138.308,"data":{"requestId":50,"url":"http://www.webkit.org/css/gray.css","requestMethod":"GET"},"type":"ResourceSendRequest","usedHeapSize":2367192,"totalHeapSize":7629120}
            ];
            var input = JSON.stringify(data);
            runTestWithDataAndCheck(input, data);
            next();
        },

        function testIncompatible(next)
        {
            var data = ["Version",
                {"startTime":1310749854316.8408,"data":{"requestId":43,"url":"http://www.webkit.org/","requestMethod":"GET"},"type":"UnknownRecordType","u\"s}e}dHeapSize\\":1819936,"totalHeapSize":7629120}
            ];
            var input = JSON.stringify(data);
            runTestWithDataAndCheck(input, data);
            next();
        },

        function testMalformed(next)
        {
            var data = ["Version"];
            // At least 1 record is parsed in first chunk.
            var input = '["Version",'
                +'{"startTime":1310749854316.8408,"data":{"requestId":43},"type":"UnknownRecordType"},'
                +'{"startTime":1310749854316.8508,"data":{"requestId":43},"type":"UnknownRecordType"},'
                +'{"startTime":1310749854316.8608,"data":{"requestId":43},"type":"UnknownRecordType"},'
                +'{"startTime":1310749854316.8708,"data":{"requestId":43_MALFORMED_JSON_},"type":"UnknownRecordType"}]';
            runTestWithDataAndCheck(input, data);
            next();
        }
    ]);
}

</script>
</head>

<body onload="runTest()">
<p>
Tests the Timeline save/load functionality.
</p>

<p>
Also tests save/load of unknown (incompatible) record types. <a href="https://bugs.webkit.org/show_bug.cgi?id=91714">(Bug 91714)</a>
</p>

</body>
</html>
