blob: 0c56007d42116421186911e948bfa35c0418502b [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/common.js"></script>
<script src="resources/manual.js"></script>
</head>
<body>
<p>
These tests require a connected serial device configured to act as a
"loopback" device, with the transmit and receive pins wired together.
</p>
<script>
manual_loopback_serial_test(async (t, port) => {
await port.open({baudRate: 115200, bufferSize: 1024});
// Create something much smaller than bufferSize above.
const data = new Uint8Array(64);
for (let i = 0; i < data.byteLength; ++i)
data[i] = i & 0xff;
const reader = port.readable.getReader();
for (let i = 0; i < 10; ++i) {
const writer = port.writable.getWriter();
writer.write(data);
const writePromise = writer.close();
const value = await readWithLength(reader, data.byteLength);
await writePromise;
compareArrays(value, data);
}
reader.releaseLock();
await port.close();
}, 'Can perform a series of small writes.');
manual_loopback_serial_test(async (t, port) => {
await port.open({baudRate: 115200, bufferSize: 1024});
// Create something much larger than bufferSize above.
const data = new Uint8Array(10 * 1024);
for (let i = 0; i < data.byteLength; ++i)
data[i] = (i / 1024) & 0xff;
const reader = port.readable.getReader();
for (let i = 0; i < 10; ++i) {
const writer = port.writable.getWriter();
writer.write(data);
const writePromise = writer.close();
const value = await readWithLength(reader, data.byteLength);
await writePromise;
compareArrays(value, data);
}
reader.releaseLock();
await port.close();
}, 'Can perform a series of large writes.');
manual_loopback_serial_test(async (t, port) => {
await port.open({baudRate: 115200, bufferSize: 64});
const writer = port.writable.getWriter();
// |data| is small enough to be completely transmitted.
let data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
await writer.write(data);
// Wait a little bit for the device to process the incoming data.
await new Promise((resolve) => setTimeout(resolve, 100));
// ...before discarding the receive buffers.
await port.readable.cancel();
data = new Uint8Array([9, 10, 11, 12, 13, 14, 15, 16]);
const reader = port.readable.getReader();
const readPromise = readWithLength(reader, data.byteLength);
// The next block of data should be received successfully.
await writer.write(data);
writer.releaseLock();
const value = await readPromise;
reader.releaseLock();
compareArrays(value, data);
await port.close();
}, 'Canceling the reader discards buffered data.');
manual_loopback_serial_test(async (t, port) => {
await port.open({baudRate: 115200, bufferSize: 1024});
// Create something much larger than bufferSize above.
const data = new Uint8Array(16 * 1024);
for (let i = 0; i < data.byteLength; ++i)
data[i] = (i / 1024) & 0xff;
// Completely write |data| to the port without waiting for it to be
// received.
const writer = port.writable.getWriter();
writer.write(data);
await writer.close();
const reader = port.readable.getReader();
const chunks = [];
let actualLength = 0;
while (true) {
try {
const {value, done} = await reader.read();
if (value) {
actualLength += value.byteLength;
chunks.push(value);
}
if (done) {
assert_unreached("Unexpected end of stream.");
break;
}
} catch (e) {
assert_equals(e.name, 'BufferOverrunError');
break;
}
}
reader.releaseLock();
const buffer = new Uint8Array(actualLength);
chunks.reduce((offset, chunk) => {
buffer.set(chunk, offset);
return offset + chunk.byteLength;
}, 0);
assert_greater_than(actualLength, 0);
compareArrays(buffer, data.slice(0, actualLength));
await port.close();
}, 'Overflowing the receive buffer triggers an error.');
manual_loopback_serial_test(async (t, port) => {
await port.open({baudRate: 115200, bufferSize: 1024});
let reader = port.readable.getReader();
let readPromise = (async () => {
// A single zero byte will be read before the break is detected.
const {value, done} = await reader.read();
compareArrays(value, new Uint8Array([0]));
assert_false(done);
try {
const {value, done} = await reader.read();
assert_unreached(`Expected break, got ${value.byteLength} bytes`);
} catch (e) {
assert_equals(e.constructor, DOMException);
assert_equals(e.name, 'BreakError');
}
})();
await port.setSignals({brk: true});
await readPromise;
await port.setSignals({brk: false});
const writer = port.writable.getWriter();
// |data| is small enough to be completely transmitted.
let data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
await writer.write(data);
writer.releaseLock();
reader = port.readable.getReader();
const buffer = await readWithLength(reader, data.byteLength);;
compareArrays(buffer, data);
reader.releaseLock();
await port.close();
}, 'Break is detected.');
</script>
</body>
</html>