diff --git a/.dprint.json b/.dprint.json index b8af9469f4..07124d6625 100644 --- a/.dprint.json +++ b/.dprint.json @@ -13,7 +13,9 @@ "associations": "**/*.rs", "rustfmt": "rustfmt --config imports_granularity=item" }, - "includes": ["**/*.{ts,tsx,js,jsx,json,md,toml,rs}"], + "includes": [ + "**/*.{ts,tsx,js,jsx,json,md,toml,rs}" + ], "excludes": [ ".cargo_home", ".git", @@ -48,7 +50,8 @@ "tools/node_compat/TODO.md", "tools/node_compat/versions", "tools/wpt/expectation.json", - "tools/wpt/manifest.json" + "tools/wpt/manifest.json", + "ext/websocket/autobahn/reports" ], "plugins": [ "https://plugins.dprint.dev/typescript-0.84.2.wasm", diff --git a/.github/workflows/ci.generate.ts b/.github/workflows/ci.generate.ts index ea9f93bc1c..b5fa91afb6 100755 --- a/.github/workflows/ci.generate.ts +++ b/.github/workflows/ci.generate.ts @@ -642,6 +642,15 @@ const ci = { run: 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/', }, + { + name: "Autobahn testsuite", + if: [ + "matrix.job == 'test' && matrix.profile == 'release' &&", + "!startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'ubuntu')", + ].join("\n"), + run: + "target/release/deno run -A --unstable ext/websocket/autobahn/fuzzingclient.js", + }, { name: "Test debug", if: [ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 205e5c069f..9f2c788c25 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -399,6 +399,11 @@ jobs: env: CLOUDSDK_PYTHON: '${{env.pythonLocation}}\python.exe' run: 'gsutil -h "Cache-Control: public, max-age=3600" cp ./target/release/*.zip gs://dl.deno.land/canary/$(git rev-parse HEAD)/' + - name: Autobahn testsuite + if: |- + !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'test' && matrix.profile == 'release' && + !startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'ubuntu')) + run: target/release/deno run -A --unstable ext/websocket/autobahn/fuzzingclient.js - name: Test debug if: |- !(github.event_name == 'pull_request' && matrix.skip_pr) && (matrix.job == 'test' && matrix.profile == 'debug' && diff --git a/.gitignore b/.gitignore index 6f806b1433..a8738ea41d 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ gclient_config.py_entries # WPT generated cert files /tools/wpt/certs/index.txt* /tools/wpt/certs/serial* + +/ext/websocket/autobahn/reports diff --git a/ext/websocket/autobahn/autobahn_server.js b/ext/websocket/autobahn/autobahn_server.js new file mode 100644 index 0000000000..b5f399a5b6 --- /dev/null +++ b/ext/websocket/autobahn/autobahn_server.js @@ -0,0 +1,20 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +import { parse } from "../../../test_util/std/flags/mod.ts"; + +const { port } = parse(Deno.args, { + number: ["port"], + default: { + port: 6969, + }, +}); + +const { serve } = Deno; + +// A message-based WebSocket echo server. +serve({ port }, (request) => { + const { socket, response } = Deno.upgradeWebSocket(request); + socket.onmessage = (event) => { + socket.send(event.data); + }; + return response; +}); diff --git a/ext/websocket/autobahn/fuzzingclient.js b/ext/websocket/autobahn/fuzzingclient.js new file mode 100644 index 0000000000..8aa7166958 --- /dev/null +++ b/ext/websocket/autobahn/fuzzingclient.js @@ -0,0 +1,33 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +// deno-lint-ignore-file + +import { $ } from "https://deno.land/x/dax@0.31.0/mod.ts"; + +const pwd = new URL(".", import.meta.url).pathname; + +const AUTOBAHN_TESTSUITE_DOCKER = + "crossbario/autobahn-testsuite:0.8.2@sha256:5d4ba3aa7d6ab2fdbf6606f3f4ecbe4b66f205ce1cbc176d6cdf650157e52242"; + +const self = Deno.execPath(); +$`${self} run -A --unstable ${pwd}/autobahn_server.js`.spawn(); +await $`docker run --name fuzzingserver -v ${pwd}/fuzzingclient.json:/fuzzingclient.json:ro -v ${pwd}/reports:/reports -p 9001:9001 --net=host --rm ${AUTOBAHN_TESTSUITE_DOCKER} wstest -m fuzzingclient -s fuzzingclient.json` + .cwd(pwd); + +const { deno_websocket } = JSON.parse( + Deno.readTextFileSync(`${pwd}/reports/servers/index.json`), +); +const result = Object.values(deno_websocket); + +function failed(name) { + return name != "OK" && name != "INFORMATIONAL" && name != "NON-STRICT"; +} + +const failedtests = result.filter((outcome) => failed(outcome.behavior)); + +console.log( + `%c${result.length - failedtests.length} / ${result.length} tests OK`, + `color: ${failedtests.length == 0 ? "green" : "red"}`, +); + +Deno.exit(failedtests.length == 0 ? 0 : 1); diff --git a/ext/websocket/autobahn/fuzzingclient.json b/ext/websocket/autobahn/fuzzingclient.json new file mode 100644 index 0000000000..fcee80c993 --- /dev/null +++ b/ext/websocket/autobahn/fuzzingclient.json @@ -0,0 +1,26 @@ +{ + "outdir": "./reports/servers", + "servers": [ + { + "agent": "deno_websocket", + "url": "ws://localhost:6969" + } + ], + "cases": [ + "1.*", + "2.*", + "3.*", + "4.*", + "5.*", + "6.*", + "7.*", + "9.*", + "10.*" + ], + "exclude-cases": [ + "11.*", + "12.*", + "13.*" + ], + "exclude-agent-cases": {} +}