<!doctype html><!-- webkit-test-runner [ IPCTestingAPIEnabled=true ] -->
<title>Test that async stream 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 bufferSizeLog2 = 9;
    const streamTesterID = 447;
    const IPCStreamTester_AsyncPingName = IPC.messages.IPCStreamTester_AsyncPing.name;
    const IPCStreamTester_AsyncPingReplyName = IPC.messages.IPCStreamTester_AsyncPingReply.name;

    for (const processTarget of IPC.processTargets) {
        const [streamConnection, serverConnectionHandle] = IPC.createStreamClientConnection(bufferSizeLog2, defaultTimeout);
        streamConnection.open();
        IPC.sendMessage(processTarget, 0, IPC.messages.IPCTester_CreateStreamTester.name, [
            { type: 'uint64_t', value: streamTesterID },
            { type: 'StreamServerConnectionHandle', value: serverConnectionHandle },
        ]);
        const arguments = streamConnection.waitForMessage(streamTesterID, IPC.messages.IPCStreamTesterProxy_WasCreated.name);
        streamConnection.setSemaphores(arguments[0].value, arguments[1].value);
        // Test starts here.
        try {
            let results = { };
            let asyncReplyIDs = { };
            const requestCount = 100;
            for (let request = 0; request < requestCount; ++request) {
                asyncReplyIDs[request] = streamConnection.sendWithAsyncReply(streamTesterID, IPCStreamTester_AsyncPingName, [{type: 'uint32_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")
                    streamConnection.waitForAsyncReplyAndDispatchImmediately(asyncReplyIDs[request], IPCStreamTester_AsyncPingReplyName);
            }
            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);
            }
        } finally {
            IPC.sendSyncMessage(processTarget, 0, IPC.messages.IPCTester_ReleaseStreamTester.name, defaultTimeout, [{ type: 'uint64_t', value: streamTesterID }]);
            streamConnection.invalidate();
        }
    }
    done();
}

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

</script>
</body>
