summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/beacon/beacon-common.sub.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/beacon/beacon-common.sub.js')
-rw-r--r--testing/web-platform/tests/beacon/beacon-common.sub.js111
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');
+}