diff options
Diffstat (limited to 'testing/web-platform/tests/beacon/beacon-common.sub.js')
-rw-r--r-- | testing/web-platform/tests/beacon/beacon-common.sub.js | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/testing/web-platform/tests/beacon/beacon-common.sub.js b/testing/web-platform/tests/beacon/beacon-common.sub.js new file mode 100644 index 0000000000..4699495460 --- /dev/null +++ b/testing/web-platform/tests/beacon/beacon-common.sub.js @@ -0,0 +1,111 @@ +'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'); +} |