<!doctype html><!-- webkit-test-runner [ IPCTestingAPIEnabled=true ] -->
<title>Test that sending messages immediately after creating a new connection works.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<body>
<script>
const defaultTimeout = 1000;

promise_test(async t => {
    if (!window.IPC)
        return;
    const testerID = 447;
    for (const processTarget of IPC.processTargets) {
        // Test starts here.
        const [connection, clientConnectionIdentifier] = IPC.createConnectionPair();
        connection.open();
        const msgs = [];
        const numMessages = 10000;
        for (let v = 0; v < numMessages; v++)
            msgs.push([{ type: 'uint32_t', value: v + 1}]);
        let msgName = IPC.messages.IPCConnectionTester_AsyncMessage.name;

        IPC.sendMessage(processTarget, 0, IPC.messages.IPCTester_CreateConnectionTester.name, [
            { type: 'uint64_t', value: testerID },
            { type: 'Attachment', value: clientConnectionIdentifier },
        ]);
        try {
            for (let msg of msgs)
                connection.sendMessage(0, msgName, msg);
            const reply = connection.sendSyncMessage(0, IPC.messages.IPCConnectionTester_SyncMessage.name, defaultTimeout, [{ type: 'uint32_t', value: 55 }]);
            const firstResult = reply.arguments[0];
            assert_equals(firstResult.type, "uint32_t", `for ${ processTarget }`);
            assert_equals(firstResult.value, 55 + numMessages, `for ${ processTarget }`);
        } finally {
            connection.invalidate();
            IPC.sendSyncMessage(processTarget, 0, IPC.messages.IPCTester_ReleaseConnectionTester.name, defaultTimeout, [{ type: 'uint64_t', value: testerID }]);
        }
    }
}, "Sending async messages from the server immediately after opening a new connection works.");

promise_test(async t => {
    if (!window.IPC)
        return;
    const testerID = 448;
    for (const processTarget of IPC.processTargets) {
        // Test starts here.
        const connectionCount = 5; // FIXME: should be 100, but waiting for messages is slow.
        for (let i = 0; i < connectionCount; ++i) {
            const [connection, clientConnectionIdentifier] = IPC.createConnectionPair();
            connection.open();
            const messageCount = 3; // FIXME: should be 10000, but waiting for messages is slow.
            IPC.sendMessage(processTarget, 0, IPC.messages.IPCTester_CreateConnectionTesterAndSendAsyncMessages.name, [
                { type: 'uint64_t', value: testerID },
                { type: 'Attachment', value: clientConnectionIdentifier },
                { type: 'uint32_t', value: messageCount },
            ]);
            try {
                for (let v = 0; v < messageCount; v++) {
                    const msg = connection.waitForMessage(0, IPC.messages.IPCConnectionTester_AsyncMessage.name, defaultTimeout);
                    assert_equals(msg[0].type, "uint32_t", `for ${ processTarget }`);
                    assert_equals(msg[0].value, v, `for ${ processTarget }`);

                }
            } finally {
                connection.invalidate();
                IPC.sendSyncMessage(processTarget, 0, IPC.messages.IPCTester_ReleaseConnectionTester.name, defaultTimeout, [{ type: 'uint64_t', value: testerID }]);
            }
        }
    }
}, "Sending async messages from the client immediately after opening the connection works.");
</script>
</body>