<!DOCTYPE html><!-- webkit-test-runner [ IPCTestingAPIEnabled=true ] -->
<script>
function arraysAreEqual(a, b) {
    if (a.byteLength !== b.byteLength) return false;
    return a.every((val, i) => val === b[i]);
}

if (window.testRunner)
    testRunner.dumpAsText()

if (window.IPC) {
    let headerReadSuccess = false;
    let headerWriteSuccess = false;
    let dataReadSuccess = false;
    let dataWriteSuccess = false;

    const testBytes = Uint8Array.from({length: 16}, (x, i) => i + 0x41);
    const bufferSize = 48;
    const streamConnection = IPC.createStreamClientConnection('GPU', bufferSize);

    let streamBuffer = streamConnection.streamBuffer();
    let initialData = new Uint8Array(streamBuffer.readHeaderBytes(0, 32));

    streamBuffer.writeHeaderBytes(testBytes, 0, 4);
    streamBuffer.writeHeaderBytes(testBytes.slice(4,8), 4, 4);

    let readResult = new Uint8Array(streamBuffer.readHeaderBytes(0, 32));

    let expected = initialData.slice();
    for(let i=0; i<8; i++){
        expected[i] = testBytes[i];
    }

    if(arraysAreEqual(readResult, expected)){
        headerWriteSuccess = true;
        readResult = new Uint8Array(streamBuffer.readHeaderBytes(4, 28));
        if(arraysAreEqual(readResult, expected.slice(4, 32))){
            headerReadSuccess = true;
        } else {
            document.write("FAIL: Header offset read");
        }   
    } else {
        document.write("FAIL: Header write");
    }

    if(headerWriteSuccess && headerReadSuccess){
        streamBuffer.writeDataBytes(testBytes.slice(0,8), 0, 8);
        streamBuffer.writeDataBytes(testBytes.slice(8,16), 8, 8);
        readResult = new Uint8Array(streamBuffer.readDataBytes(0));

        if(arraysAreEqual(readResult, testBytes)){
            dataWriteSuccess = true;
            readResult = new Uint8Array(streamBuffer.readDataBytes(3));
            if(arraysAreEqual(readResult, testBytes.slice(3))){
                dataReadSuccess = true;
            }  else {
                document.write("FAIL: Data offset read");
            }
        } else {
            document.write("FAIL: Data write");
        }

        if(dataWriteSuccess && dataReadSuccess){
            document.write("PASS");
        }
    }
} else {
    // IPC not enabled so this test passes by default.
    document.write("PASS");    
}
</script>
<p>Test passes if it does not crash and has no 'FAIL' output</p>
</body>
</html>