blob: 828e6ac52e4a87b0424abe048dd6393603202e24 [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/mojo/public/mojom/base/unguessable_token.mojom.js"></script>
<script src="file:///gen/third_party/blink/public/mojom/serial/serial.mojom.js"></script>
<script src="resources/serial-test-utils.js"></script>
<script>
serial_test(async (t, fake) => {
const { port, fakePort } = await getFakeSerialPort(fake);
assert_equals(port.readable, null);
await port.open({ baudrate: 9600 });
const readable = port.readable;
assert_true(readable instanceof ReadableStream);
await port.close();
assert_equals(port.readable, null);
const reader = readable.getReader();
const { value, done } = await reader.read();
assert_true(done);
assert_equals(value, undefined);
}, 'SerialPort.readable is set by open() and closes on port close');
serial_test(async (t, fake) => {
const { port, fakePort } = await getFakeSerialPort(fake);
await port.open({ baudrate: 9600 });
assert_true(port.readable instanceof ReadableStream);
const reader = port.readable.getReader();
await promise_rejects(t, new TypeError(), port.close());
reader.releaseLock();
await port.close();
assert_equals(port.readable, null);
}, 'Port cannot be closed while readable is locked');
serial_test(async (t, fake) => {
const { port, fakePort } = await getFakeSerialPort(fake);
// Select a buffer size larger than the amount of data transferred.
await port.open({ baudrate: 9600, buffersize: 64 });
const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
fakePort.write(data);
const reader = port.readable.getReader();
let { value, done } = await reader.read();
assert_false(done);
compareArrays(data, value);
reader.releaseLock();
await port.close();
}, 'Can read a small amount of data');
serial_test(async (t, fake) => {
const { port, fakePort } = await getFakeSerialPort(fake);
// Select a buffer size smaller than the amount of data transferred.
await port.open({ baudrate: 9600, buffersize: 64 });
const data = new Uint8Array(1024); // Much larger than buffersize above.
for (let i = 0; i < data.byteLength; ++i)
data[i] = i & 0xff;
fakePort.write(data);
const reader = port.readable.getReader();
const value = await readWithLength(reader, data.byteLength);
compareArrays(data, value);
reader.releaseLock();
await port.close();
}, 'Can read a large amount of data');
serial_test(async (t, fake) => {
const { port, fakePort } = await getFakeSerialPort(fake);
// Select a buffer size smaller than the amount of data transferred.
await port.open({ baudrate: 9600, buffersize: 64 });
const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
fakePort.write(data);
fakePort.simulateParityError();
let readable = port.readable;
let reader = readable.getReader();
let { value, done } = await reader.read();
assert_false(done);
compareArrays(data, value);
await promise_rejects(t, new DOMException('', 'ParityError'), reader.read());
assert_not_equals(port.readable, readable);
readable = port.readable;
assert_true(readable instanceof ReadableStream);
reader = port.readable.getReader();
await fakePort.waitForErrorCleared();
fakePort.write(data);
({ value, done } = await reader.read());
assert_false(done);
compareArrays(data, value);
reader.releaseLock();
await port.close();
assert_equals(port.readable, null);
}, 'Parity error closes readable and replaces it with a new stream');
serial_test(async (t, fake) => {
const { port, fakePort } = await getFakeSerialPort(fake);
// Select a buffer size larger than the amount of data transferred.
await port.open({ baudrate: 9600, buffersize: 64 });
fakePort.write(new TextEncoder().encode("Hello world!"));
const reader = port.readable.pipeThrough(new TextDecoderStream()).getReader();
let { value, done } = await reader.read();
assert_false(done);
assert_equals("Hello world!", value);
await reader.cancel();
await port.close();
}, 'Can pipe readable through a transform stream.')
serial_test(async (t, fake) => {
const { port, fakePort } = await getFakeSerialPort(fake);
// Select a buffer size smaller than the amount of data transferred.
await port.open({ baudrate: 9600, buffersize: 64 });
const reader = port.readable.getReader();
const readPromise = reader.read();
await reader.cancel();
let { value, done } = await readPromise;
assert_true(done);
assert_equals(undefined, value);
await port.close();
}, 'Can cancel while reading');
</script>