From 33b65e204a33485860e6be2b0261d5f34044344c Mon Sep 17 00:00:00 2001 From: Chris Cuellar <58723+ChrisC@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:37:56 -0700 Subject: [PATCH] Simplify test results data (#70) * removes 'protocol' naming scheme and removes IPC architecture for reading test plans from files * removes protocol option from cli * updates command output from test runners * updates snapshots * fix types and regenerate snapshots * moves testId property into parent TestPlanResult object * updates snapshots --- src/data/types.js | 28 +- src/host/cli-run-plan.js | 13 +- src/host/main.js | 2 +- src/host/messages.js | 4 +- src/host/plan-from.js | 64 +--- src/host/plan-object.js | 10 +- src/host/tests/plan-from.js | 1 - src/host/tests/snapshots/cli-run-plan.js.md | 28 +- src/host/tests/snapshots/cli-run-plan.js.snap | Bin 1415 -> 1384 bytes src/host/tests/snapshots/messages.js.md | 2 +- src/host/tests/snapshots/messages.js.snap | Bin 894 -> 880 bytes src/host/tests/snapshots/plan-from.js.md | 324 ++++++------------ src/host/tests/snapshots/plan-from.js.snap | Bin 8104 -> 6327 bytes src/host/tests/snapshots/plan-object.js.md | 13 +- src/host/tests/snapshots/plan-object.js.snap | Bin 1137 -> 1137 bytes src/host/types.js | 2 +- src/runner/driver-test-runner.js | 29 +- src/runner/mock-test-runner.js | 43 +-- src/runner/types.js | 2 +- src/shared/process-util.js | 38 -- 20 files changed, 187 insertions(+), 416 deletions(-) delete mode 100644 src/shared/process-util.js diff --git a/src/data/types.js b/src/data/types.js index d2159e9..f1e996f 100644 --- a/src/data/types.js +++ b/src/data/types.js @@ -70,22 +70,36 @@ * @property {string} name name of the test plan, defaults to 'unknown' * @property {AriaATCIData.Log[]} log debug messages emitted during execution of test plan * @property {object[]} tests + * @property {string} tests[].id id of a test in a test plan * @property {string} tests[].filepath filepath of file describing the test in the test plan * @property {AriaATCIData.Log[]} tests[].log subset of log emitted during this single test - * @property {AriaATCIData.TestResult[]} tests[].results + * @property {AriaATCIData.TestResultOutput[]} tests[].results */ /** * Result from a single test in a test plan. * @typedef AriaATCIData.TestResult - * @property {number} testId numeric id of a test in a test plan + * @property {string} testId id of a test in a test plan + * @property {number} presentationNumber numeric id of a test in a test plan * @property {object[]} commands input commands and the speech emitted * @property {string} commands[].command id of input command sent to system - * @property {string} [commands[].output] speech emitted + * @property {string} [commands[].response] speech emitted * @property {string[]} [commands[].errors] errors that occured while during command + * @property {object[]} commands[].assertions + * @property {string} commands[].assertions[].expectation + * @property {"pass"|"fail"|null} commands[].assertions[].verdict + * @property {Record} capabilities Information about the system under test + */ + +/** + * Result from a single test in a test plan. + * @typedef AriaATCIData.TestResultOutput + * @property {object[]} commands input commands and the speech emitted + * @property {string} commands[].command id of input command sent to system + * @property {string} [commands[].response] speech emitted + * @property {string[]} [commands[].errors] errors that occured while during command + * @property {object[]} commands[].assertions + * @property {string} commands[].assertions[].expectation + * @property {"pass"|"fail"|null} commands[].assertions[].verdict * @property {Record} capabilities Information about the system under test - * @property {object[]} results permutation of input commands and assertions passing or not passing - * @property {string} results[].command id of input command sent to system - * @property {string} results[].expectation description of expected assertion - * @property {boolean} results[].pass did command pass or not pass expectation */ diff --git a/src/host/cli-run-plan.js b/src/host/cli-run-plan.js index 095f65b..7bea4a1 100644 --- a/src/host/cli-run-plan.js +++ b/src/host/cli-run-plan.js @@ -70,11 +70,6 @@ export const builder = (args = yargs) => describe: 'Directory "plan-files" are relative to', default: '.', }, - 'plan-protocol': { - choices: ['fork', 'developer'], - default: 'fork', - hidden: true, - }, 'web-driver-url': { coerce(arg) { return new URL(arg); @@ -195,19 +190,17 @@ function mainLoggerMiddleware(argv) { } function mainTestPlanMiddleware(argv) { - const { log, testsMatch: testPattern, planProtocol, planWorkingdir, planFiles } = argv; + const { log, testsMatch: testPattern, planWorkingdir, planFiles } = argv; if (!planFiles || planFiles.length === 0) { - throw new Error( - `'--plan-protocol ${planProtocol}' requires 'plan-files' argument to not be empty` - ); + throw new Error(`'plan-files' argument can not be empty`); } const planInput = { workingdir: planWorkingdir, files: planFiles, }; - const planOptions = { log, testPattern, protocol: planProtocol }; + const planOptions = { log, testPattern }; argv.plans = plansFrom(planInput, planOptions); } diff --git a/src/host/main.js b/src/host/main.js index e541640..1abeff0 100644 --- a/src/host/main.js +++ b/src/host/main.js @@ -142,7 +142,7 @@ export async function hostMain(options) { ...callbackBody, capabilities, status: 'COMPLETED', - responses: commands.map(({ output }) => output), + responses: commands.map(({ response }) => response), }); plan = addTestResultToTestPlan(plan, test.filepath, result); diff --git a/src/host/messages.js b/src/host/messages.js index 3baa2fd..5fe37fe 100644 --- a/src/host/messages.js +++ b/src/host/messages.js @@ -43,8 +43,8 @@ export const HOST_TEMPLATES = { [HostMessage.START]: () => `Starting...`, [HostMessage.UNCAUGHT_ERROR]: ({ error }) => `Uncaught error: ${error.message}`, [HostMessage.WILL_STOP]: () => `Stopping...`, - [HostMessage.PLAN_READ]: ({ name, source, tests, files }) => - `Plan '${name}' with ${tests.length} tests and ${files.length} files read from source '${source}'.`, + [HostMessage.PLAN_READ]: ({ name, tests, files }) => + `Plan '${name}' with ${tests.length} tests and ${files.length} files read.`, [HostMessage.START_SERVER]: () => `Starting reference server.`, [HostMessage.SERVER_LISTENING]: ({ url }) => `Reference server listening on '${url}'.`, [HostMessage.STOP_SERVER]: () => `Stopping reference server.`, diff --git a/src/host/plan-from.js b/src/host/plan-from.js index cdefcb6..347151e 100644 --- a/src/host/plan-from.js +++ b/src/host/plan-from.js @@ -5,14 +5,10 @@ * @module host */ -import * as child_process from 'child_process'; import * as path from 'path'; -import { fileURLToPath } from 'url'; import { compileGlob } from '../shared/file-glob.js'; import { createHost } from '../shared/file-record.js'; -import { iterateEmitter } from '../shared/iterate-emitter.js'; -import { processExited, collectProcessPipe } from '../shared/process-util.js'; import { HostMessage } from './messages.js'; import { blankTestPlan, addFileToTestPlan, addTestToTestPlan } from './plan-object.js'; @@ -47,60 +43,16 @@ function planSelectTests(plan, { pattern = '{,**/}test*' }) { return plan; } -async function planFromCommandFork({ workingdir, files }) { - const fork = child_process.fork( - path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../bin/host.js'), - ['read-plan', '--protocol', 'fork', ...files], - { - cwd: workingdir, - stdio: 'pipe', - serialization: 'advanced', - } - ); - - const stdoutJob = collectProcessPipe(fork.stdout); - const stderrJob = collectProcessPipe(fork.stderr); - const exited = processExited(fork); - try { - for await (const message of iterateEmitter(fork, 'message', 'exit', 'error')) { - if (message.type === 'record') { - await stdoutJob.cancel(); - await stderrJob.cancel(); - return { ...planFromRecord(message.data), source: 'fork' }; - } - } - throw new Error( - `did not receive record -stdout: -${await stdoutJob.cancel()} -stderr: -${await stderrJob.cancel()}` - ); - } finally { - await exited; - } -} - -planFromCommandFork.protocolName = 'fork'; - -async function planFromDeveloperInterface({ workingdir, files }) { +async function planFrom({ workingdir, files }) { const host = createHost(); const glob = files.length === 1 ? files[0] : `{${files.join(',')}}`; const record = await host.read(workingdir, { glob }); - return { ...planFromRecord(record), source: 'developer' }; + return { ...planFromRecord(record) }; } -planFromDeveloperInterface.protocolName = 'developer'; - -const PLAN_PROTOCOL = { - fork: planFromCommandFork, - developer: planFromDeveloperInterface, -}; - -async function planFromFiles({ workingdir, files }, { protocol = 'fork' }) { +async function planFromFiles({ workingdir, files }) { try { - const activeProtocol = PLAN_PROTOCOL[protocol]; - return await activeProtocol({ workingdir, files }); + return await planFrom({ workingdir, files }); } catch (error) { throw Object.assign(new Error('could not load files'), { error }); } @@ -111,16 +63,12 @@ async function planFromFiles({ workingdir, files }, { protocol = 'fork' }) { * @param {string} target.workingdir * @param {string[]} target.files * @param {object} [options] - * @param {'fork' | 'developer'} [options.protocol] * @param {string} [options.testPattern] * @param {AriaATCIHost.Log} [options.log] * @returns {AsyncGenerator} */ -export async function* plansFrom( - { workingdir, files }, - { log = () => {}, protocol, testPattern } = {} -) { - const plan = await planFromFiles({ workingdir, files }, { protocol }); +export async function* plansFrom({ workingdir, files }, { log = () => {}, testPattern } = {}) { + const plan = await planFromFiles({ workingdir, files }); const testPlan = planSelectTests(plan, { pattern: testPattern }); log(HostMessage.PLAN_READ, testPlan); yield testPlan; diff --git a/src/host/plan-object.js b/src/host/plan-object.js index b277f83..3c45e08 100644 --- a/src/host/plan-object.js +++ b/src/host/plan-object.js @@ -14,7 +14,6 @@ import * as arrayUtil from '../shared/array-util.js'; export function blankTestPlan(name) { return { name, - source: 'unknown', serverOptions: { baseUrl: { protocol: 'unknown', @@ -59,7 +58,7 @@ export function addTestToTestPlan(testPlan, filepath) { testPlan.files.find(file => file.name === filepath), () => `File ${filepath} does not exist in test plan.` ); - return { ...testPlan, tests: [...testPlan.tests, { filepath, log: [], results: [] }] }; + return { ...testPlan, tests: [...testPlan.tests, { filepath, id: '', log: [], results: [] }] }; } /** @@ -95,9 +94,14 @@ export function addTestLogToTestPlan(testPlan, { filepath: testFilepath }) { */ export function addTestResultToTestPlan(testPlan, testFilepath, result) { const test = testPlan.tests.find(({ filepath }) => filepath === testFilepath); + const { testId, presentationNumber, ...resultOutput } = result; return { ...testPlan, - tests: arrayUtil.replace(testPlan.tests, test, { ...test, results: [...test.results, result] }), + tests: arrayUtil.replace(testPlan.tests, test, { + ...test, + id: testId, + results: [...test.results, resultOutput], + }), }; } diff --git a/src/host/tests/plan-from.js b/src/host/tests/plan-from.js index a80b859..cea8d6f 100644 --- a/src/host/tests/plan-from.js +++ b/src/host/tests/plan-from.js @@ -41,7 +41,6 @@ test('plansFrom', async t => { }, { testPattern, - protocol, log, } )) { diff --git a/src/host/tests/snapshots/cli-run-plan.js.md b/src/host/tests/snapshots/cli-run-plan.js.md index 0ac34f4..e5dea04 100644 --- a/src/host/tests/snapshots/cli-run-plan.js.md +++ b/src/host/tests/snapshots/cli-run-plan.js.md @@ -11,7 +11,7 @@ Generated by [AVA](https://avajs.dev). { stderr: `Starting...␊ Reference server listening on 'http://localhost:8888'.␊ - Plan 'unknown' with 2 tests and 3 files read from source 'fork'.␊ + Plan 'unknown' with 2 tests and 3 files read.␊ Reference available on 'http://localhost:8888/static␊ Starting test #1 'test 1'.␊ [Server]: Serving '/static/index.html'.␊ @@ -24,7 +24,7 @@ Generated by [AVA](https://avajs.dev). Stopping reference server.␊ Stopping...␊ `, - stdout: `{"name":"unknown","tests":[{"filepath":"test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/index.html"},"text":"Open page: 'http://localhost:8888/static/index.html'."}],"results":[{"testId":1,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","output":"mocked output for UP_ARROW"}],"results":[{"command":"UP_ARROW","expectation":"role up","pass":true,"output":"mocked output for role up"}]}]},{"filepath":"test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/index.html"},"text":"Open page: 'http://localhost:8888/static/index.html'."}],"results":[{"testId":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","output":"mocked output for UP_ARROW,DOWN_ARROW"}],"results":[{"command":"UP_ARROW,DOWN_ARROW","expectation":"role down","pass":true,"output":"mocked output for role down"}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/index.html"},"text":"Open page: 'http://localhost:8888/static/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/index.html"},"text":"Open page: 'http://localhost:8888/static/index.html'."}]}␊ + stdout: `{"name":"unknown","tests":[{"filepath":"test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/index.html"},"text":"Open page: 'http://localhost:8888/static/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","response":"mocked output for UP_ARROW","assertions":[{"expectation":"role up","verdict":null}]}]}]},{"filepath":"test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/index.html"},"text":"Open page: 'http://localhost:8888/static/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","response":"mocked output for UP_ARROW,DOWN_ARROW","assertions":[{"expectation":"role down","verdict":null}]}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/index.html"},"text":"Open page: 'http://localhost:8888/static/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/index.html"},"text":"Open page: 'http://localhost:8888/static/index.html'."}]}␊ `, } @@ -35,7 +35,7 @@ Generated by [AVA](https://avajs.dev). { stderr: `Starting...␊ Reference server listening on 'http://localhost:8888'.␊ - Plan 'unknown' with 2 tests and 4 files read from source 'fork'.␊ + Plan 'unknown' with 2 tests and 4 files read.␊ Reference available on 'http://localhost:8888/static␊ Starting test #1 'test 1'.␊ [Server]: Serving '/static/reference/index.html'.␊ @@ -48,7 +48,7 @@ Generated by [AVA](https://avajs.dev). Stopping reference server.␊ Stopping...␊ `, - stdout: `{"name":"unknown","tests":[{"filepath":"test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":1,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","output":"mocked output for UP_ARROW"}],"results":[{"command":"UP_ARROW","expectation":"role up","pass":true,"output":"mocked output for role up"}]}]},{"filepath":"test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","output":"mocked output for UP_ARROW,DOWN_ARROW"}],"results":[{"command":"UP_ARROW,DOWN_ARROW","expectation":"role down","pass":true,"output":"mocked output for role down"}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ + stdout: `{"name":"unknown","tests":[{"filepath":"test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","response":"mocked output for UP_ARROW","assertions":[{"expectation":"role up","verdict":null}]}]}]},{"filepath":"test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","response":"mocked output for UP_ARROW,DOWN_ARROW","assertions":[{"expectation":"role down","verdict":null}]}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ `, } @@ -59,7 +59,7 @@ Generated by [AVA](https://avajs.dev). { stderr: `Starting...␊ Reference server listening on 'http://localhost:8888'.␊ - Plan 'unknown' with 2 tests and 4 files read from source 'fork'.␊ + Plan 'unknown' with 2 tests and 4 files read.␊ Reference available on 'http://localhost:8888/static␊ Starting test #1 'test 1'.␊ [Server]: Serving '/static/reference/index.html'.␊ @@ -72,7 +72,7 @@ Generated by [AVA](https://avajs.dev). Stopping reference server.␊ Stopping...␊ `, - stdout: `{"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":1,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","output":"mocked output for UP_ARROW"}],"results":[{"command":"UP_ARROW","expectation":"role up","pass":true,"output":"mocked output for role up"}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","output":"mocked output for UP_ARROW,DOWN_ARROW"}],"results":[{"command":"UP_ARROW,DOWN_ARROW","expectation":"role down","pass":true,"output":"mocked output for role down"}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ + stdout: `{"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","response":"mocked output for UP_ARROW","assertions":[{"expectation":"role up","verdict":null}]}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","response":"mocked output for UP_ARROW,DOWN_ARROW","assertions":[{"expectation":"role down","verdict":null}]}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ `, } @@ -83,7 +83,7 @@ Generated by [AVA](https://avajs.dev). { stderr: `Starting...␊ Reference server listening on 'http://localhost:8888'.␊ - Plan 'unknown' with 2 tests and 4 files read from source 'fork'.␊ + Plan 'unknown' with 2 tests and 4 files read.␊ Reference available on 'http://localhost:8888/static␊ Starting test #1 'test 1'.␊ [Server]: Serving '/static/reference/index.html'.␊ @@ -116,7 +116,7 @@ Generated by [AVA](https://avajs.dev). body: '{"testCsvRow":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"status":"COMPLETED","responses":["mocked output for UP_ARROW,DOWN_ARROW"]}',␊ headers: { 'Content-Type': 'application/json', test: 'header:multiple:colon' }␊ }␊ - {"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":1,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","output":"mocked output for UP_ARROW"}],"results":[{"command":"UP_ARROW","expectation":"role up","pass":true,"output":"mocked output for role up"}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","output":"mocked output for UP_ARROW,DOWN_ARROW"}],"results":[{"command":"UP_ARROW,DOWN_ARROW","expectation":"role down","pass":true,"output":"mocked output for role down"}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ + {"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","response":"mocked output for UP_ARROW","assertions":[{"expectation":"role up","verdict":null}]}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","response":"mocked output for UP_ARROW,DOWN_ARROW","assertions":[{"expectation":"role down","verdict":null}]}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ `, } @@ -127,7 +127,7 @@ Generated by [AVA](https://avajs.dev). { stderr: `Starting...␊ Reference server listening on 'http://localhost:8888'.␊ - Plan 'unknown' with 2 tests and 4 files read from source 'fork'.␊ + Plan 'unknown' with 2 tests and 4 files read.␊ Reference available on 'http://localhost:8888/static␊ Starting test #1 'test 1'.␊ [Server]: Serving '/static/reference/index.html'.␊ @@ -160,7 +160,7 @@ Generated by [AVA](https://avajs.dev). body: '{"testCsvRow":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"status":"COMPLETED","responses":["mocked output for UP_ARROW,DOWN_ARROW"]}',␊ headers: { 'Content-Type': 'application/json', test: 'header:multiple:colon' }␊ }␊ - {"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":1,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","output":"mocked output for UP_ARROW"}],"results":[{"command":"UP_ARROW","expectation":"role up","pass":true,"output":"mocked output for role up"}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","output":"mocked output for UP_ARROW,DOWN_ARROW"}],"results":[{"command":"UP_ARROW,DOWN_ARROW","expectation":"role down","pass":true,"output":"mocked output for role down"}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ + {"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","response":"mocked output for UP_ARROW","assertions":[{"expectation":"role up","verdict":null}]}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","response":"mocked output for UP_ARROW,DOWN_ARROW","assertions":[{"expectation":"role down","verdict":null}]}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ `, } @@ -171,7 +171,7 @@ Generated by [AVA](https://avajs.dev). { stderr: `Starting...␊ Reference server listening on 'http://localhost:8888'.␊ - Plan 'unknown' with 2 tests and 4 files read from source 'fork'.␊ + Plan 'unknown' with 2 tests and 4 files read.␊ Reference available on 'http://localhost:8888/static␊ Starting test #1 'test 1'.␊ HTTP 418 response received when reporting result: 'a body'.␊ @@ -208,7 +208,7 @@ Generated by [AVA](https://avajs.dev). body: '{"testCsvRow":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"status":"COMPLETED","responses":["mocked output for UP_ARROW,DOWN_ARROW"]}',␊ headers: { 'Content-Type': 'application/json', x: 'y' }␊ }␊ - {"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":1,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","output":"mocked output for UP_ARROW"}],"results":[{"command":"UP_ARROW","expectation":"role up","pass":true,"output":"mocked output for role up"}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","output":"mocked output for UP_ARROW,DOWN_ARROW"}],"results":[{"command":"UP_ARROW,DOWN_ARROW","expectation":"role down","pass":true,"output":"mocked output for role down"}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ + {"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","response":"mocked output for UP_ARROW","assertions":[{"expectation":"role up","verdict":null}]}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","response":"mocked output for UP_ARROW,DOWN_ARROW","assertions":[{"expectation":"role down","verdict":null}]}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ `, } @@ -219,7 +219,7 @@ Generated by [AVA](https://avajs.dev). { stderr: `Starting...␊ Reference server listening on 'http://localhost:8888'.␊ - Plan 'unknown' with 2 tests and 4 files read from source 'fork'.␊ + Plan 'unknown' with 2 tests and 4 files read.␊ Reference available on 'http://localhost:8888/static␊ Starting test #1 'test 1'.␊ HTTP 418 response received when reporting result: 'Unknown error - unable to read response body.'.␊ @@ -256,6 +256,6 @@ Generated by [AVA](https://avajs.dev). body: '{"testCsvRow":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"status":"COMPLETED","responses":["mocked output for UP_ARROW,DOWN_ARROW"]}',␊ headers: { 'Content-Type': 'application/json', x: 'y' }␊ }␊ - {"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":1,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","output":"mocked output for UP_ARROW"}],"results":[{"command":"UP_ARROW","expectation":"role up","pass":true,"output":"mocked output for role up"}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"testId":2,"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","output":"mocked output for UP_ARROW,DOWN_ARROW"}],"results":[{"command":"UP_ARROW,DOWN_ARROW","expectation":"role down","pass":true,"output":"mocked output for role down"}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ + {"name":"unknown","tests":[{"filepath":"tests/test-1.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW","response":"mocked output for UP_ARROW","assertions":[{"expectation":"role up","verdict":null}]}]}]},{"filepath":"tests/test-2.json","log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}],"results":[{"capabilities":{"browserName":"mock","browserVersion":"1.0","atName":"mock","atVersion":"1.0","platformName":"mock"},"commands":[{"command":"UP_ARROW,DOWN_ARROW","response":"mocked output for UP_ARROW,DOWN_ARROW","assertions":[{"expectation":"role down","verdict":null}]}]}]}],"log":[{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."},{"data":{"type":"openPage","date":"2000-01-01T12:00:00.000Z","url":"http://localhost:8888/static/reference/index.html"},"text":"Open page: 'http://localhost:8888/static/reference/index.html'."}]}␊ `, } diff --git a/src/host/tests/snapshots/cli-run-plan.js.snap b/src/host/tests/snapshots/cli-run-plan.js.snap index 5a15f78fb611179d4b740741a8f37174ebe02147..4a1e4682aaf4ee053c29cc19796eb57ad978d7cd 100644 GIT binary patch literal 1384 zcmV-u1(*6kRzVw*Q!i$qCG4hDguacs8@nn;E$ zH%J2^SdlA>G0A1PD@%r;Lr?jJ9#f#`p`Xwn=x6j(I!j5mY%#GVMV2V7Y{TSoc6Vmp zEayGwUA^W~>zKX$gK&qtgaj`33l8&fz#5dZ-`?3a=J>_Nzw4=ul=vujm30IDZ^7TI zwN&c9a_0->PO0{qSX@!gE;lzfQ_8)RvX)Xl2b;AomGzWz8y+)mlQ8Vxu5GLxa2#^S zKhkwQT_$xB65k?-k?@3s$aNSeK0HO#M_PmPz|7^qVeB?2#yo^>w-xQD*T@+yV zmj{urRTGH|VWahDLP$o}qcT^vHL^ahu%xXrB09MVH9aX>^ zVBUboVlZ3KUo$F9TzV84h#FSSj>=C1u?B^V>_bAp0-lHwBcIP_^9A^=6bv(;hhH6r zeg%tW=z_sD6Q_2CUu_OECQ7^7t!C7au%_D&&B6h$Ij+MU!bAkMkhUOy#a=QzIJ@9t zfAAMbxC3#UYC+G#FyR|dN=U+aR1eIxmrLpUfz( zhQxK2xMp@s&x_+hd~wRvXxqJ`8;5r_k+5bGunQu-uKL(tohH#nS~+*zb`f+h)dxlr#BvoL^P9?Aqf)el_3tZhI;m7V&=tq zkzhQCAsA03!H@)F;R(i{V-XCNlQd(sXht7#Nj4UpHDO6Ml3yoA0_$X$w9Kkxq{c}CFRzVCx5^fAc31uJ8y6JsebA9^jC7sNlc6bsQ}4tB1|y+{Zcj(H?5c7W`df*`*Q6yh?fh|dbv36w%4thE?Ney8^tra2(;h%I7Y<>p|GMQn`d<-+c3pOJo3XTGL5*X;j z6&++DLAc-u2M&6Q+O9`9Vgx&=&8Uw!jTp>gv?)6>hUdk{*!6JJBk!KD#03^^D?czi zo(O$eK}P&gf$&nDde`0Iu z6W54O<3ZVZyy9ry7AG2pvX{eLu#KA+CG5(2UsTC#NXZ-;i9zQ4{oqUwuupVb@2|XG z(Bn1N?SnI2u6T$=2dZUZv0}dFR5tPGVcbBbwQis3;xv?FP>9Gb1O!?@jV!Us<#MrH zfp5KH+2t~PO(^;iT13o)26qgc-jjB91@ssz?0T7*8*LO|&^W4$xNPzSd%M?bU--S3Rc}Fl7I&XE=tJHx=H-xhULK0iWDD2B9l$K!* zy#$NMjgt*J^cwI}xSkZ&;w6POpGi^Js=nMAB|nBc+@30zhfm2GCpjNR$(y)KoH>n5 zCP*Pu);4C2p{r~PH=^E5^J{HLUkl0I3KK82B_4=*VJ zH1m5cI|8VmE=mR|8Kh)T<~_KOL0uH|d8ikJgn$QW7bP z66sBTbCBZS5Yg(O7xAfOBh^$H3R`12lJCJDLfsM|Pu}K3+VNtBZv0=a%I1D|v6`!#sd9fOW zc+F&}<6gE8$F&=J#BNa!s!=cBo2Cmhx%AHCwpo3#`~7x(drOaRs*na;nsIQGG-_ll z$X53AWLDy6k~|rfHq%NOMPG`(6n!cBQuL+h>yGrrQ{XFwx3(2;Dc;H=Z~Zos2(2st zaEZ-@#&o? z;ys$4Ii?sBB zUMOaH6Q=;@ziGhvB z+)+a@B^dr=5^{JFzi+H>6*sC|uQH6r6FHJOAet#Ck00te!{&(`$z0ATh*l7-AbQ@? VMM1QJ=mm%9{{ey21N|CP007A?qwD|x diff --git a/src/host/tests/snapshots/messages.js.md b/src/host/tests/snapshots/messages.js.md index 9b133cd..9741d41 100644 --- a/src/host/tests/snapshots/messages.js.md +++ b/src/host/tests/snapshots/messages.js.md @@ -46,7 +46,7 @@ Generated by [AVA](https://avajs.dev). tests: [], type: 'planRead', }, - text: 'Plan \'test\' with 0 tests and 0 files read from source \'unknown\'.', + text: 'Plan \'test\' with 0 tests and 0 files read.', } > Snapshot 5 diff --git a/src/host/tests/snapshots/messages.js.snap b/src/host/tests/snapshots/messages.js.snap index ac32f575953d93d5ec81b8c796084c7c46150680..bd16dea6de8523ce8ae1811f6868d128a886401b 100644 GIT binary patch literal 880 zcmV-$1CRVcRzV>q+mB{uOP znz3r46(5TT00000000BMR?klpK@{HU(o!H;@CN}-8;NQ3P!Nrp8e>q=ixC5wNC+`Q zciJv&XPTL5ks}8a6GPO4M-QO!TvKhlz}G`!I~uZq(AAIk(f)1 zmU6kALzj34Pd{&@N^GM-+dx;U#GfRE1L}&IMN_fVtVU5YaGMrztyGo<;hgcjaf!1f zLKX8X0D2AaX=iaR^Ja)Ssqorq?yY&$lkUzzlo&ypb{siuK#^4Iir5_@-5<5eX=jB9 zflC2J%2nf;#!!&rdffGi*ypLLJczd|H;W znjam7n*-ZrCS?BP_^H#QRV>R{l>_}Nu>FA0clKnWT^=$n{dJ#RNf`_|Os{cUW&I*7 zPByaX&9V*%cS8ti$z~*1*h6k-3|16Y`YJS1X))^9E|>tG=e(c$>O8mY{YU3@3*gvl zytP;g*P|#r^Urv=jx8H6*rbi)ip(|%_dMtKL=@9=2eE0o3Akc$c!=>8C1jwP?JmIL z<=xtDe(!8Ii=M=)%0`r`oSh~WR^RHoB4?FdmE{XCeTPWKEXxt@9D+2f%y6^HOfRq!n-(YK&)|Kn> znm8+YE%SG*1U-(Dpku*h?Htw^sZo;@EeaB{!O+c7;tk-wi`hN9)V+NRsQv=D(SQP3 G4FCYp{ip)~ literal 894 zcmV-^1A+WORzVP!FOUbX=pD(Re10K(lr$CLmh5D4W;1CSg48j;?S>pnu z3&fGgFCfuNh>zQoQ^@Nz$Z?sk73ZFc2R*Ky96+&Qq-jTxiv|#Jxh{d#5b6G?Sx-Al zgmYX7AQFm=XOa)QY7$y5@32XdiiG82EiA3mm7((Z-+1N4Cf^d;G7A;XUjvDTS z8`v>noVRSk4MwnOK;g_ssguo#mVeXYO_mbEu|!|t7v*gc63f>E&;E=y>fl7J8hy(I)!m5NRhx-5aC=TtG+t{?s>YMaIB#O_%P&_kL z$IP%TE{Nljrr_S95asO12%IO_E>bSC$3~Bz7%5{>RQ}Yz0NQs5eS1&FTJ<5N;IH`T zlFC4h!}JQXW!KNa;&?rp-l*%4;dV`iq@dG+$=ri#zYJDnuH*!4ufn2^Yr9|q`8?01WRyX@j9!~AZ@)?l6LBu1< za*(-2kVeW3HBx2_7B9D}4Bkm)1|uo65=NOrw^To7vxXd)^8TQ%7nylZz59ax8j`+) zSa0hF+8l47IZAWoy1Y%C7Q8L)!C~zdYYbN$ljJQ2D5Qg->QU?!z7iceRUI zwc~<~C@STNjItpuOaf7)_KwVHIz@*yiU{lP4|gwvG@9wmuh-Mj^C0GIb(pX`BPVYl z3EIviH>2b1Gz=g8p-N03JuO4V^lNcpe!#OiWkL4KFc;oYEjTV0f?tG) z+C**L=Io754jtcuDbH0k)P40<4mbp3(dF;aaK=v~VI-s0+ZI+NbW-`dM=KV980xEm~lfGR?Hnb6i9p%i{bwx&laEdx>G@8F?aN?|{WAIw zhuQUhe>)=|1$w>qdNA+LL`}fvna942smEq8%JUCU>{p7*3Qfc-suK~=qTFYIukHRE zeZ^H(ZcVQKIyvAf8(2G$2eNZWvNh+g%fg66xiZskN|g-XXy@@Yc}t{$-09dBTeV@- zx9|lFI|knc;unHx55{*WNq(4d`*n46;_OMyBF3T?bDAaLmF0-`36QAwlo6GZ`MkS0 zEi2-mCBz;O23s&KXM7M0XfvEz7<=6naNgt7G(~+oy@0E7$aqcgrQPvPJ*cJmm3Bw( zruEpusWc4PHrYYXJE2EpM7SMyY9^@dOu*i*U-&FYU2FVeXPC7&tdh;1h_T~N%@Sgz zi(xx*EZtKAA|_2>iX~3rt?m?5o=aQ&lbNcVRZhOEn9)c<;83aRVmnAUj*nA9>=$xD z2bgg2vC6t^X^X?06M!W-rzWFYI7aX@MoL z5=)j9p5CVj!Tq7|G|qu=wro5Q!PD`vl7pXEz2oC^+p>~6j<97@4SK4c5MeWo&(Ss} z_j|gsn3}$9|3UpWVyl1QyH4BbwoLsgNO$pBo&0^x(HCG{EHJhh{s^^#u7Ya9bG}kr z{ka0LWkDU2L%lA8V{?yEA@Lc}c=-MfFc;LS_8H@5gWoJnh;vpjm?#L18{(@ko08~94K>iIkBH(U3{gA88|NY}AY1RB;lj9Dw>Vt*hIV;Hd> zp{9b&d?eNFNEG7KAl9`_CoZ-h30420(?Bg4s$S$?g!`wN`c3d5ZwpC9N68_t7VHe6 z3hTyVYnt7*Ehu@-)=xq3LF5H-px_98Q%mlywfZ>itI~IL`5-3xQ94?yT@HcIka$#RyQ7+Bk!`{#J`idFQ+WCO% ziZ!48C0ft)z<-xEECnP$=9pwe55?54uTo0Vr|GG85d(5uHxQk)Vbdi#YpfiLLbMJg z0EUzb8=V!c4@0v^ zCSFu`ErD7rOTX)dZ`^)%8eHacNl*MPqGWi0u+*2Xgx+pIjgPCLy(z}pZEFy38Folv z11$4ocS876=^USU%?}>9p;!4tUf`;R9Tu3c0=aN0iSnfF{YhE9#3wv$Iro8E%ZO++a!0FYQD0DvjzMc zVvc~LTBR7_fGQ>gh*s%8jEULp&Gwt`e7n(jQeC?Nf7YU6{@fhpVi=9A-AIMVjq;RL zC16@!_P_Oq4!?c8uCZbGhRZeFhKqfsW7TCvErO0Q_R2>o(m3woOIYq7bJ>rm(v*fe z=ca0{NTy^&@ezq|^`4tt#F)y{T3+Rs9bTE}@6= zRP^a@`>g*B4#qmsLwsg_C$%N)KlH@5^o$912%a#Yl!ROo<8yg+NngZ>xKPizn)-+; z&azN(R6et(Kz43aHkvx@#|zoV{PCKtvgt)JBR%Z@SxCoesBG(mpcr4rcgOvQi}-Gy z*O8UO9vNc8ag+ZBFK&{F>`|E+0X~NOUw}<9L!*@+8By9oZHY(uyeFhRDI#su2d>M0 z;W+1V8#>GG2xeIL)DQP|?}e(7mh$~z*g%~>a%m1eRM9wOZf zTU(n)9viw9ch{N=;DEYj#9;eQ%6=S?zzoo-f)FKsi8VCMve$Q#KlaFayyV4#28C;` z_SZ;jBnlVf5(>bJcoe*^;DXjCB2muPq>z5N4X>cJWJ@-f4$%Rwj*le&2_9o4~nH&*mY9KroiUtfN%}6<#(*juz2w% zS+xgv1?ip^YgBZ~?Idw~oo?%8!qKDd#aizoO_PX!$>j%GAmsWX`Gchu{dhU5b!x9O zvwss!TD8kjhM6h~l0Z?*eu2EHC~WFoy{g!-9Q~}Q5M-@r6x(fIO@wq!D%LyL%|r>Z zdxd#735^RWfz-j1{h+yq%Tduu7=#4k;aKE5`_}$n2t;*R)KbGneaw@l3Fq*-mO zdY(kd$l%B;%B3tqslo{7O}Hqhe#U-;2HNpcHa4}#2isk65}$!x35`sxnYdt2FzAr9&^a^BJn+D-hc^d0(;+LcXC z#Tze`2$H7Yc*Zf}%}0_AOx%J*NYFJ`7Xcqdh#|YWnadXf6&@7o2F@Bg^dJ=!c_Z~u z(+^B&26ClI&Wc|mNu?1Go|nqi;O_=+pRv+Bd)#X(9rX$P7?`;=RwT!LJ;MF%S0SVb zwpvQ(Gs>lo@v5@q#IND zX^DtkAlOET9EIOktGJX3t!bkp3pNuX3jr``pDU>ql8wv{9s>PRVd8U!05 z^)4!yN{l^y{1De_ne5Z+9IaFex@IifzhiUu(uW687~iD$jE8U?C(oEop?`Fpcp{4d za*}C#FI++Vqofew#@BgHDVwh@M}q%UVz;k`J51~QcOmU!XByJW@?%?6p?`%2UjyB% z^q5hN>F>xWj5CulxSz%ZNsJK8UaQQFR*v*sE%UehyxEnlSV6WHJ}n?#tsRV;Y_g8Cov9^HJ93Wr2>nce=2pdd64kM&5+oxBwT6dkkya zdY?aYIZr2WKUJ>iKb6YTsW^ikD5esP6$y#@lTd}^jBnKXhTFljUY+hhDn47THIDOr zRsPzKCqtF@&W2i{5{CawDVM9CHg^IqHT;8+nB~n4S;6*u-S!USkA6J7qtS2ORk`2~m5LSm>x8 zf1q})^O!aYSY9p7xl=Q2B~q4}u+UU@b*p>>H9n}^-7S+euE4adbrWk9+}$C-m4aWJ zsy8np%cBRD=G&QyCTcK{;$|UO>UfhRD$?X+cha3Zb~>ZJw&{<>q;%t;%(O%^)|^Z_ z??&X;$NG3trty-r4kulYDLI$%KD|rOa%x&&|5Qo`z}0?40u1EQde3l#tL;8kJgN0W z#BwjWGaWcdTJzU<%^=Lj;A0pm!{^-ZR3U}slaE&^`2kBEor+xwan&7oKD3?OnC^0( zaD1HDHPd6?%%kkjSM{B!*bsfD{(xE6BQ8$uI zRR-V;T8XaeKbFFiWqqYS^45Hma{Q;~_bGmOVg`ZL&h;gAxe74xYP|u)e(}?3 zuEO**{&554qT!pVxwhNrnH#OtMU$V)MlLJ8l$(@j<~7__YdenPDyR>I4)|j}ZK8pt zb9v{AvDHK)ms_cHqEvEK?!EAiY$qNjk~_^yjTb(lP&N`LR}{k=y}w3Pi}neDw(4LtiwOBrhsSYr!h;n%h(4h)q?31)RKV>Q9Hyt8*h z%jue6i9XY*-&lH_uw_WUb<`a4%cv(=H5%ymeXttc0G~V?F#R;#Ae#G~aU7}3rD{1l_Qxnie7BJiMI}OVW-+%B9?9yW zN72#o`1Eu=q0VN;^eMcnP4cR%#kWN00Y~oNBV`F?)gIMDD9z*sBZ`Cg)VS0lF%HHU zbk~-3Z{9I+ZmvL`t)3xVtO_yu4#tx<{cQuR0ej*0D!r!I?kuH>#ICt>e6}l*C51{0 z)G|H&WmqjfQ{8u@vJ8MWjNYQ6Wc<)J0o8TWh0L6<^I;z)3;=gt{EwOOF zwk>h}0*bK;tHZVHCDBcwp}WdCA*}=F_ln|7M3%IaPRj+XUwMNaGgt6Sx=9H*dw$OK zY6HA=RuTleoW`X3fpMT8)e((~y z%-wBRjR*9W+UKsJ>7UbGHf*3R54HPY*pMt=E}k_~hq&nIsT8&+W9;m~L07TmOISV= zBp2-*6cQaIyVJFBP0+0+^jy2_W>|Rxp6jB|D%NVUq8P#5(lDp1bD8#HpZ3Exd$CEv zMc@yZd+EM0W=D?KXn}hGTHk5yer^;?=v5@fvQ~DCh|^o)VNGdhw|-tH*q{;_ttvC^ zB%}KC?$m%ISS36Z{e+GVIG~IIWs~^w?8N8h zd|~Co@tyC;YVVf|d5M|O#3oe#Q}g`FJdL=LU7thChD4{_hD6V3$(qQ2DRxau!*Y3e zHNG8|#TW!9S{fs6VympT^=Z~BYMq!%zsK6ydnoKncBkv3s?rL%9$bc=uqrcqdd40P zwR(A}`F$#%&c#Z}pX7JCuBun*sFWmlA)5NW9Z1GyF7zNcf?lJ`H0Nt|hF_qiG+7c? zGuyv7l5X}AOZ*wu<|XxHt0n8C;~Xz|n3Swy_HbNK)v{6GnPpg-nPuw3J6*o9w58*4 zMF-06hc*9zH!$AmaupsP&k zNqCK?GSN!nA~9ThBJb(H@h^DV+o|rnBeB~hd6{uy?1nsX)8CYtLT<=Z&8;22rVOTV z$&h$cp34pPdQ(0Ip9qf^LrJ=B_Z{hYpJZH~q7wUz-=}km98*9+D=zt6VLh!h>C`iP zN7kK-kzMuqediqhfCmYXwPJ$T4>;AY?KR4}Sv>q&QT6(4mo{FW^6?iogXr!p%ny*- zQhD@TO)3}1oWNpV@)!`$&{B0QfC&qnMJyJGLg~}CGJx~6|7t#pH|8Bi`*;Tw?eCMC zEAqdm*-7s~zt;;W#}v>#?C=;c13%uyHw)(_Je*Y07yDI9?FC&)yh}Xd7bwEYk-;mu zc0Ya&vJ;OKJnzd$Oex?PmUywC3^+E5NFw)HqrA}p7EID{XsUjK%gq03p}q_ShWip$ z#82D*gd6GTu4@8B9v$U%0U|_ucn5Z|&RSO3s?;|9oKr|%`fZoaCJOl@*O$v9gXKJ- zL#Ye5A=@|I%x#?9{`}6vf8v(!o#vFq_w^1E?55L$#MP1wUs|ShH&R5oPQ2CyTbrh5 z5?C^s2AP@Z)6<59-U&`Vu-Z}ci!90mZur4kJZGYhJ8Ta+Q0eVMgUe@%U-~XdQXl-A zlut)s3%@mMD*vcq%V|oRo}kl|o{ZF85+{Z1%`|rF)6o;bn!fBoE2RC>^+eKYqz%@nEoo(YoZ zO&-o8+_&#ayqGS8ODZ(^*?<-Ne2J` literal 8104 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 bem!x%`p9p-`k2n_iGVJnD;z`QIm-V5CTFLW diff --git a/src/host/tests/snapshots/plan-object.js.md b/src/host/tests/snapshots/plan-object.js.md index 4865acd..166f742 100644 --- a/src/host/tests/snapshots/plan-object.js.md +++ b/src/host/tests/snapshots/plan-object.js.md @@ -20,7 +20,6 @@ Generated by [AVA](https://avajs.dev). protocol: 'unknown', }, }, - source: 'unknown', tests: [], } @@ -38,7 +37,6 @@ Generated by [AVA](https://avajs.dev). protocol: 'unknown', }, }, - source: 'unknown', tests: [], } @@ -56,7 +54,6 @@ Generated by [AVA](https://avajs.dev). protocol: 'http', }, }, - source: 'unknown', tests: [], } @@ -81,7 +78,6 @@ Generated by [AVA](https://avajs.dev). protocol: 'unknown', }, }, - source: 'unknown', tests: [], } @@ -106,10 +102,10 @@ Generated by [AVA](https://avajs.dev). protocol: 'unknown', }, }, - source: 'unknown', tests: [ { filepath: 'test-something.json', + id: '', log: [], results: [], }, @@ -141,7 +137,6 @@ Generated by [AVA](https://avajs.dev). protocol: 'unknown', }, }, - source: 'unknown', tests: [], } @@ -170,10 +165,10 @@ Generated by [AVA](https://avajs.dev). protocol: 'unknown', }, }, - source: 'unknown', tests: [ { filepath: 'test-something.json', + id: '', log: [], results: [], }, @@ -205,10 +200,10 @@ Generated by [AVA](https://avajs.dev). protocol: 'unknown', }, }, - source: 'unknown', tests: [ { filepath: 'test-something.json', + id: '', log: [ 0, ], @@ -238,10 +233,10 @@ Generated by [AVA](https://avajs.dev). protocol: 'unknown', }, }, - source: 'unknown', tests: [ { filepath: 'test-something.json', + id: undefined, log: [], results: [ { diff --git a/src/host/tests/snapshots/plan-object.js.snap b/src/host/tests/snapshots/plan-object.js.snap index f2a9eaf894441c9b46804780baee7781aa176186..b2761e799fad42069220018eea26a1bc4b19fe5f 100644 GIT binary patch literal 1137 zcmV-%1djVbRzV2rGgBicp8F*}0)vxMTUG?7U+FC1@Y<0yHE=91sJJRP zy*4*zDQkwk&5f)P{wPP8ckuTBa2W7_bHG(#8)e2R(-?!O{a7p(4H`4ZG-xZ)?+AR6 zIEv$BmaDc5>ec^rRCC*%H>iN|SgT4n)=}9iyi~RpD9bf67x;*J)&VtE1Tr`=L75n729U`_^${t*1hvpttd88?lcu+ze?iE}}0U9U>DM z0*gZRdHEgl%9gA^PWyJ4!Tb>oKLNi1_keMxWiz{$S!hd_tGI#cT)u40S#;cEjvnV( zs?rf>=v&~qzN!}lfABzW&3V47+*#MwvkVzDWYAz3v~S3uC(59k!2K}O02m~~iWK^g zxhJfNClUL#E04}0QBlfk5{OSeY6AT`7y@liCeXXR2t@1%s!J^*^uZ)kXOfN1zRsjf z5|eU~A@X%5jS#I+eUaPDx*WqSeg_SAff1ciT+2%4euPW{Rp2ymUhk6a+A3C0zRot1 z=S#J6S^5XShNP|87B1@Uz&$Ee1$*+wLf|@2qcIxv3US5_V>_^eHy0#7U3JvH#s-N< zu~5V=?J!=TqM`qqn-$5MFCAC%L+Q+`N@H$RY${2-zp0fZQN8$olvG3K6KP5!wu+E% zwLCGB`azS_dQVBU!x?LC4&RHXP&)=1YE?NFP?6+n5>F>?YSWfy%!+Dzm-}YIaCs_(D#=6M)x5f4&f< zbUuOZBaya2_z6G%jQGi`$$oP1q5VYjj5uRiM!<@0EV?WsLu^U(lXiJs^OyT^pX}FR z3VVPLQvHOTK**9F*5!icTJvijeyHyPW4edrVmxH;06j$Ks!;MX6(!8m=rquI1*`A{ zu>3f`{}(p3UL91cG`)U~fRkx@J%fPNG`$kLfRKyYSTVx=MHB9AO}GV?crbXceK4ru zDOBj$bRl0u$c=O%|J^(@golFtz)Xse(ParCr+_QKE#MEmOFl;XTs-&Me?+H@H${(A z#z!LNl;NOZ8CZF!Q^rWbDPwftrwnm@=vqV98oJhV<64K~Tn?Y zPr|-hLKqF>8ZRV_mZv={|2YkBVjka3j01ex?@i2i!<(4C-6lKM*z#T%F@MHg#1!Eg zyMWz;xQHP(g<+->jc6cd1L}Svn$%@q;puCk5o)xHP+gxS&kBNifffD(TNKoZZy*2w DCJ#b@QoGQCF6=@q2!c{Ux=^8Axe!-^_>@x5OeSgO z=1u0c9iDyd1P+<`?l<3^x%ZqiA2Z*qJ6@xso_}BJwsz!P*RkF0^*PzlZROfs)$+7D zJilj;t?gZ`!AX$>KU$*2E%<*F*bQjl1K>39J1|2FYiOZghtlC;wOS=~HK7GUZ=#e@ zLe^1EsI`V#&9);|7`}BR%pGr*&9#u?mf18? zX0?+3Q_|nw)ossJM!|yedVXVAveGj@(zVZY#OdcY+zLA29F}Z~<7)2zihhvsq)C zA&m7XwLGOq7x~hP#PhngZjIy-bECSRufr3;FJ3f9OI_d7Uc+(&1f@*V%QH`=g z2){6(%n~?fnVfqK7auh_SD3`PQmjNdzkf|Pf*U44IlgGB7KQpGOaM%L0QF@Mo!#pW&7_i4FJy0f~~zc*TqG$(fC znhPcKBEqj;jpp9P#mCY#N7*T)d}GX$AinPn@hvPWzG3MPI6( z6VMbMu}%A>XV@fnu zV%0=%8J;f~UQ=TUFZvxA*ah@by@ee^$|q*pm?K)>MLobmWIr2CPbnpM%I*w3#bmY6 z@);ec)wSq6aD-Q|3W2+xSkA8D%UszZ#os{qoit^CgoIDil>G$~PNgZEva?9})u@#q z@!t%IuVrzGKd`98hw09+op>8Z^T1c>lK%rKf2K=*hWDi&v=TP(T#Dq;b$p1FuU}DbGBu$$na;d75odD;%N;Ctup83B zW|JK3AO_w7-dn1JQT8=bzZK;Fu(AQwr-Quy0|_$lx6fCQzvbU`^6xs=o%3AYcb)aH zkb8kmS$x-_>e@<$C#>=x7Xc7sav=Z! D#$7Et diff --git a/src/host/types.js b/src/host/types.js index 0b8fba3..f90c434 100644 --- a/src/host/types.js +++ b/src/host/types.js @@ -45,10 +45,10 @@ /** * @typedef AriaATCIHost.TestPlan * @property {string} name - * @property {'fork' | 'developer' | 'unknown'} source * @property {object} serverOptions * @property {AriaATCIShared.BaseURL} serverOptions.baseUrl * @property {object[]} tests + * @property {string} tests[].id * @property {string} tests[].filepath * @property {number[]} tests[].log * @property {Array} tests[].results diff --git a/src/runner/driver-test-runner.js b/src/runner/driver-test-runner.js index c438a1d..e9c95f2 100644 --- a/src/runner/driver-test-runner.js +++ b/src/runner/driver-test-runner.js @@ -189,11 +189,15 @@ export class DriverTestRunner { await this.browserDriver.navigate('about:blank'); const commandsOutput = []; - const results = []; for (const command of test.commands) { const { value: validCommand, errors } = validateKeysFromCommand(command); - + const assertions = test.assertions.map(assertion => { + return { + expectation: assertion.expectation || assertion.assertionStatement, + verdict: null, + }; + }); if (validCommand) { await this._collectSpeech(this.timesOption.afterNav, () => this.openPage({ @@ -221,31 +225,17 @@ export class DriverTestRunner { commandsOutput.push({ command: command.id, - output: spokenOutput.join('\n'), + response: spokenOutput.join('\n'), + assertions, }); - - for (const assertion of test.assertions) { - results.push({ - command: command.id, - expectation: assertion.expectation || assertion.assertionStatement, - pass: true, - }); - } } else { await this.log(RunnerMessage.INVALID_KEYS, { command, errors }); commandsOutput.push({ command: command.id, errors, + assertions, }); - - for (const assertion of test.assertions) { - results.push({ - command: command.id, - expectation: assertion.expectation, - pass: false, - }); - } } } @@ -256,7 +246,6 @@ export class DriverTestRunner { presentationNumber, capabilities, commands: commandsOutput, - results, }; } diff --git a/src/runner/mock-test-runner.js b/src/runner/mock-test-runner.js index 35af8cb..c683efb 100644 --- a/src/runner/mock-test-runner.js +++ b/src/runner/mock-test-runner.js @@ -48,14 +48,6 @@ export class MockTestRunner { this.log(RunnerMessage.OPEN_PAGE, { url }); } - /** - * @param {AriaATCIData.CollectedTest["commands"][number]} command - * @param {AriaATCIData.CollectedTest["assertions"][number]} assertion - */ - async testAssertion(command, assertion) { - return true; - } - /** * @param {AriaATCIData.CollectedTest} task */ @@ -68,50 +60,34 @@ export class MockTestRunner { ); const commandsOutput = []; - const results = []; for (const command of task.commands) { const { value: validCommand, errors } = validateKeysFromCommand(command); + const assertions = task.assertions.map(assertion => { + return { + expectation: assertion.expectation || assertion.assertionStatement, + verdict: null, + }; + }); if (validCommand) { const mockOutput = `mocked output for ${command.id}`; commandsOutput.push({ command: validCommand.id, - output: mockOutput, + response: mockOutput, + assertions, }); - - for (const assertion of task.assertions) { - const expectationText = assertion.expectation || assertion.assertionStatement; - - results.push({ - command: validCommand.id, - expectation: expectationText, - pass: await this.testAssertion(validCommand, assertion), - output: `mocked output for ${expectationText}`, - }); - } } else { await this.log(RunnerMessage.INVALID_KEYS, { command, errors }); commandsOutput.push({ command: command.id, errors, + assertions, }); - - for (const assertion of task.assertions) { - const expectationText = assertion.expectation || assertion.assertionStatement; - - results.push({ - command: command.id, - expectation: expectationText, - output: `mocked output for ${expectationText}`, - pass: false, - }); - } } } return { - testId: task.info.testId, capabilities: { browserName: 'mock', browserVersion: '1.0', @@ -120,7 +96,6 @@ export class MockTestRunner { platformName: 'mock', }, commands: commandsOutput, - results, }; } } diff --git a/src/runner/types.js b/src/runner/types.js index 07e0ebc..7ad37b2 100644 --- a/src/runner/types.js +++ b/src/runner/types.js @@ -28,7 +28,7 @@ /** * @typedef AriaATCIRunner.TestRunner - * @property {function(AriaATCIData.Test): Promise} run run a test + * @property {function(AriaATCIData.Test): Promise} run run a test */ /** diff --git a/src/shared/process-util.js b/src/shared/process-util.js deleted file mode 100644 index 40c50ed..0000000 --- a/src/shared/process-util.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @module shared - */ - -import { iterateEmitter } from './iterate-emitter.js'; -import { startJob } from './job.js'; - -export function processExited(fork) { - return new Promise((resolve, reject) => { - fork.once('exit', (code, signal) => resolve({ code, signal })); - fork.once('error', reject); - }); -} - -const MAX_COLLECT_PIPE_BYTES = 4096; -export function collectProcessPipe(readable, { maxKeptBytes = MAX_COLLECT_PIPE_BYTES } = {}) { - return startJob(async function ({ cancelable }) { - let bytes = 0; - const carry = []; - for await (const buffer of cancelable(iterateEmitter(readable, 'data', 'end', 'error'))) { - bytes += buffer.length; - carry.push(buffer); - - while (bytes > maxKeptBytes) { - const firstBuffer = carry[0]; - if (bytes - firstBuffer.length <= maxKeptBytes) { - const difference = bytes - maxKeptBytes; - carry[0] = firstBuffer.slice(difference); - bytes -= difference; - } else { - carry.shift(); - bytes -= firstBuffer.length; - } - } - } - return carry.join(''); - }); -}