| <!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> |