blob: f2700efd76baf1ebb6b894424e17357f7a2794af [file] [log] [blame]
<!doctype html>
<html>
<script src = "/resources/testharness.js"></script>
<script src = "/resources/testharnessreport.js"></script>
<script>
'use strict';
// The old quota-based flow control system would never fragment messages less
// than 64KB as long as there was sufficient time between messages to refresh
// quota. Some servers may have come to rely on this behaviour. The new
// datapipe-based flow control system has code to emulate the behaviour.
// This test verifies that small messages are reassembled correctly.
// This behaviour is Chromium-specific.
// TODO(ricea): If we decide this behaviour is not needed we should remove
// this test. See https://crbug.com/1086273.
// Prime number under 65536. Messages of 65536 bytes or less should not be
// fragmented. Prime so that it is extremely unlikely to fit exactly into
// any data pipe size that might be used.
const MESSAGE_SIZE = 65521;
// 32 * 65521 = 2096672 is probably larger than any data pipe that would be
// used. We can't go much bigger without making the test too slow.
const NUMBER_OF_MESSAGES = 32;
async_test(t => {
const ws = new WebSocket('ws://127.0.0.1:8880/expect-unfragmented');
let finished = false;
let sent_messages = 0;
const message = new ArrayBuffer(MESSAGE_SIZE);
ws.onopen = () => {
// We wait for acknowledgement of each message before sending the next one.
// This ensures that the quota would have been updated with the old
// quota-based flow control.
ws.send(message);
sent_messages = 1;
};
ws.onerror = t.unreached_func('onerror should not be fired');
ws.onmessage = t.step_func(evt => {
if (sent_messages < NUMBER_OF_MESSAGES) {
assert_equals(evt.data,
`OK: message ${sent_messages - 1} not fragmented`);
ws.send(message);
++sent_messages;
return;
}
assert_equals(evt.data, 'OK: message 31 not fragmented');
finished = true;
});
ws.onclose = t.step_func_done(() => {
assert_true(finished, 'Test must finish');
});
}, 'Small messages should not be fragmented');
</script>
</html>