'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'); }