From 2a42bf684492d11f4895666d44cbf43d52518c72 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Wed, 21 Aug 2024 17:00:37 -0700 Subject: [PATCH] POC for basic web platform test integration --- WORKSPACE | 11 ++++++++ build/BUILD.wpt | 13 +++++++++ src/workerd/api/wpt/BUILD.bazel | 17 +++++++++++ src/workerd/api/wpt/bar.txt | 0 src/workerd/api/wpt/url-test.js | 42 ++++++++++++++++++++++++++++ src/workerd/api/wpt/url-test.wd-test | 28 +++++++++++++++++++ 6 files changed, 111 insertions(+) create mode 100644 build/BUILD.wpt create mode 100644 src/workerd/api/wpt/BUILD.bazel create mode 100644 src/workerd/api/wpt/bar.txt create mode 100644 src/workerd/api/wpt/url-test.js create mode 100644 src/workerd/api/wpt/url-test.wd-test diff --git a/WORKSPACE b/WORKSPACE index 358a302fb17..2cf0112506d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -604,3 +604,14 @@ new_local_repository( visibility = ["//visibility:public"],)""", path = "empty", ) + +# ======================================================================================== +# Web Platform Tests + +http_archive( + name = "wpt", + build_file = "//:build/BUILD.wpt", + integrity = "sha256-2l8wKVITBCYMflmq8qAqWvUPcCdDGwN0r+bMe93Mpww=", + strip_prefix = "wpt-merge_pr_47718", + url = "https://github.com/web-platform-tests/wpt/archive/refs/tags/merge_pr_47718.tar.gz", +) diff --git a/build/BUILD.wpt b/build/BUILD.wpt new file mode 100644 index 00000000000..b96b306c972 --- /dev/null +++ b/build/BUILD.wpt @@ -0,0 +1,13 @@ +exports_files([ + "url/url-origin.any.js", +]); + +filegroup( + name = "url", + srcs = glob( + include = ["url/**/*"], + allow_empty = True, + ), + visibility = ["//visibility:public"], +) + diff --git a/src/workerd/api/wpt/BUILD.bazel b/src/workerd/api/wpt/BUILD.bazel new file mode 100644 index 00000000000..afc37db6abc --- /dev/null +++ b/src/workerd/api/wpt/BUILD.bazel @@ -0,0 +1,17 @@ +load("//:build/kj_test.bzl", "kj_test") +load("//:build/wd_cc_library.bzl", "wd_cc_library") +load("//:build/wd_test.bzl", "wd_test") + +[wd_test( + src = f, + args = [ + "--experimental", + ], + data = [ + f.removesuffix(".wd-test") + ".js", + "bar.txt", + "@wpt//:url", + ], +) for f in glob( + ["**/*.wd-test"], +)] diff --git a/src/workerd/api/wpt/bar.txt b/src/workerd/api/wpt/bar.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/workerd/api/wpt/url-test.js b/src/workerd/api/wpt/url-test.js new file mode 100644 index 00000000000..b2268176101 --- /dev/null +++ b/src/workerd/api/wpt/url-test.js @@ -0,0 +1,42 @@ +import { + strictEqual, +} from 'assert'; + +globalThis.fetch = async(url) => { + const { default: data } = await import(url); + return { + async json() { return data; }, + }; +}; + +globalThis.promise_test = (callback) => { + callback(); +}; + +globalThis.assert_equals = (a, b, c) => { + strictEqual(a,b,c); +}; + +globalThis.test = (callback, message) => { + try { + callback(); + } catch (err) { + const aerr = new AggregateError([err], message); + globalThis.errors.push(aerr); + } +} + +globalThis.errors = []; + +export const test = { + async test(_, env) { + const foo = await import('url-origin.any.js'); + + if (globalThis.errors.length > 0) { + for (const err of globalThis.errors) { + console.error(err); + } + throw new Error('Test failed'); + } + } +}; diff --git a/src/workerd/api/wpt/url-test.wd-test b/src/workerd/api/wpt/url-test.wd-test new file mode 100644 index 00000000000..c4918551dce --- /dev/null +++ b/src/workerd/api/wpt/url-test.wd-test @@ -0,0 +1,28 @@ +using Workerd = import "/workerd/workerd.capnp"; + +const unitTests :Workerd.Config = ( + services = [ + ( name = "url-test-test", + worker = ( + modules = [ + (name = "worker", esModule = embed "url-test.js"), + (name = "url-origin.any.js", + esModule = embed "../../../../../wpt/url/url-origin.any.js"), + (name = "resources/urltestdata.json", + json = embed "../../../../../wpt/url/resources/urltestdata.json"), + (name = "resources/urltestdata-javascript-only.json", + json = embed "../../../../../wpt/url/resources/urltestdata-javascript-only.json"), + ], + bindings = [ + (name = "wpt", service = "wpt"), + ], + compatibilityDate = "2024-07-01", + compatibilityFlags = ["nodejs_compat_v2"], + ) + ), + ( + name = "wpt", + disk = ".", + ) + ], +);