<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="../resources/testharness.js"></script>
        <script src="../resources/testharnessreport.js"></script>
    </head>
    <body>
        <script>

async function getEncryptedData(transform)
{
    const chunk = await transform.readable.getReader().read();
    const value = new Uint8Array(chunk.value);
    return [...value];
}

promise_test(async (test) => {
    const key = await crypto.subtle.importKey("raw", new Uint8Array([143, 77, 43, 10, 72, 19, 37, 67, 236, 219, 24, 93, 26, 165, 91, 178]), "HKDF", false, ["deriveBits", "deriveKey"]);
    const transform1 = new SFrameTransform;
    const transform2 = new SFrameTransform;
    const transform3 = new SFrameTransform;

    await transform1.setEncryptionKey(key);
    await transform2.setEncryptionKey(key);
    await transform3.setEncryptionKey(key);

    const buffer1 = new ArrayBuffer(10);
    const buffer2 = new ArrayBuffer(11);
    const view1 = new Uint8Array(buffer1);
    const view2 = new Uint8Array(buffer2, 1);
    for (let i = 0 ; i < buffer1.byteLength; ++i) {
        view1[i] = i;
        view2[i] = i;
    }

    transform1.writable.getWriter().write(buffer1);
    transform2.writable.getWriter().write(view1);
    transform3.writable.getWriter().write(view2);

    const result1 = await getEncryptedData(transform1);
    const result2 = await getEncryptedData(transform2);
    const result3 = await getEncryptedData(transform3);

    assert_array_equals(result1, result2, "result2");
    assert_array_equals(result1, result3, "result3");
}, "Uint8Array as input to SFrameTransform");
        </script>
    </body>
</html>
