111 lines
2.7 KiB
JavaScript
111 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
const EMPTY = 'empty';
|
|
const SMALL = 'small';
|
|
const LARGE = 'large';
|
|
const MAX = 'max';
|
|
const TOOLARGE = 'toolarge';
|
|
|
|
const STRING = 'string';
|
|
const ARRAYBUFFER = 'arraybuffer';
|
|
const FORM = 'form';
|
|
const BLOB = 'blob';
|
|
|
|
function getContentType(type) {
|
|
switch (type) {
|
|
case STRING:
|
|
return 'text/plain;charset=UTF-8';
|
|
case ARRAYBUFFER:
|
|
return null;
|
|
case FORM:
|
|
return 'multipart/form-data';
|
|
case BLOB:
|
|
return null;
|
|
default:
|
|
throw Error(`invalid type: ${type}`);
|
|
}
|
|
}
|
|
|
|
// Create a payload with the given size and type.
|
|
// `sizeString` must be one of EMPTY, SMALL, LARGE, MAX, TOOLARGE.
|
|
// `type` must be one of STRING, ARRAYBUFFER, FORM, BLOB.
|
|
// `contentType` is effective only if `type` is BLOB.
|
|
function makePayload(sizeString, type, contentType) {
|
|
let size = 0;
|
|
switch (sizeString) {
|
|
case EMPTY:
|
|
size = 0;
|
|
break;
|
|
case SMALL:
|
|
size = 10;
|
|
break;
|
|
case LARGE:
|
|
size = 10 * 1000;
|
|
break;
|
|
case MAX:
|
|
if (type === FORM) {
|
|
throw Error('Not supported');
|
|
}
|
|
size = 65536;
|
|
break;
|
|
case TOOLARGE:
|
|
size = 65537;
|
|
break;
|
|
default:
|
|
throw Error('invalid size');
|
|
}
|
|
|
|
let data = '';
|
|
if (size > 0) {
|
|
const prefix = String(size) + ':';
|
|
data = prefix + Array(size - prefix.length).fill('*').join('');
|
|
}
|
|
|
|
switch (type) {
|
|
case STRING:
|
|
return data;
|
|
case ARRAYBUFFER:
|
|
return new TextEncoder().encode(data).buffer;
|
|
case FORM:
|
|
const formData = new FormData();
|
|
if (size > 0) {
|
|
formData.append('payload', data);
|
|
}
|
|
return formData;
|
|
case BLOB:
|
|
const options = contentType ? {type: contentType} : undefined;
|
|
const blob = new Blob([data], options);
|
|
return blob;
|
|
default:
|
|
throw Error('invalid type');
|
|
}
|
|
}
|
|
|
|
function parallelPromiseTest(func, description) {
|
|
async_test((t) => {
|
|
Promise.resolve(func(t)).then(() => t.done()).catch(t.step_func((e) => {
|
|
throw e;
|
|
}));
|
|
}, description);
|
|
}
|
|
|
|
// Poll the server for the test result.
|
|
async function waitForResult(id, expectedError = null) {
|
|
const url = `/beacon/resources/beacon.py?cmd=stat&id=${id}`;
|
|
for (let i = 0; i < 30; ++i) {
|
|
const response = await fetch(url);
|
|
const text = await response.text();
|
|
const results = JSON.parse(text);
|
|
|
|
if (results.length === 0) {
|
|
await new Promise(resolve => step_timeout(resolve, 100));
|
|
continue;
|
|
}
|
|
assert_equals(results.length, 1, `bad response: '${text}'`);
|
|
const result = results[0];
|
|
// null JSON values parse as null, not undefined
|
|
assert_equals(result.error, expectedError, 'error recorded in stash');
|
|
return result;
|
|
}
|
|
assert_true(false, 'timeout');
|
|
}
|