<!doctype html><!-- webkit-test-runner [ IPCTestingAPIEnabled=true ] -->
<title>Test that async messages can be sent and replies received</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<body>
<script>
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
async function runTest() {
    const defaultTimeout = 1000;
    const testerID = 0;
    const IPCTester_AsyncPingName = IPC.messages.IPCTester_AsyncPing.name;
    const IPCTester_AsyncPingReplyName = IPC.messages.IPCTester_AsyncPingReply.name;

    for (const processTarget of IPC.processTargets) {
        // Test starts here.
        let results = { };
        let asyncReplyIDs = { };
        const requestCount = 100;
        let connection = IPC.connectionForProcessTarget(processTarget);
        for (let request = 0; request < requestCount; ++request) {
            asyncReplyIDs[request] = connection.sendWithAsyncReply(testerID, IPCTester_AsyncPingName, [{type: 'int32_t', value: request}], (message) => {
                results[request] = message;
            });
            assert_greater_than(asyncReplyIDs[request], 0, "asyncReplyID is valid");
            if (request == 17)
                await sleep(100); // Let some requests be fullfilled asynchronously and some are force-waited.
        }
        for (let request = 0; request < requestCount; ++request) {
            if (typeof results[request] === "undefined")
                connection.waitForAsyncReplyAndDispatchImmediately(asyncReplyIDs[request], IPCTester_AsyncPingReplyName, defaultTimeout);
        }
        for (let request = 0; request < requestCount; ++request) {
            const subcase = `${processTarget} request:${request}`
            const result = results[request];
            assert_equals(typeof result, "object", subcase);
            const firstReply = result.arguments[0];
            assert_equals(firstReply.type, "uint32_t", subcase);
            assert_equals(firstReply.value, request + 1, subcase);
        }
    }
    done();
}

setup({ single_test: true });
if (window.IPC)
    runTest();
else
    done();

</script>
</body>
