| // META: script=../../constants.sub.js |
| // META: script=resources/url-constants.js |
| // META: global=window,worker |
| // META: timeout=long |
| // META: variant=?wss |
| // META: variant=?wpt_flags=h2 |
| |
| // Allow for this much timer jitter. |
| const JITTER_ALLOWANCE_MS = 200; |
| const LARGE_MESSAGE_COUNT = 16; |
| |
| // This test works by using a server WebSocket handler which sends a large |
| // message, and then sends a second message with the time it measured the first |
| // message taking. On the browser side, we wait 2 seconds before reading from |
| // the socket. This should ensure it takes at least 2 seconds to finish sending |
| // the large message. |
| promise_test(async t => { |
| const wss = new WebSocketStream(`${BASEURL}/send-backpressure`); |
| const { readable } = await wss.connection; |
| const reader = readable.getReader(); |
| |
| // Create backpressure for 2 seconds. |
| await new Promise(resolve => t.step_timeout(resolve, 2000)); |
| |
| // Skip the empty message used to fill the readable queue. |
| await reader.read(); |
| |
| // Skip the large messages. |
| for (let i = 0; i < LARGE_MESSAGE_COUNT; ++i) { |
| await reader.read(); |
| } |
| |
| // Read the time it took. |
| const { value, done } = await reader.read(); |
| |
| // A browser can pass this test simply by being slow. This may be a source of |
| // flakiness for browsers that do not implement backpressure properly. |
| assert_greater_than_equal(Number(value), 2 - JITTER_ALLOWANCE_MS / 1000, |
| 'data send should have taken at least 2 seconds'); |
| }, 'backpressure should be applied to received messages'); |