107 lines
2.9 KiB
HTML
107 lines
2.9 KiB
HTML
<!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 device configured with the following Arduino sketch:
|
|
|
|
<pre>
|
|
uint32_t seed = 0;
|
|
uint32_t bytesToSend = 0;
|
|
|
|
uint8_t nextByte() {
|
|
seed = (1103515245 * seed + 12345) % 0x8000000;
|
|
return (seed >> 16) & 0xFF;
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
}
|
|
|
|
void loop() {
|
|
if (!Serial) {
|
|
return;
|
|
}
|
|
|
|
if (bytesToSend == 0) {
|
|
// Read the seed and number of bytes to send from the host as 32-bit
|
|
// little-endian values.
|
|
if (Serial.available() < 8) {
|
|
return;
|
|
}
|
|
|
|
uint8_t buf[8];
|
|
Serial.readBytes((char*)buf, sizeof buf);
|
|
seed = (uint32_t)buf[0] |
|
|
((uint32_t)buf[1] << 8) |
|
|
((uint32_t)buf[2] << 16) |
|
|
((uint32_t)buf[3] << 24);
|
|
bytesToSend = (uint32_t)buf[4] |
|
|
((uint32_t)buf[5] << 8) |
|
|
((uint32_t)buf[6] << 16) |
|
|
((uint32_t)buf[7] << 24);
|
|
} else {
|
|
uint8_t buf[64];
|
|
uint32_t count = min(sizeof buf, bytesToSend);
|
|
for (uint32_t i = 0; i < count; ++i) {
|
|
buf[i] = nextByte();
|
|
}
|
|
bytesToSend -= count;
|
|
Serial.write((char*)buf, count);
|
|
}
|
|
}
|
|
</pre>
|
|
</p>
|
|
<p>
|
|
<progress id='progress'></progress>
|
|
</p>
|
|
<script>
|
|
let seed = 10;
|
|
const length = 1024 * 1024 * 10;
|
|
|
|
function next_byte() {
|
|
seed = (Math.imul(1103515245, seed) + 12345) % (1 << 31);
|
|
return (seed >> 16) & 0xFF;
|
|
}
|
|
|
|
manual_serial_test(async (t, port) => {
|
|
await port.open({baudRate: 115200, bufferSize: 1024});
|
|
|
|
const config = new DataView(new ArrayBuffer(8));
|
|
config.setUint32(0, seed, /*littleEndian=*/true);
|
|
config.setUint32(4, length, /*littleEndian=*/true);
|
|
|
|
const writer = port.writable.getWriter();
|
|
writer.write(config);
|
|
|
|
const progress = document.getElementById('progress');
|
|
progress.max = length;
|
|
progress.value = 0;
|
|
|
|
const reader = port.readable.getReader();
|
|
let bytesRead = 0;
|
|
while (bytesRead < length) {
|
|
const { value, done } = await reader.read();
|
|
assert_false(done);
|
|
for (let i = 0; i < value.byteLength; ++i) {
|
|
assert_equals(value[i], next_byte(),
|
|
`mismatch at byte ${bytesRead + i}`);
|
|
}
|
|
bytesRead += value.byteLength;
|
|
progress.value = bytesRead;
|
|
}
|
|
|
|
writer.releaseLock();
|
|
reader.releaseLock();
|
|
await port.close();
|
|
}, `Reading ${length} bytes from the device succeeds.`);
|
|
</script>
|
|
</body>
|
|
</html>
|