<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>
function test()
{
    let suite = ProtocolTest.createAsyncSuite("Memory.Tracking");

    suite.addTestCase({
        name: "Memory.Tracking.StartAndStopTrackingWithEvent",
        test(resolve, reject) {
            InspectorProtocol.awaitEvent({event: "Memory.trackingStart"}).then((messageObject) => {
                ProtocolTest.log("Memory.trackingStart");
                ProtocolTest.expectThat(typeof messageObject.params.timestamp === "number", "Should have a timestamp when starting.");
            });

            InspectorProtocol.awaitEvent({event: "Memory.trackingUpdate"}).then((messageObject) => {
                ProtocolTest.log("Memory.trackingUpdate");
                ProtocolTest.expectThat(typeof messageObject.params.event === "object", "Should have an event object.");
                ProtocolTest.expectThat(typeof messageObject.params.event.timestamp === "number", "Event should have a timestamp.");
                ProtocolTest.expectThat(messageObject.params.event.categories.length > 0, "Event should have category data.");

                let categories = messageObject.params.event.categories;
                let totalSize = categories.reduce((sum, x) => sum += x.size, 0);
                let types = categories.reduce((list, x) => { list.push(x.type); return list; }, []).sort();
                ProtocolTest.expectThat(totalSize >= 0, "Total size should be non-zero.");
                ProtocolTest.log("CATEGORIES: " + types.join(", "));

                InspectorProtocol.sendCommand("Memory.stopTracking", {});
            });

            InspectorProtocol.awaitEvent({event: "Memory.trackingComplete"}).then((messageObject) => {
                ProtocolTest.log("Memory.trackingComplete");
                resolve();
            });

            InspectorProtocol.sendCommand("Memory.startTracking", {});
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests that Memory.startTracking and Memory.stopTracking trigger trackingStart, trackingUpdate, and trackingComplete events with expected data.</p>
</body>
</html>
