From 6ecbb939f1aba9b270c05865aeb0e26d45ceda03 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 20 Nov 2023 17:30:20 -0800 Subject: [PATCH 1/2] fix: various fs support --- .gitignore | 1 + .../src/function_bindgen.rs | 4 +- .../src/transpile_bindgen.rs | 2 +- packages/preview2-shim/lib/io/worker-io.js | 2 +- .../preview2-shim/lib/io/worker-thread.js | 33 +- .../preview2-shim/lib/nodejs/filesystem.js | 761 +++++++++--------- src/cmd/run.js | 19 +- src/jco.js | 3 +- submodules/wasmtime | 2 +- test/cli.js | 4 +- tests/generated/api_proxy.rs | 3 +- tests/generated/api_proxy_streaming.rs | 3 +- tests/generated/api_reactor.rs | 3 +- tests/generated/api_read_only.rs | 17 +- tests/generated/api_time.rs | 3 +- tests/generated/cli_args.rs | 3 +- tests/generated/cli_default_clocks.rs | 3 +- tests/generated/cli_directory_list.rs | 3 +- tests/generated/cli_env.rs | 3 +- tests/generated/cli_exit_default.rs | 3 +- tests/generated/cli_exit_failure.rs | 3 +- tests/generated/cli_exit_panic.rs | 3 +- tests/generated/cli_exit_success.rs | 3 +- tests/generated/cli_export_cabi_realloc.rs | 3 +- tests/generated/cli_file_append.rs | 3 +- tests/generated/cli_file_dir_sync.rs | 3 +- tests/generated/cli_file_read.rs | 3 +- tests/generated/cli_hello_stdout.rs | 3 +- tests/generated/cli_splice_stdin.rs | 3 +- tests/generated/cli_stdin.rs | 3 +- tests/generated/cli_stdio_write_flushes.rs | 3 +- .../http_outbound_request_content_length.rs | 3 +- tests/generated/http_outbound_request_get.rs | 3 +- .../http_outbound_request_invalid_dnsname.rs | 3 +- .../http_outbound_request_invalid_header.rs | 3 +- .../http_outbound_request_invalid_port.rs | 3 +- .../http_outbound_request_invalid_version.rs | 3 +- .../http_outbound_request_large_post.rs | 3 +- tests/generated/http_outbound_request_post.rs | 3 +- tests/generated/http_outbound_request_put.rs | 3 +- .../http_outbound_request_response_build.rs | 3 +- .../http_outbound_request_unknown_method.rs | 3 +- ...ttp_outbound_request_unsupported_scheme.rs | 3 +- tests/generated/mod.rs | 1 + tests/generated/preview1_big_random_buf.rs | 3 +- tests/generated/preview1_clock_time_get.rs | 3 +- tests/generated/preview1_close_preopen.rs | 3 +- tests/generated/preview1_dangling_fd.rs | 3 +- tests/generated/preview1_dangling_symlink.rs | 3 +- .../generated/preview1_dir_fd_op_failures.rs | 3 +- tests/generated/preview1_directory_seek.rs | 3 +- tests/generated/preview1_fd_advise.rs | 3 +- tests/generated/preview1_fd_filestat_get.rs | 3 +- tests/generated/preview1_fd_filestat_set.rs | 3 +- tests/generated/preview1_fd_flags_set.rs | 3 +- tests/generated/preview1_fd_readdir.rs | 3 +- tests/generated/preview1_file_allocate.rs | 3 +- tests/generated/preview1_file_pread_pwrite.rs | 3 +- tests/generated/preview1_file_seek_tell.rs | 3 +- tests/generated/preview1_file_truncation.rs | 3 +- .../preview1_file_unbuffered_write.rs | 3 +- tests/generated/preview1_file_write.rs | 3 +- tests/generated/preview1_interesting_paths.rs | 3 +- tests/generated/preview1_nofollow_errors.rs | 3 +- tests/generated/preview1_overwrite_preopen.rs | 3 +- tests/generated/preview1_path_exists.rs | 3 +- tests/generated/preview1_path_filestat.rs | 3 +- tests/generated/preview1_path_link.rs | 3 +- .../preview1_path_open_create_existing.rs | 3 +- .../preview1_path_open_dirfd_not_dir.rs | 3 +- tests/generated/preview1_path_open_missing.rs | 3 +- .../generated/preview1_path_open_nonblock.rs | 3 +- tests/generated/preview1_path_open_preopen.rs | 3 +- .../preview1_path_open_read_write.rs | 3 +- tests/generated/preview1_path_rename.rs | 3 +- ...eview1_path_rename_dir_trailing_slashes.rs | 3 +- ...view1_path_rename_file_trailing_slashes.rs | 3 +- .../preview1_path_symlink_trailing_slashes.rs | 3 +- tests/generated/preview1_poll_oneoff_files.rs | 3 +- tests/generated/preview1_poll_oneoff_stdio.rs | 3 +- tests/generated/preview1_readlink.rs | 3 +- .../generated/preview1_regular_file_isatty.rs | 3 +- tests/generated/preview1_remove_directory.rs | 15 + ...view1_remove_directory_trailing_slashes.rs | 3 +- .../preview1_remove_nonempty_directory.rs | 3 +- tests/generated/preview1_renumber.rs | 3 +- tests/generated/preview1_sched_yield.rs | 3 +- tests/generated/preview1_stdio.rs | 3 +- tests/generated/preview1_stdio_isatty.rs | 3 +- tests/generated/preview1_stdio_not_isatty.rs | 3 +- tests/generated/preview1_symlink_create.rs | 3 +- tests/generated/preview1_symlink_filestat.rs | 3 +- tests/generated/preview1_symlink_loop.rs | 3 +- tests/generated/preview1_unicode_output.rs | 3 +- .../preview1_unlink_file_trailing_slashes.rs | 3 +- tests/generated/preview2_ip_name_lookup.rs | 3 +- tests/generated/preview2_random.rs | 3 +- tests/generated/preview2_sleep.rs | 3 +- .../preview2_stream_pollable_correct.rs | 3 +- .../preview2_stream_pollable_traps.rs | 3 +- tests/generated/preview2_tcp_bind.rs | 3 +- tests/generated/preview2_tcp_connect.rs | 3 +- .../preview2_tcp_sample_application.rs | 3 +- tests/generated/preview2_tcp_sockopts.rs | 3 +- tests/generated/preview2_tcp_states.rs | 3 +- tests/generated/preview2_udp_bind.rs | 3 +- tests/generated/preview2_udp_connect.rs | 3 +- .../preview2_udp_sample_application.rs | 3 +- tests/generated/preview2_udp_sockopts.rs | 3 +- tests/generated/preview2_udp_states.rs | 3 +- tests/virtualenvs/bar-jabberwock.js | 5 + tests/virtualenvs/base.js | 23 + tests/virtualenvs/scratch.js | 16 + xtask/src/generate/tests.rs | 32 +- 114 files changed, 626 insertions(+), 605 deletions(-) create mode 100644 tests/generated/preview1_remove_directory.rs create mode 100644 tests/virtualenvs/bar-jabberwock.js create mode 100644 tests/virtualenvs/scratch.js diff --git a/.gitignore b/.gitignore index 60cbcb2d8..e4693eb8c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ package-lock.json /docs/book /src/**/*.d.ts /src/**/*.d.ts.map +/tests/rundir diff --git a/crates/js-component-bindgen/src/function_bindgen.rs b/crates/js-component-bindgen/src/function_bindgen.rs index c7450bacc..d212441aa 100644 --- a/crates/js-component-bindgen/src/function_bindgen.rs +++ b/crates/js-component-bindgen/src/function_bindgen.rs @@ -1038,7 +1038,7 @@ impl Bindgen for FunctionBindgen<'_> { let to_result_string = self.intrinsic(Intrinsic::ToResultString); uwriteln!( self.src, - "console.trace(`{prefix} return {}`);", + "console.error(`{prefix} return {}`);", if sig_results_length > 0 || !results.is_empty() { format!("result=${{{to_result_string}(ret)}}") } else { @@ -1074,7 +1074,7 @@ impl Bindgen for FunctionBindgen<'_> { let to_result_string = self.intrinsic(Intrinsic::ToResultString); uwriteln!( self.src, - "console.trace(`{prefix} return {}`);", + "console.error(`{prefix} return {}`);", if results_length > 0 || !results.is_empty() { format!("result=${{{to_result_string}(ret)}}") } else { diff --git a/crates/js-component-bindgen/src/transpile_bindgen.rs b/crates/js-component-bindgen/src/transpile_bindgen.rs index 0b269f2bc..3ccfd656b 100644 --- a/crates/js-component-bindgen/src/transpile_bindgen.rs +++ b/crates/js-component-bindgen/src/transpile_bindgen.rs @@ -1269,7 +1269,7 @@ impl<'a> Instantiator<'a, '_> { .collect::>(); uwriteln!( self.src.js, - "console.trace(`{tracing_prefix} call {}`);", + "console.error(`{tracing_prefix} call {}`);", event_fields.join(", ") ); } diff --git a/packages/preview2-shim/lib/io/worker-io.js b/packages/preview2-shim/lib/io/worker-io.js index 9c9e4647b..c3ab6557f 100644 --- a/packages/preview2-shim/lib/io/worker-io.js +++ b/packages/preview2-shim/lib/io/worker-io.js @@ -48,7 +48,7 @@ if (DEBUG) { ret = e; throw ret; } finally { - console.trace( + process._rawDebug( (num & CALL_MASK) >> CALL_SHIFT, num & CALL_TYPE_MASK, id, diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index b082ab842..9e7d0ff4f 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -1,6 +1,6 @@ import { runAsWorker } from "../synckit/index.js"; import { FILE, STDOUT, STDERR, STDIN } from "./stream-types.js"; -import { createReadStream } from "node:fs"; +import { createReadStream, createWriteStream } from "node:fs"; import { Readable } from "node:stream"; import { hrtime } from "node:process"; import { @@ -64,7 +64,6 @@ unfinishedStreams.set(++streamCnt, { }); /** - * * @param {number} streamId * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream */ @@ -79,7 +78,6 @@ function streamError(streamId, stream, err) { } /** - * * @param {number} streamId * @returns {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, flushPromise: Promise | null }} */ @@ -153,9 +151,21 @@ function handle(call, id, payload) { stream.on("end", () => void stream.emit("readable")); return streamCnt; } - case OUTPUT_STREAM_CREATE | FILE: - throw new Error("todo: file write"); - + case OUTPUT_STREAM_CREATE | FILE: { + const { fd, offset } = payload; + const stream = createWriteStream(null, { + fd, + autoClose: false, + emitClose: false, + highWaterMark: 64 * 1024, + start: Number(offset) + }); + unfinishedStreams.set(++streamCnt, { + flushPromise: null, + stream, + }); + return streamCnt; + } // Generic call implementations (streams + polls) default: switch (call & CALL_MASK) { @@ -246,13 +256,12 @@ function handle(call, id, payload) { new Error("Cannot write more than permitted writable length") ); } - return new Promise((resolve, reject) => { - stream.write(payload, (err) => - err - ? reject(streamError(id, stream, err)) - : resolve(BigInt(payload.byteLength)) - ); + stream.write(payload, err => { + if (err) + return void reject(streamError(id, stream, err)); + resolve(BigInt(payload.byteLength)); + }); }); } case OUTPUT_STREAM_FLUSH: { diff --git a/packages/preview2-shim/lib/nodejs/filesystem.js b/packages/preview2-shim/lib/nodejs/filesystem.js index eaf4eaba6..6b25f16ed 100644 --- a/packages/preview2-shim/lib/nodejs/filesystem.js +++ b/packages/preview2-shim/lib/nodejs/filesystem.js @@ -6,23 +6,26 @@ import { } from "../io/worker-io.js"; import { INPUT_STREAM_CREATE, OUTPUT_STREAM_CREATE } from "../io/calls.js"; import { FILE } from "../io/stream-types.js"; -import { environment } from "./cli.js"; +// import { environment } from "./cli.js"; import { - constants, - readSync, - openSync, - opendirSync, closeSync, + constants, + fdatasyncSync, fstatSync, + fsyncSync, lstatSync, + mkdirSync, + opendirSync, + openSync, + readSync, + rmdirSync, statSync, + symlinkSync, + unlinkSync, writeSync, - mkdirSync, } from "node:fs"; import { platform } from "node:process"; -const { Error: StreamError } = streams; - const symbolDispose = Symbol.dispose || Symbol.for("dispose"); const isWindows = platform === "win32"; @@ -45,445 +48,471 @@ function lookupType(obj) { return "unknown"; } +// Note: This should implement per-segment semantics of openAt, but we cannot currently +// due to the lack of support for openat() in Node.js. +// Tracking issue: https://github.com/libuv/libuv/issues/4167 /** - * @typedef { - * { hostPreopen: string } | - * { fullPath: string, fd: number } - * } DescriptorProps + * @implements {DescriptorProps} */ -export class FileSystem { - /** - * - * @param {[string, string][]} preopens - * @param {import('./cli.js').environment} environment - * @returns - */ - constructor(preopens, environment) { - const fs = this; - this.cwd = environment.initialCwd(); - - class DirectoryEntryStream { - #dir; - readDirectoryEntry() { - let entry; - try { - entry = this.#dir.readSync(); - } catch (e) { - throw convertFsError(e); - } - if (entry === null) { - return null; - } - const name = entry.name; - const type = lookupType(entry); - return { name, type }; - } - [symbolDispose]() { - this.#dir.closeSync(); - } - - static _create(dir) { - const dirStream = new DirectoryEntryStream(); - dirStream.#dir = dir; - return dirStream; - } - } - const directoryEntryStreamCreate = DirectoryEntryStream._create; - delete DirectoryEntryStream._create; - - // Note: This should implement per-segment semantics of openAt, but we cannot currently - // due to the lack of support for openat() in Node.js. - // Tracking issue: https://github.com/libuv/libuv/issues/4167 - /** - * @implements {DescriptorProps} - */ - class Descriptor { - #hostPreopen; - #fd; - #fullPath; - - static _createPreopen(hostPreopen) { - const descriptor = new Descriptor(); - descriptor.#hostPreopen = hostPreopen; - return descriptor; - } +let descriptorCnt = 3; +class Descriptor { + #hostPreopen; + #fd; + #fullPath; + + static _createPreopen(hostPreopen) { + const descriptor = new Descriptor(); + descriptor.#hostPreopen = hostPreopen; + return descriptor; + } - static _create(fd, fullPath) { - const descriptor = new Descriptor(); - descriptor.#fd = fd; - descriptor.#fullPath = fullPath; - return descriptor; - } + static _create(fd, fullPath) { + const descriptor = new Descriptor(); + descriptor.#fd = fd; + descriptor.#fullPath = fullPath; + return descriptor; + } - constructor() { - // this id is purely for debugging purposes - this._id = fs.descriptorCnt++; - } + constructor() { + // this id is purely for debugging purposes + this._id = descriptorCnt++; + } - readViaStream(offset) { - if (this.#hostPreopen) - throw { tag: "last-operation-failed", val: new StreamError() }; - return inputStreamCreate( - FILE, - ioCall(INPUT_STREAM_CREATE | FILE, null, { - fd: this.#fd, - offset, - }) - ); - } + readViaStream(offset) { + if (this.#hostPreopen) throw "is-directory"; + return inputStreamCreate( + FILE, + ioCall(INPUT_STREAM_CREATE | FILE, null, { + fd: this.#fd, + offset, + }) + ); + } - writeViaStream(offset) { - if (this.#hostPreopen) throw "is-directory"; - return outputStreamCreate( - FILE, - ioCall(OUTPUT_STREAM_CREATE | FILE, null, { fd: this.#fd, offset }) - ); - } + writeViaStream(offset) { + if (this.#hostPreopen) throw "is-directory"; + return outputStreamCreate( + FILE, + ioCall(OUTPUT_STREAM_CREATE | FILE, null, { fd: this.#fd, offset }) + ); + } - appendViaStream() { - console.log(`[filesystem] APPEND STREAM ${this._id}`); - } + appendViaStream() { + return this.writeViaStream(this.stat().size); + } - advise(offset, length, advice) { - console.log(`[filesystem] ADVISE`, this._id, offset, length, advice); - } + advise(_offset, _length, _advice) {} - syncData() { - console.log(`[filesystem] SYNC DATA ${this._id}`); - } + syncData() { + if (this.#hostPreopen) throw "invalid"; + try { + fdatasyncSync(this.#fd); + } catch (e) { + throw convertFsError(e); + } + } - getFlags() { - console.log(`[filesystem] FLAGS FOR ${this._id}`); - } + getFlags() { + if (this.#hostPreopen) throw "invalid"; + let stats; + try { + stats = fstatSync(this.#fd); + } catch (e) { + throw convertFsError(e); + } + const mode = stats.mode; + return { + read: ((mode & constants.O_RDWR) | (mode & constants.O_RDONLY)) > 0, + write: ((mode & constants.O_RDWR) | (mode & constants.O_WRONLY)) > 0, + // TODO: + fileIntegritySync: false, + dataIntegritySync: false, + requestedWriteSync: false, + mutateDirectory: false, + }; + } - getType() { - if (this.#hostPreopen) return "directory"; - const stats = fstatSync(this.#fd); - return lookupType(stats); - } + getType() { + if (this.#hostPreopen) return "directory"; + const stats = fstatSync(this.#fd); + return lookupType(stats); + } - setSize(size) { - console.log(`[filesystem] SET SIZE`, this._id, size); - } + setSize(size) { + if (this.#hostPreopen) throw "is-directory"; + console.log(`[filesystem] SET SIZE`, this._id, size); + } - setTimes(dataAccessTimestamp, dataModificationTimestamp) { - console.log( - `[filesystem] SET TIMES`, - this._id, - dataAccessTimestamp, - dataModificationTimestamp - ); - } + setTimes(dataAccessTimestamp, dataModificationTimestamp) { + if (this.#hostPreopen) throw "invalid"; + console.log( + `[filesystem] SET TIMES`, + this._id, + dataAccessTimestamp, + dataModificationTimestamp + ); + } - read(length, offset) { - if (!this.#fullPath) throw "bad-descriptor"; - const buf = new Uint8Array(length); - const bytesRead = readSync(this.#fd, buf, Number(offset), length, 0); - const out = new Uint8Array(buf.buffer, 0, bytesRead); - return [out, bytesRead === 0 ? "ended" : "open"]; - } + read(length, offset) { + if (!this.#fullPath) throw "bad-descriptor"; + const buf = new Uint8Array(length); + const bytesRead = readSync(this.#fd, buf, Number(offset), length, 0); + const out = new Uint8Array(buf.buffer, 0, bytesRead); + return [out, bytesRead === 0 ? "ended" : "open"]; + } - write(buffer, offset) { - if (!this.#fullPath) throw "bad-descriptor"; - return BigInt( - writeSync( - this.#fd, - buffer, - Number(offset), - buffer.byteLength - offset, - 0 - ) - ); - } + write(buffer, offset) { + if (!this.#fullPath) throw "bad-descriptor"; + return BigInt( + writeSync(this.#fd, buffer, Number(offset), buffer.byteLength - offset, 0) + ); + } - readDirectory() { - if (!this.#fullPath) throw "bad-descriptor"; - try { - const dir = opendirSync( - isWindows ? this.#fullPath.slice(1) : this.#fullPath - ); - return directoryEntryStreamCreate(dir); - } catch (e) { - throw convertFsError(e); - } - } + readDirectory() { + if (!this.#fullPath) throw "bad-descriptor"; + try { + const dir = opendirSync( + isWindows ? this.#fullPath.slice(1) : this.#fullPath + ); + return directoryEntryStreamCreate(dir); + } catch (e) { + throw convertFsError(e); + } + } - sync() { - console.log(`[filesystem] SYNC`, this._id); - } + sync() { + if (this.#hostPreopen) throw "invalid"; + try { + fsyncSync(this.#fd); + } catch (e) { + throw convertFsError(e); + } + } - createDirectoryAt(path) { - const fullPath = this.#getFullPath(path); - try { - mkdirSync(fullPath); - } catch (e) { - throw convertFsError(e); - } - } + createDirectoryAt(path) { + const fullPath = this.#getFullPath(path); + try { + mkdirSync(fullPath); + } catch (e) { + throw convertFsError(e); + } + } - stat() { - if (this.#hostPreopen) throw "invalid"; - let stats; - try { - stats = fstatSync(this.#fd, { bigint: true }); - } catch (e) { - convertFsError(e); - } - const type = lookupType(stats); - return { - type, - linkCount: stats.nlink, - size: stats.size, - dataAccessTimestamp: nsToDateTime(stats.atimeNs), - dataModificationTimestamp: nsToDateTime(stats.mtimeNs), - statusChangeTimestamp: nsToDateTime(stats.ctimeNs), - }; - } + stat() { + if (this.#hostPreopen) throw "invalid"; + let stats; + try { + stats = fstatSync(this.#fd, { bigint: true }); + } catch (e) { + throw convertFsError(e); + } + const type = lookupType(stats); + return { + type, + linkCount: stats.nlink, + size: stats.size, + dataAccessTimestamp: nsToDateTime(stats.atimeNs), + dataModificationTimestamp: nsToDateTime(stats.mtimeNs), + statusChangeTimestamp: nsToDateTime(stats.ctimeNs), + }; + } - statAt(pathFlags, path) { - const fullPath = this.#getFullPath(path, false); - let stats; - try { - stats = (pathFlags.symlinkFollow ? statSync : lstatSync)( - isWindows ? fullPath.slice(1) : fullPath, - { bigint: true } - ); - } catch (e) { - convertFsError(e); - } - const type = lookupType(stats); - return { - type, - linkCount: stats.nlink, - size: stats.size, - dataAccessTimestamp: nsToDateTime(stats.atimeNs), - dataModificationTimestamp: nsToDateTime(stats.mtimeNs), - statusChangeTimestamp: nsToDateTime(stats.ctimeNs), - }; - } + statAt(pathFlags, path) { + const fullPath = this.#getFullPath(path, false); + let stats; + try { + stats = (pathFlags.symlinkFollow ? statSync : lstatSync)( + isWindows ? fullPath.slice(1) : fullPath, + { bigint: true } + ); + } catch (e) { + throw convertFsError(e); + } + const type = lookupType(stats); + return { + type, + linkCount: stats.nlink, + size: stats.size, + dataAccessTimestamp: nsToDateTime(stats.atimeNs), + dataModificationTimestamp: nsToDateTime(stats.mtimeNs), + statusChangeTimestamp: nsToDateTime(stats.ctimeNs), + }; + } - setTimesAt() { - console.log(`[filesystem] SET TIMES AT`, this._id); - } + setTimesAt() { + console.log(`[filesystem] SET TIMES AT`, this._id); + } - linkAt() { - console.log(`[filesystem] LINK AT`, this._id); - } + linkAt() { + console.log(`[filesystem] LINK AT`, this._id); + } - openAt(pathFlags, path, openFlags, descriptorFlags) { - const fullPath = this.#getFullPath(path, pathFlags.symlinkFollow); - let fsOpenFlags = 0x0; - if (openFlags.create) fsOpenFlags |= constants.O_CREAT; - if (openFlags.directory) fsOpenFlags |= constants.O_DIRECTORY; - if (openFlags.exclusive) fsOpenFlags |= constants.O_EXCL; - if (openFlags.truncate) fsOpenFlags |= constants.O_TRUNC; - - if (descriptorFlags.read && descriptorFlags.write) - fsOpenFlags |= constants.O_RDWR; - else if (descriptorFlags.write) fsOpenFlags |= constants.O_WRONLY; - // TODO: - // if (descriptorFlags.fileIntegritySync) - // if (descriptorFlags.dataIntegritySync) - // if (descriptorFlags.requestedWriteSync) - // if (descriptorFlags.mutateDirectory) - - try { - const fd = openSync( - isWindows ? fullPath.slice(1) : fullPath, - fsOpenFlags - ); - return descriptorCreate(fd, fullPath); - } catch (e) { - throw convertFsError(e); - } - } + openAt(pathFlags, path, openFlags, descriptorFlags) { + const fullPath = this.#getFullPath(path, pathFlags.symlinkFollow); + let fsOpenFlags = 0x0; + if (openFlags.create) fsOpenFlags |= constants.O_CREAT; + if (openFlags.directory) fsOpenFlags |= constants.O_DIRECTORY; + if (openFlags.exclusive) fsOpenFlags |= constants.O_EXCL; + if (openFlags.truncate) fsOpenFlags |= constants.O_TRUNC; + + if (descriptorFlags.read && descriptorFlags.write) + fsOpenFlags |= constants.O_RDWR; + else if (descriptorFlags.write) fsOpenFlags |= constants.O_WRONLY; + else if (descriptorFlags.read) fsOpenFlags |= constants.O_RDONLY; + // TODO: + // if (descriptorFlags.fileIntegritySync) + // if (descriptorFlags.dataIntegritySync) + // if (descriptorFlags.requestedWriteSync) + // if (descriptorFlags.mutateDirectory) + + try { + const fd = openSync( + isWindows ? fullPath.slice(1) : fullPath, + fsOpenFlags + ); + return descriptorCreate(fd, fullPath, preopenEntries); + } catch (e) { + throw convertFsError(e); + } + } - readlinkAt() { - console.log(`[filesystem] READLINK AT`, this._id); - } + readlinkAt() { + console.log(`[filesystem] READLINK AT`, this._id); + } - removeDirectoryAt() { - console.log(`[filesystem] REMOVE DIR AT`, this._id); - } + removeDirectoryAt(path) { + const fullPath = this.#getFullPath(path, false); + try { + rmdirSync(fullPath); + } catch (e) { + throw convertFsError(e); + } + } - renameAt() { - console.log(`[filesystem] RENAME AT`, this._id); - } + renameAt() { + console.log(`[filesystem] RENAME AT`, this._id); + } - symlinkAt() { - console.log(`[filesystem] SYMLINK AT`, this._id); - } + symlinkAt(target, path) { + const fullPath = this.#getFullPath(path, false); + try { + symlinkSync(target, fullPath); + } catch (e) { + throw convertFsError(e); + } + } - unlinkFileAt() { - console.log(`[filesystem] UNLINK FILE AT`, this._id); - } + unlinkFileAt(path) { + const fullPath = this.#getFullPath(path, false); + try { + unlinkSync(fullPath); + } catch (e) { + throw convertFsError(e); + } + } - isSameObject(other) { - return other === this; - } + isSameObject(other) { + return other === this; + } - metadataHash() { - if (this.#hostPreopen) return { upper: 0n, lower: BigInt(this._id) }; - try { - const stats = fstatSync(this.#fd, { bigint: true }); - return { upper: stats.mtimeNs, lower: stats.ino }; - } catch (e) { - convertFsError(e); - } - } + metadataHash() { + if (this.#hostPreopen) return { upper: 0n, lower: BigInt(this._id) }; + try { + const stats = fstatSync(this.#fd, { bigint: true }); + return { upper: stats.mtimeNs, lower: stats.ino }; + } catch (e) { + throw convertFsError(e); + } + } - metadataHashAt(pathFlags, path) { - const fullPath = this.#getFullPath(path, false); - try { - const stats = (pathFlags.symlinkFollow ? statSync : lstatSync)( - isWindows ? fullPath.slice(1) : fullPath, - { bigint: true } - ); - return { upper: stats.mtimeNs, lower: stats.ino }; - } catch (e) { - convertFsError(e); - } - } + metadataHashAt(pathFlags, path) { + const fullPath = this.#getFullPath(path, false); + try { + const stats = (pathFlags.symlinkFollow ? statSync : lstatSync)( + isWindows ? fullPath.slice(1) : fullPath, + { bigint: true } + ); + return { upper: stats.mtimeNs, lower: stats.ino }; + } catch (e) { + throw convertFsError(e); + } + } - // TODO: support followSymlinks - #getFullPath(subpath, _followSymlinks) { - let descriptor = this; - if (subpath.indexOf("\\") !== -1) subpath = subpath.replace(/\\/g, "/"); - if (subpath[0] === "/") { - let bestPreopenMatch = ""; - for (const preopenEntry of fs.preopenEntries) { - if ( - subpath.startsWith(preopenEntry[1]) && - (!bestPreopenMatch || - bestPreopenMatch.length < preopenEntry[1].length) - ) { - bestPreopenMatch = preopenEntry; - } - } - if (!bestPreopenMatch) throw "no-entry"; - descriptor = bestPreopenMatch[0]; - subpath = subpath.slice(bestPreopenMatch[1]); - if (subpath[0] === "/") subpath = subpath.slice(1); + // TODO: support followSymlinks + #getFullPath(subpath, _followSymlinks) { + let descriptor = this; + if (subpath.indexOf("\\") !== -1) subpath = subpath.replace(/\\/g, "/"); + if (subpath[0] === "/") { + let bestPreopenMatch = ""; + for (const preopenEntry of preopenEntries) { + if ( + subpath.startsWith(preopenEntry[1]) && + (!bestPreopenMatch || + bestPreopenMatch.length < preopenEntry[1].length) + ) { + bestPreopenMatch = preopenEntry; } - if (subpath.startsWith(".")) - subpath = subpath.slice(subpath[1] === "/" ? 2 : 1); - if (descriptor.#hostPreopen) - return ( - descriptor.#hostPreopen + - (descriptor.#hostPreopen.endsWith("/") ? "" : "/") + - subpath - ); - return descriptor.#fullPath + "/" + subpath; - } - - [symbolDispose]() { - if (this.#fd) closeSync(this.#fd); } + if (!bestPreopenMatch) throw "no-entry"; + descriptor = bestPreopenMatch[0]; + subpath = subpath.slice(bestPreopenMatch[1]); + if (subpath[0] === "/") subpath = subpath.slice(1); } + if (subpath.startsWith(".")) + subpath = subpath.slice(subpath[1] === "/" ? 2 : 1); + if (descriptor.#hostPreopen) + return ( + descriptor.#hostPreopen + + (descriptor.#hostPreopen.endsWith("/") ? "" : "/") + + subpath + ); + return descriptor.#fullPath + (subpath.length > 0 ? "/" : '') + subpath; + } - const descriptorCreatePreopen = Descriptor._createPreopen; - delete Descriptor._createPreopen; - const descriptorCreate = Descriptor._create; - delete Descriptor._create; - - this.descriptorCnt = 3; - this.preopenEntries = []; - for (const [virtualPath, hostPreopen] of Object.entries(preopens)) { - const preopenEntry = [descriptorCreatePreopen(hostPreopen), virtualPath]; - this.preopenEntries.push(preopenEntry); + [symbolDispose]() { + if (this.#fd) closeSync(this.#fd); + } +} +const descriptorCreatePreopen = Descriptor._createPreopen; +delete Descriptor._createPreopen; +const descriptorCreate = Descriptor._create; +delete Descriptor._create; + +class DirectoryEntryStream { + #dir; + readDirectoryEntry() { + let entry; + try { + entry = this.#dir.readSync(); + } catch (e) { + throw convertFsError(e); } - this.preopens = { - Descriptor, - getDirectories() { - return fs.preopenEntries; - }, - }; - this.types = { - Descriptor, - DirectoryEntryStream, - }; + if (entry === null) { + return null; + } + const name = entry.name; + const type = lookupType(entry); + return { name, type }; + } + [symbolDispose]() { + this.#dir.closeSync(); + } + + static _create(dir) { + const dirStream = new DirectoryEntryStream(); + dirStream.#dir = dir; + return dirStream; + } +} +const directoryEntryStreamCreate = DirectoryEntryStream._create; +delete DirectoryEntryStream._create; + +let preopenEntries = []; +// let cwd = environment.initialCwd(); + +export const preopens = { + Descriptor, + getDirectories() { + return preopenEntries; + }, +}; + +_addPreopen("/", "/"); + +export const types = { + Descriptor, + DirectoryEntryStream, +}; + +export function _setPreopens(preopens) { + preopenEntries = []; + for (const [virtualPath, hostPreopen] of Object.entries(preopens)) { + _addPreopen(virtualPath, hostPreopen); } } -export const { preopens, types } = new FileSystem({ "/": "/" }, environment); +export function _addPreopen(virtualPath, hostPreopen) { + const preopenEntry = [descriptorCreatePreopen(hostPreopen), virtualPath]; + preopenEntries.push(preopenEntry); +} function convertFsError(e) { switch (e.code) { case "EACCES": - throw "access"; + return "access"; case "EAGAIN": case "EWOULDBLOCK": - throw "would-block"; + return "would-block"; case "EALREADY": - throw "already"; + return "already"; case "EBADF": - throw "bad-descriptor"; + return "bad-descriptor"; case "EBUSY": - throw "busy"; + return "busy"; case "EDEADLK": - throw "deadlock"; + return "deadlock"; case "EDQUOT": - throw "quota"; + return "quota"; case "EEXIST": - throw "exist"; + return "exist"; case "EFBIG": - throw "file-too-large"; + return "file-too-large"; case "EILSEQ": - throw "illegal-byte-sequence"; + return "illegal-byte-sequence"; case "EINPROGRESS": - throw "in-progress"; + return "in-progress"; case "EINTR": - throw "interrupted"; + return "interrupted"; case "EINVAL": - throw "invalid"; + return "invalid"; case "EIO": - throw "io"; + return "io"; case "EISDIR": - throw "is-directory"; + return "is-directory"; case "ELOOP": - throw "loop"; + return "loop"; case "EMLINK": - throw "too-many-links"; + return "too-many-links"; case "EMSGSIZE": - throw "message-size"; + return "message-size"; case "ENAMETOOLONG": - throw "name-too-long"; + return "name-too-long"; case "ENODEV": - throw "no-device"; + return "no-device"; case "ENOENT": - throw "no-entry"; + return "no-entry"; case "ENOLCK": - throw "no-lock"; + return "no-lock"; case "ENOMEM": - throw "insufficient-memory"; + return "insufficient-memory"; case "ENOSPC": - throw "insufficient-space"; + return "insufficient-space"; case "ENOTDIR": - throw "not-directory"; + return "not-directory"; case "ENOTEMPTY": - throw "not-empty"; + return "not-empty"; case "ENOTRECOVERABLE": - throw "not-recoverable"; + return "not-recoverable"; case "ENOTSUP": - throw "unsupported"; + return "unsupported"; case "ENOTTY": - throw "no-tty"; + return "no-tty"; case "ENXIO": - throw "no-such-device"; + return "no-such-device"; case "EOVERFLOW": - throw "overflow"; + return "overflow"; case "EPERM": - throw "not-permitted"; + return "not-permitted"; case "EPIPE": - throw "pipe"; + return "pipe"; case "EROFS": - throw "read-only"; + return "read-only"; case "ESPIPE": - throw "invalid-seek"; + return "invalid-seek"; case "ETXTBSY": - throw "text-file-busy"; + return "text-file-busy"; case "EXDEV": - throw "cross-device"; + return "cross-device"; default: throw e; } diff --git a/src/cmd/run.js b/src/cmd/run.js index 802b72b0a..89ca381db 100644 --- a/src/cmd/run.js +++ b/src/cmd/run.js @@ -4,7 +4,7 @@ import { rm, stat, mkdir, writeFile, symlink } from 'node:fs/promises'; import { basename, resolve, extname } from 'node:path'; import { fork } from 'node:child_process'; import process from 'node:process'; -import { fileURLToPath, pathToFileURL } from 'node:url'; +import { fileURLToPath } from 'node:url'; import c from 'chalk-template'; export async function run (componentPath, args, opts) { @@ -14,7 +14,10 @@ export async function run (componentPath, args, opts) { const jcoImport = opts.jcoImport ? resolve(opts.jcoImport) : null; const name = basename(componentPath.slice(0, -extname(componentPath).length || Infinity)); - const outDir = await getTmpDir(); + const outDir = opts.jcoDir || await getTmpDir(); + if (opts.jcoDir) { + await mkdir(outDir, { recursive: true }); + } try { try { await transpile(componentPath, { @@ -23,7 +26,7 @@ export async function run (componentPath, args, opts) { noTypescript: true, wasiShim: true, outDir, - tracing: opts.jcoDebug + tracing: opts.jcoTrace }); } catch (e) { @@ -49,7 +52,13 @@ export async function run (componentPath, args, opts) { const modulesDir = resolve(outDir, 'node_modules', '@bytecodealliance'); await mkdir(modulesDir, { recursive: true }); - await symlink(preview2ShimPath, resolve(modulesDir, 'preview2-shim'), 'dir'); + + try { + await symlink(preview2ShimPath, resolve(modulesDir, 'preview2-shim'), 'dir'); + } catch (e) { + if (e.code !== 'EEXIST') + throw e; + } const runPath = resolve(outDir, '_run.js'); await writeFile(runPath, ` @@ -89,7 +98,7 @@ export async function run (componentPath, args, opts) { } finally { try { - if (!opts.jcoDebug) + if (!opts.jcoDir) await rm(outDir, { recursive: true }); } catch {} } diff --git a/src/jco.js b/src/jco.js index 0df9f976a..f850e80f1 100755 --- a/src/jco.js +++ b/src/jco.js @@ -56,7 +56,8 @@ program.command('run') .usage(' ') .helpOption(false) .argument('', 'Wasm command binary to run') - .option('--jco-debug', 'Enable call tracing debug output and retain output for debugging') + .option('--jco-dir ', 'Instead of using a temporary dir, set the output directory for the run command') + .option('--jco-trace', 'Enable call tracing') .option('--jco-import ', 'Custom module to import before the run executes to support custom environment setup') .argument('[args...]', 'Any CLI arguments to provide to the command') .action(asyncAction(run)); diff --git a/submodules/wasmtime b/submodules/wasmtime index 4fe4d3f9f..3068d372b 160000 --- a/submodules/wasmtime +++ b/submodules/wasmtime @@ -1 +1 @@ -Subproject commit 4fe4d3f9f43eb92734f5c54a950594a9a71065f9 +Subproject commit 3068d372ba446be77e9602d5294bf9a19bb9cd90 diff --git a/test/cli.js b/test/cli.js index c9155b940..a5a93870d 100644 --- a/test/cli.js +++ b/test/cli.js @@ -74,8 +74,8 @@ export async function cliTest (fixtures) { strictEqual(stderr, ''); const source = await readFile(`${outDir}/${name}.js`, 'utf8'); ok(source.includes('function toResultString(')); - ok(source.includes('console.trace(`[module="test:flavorful/test", function="f-list-in-record1"] call a')); - ok(source.includes('console.trace(`[module="test:flavorful/test", function="list-of-variants"] return result=${toResultString(ret)}`);')); + ok(source.includes('console.error(`[module="test:flavorful/test", function="f-list-in-record1"] call a')); + ok(source.includes('console.error(`[module="test:flavorful/test", function="list-of-variants"] return result=${toResultString(ret)}`);')); }); test('Transpile to JS', async () => { diff --git a/tests/generated/api_proxy.rs b/tests/generated/api_proxy.rs index 864a0f99d..43dd75a59 100644 --- a/tests/generated/api_proxy.rs +++ b/tests/generated/api_proxy.rs @@ -10,7 +10,6 @@ fn api_proxy() -> anyhow::Result<()> { let file_name = "api_proxy"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/api_proxy --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/api_proxy_streaming.rs b/tests/generated/api_proxy_streaming.rs index b84039677..36fee1e04 100644 --- a/tests/generated/api_proxy_streaming.rs +++ b/tests/generated/api_proxy_streaming.rs @@ -10,7 +10,6 @@ fn api_proxy_streaming() -> anyhow::Result<()> { let file_name = "api_proxy_streaming"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/api_proxy_streaming --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/api_reactor.rs b/tests/generated/api_reactor.rs index 0bcb745cb..f35924d23 100644 --- a/tests/generated/api_reactor.rs +++ b/tests/generated/api_reactor.rs @@ -10,7 +10,6 @@ fn api_reactor() -> anyhow::Result<()> { let file_name = "api_reactor"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/api_reactor --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/api_read_only.rs b/tests/generated/api_read_only.rs index 3a42a6d5e..11ccf1462 100644 --- a/tests/generated/api_read_only.rs +++ b/tests/generated/api_read_only.rs @@ -1,16 +1,15 @@ //! This file has been auto-generated, please do not modify manually //! To regenerate this file re-run `cargo xtask generate tests` from the project root -use tempdir::TempDir; -use xshell::{cmd, Shell}; +// use tempdir::TempDir; +// use xshell::{cmd, Shell}; #[test] fn api_read_only() -> anyhow::Result<()> { - let sh = Shell::new()?; - let file_name = "api_read_only"; - let tempdir = TempDir::new("{file_name}")?; - let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; - Ok(()) + // let sh = Shell::new()?; + // let file_name = "api_read_only"; + // let tempdir = TempDir::new("{file_name}")?; + // let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; + panic!("skipped"); // cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/api_read_only --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; + // Ok(()) } diff --git a/tests/generated/api_time.rs b/tests/generated/api_time.rs index f92ae5ab1..89eaae533 100644 --- a/tests/generated/api_time.rs +++ b/tests/generated/api_time.rs @@ -10,7 +10,6 @@ fn api_time() -> anyhow::Result<()> { let file_name = "api_time"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/fakeclocks.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/api_time --jco-import ./tests/virtualenvs/fakeclocks.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_args.rs b/tests/generated/cli_args.rs index 8fd27a1c0..bd0ed5865 100644 --- a/tests/generated/cli_args.rs +++ b/tests/generated/cli_args.rs @@ -10,7 +10,6 @@ fn cli_args() -> anyhow::Result<()> { let file_name = "cli_args"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_args --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_default_clocks.rs b/tests/generated/cli_default_clocks.rs index 291ab255f..832f7469f 100644 --- a/tests/generated/cli_default_clocks.rs +++ b/tests/generated/cli_default_clocks.rs @@ -10,7 +10,6 @@ fn cli_default_clocks() -> anyhow::Result<()> { let file_name = "cli_default_clocks"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_default_clocks --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_directory_list.rs b/tests/generated/cli_directory_list.rs index 03454c0b2..3b26c70d1 100644 --- a/tests/generated/cli_directory_list.rs +++ b/tests/generated/cli_directory_list.rs @@ -10,7 +10,6 @@ fn cli_directory_list() -> anyhow::Result<()> { let file_name = "cli_directory_list"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_directory_list --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_env.rs b/tests/generated/cli_env.rs index cd435af91..79020e6e5 100644 --- a/tests/generated/cli_env.rs +++ b/tests/generated/cli_env.rs @@ -10,7 +10,6 @@ fn cli_env() -> anyhow::Result<()> { let file_name = "cli_env"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_env --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_exit_default.rs b/tests/generated/cli_exit_default.rs index 297911b6e..92c2fb222 100644 --- a/tests/generated/cli_exit_default.rs +++ b/tests/generated/cli_exit_default.rs @@ -10,7 +10,6 @@ fn cli_exit_default() -> anyhow::Result<()> { let file_name = "cli_exit_default"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_exit_default --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_exit_failure.rs b/tests/generated/cli_exit_failure.rs index 108bca8b8..0b98cfd77 100644 --- a/tests/generated/cli_exit_failure.rs +++ b/tests/generated/cli_exit_failure.rs @@ -10,7 +10,6 @@ fn cli_exit_failure() -> anyhow::Result<()> { let file_name = "cli_exit_failure"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run().expect_err("test should exit with code 1"); + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_exit_failure --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run().expect_err("test should exit with code 1"); Ok(()) } diff --git a/tests/generated/cli_exit_panic.rs b/tests/generated/cli_exit_panic.rs index 21368ee0e..3d18fb48d 100644 --- a/tests/generated/cli_exit_panic.rs +++ b/tests/generated/cli_exit_panic.rs @@ -10,7 +10,6 @@ fn cli_exit_panic() -> anyhow::Result<()> { let file_name = "cli_exit_panic"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run().expect_err("test should exit with code 1"); + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_exit_panic --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run().expect_err("test should exit with code 1"); Ok(()) } diff --git a/tests/generated/cli_exit_success.rs b/tests/generated/cli_exit_success.rs index 82e12434e..427a8125e 100644 --- a/tests/generated/cli_exit_success.rs +++ b/tests/generated/cli_exit_success.rs @@ -10,7 +10,6 @@ fn cli_exit_success() -> anyhow::Result<()> { let file_name = "cli_exit_success"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_exit_success --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_export_cabi_realloc.rs b/tests/generated/cli_export_cabi_realloc.rs index 08697e8c0..6a2d214eb 100644 --- a/tests/generated/cli_export_cabi_realloc.rs +++ b/tests/generated/cli_export_cabi_realloc.rs @@ -10,7 +10,6 @@ fn cli_export_cabi_realloc() -> anyhow::Result<()> { let file_name = "cli_export_cabi_realloc"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_export_cabi_realloc --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_file_append.rs b/tests/generated/cli_file_append.rs index 6464e3d83..509cfbf1e 100644 --- a/tests/generated/cli_file_append.rs +++ b/tests/generated/cli_file_append.rs @@ -10,7 +10,6 @@ fn cli_file_append() -> anyhow::Result<()> { let file_name = "cli_file_append"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_file_append --jco-import ./tests/virtualenvs/bar-jabberwock.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_file_dir_sync.rs b/tests/generated/cli_file_dir_sync.rs index 0b7fe5d28..215dd8477 100644 --- a/tests/generated/cli_file_dir_sync.rs +++ b/tests/generated/cli_file_dir_sync.rs @@ -10,7 +10,6 @@ fn cli_file_dir_sync() -> anyhow::Result<()> { let file_name = "cli_file_dir_sync"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_file_dir_sync --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_file_read.rs b/tests/generated/cli_file_read.rs index 964f4d600..2212bfb31 100644 --- a/tests/generated/cli_file_read.rs +++ b/tests/generated/cli_file_read.rs @@ -10,7 +10,6 @@ fn cli_file_read() -> anyhow::Result<()> { let file_name = "cli_file_read"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_file_read --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_hello_stdout.rs b/tests/generated/cli_hello_stdout.rs index bab483f7b..cd69a72d1 100644 --- a/tests/generated/cli_hello_stdout.rs +++ b/tests/generated/cli_hello_stdout.rs @@ -10,7 +10,6 @@ fn cli_hello_stdout() -> anyhow::Result<()> { let file_name = "cli_hello_stdout"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_hello_stdout --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_splice_stdin.rs b/tests/generated/cli_splice_stdin.rs index 497c580a1..862a58ad5 100644 --- a/tests/generated/cli_splice_stdin.rs +++ b/tests/generated/cli_splice_stdin.rs @@ -10,7 +10,6 @@ fn cli_splice_stdin() -> anyhow::Result<()> { let file_name = "cli_splice_stdin"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_splice_stdin --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_stdin.rs b/tests/generated/cli_stdin.rs index bd298993a..2fa3ff8c6 100644 --- a/tests/generated/cli_stdin.rs +++ b/tests/generated/cli_stdin.rs @@ -10,7 +10,6 @@ fn cli_stdin() -> anyhow::Result<()> { let file_name = "cli_stdin"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_stdin --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/cli_stdio_write_flushes.rs b/tests/generated/cli_stdio_write_flushes.rs index 2c523ec69..11a1cba2f 100644 --- a/tests/generated/cli_stdio_write_flushes.rs +++ b/tests/generated/cli_stdio_write_flushes.rs @@ -10,7 +10,6 @@ fn cli_stdio_write_flushes() -> anyhow::Result<()> { let file_name = "cli_stdio_write_flushes"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/cli_stdio_write_flushes --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_content_length.rs b/tests/generated/http_outbound_request_content_length.rs index 47a4af4b1..7593b838d 100644 --- a/tests/generated/http_outbound_request_content_length.rs +++ b/tests/generated/http_outbound_request_content_length.rs @@ -10,7 +10,6 @@ fn http_outbound_request_content_length() -> anyhow::Result<()> { let file_name = "http_outbound_request_content_length"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_content_length --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_get.rs b/tests/generated/http_outbound_request_get.rs index 3c3c2c29a..624dba8ec 100644 --- a/tests/generated/http_outbound_request_get.rs +++ b/tests/generated/http_outbound_request_get.rs @@ -10,7 +10,6 @@ fn http_outbound_request_get() -> anyhow::Result<()> { let file_name = "http_outbound_request_get"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_get --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_invalid_dnsname.rs b/tests/generated/http_outbound_request_invalid_dnsname.rs index 45c9f42f1..52429e1cd 100644 --- a/tests/generated/http_outbound_request_invalid_dnsname.rs +++ b/tests/generated/http_outbound_request_invalid_dnsname.rs @@ -10,7 +10,6 @@ fn http_outbound_request_invalid_dnsname() -> anyhow::Result<()> { let file_name = "http_outbound_request_invalid_dnsname"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_invalid_dnsname --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_invalid_header.rs b/tests/generated/http_outbound_request_invalid_header.rs index 91f2a72c0..06ed752d4 100644 --- a/tests/generated/http_outbound_request_invalid_header.rs +++ b/tests/generated/http_outbound_request_invalid_header.rs @@ -10,7 +10,6 @@ fn http_outbound_request_invalid_header() -> anyhow::Result<()> { let file_name = "http_outbound_request_invalid_header"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_invalid_header --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_invalid_port.rs b/tests/generated/http_outbound_request_invalid_port.rs index 81ff28a32..3da57226f 100644 --- a/tests/generated/http_outbound_request_invalid_port.rs +++ b/tests/generated/http_outbound_request_invalid_port.rs @@ -10,7 +10,6 @@ fn http_outbound_request_invalid_port() -> anyhow::Result<()> { let file_name = "http_outbound_request_invalid_port"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_invalid_port --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_invalid_version.rs b/tests/generated/http_outbound_request_invalid_version.rs index 588229753..47037748b 100644 --- a/tests/generated/http_outbound_request_invalid_version.rs +++ b/tests/generated/http_outbound_request_invalid_version.rs @@ -10,7 +10,6 @@ fn http_outbound_request_invalid_version() -> anyhow::Result<()> { let file_name = "http_outbound_request_invalid_version"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_invalid_version --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_large_post.rs b/tests/generated/http_outbound_request_large_post.rs index 154b95efd..d03b596e2 100644 --- a/tests/generated/http_outbound_request_large_post.rs +++ b/tests/generated/http_outbound_request_large_post.rs @@ -10,7 +10,6 @@ fn http_outbound_request_large_post() -> anyhow::Result<()> { let file_name = "http_outbound_request_large_post"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_large_post --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_post.rs b/tests/generated/http_outbound_request_post.rs index 8585c1db6..8683357fa 100644 --- a/tests/generated/http_outbound_request_post.rs +++ b/tests/generated/http_outbound_request_post.rs @@ -10,7 +10,6 @@ fn http_outbound_request_post() -> anyhow::Result<()> { let file_name = "http_outbound_request_post"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_post --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_put.rs b/tests/generated/http_outbound_request_put.rs index 5052f8c65..af7fd3c91 100644 --- a/tests/generated/http_outbound_request_put.rs +++ b/tests/generated/http_outbound_request_put.rs @@ -10,7 +10,6 @@ fn http_outbound_request_put() -> anyhow::Result<()> { let file_name = "http_outbound_request_put"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_put --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_response_build.rs b/tests/generated/http_outbound_request_response_build.rs index 03956b2e5..d2347fc29 100644 --- a/tests/generated/http_outbound_request_response_build.rs +++ b/tests/generated/http_outbound_request_response_build.rs @@ -10,7 +10,6 @@ fn http_outbound_request_response_build() -> anyhow::Result<()> { let file_name = "http_outbound_request_response_build"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_response_build --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_unknown_method.rs b/tests/generated/http_outbound_request_unknown_method.rs index 26307e1f3..1cdc739e1 100644 --- a/tests/generated/http_outbound_request_unknown_method.rs +++ b/tests/generated/http_outbound_request_unknown_method.rs @@ -10,7 +10,6 @@ fn http_outbound_request_unknown_method() -> anyhow::Result<()> { let file_name = "http_outbound_request_unknown_method"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_unknown_method --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/http_outbound_request_unsupported_scheme.rs b/tests/generated/http_outbound_request_unsupported_scheme.rs index 4dd3b3c66..f242e8e39 100644 --- a/tests/generated/http_outbound_request_unsupported_scheme.rs +++ b/tests/generated/http_outbound_request_unsupported_scheme.rs @@ -10,7 +10,6 @@ fn http_outbound_request_unsupported_scheme() -> anyhow::Result<()> { let file_name = "http_outbound_request_unsupported_scheme"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_unsupported_scheme --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index c93614d45..e43c519c6 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -69,6 +69,7 @@ mod preview1_poll_oneoff_files; mod preview1_poll_oneoff_stdio; mod preview1_readlink; mod preview1_regular_file_isatty; +mod preview1_remove_directory; mod preview1_remove_directory_trailing_slashes; mod preview1_remove_nonempty_directory; mod preview1_renumber; diff --git a/tests/generated/preview1_big_random_buf.rs b/tests/generated/preview1_big_random_buf.rs index 74575d2c1..4df4cf868 100644 --- a/tests/generated/preview1_big_random_buf.rs +++ b/tests/generated/preview1_big_random_buf.rs @@ -10,7 +10,6 @@ fn preview1_big_random_buf() -> anyhow::Result<()> { let file_name = "preview1_big_random_buf"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_big_random_buf --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_clock_time_get.rs b/tests/generated/preview1_clock_time_get.rs index a0ee94bef..734134d7f 100644 --- a/tests/generated/preview1_clock_time_get.rs +++ b/tests/generated/preview1_clock_time_get.rs @@ -10,7 +10,6 @@ fn preview1_clock_time_get() -> anyhow::Result<()> { let file_name = "preview1_clock_time_get"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_clock_time_get --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_close_preopen.rs b/tests/generated/preview1_close_preopen.rs index ead944f95..e7d388d31 100644 --- a/tests/generated/preview1_close_preopen.rs +++ b/tests/generated/preview1_close_preopen.rs @@ -10,7 +10,6 @@ fn preview1_close_preopen() -> anyhow::Result<()> { let file_name = "preview1_close_preopen"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_close_preopen --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_dangling_fd.rs b/tests/generated/preview1_dangling_fd.rs index 772892ff5..28ae9d1a7 100644 --- a/tests/generated/preview1_dangling_fd.rs +++ b/tests/generated/preview1_dangling_fd.rs @@ -10,7 +10,6 @@ fn preview1_dangling_fd() -> anyhow::Result<()> { let file_name = "preview1_dangling_fd"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_dangling_fd --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_dangling_symlink.rs b/tests/generated/preview1_dangling_symlink.rs index 6fc75eb12..c21adc801 100644 --- a/tests/generated/preview1_dangling_symlink.rs +++ b/tests/generated/preview1_dangling_symlink.rs @@ -10,7 +10,6 @@ fn preview1_dangling_symlink() -> anyhow::Result<()> { let file_name = "preview1_dangling_symlink"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_dangling_symlink --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_dir_fd_op_failures.rs b/tests/generated/preview1_dir_fd_op_failures.rs index f4bed269b..165c6d504 100644 --- a/tests/generated/preview1_dir_fd_op_failures.rs +++ b/tests/generated/preview1_dir_fd_op_failures.rs @@ -10,7 +10,6 @@ fn preview1_dir_fd_op_failures() -> anyhow::Result<()> { let file_name = "preview1_dir_fd_op_failures"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_dir_fd_op_failures --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_directory_seek.rs b/tests/generated/preview1_directory_seek.rs index 9036720f2..1bf0839b7 100644 --- a/tests/generated/preview1_directory_seek.rs +++ b/tests/generated/preview1_directory_seek.rs @@ -10,7 +10,6 @@ fn preview1_directory_seek() -> anyhow::Result<()> { let file_name = "preview1_directory_seek"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_directory_seek --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_fd_advise.rs b/tests/generated/preview1_fd_advise.rs index d78daf51c..6501c6796 100644 --- a/tests/generated/preview1_fd_advise.rs +++ b/tests/generated/preview1_fd_advise.rs @@ -10,7 +10,6 @@ fn preview1_fd_advise() -> anyhow::Result<()> { let file_name = "preview1_fd_advise"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_advise --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_fd_filestat_get.rs b/tests/generated/preview1_fd_filestat_get.rs index 59a5461e2..07e4369ea 100644 --- a/tests/generated/preview1_fd_filestat_get.rs +++ b/tests/generated/preview1_fd_filestat_get.rs @@ -10,7 +10,6 @@ fn preview1_fd_filestat_get() -> anyhow::Result<()> { let file_name = "preview1_fd_filestat_get"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_filestat_get --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_fd_filestat_set.rs b/tests/generated/preview1_fd_filestat_set.rs index 4bceb4d4d..3e405b0f8 100644 --- a/tests/generated/preview1_fd_filestat_set.rs +++ b/tests/generated/preview1_fd_filestat_set.rs @@ -10,7 +10,6 @@ fn preview1_fd_filestat_set() -> anyhow::Result<()> { let file_name = "preview1_fd_filestat_set"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_filestat_set --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_fd_flags_set.rs b/tests/generated/preview1_fd_flags_set.rs index 4c95bfbfb..25cb55c85 100644 --- a/tests/generated/preview1_fd_flags_set.rs +++ b/tests/generated/preview1_fd_flags_set.rs @@ -10,7 +10,6 @@ fn preview1_fd_flags_set() -> anyhow::Result<()> { let file_name = "preview1_fd_flags_set"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_flags_set --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_fd_readdir.rs b/tests/generated/preview1_fd_readdir.rs index 8a8988c92..137586588 100644 --- a/tests/generated/preview1_fd_readdir.rs +++ b/tests/generated/preview1_fd_readdir.rs @@ -10,7 +10,6 @@ fn preview1_fd_readdir() -> anyhow::Result<()> { let file_name = "preview1_fd_readdir"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_readdir --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_file_allocate.rs b/tests/generated/preview1_file_allocate.rs index bd8ca7066..a9d9f0832 100644 --- a/tests/generated/preview1_file_allocate.rs +++ b/tests/generated/preview1_file_allocate.rs @@ -10,7 +10,6 @@ fn preview1_file_allocate() -> anyhow::Result<()> { let file_name = "preview1_file_allocate"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_file_allocate --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_file_pread_pwrite.rs b/tests/generated/preview1_file_pread_pwrite.rs index ac1e81966..d7aa18e1f 100644 --- a/tests/generated/preview1_file_pread_pwrite.rs +++ b/tests/generated/preview1_file_pread_pwrite.rs @@ -10,7 +10,6 @@ fn preview1_file_pread_pwrite() -> anyhow::Result<()> { let file_name = "preview1_file_pread_pwrite"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_file_pread_pwrite --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_file_seek_tell.rs b/tests/generated/preview1_file_seek_tell.rs index 648476173..d4433ea41 100644 --- a/tests/generated/preview1_file_seek_tell.rs +++ b/tests/generated/preview1_file_seek_tell.rs @@ -10,7 +10,6 @@ fn preview1_file_seek_tell() -> anyhow::Result<()> { let file_name = "preview1_file_seek_tell"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_file_seek_tell --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_file_truncation.rs b/tests/generated/preview1_file_truncation.rs index 74079e544..ad38c886e 100644 --- a/tests/generated/preview1_file_truncation.rs +++ b/tests/generated/preview1_file_truncation.rs @@ -10,7 +10,6 @@ fn preview1_file_truncation() -> anyhow::Result<()> { let file_name = "preview1_file_truncation"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_file_truncation --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_file_unbuffered_write.rs b/tests/generated/preview1_file_unbuffered_write.rs index 34e5080a4..ff79f73d5 100644 --- a/tests/generated/preview1_file_unbuffered_write.rs +++ b/tests/generated/preview1_file_unbuffered_write.rs @@ -10,7 +10,6 @@ fn preview1_file_unbuffered_write() -> anyhow::Result<()> { let file_name = "preview1_file_unbuffered_write"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_file_unbuffered_write --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_file_write.rs b/tests/generated/preview1_file_write.rs index 3f1632c20..943e21f6c 100644 --- a/tests/generated/preview1_file_write.rs +++ b/tests/generated/preview1_file_write.rs @@ -10,7 +10,6 @@ fn preview1_file_write() -> anyhow::Result<()> { let file_name = "preview1_file_write"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_file_write --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_interesting_paths.rs b/tests/generated/preview1_interesting_paths.rs index e455cb47d..39b1a5d3f 100644 --- a/tests/generated/preview1_interesting_paths.rs +++ b/tests/generated/preview1_interesting_paths.rs @@ -10,7 +10,6 @@ fn preview1_interesting_paths() -> anyhow::Result<()> { let file_name = "preview1_interesting_paths"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_interesting_paths --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_nofollow_errors.rs b/tests/generated/preview1_nofollow_errors.rs index 5eff2538f..2f57365e4 100644 --- a/tests/generated/preview1_nofollow_errors.rs +++ b/tests/generated/preview1_nofollow_errors.rs @@ -10,7 +10,6 @@ fn preview1_nofollow_errors() -> anyhow::Result<()> { let file_name = "preview1_nofollow_errors"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_nofollow_errors --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_overwrite_preopen.rs b/tests/generated/preview1_overwrite_preopen.rs index c8a4c1190..5376294e9 100644 --- a/tests/generated/preview1_overwrite_preopen.rs +++ b/tests/generated/preview1_overwrite_preopen.rs @@ -10,7 +10,6 @@ fn preview1_overwrite_preopen() -> anyhow::Result<()> { let file_name = "preview1_overwrite_preopen"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_overwrite_preopen --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_exists.rs b/tests/generated/preview1_path_exists.rs index d993aa64d..3d231020d 100644 --- a/tests/generated/preview1_path_exists.rs +++ b/tests/generated/preview1_path_exists.rs @@ -10,7 +10,6 @@ fn preview1_path_exists() -> anyhow::Result<()> { let file_name = "preview1_path_exists"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_exists --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_filestat.rs b/tests/generated/preview1_path_filestat.rs index 93c678983..bdc5b010d 100644 --- a/tests/generated/preview1_path_filestat.rs +++ b/tests/generated/preview1_path_filestat.rs @@ -10,7 +10,6 @@ fn preview1_path_filestat() -> anyhow::Result<()> { let file_name = "preview1_path_filestat"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_filestat --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_link.rs b/tests/generated/preview1_path_link.rs index e95ed7b10..05e630eba 100644 --- a/tests/generated/preview1_path_link.rs +++ b/tests/generated/preview1_path_link.rs @@ -10,7 +10,6 @@ fn preview1_path_link() -> anyhow::Result<()> { let file_name = "preview1_path_link"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_link --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_open_create_existing.rs b/tests/generated/preview1_path_open_create_existing.rs index a36d2ad52..8f733d4f3 100644 --- a/tests/generated/preview1_path_open_create_existing.rs +++ b/tests/generated/preview1_path_open_create_existing.rs @@ -10,7 +10,6 @@ fn preview1_path_open_create_existing() -> anyhow::Result<()> { let file_name = "preview1_path_open_create_existing"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_create_existing --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_open_dirfd_not_dir.rs b/tests/generated/preview1_path_open_dirfd_not_dir.rs index cf1fbb643..2001ddc9e 100644 --- a/tests/generated/preview1_path_open_dirfd_not_dir.rs +++ b/tests/generated/preview1_path_open_dirfd_not_dir.rs @@ -10,7 +10,6 @@ fn preview1_path_open_dirfd_not_dir() -> anyhow::Result<()> { let file_name = "preview1_path_open_dirfd_not_dir"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_dirfd_not_dir --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_open_missing.rs b/tests/generated/preview1_path_open_missing.rs index c61774edc..732a84c75 100644 --- a/tests/generated/preview1_path_open_missing.rs +++ b/tests/generated/preview1_path_open_missing.rs @@ -10,7 +10,6 @@ fn preview1_path_open_missing() -> anyhow::Result<()> { let file_name = "preview1_path_open_missing"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_missing --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_open_nonblock.rs b/tests/generated/preview1_path_open_nonblock.rs index 62a1c8517..ba9ffefb8 100644 --- a/tests/generated/preview1_path_open_nonblock.rs +++ b/tests/generated/preview1_path_open_nonblock.rs @@ -10,7 +10,6 @@ fn preview1_path_open_nonblock() -> anyhow::Result<()> { let file_name = "preview1_path_open_nonblock"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_nonblock --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_open_preopen.rs b/tests/generated/preview1_path_open_preopen.rs index 15410c255..d6c5d41bf 100644 --- a/tests/generated/preview1_path_open_preopen.rs +++ b/tests/generated/preview1_path_open_preopen.rs @@ -10,7 +10,6 @@ fn preview1_path_open_preopen() -> anyhow::Result<()> { let file_name = "preview1_path_open_preopen"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_preopen --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_open_read_write.rs b/tests/generated/preview1_path_open_read_write.rs index 35031d453..66e53a879 100644 --- a/tests/generated/preview1_path_open_read_write.rs +++ b/tests/generated/preview1_path_open_read_write.rs @@ -10,7 +10,6 @@ fn preview1_path_open_read_write() -> anyhow::Result<()> { let file_name = "preview1_path_open_read_write"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_read_write --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_rename.rs b/tests/generated/preview1_path_rename.rs index 2bd0e1f77..6f489ce37 100644 --- a/tests/generated/preview1_path_rename.rs +++ b/tests/generated/preview1_path_rename.rs @@ -10,7 +10,6 @@ fn preview1_path_rename() -> anyhow::Result<()> { let file_name = "preview1_path_rename"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_rename --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_rename_dir_trailing_slashes.rs b/tests/generated/preview1_path_rename_dir_trailing_slashes.rs index 4d976e093..8b88dd8dc 100644 --- a/tests/generated/preview1_path_rename_dir_trailing_slashes.rs +++ b/tests/generated/preview1_path_rename_dir_trailing_slashes.rs @@ -10,7 +10,6 @@ fn preview1_path_rename_dir_trailing_slashes() -> anyhow::Result<()> { let file_name = "preview1_path_rename_dir_trailing_slashes"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_rename_dir_trailing_slashes --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_rename_file_trailing_slashes.rs b/tests/generated/preview1_path_rename_file_trailing_slashes.rs index 888e431ba..74df12691 100644 --- a/tests/generated/preview1_path_rename_file_trailing_slashes.rs +++ b/tests/generated/preview1_path_rename_file_trailing_slashes.rs @@ -10,7 +10,6 @@ fn preview1_path_rename_file_trailing_slashes() -> anyhow::Result<()> { let file_name = "preview1_path_rename_file_trailing_slashes"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_rename_file_trailing_slashes --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_path_symlink_trailing_slashes.rs b/tests/generated/preview1_path_symlink_trailing_slashes.rs index 18262a956..c38a71f2b 100644 --- a/tests/generated/preview1_path_symlink_trailing_slashes.rs +++ b/tests/generated/preview1_path_symlink_trailing_slashes.rs @@ -10,7 +10,6 @@ fn preview1_path_symlink_trailing_slashes() -> anyhow::Result<()> { let file_name = "preview1_path_symlink_trailing_slashes"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_path_symlink_trailing_slashes --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_poll_oneoff_files.rs b/tests/generated/preview1_poll_oneoff_files.rs index 8a772b0ef..56222d4b2 100644 --- a/tests/generated/preview1_poll_oneoff_files.rs +++ b/tests/generated/preview1_poll_oneoff_files.rs @@ -10,7 +10,6 @@ fn preview1_poll_oneoff_files() -> anyhow::Result<()> { let file_name = "preview1_poll_oneoff_files"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_poll_oneoff_files --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_poll_oneoff_stdio.rs b/tests/generated/preview1_poll_oneoff_stdio.rs index 35768638e..8fae23025 100644 --- a/tests/generated/preview1_poll_oneoff_stdio.rs +++ b/tests/generated/preview1_poll_oneoff_stdio.rs @@ -10,7 +10,6 @@ fn preview1_poll_oneoff_stdio() -> anyhow::Result<()> { let file_name = "preview1_poll_oneoff_stdio"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_poll_oneoff_stdio --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_readlink.rs b/tests/generated/preview1_readlink.rs index 5055b7fa2..d35b43475 100644 --- a/tests/generated/preview1_readlink.rs +++ b/tests/generated/preview1_readlink.rs @@ -10,7 +10,6 @@ fn preview1_readlink() -> anyhow::Result<()> { let file_name = "preview1_readlink"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_readlink --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_regular_file_isatty.rs b/tests/generated/preview1_regular_file_isatty.rs index ea0077dae..691bdbf17 100644 --- a/tests/generated/preview1_regular_file_isatty.rs +++ b/tests/generated/preview1_regular_file_isatty.rs @@ -10,7 +10,6 @@ fn preview1_regular_file_isatty() -> anyhow::Result<()> { let file_name = "preview1_regular_file_isatty"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_regular_file_isatty --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_remove_directory.rs b/tests/generated/preview1_remove_directory.rs new file mode 100644 index 000000000..b74611e9a --- /dev/null +++ b/tests/generated/preview1_remove_directory.rs @@ -0,0 +1,15 @@ +//! This file has been auto-generated, please do not modify manually +//! To regenerate this file re-run `cargo xtask generate tests` from the project root + +use tempdir::TempDir; +use xshell::{cmd, Shell}; + +#[test] +fn preview1_remove_directory() -> anyhow::Result<()> { + let sh = Shell::new()?; + let file_name = "preview1_remove_directory"; + let tempdir = TempDir::new("{file_name}")?; + let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_remove_directory --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; + Ok(()) +} diff --git a/tests/generated/preview1_remove_directory_trailing_slashes.rs b/tests/generated/preview1_remove_directory_trailing_slashes.rs index 6b582bf79..5909589ba 100644 --- a/tests/generated/preview1_remove_directory_trailing_slashes.rs +++ b/tests/generated/preview1_remove_directory_trailing_slashes.rs @@ -10,7 +10,6 @@ fn preview1_remove_directory_trailing_slashes() -> anyhow::Result<()> { let file_name = "preview1_remove_directory_trailing_slashes"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_remove_directory_trailing_slashes --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_remove_nonempty_directory.rs b/tests/generated/preview1_remove_nonempty_directory.rs index 1f1a78051..56e15334d 100644 --- a/tests/generated/preview1_remove_nonempty_directory.rs +++ b/tests/generated/preview1_remove_nonempty_directory.rs @@ -10,7 +10,6 @@ fn preview1_remove_nonempty_directory() -> anyhow::Result<()> { let file_name = "preview1_remove_nonempty_directory"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_remove_nonempty_directory --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_renumber.rs b/tests/generated/preview1_renumber.rs index 638951073..a91b04458 100644 --- a/tests/generated/preview1_renumber.rs +++ b/tests/generated/preview1_renumber.rs @@ -10,7 +10,6 @@ fn preview1_renumber() -> anyhow::Result<()> { let file_name = "preview1_renumber"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_renumber --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_sched_yield.rs b/tests/generated/preview1_sched_yield.rs index 7bf31de45..da099b7c7 100644 --- a/tests/generated/preview1_sched_yield.rs +++ b/tests/generated/preview1_sched_yield.rs @@ -10,7 +10,6 @@ fn preview1_sched_yield() -> anyhow::Result<()> { let file_name = "preview1_sched_yield"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_sched_yield --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_stdio.rs b/tests/generated/preview1_stdio.rs index 137004869..99b4e2ff4 100644 --- a/tests/generated/preview1_stdio.rs +++ b/tests/generated/preview1_stdio.rs @@ -10,7 +10,6 @@ fn preview1_stdio() -> anyhow::Result<()> { let file_name = "preview1_stdio"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_stdio --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_stdio_isatty.rs b/tests/generated/preview1_stdio_isatty.rs index e65538bb8..2de9d190d 100644 --- a/tests/generated/preview1_stdio_isatty.rs +++ b/tests/generated/preview1_stdio_isatty.rs @@ -10,7 +10,6 @@ fn preview1_stdio_isatty() -> anyhow::Result<()> { let file_name = "preview1_stdio_isatty"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_stdio_isatty --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_stdio_not_isatty.rs b/tests/generated/preview1_stdio_not_isatty.rs index 979d8fb3b..d0a7151c5 100644 --- a/tests/generated/preview1_stdio_not_isatty.rs +++ b/tests/generated/preview1_stdio_not_isatty.rs @@ -10,7 +10,6 @@ fn preview1_stdio_not_isatty() -> anyhow::Result<()> { let file_name = "preview1_stdio_not_isatty"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/notty.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_stdio_not_isatty --jco-import ./tests/virtualenvs/notty.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_symlink_create.rs b/tests/generated/preview1_symlink_create.rs index ab2f215f0..09e48d82c 100644 --- a/tests/generated/preview1_symlink_create.rs +++ b/tests/generated/preview1_symlink_create.rs @@ -10,7 +10,6 @@ fn preview1_symlink_create() -> anyhow::Result<()> { let file_name = "preview1_symlink_create"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_symlink_create --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_symlink_filestat.rs b/tests/generated/preview1_symlink_filestat.rs index a059ccff4..f233fd259 100644 --- a/tests/generated/preview1_symlink_filestat.rs +++ b/tests/generated/preview1_symlink_filestat.rs @@ -10,7 +10,6 @@ fn preview1_symlink_filestat() -> anyhow::Result<()> { let file_name = "preview1_symlink_filestat"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_symlink_filestat --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_symlink_loop.rs b/tests/generated/preview1_symlink_loop.rs index 65a644fa4..732d46938 100644 --- a/tests/generated/preview1_symlink_loop.rs +++ b/tests/generated/preview1_symlink_loop.rs @@ -10,7 +10,6 @@ fn preview1_symlink_loop() -> anyhow::Result<()> { let file_name = "preview1_symlink_loop"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_symlink_loop --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_unicode_output.rs b/tests/generated/preview1_unicode_output.rs index 7223801b2..5c8a2c568 100644 --- a/tests/generated/preview1_unicode_output.rs +++ b/tests/generated/preview1_unicode_output.rs @@ -10,7 +10,6 @@ fn preview1_unicode_output() -> anyhow::Result<()> { let file_name = "preview1_unicode_output"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_unicode_output --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview1_unlink_file_trailing_slashes.rs b/tests/generated/preview1_unlink_file_trailing_slashes.rs index 6983520c9..c22eff182 100644 --- a/tests/generated/preview1_unlink_file_trailing_slashes.rs +++ b/tests/generated/preview1_unlink_file_trailing_slashes.rs @@ -10,7 +10,6 @@ fn preview1_unlink_file_trailing_slashes() -> anyhow::Result<()> { let file_name = "preview1_unlink_file_trailing_slashes"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview1_unlink_file_trailing_slashes --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_ip_name_lookup.rs b/tests/generated/preview2_ip_name_lookup.rs index dab671589..76a0857bd 100644 --- a/tests/generated/preview2_ip_name_lookup.rs +++ b/tests/generated/preview2_ip_name_lookup.rs @@ -10,7 +10,6 @@ fn preview2_ip_name_lookup() -> anyhow::Result<()> { let file_name = "preview2_ip_name_lookup"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_ip_name_lookup --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_random.rs b/tests/generated/preview2_random.rs index 4fde05dfe..1107b0bf6 100644 --- a/tests/generated/preview2_random.rs +++ b/tests/generated/preview2_random.rs @@ -10,7 +10,6 @@ fn preview2_random() -> anyhow::Result<()> { let file_name = "preview2_random"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_random --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_sleep.rs b/tests/generated/preview2_sleep.rs index c14cd72ad..7d7944103 100644 --- a/tests/generated/preview2_sleep.rs +++ b/tests/generated/preview2_sleep.rs @@ -10,7 +10,6 @@ fn preview2_sleep() -> anyhow::Result<()> { let file_name = "preview2_sleep"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_sleep --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_stream_pollable_correct.rs b/tests/generated/preview2_stream_pollable_correct.rs index b6030a21a..385a8db90 100644 --- a/tests/generated/preview2_stream_pollable_correct.rs +++ b/tests/generated/preview2_stream_pollable_correct.rs @@ -10,7 +10,6 @@ fn preview2_stream_pollable_correct() -> anyhow::Result<()> { let file_name = "preview2_stream_pollable_correct"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_stream_pollable_correct --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_stream_pollable_traps.rs b/tests/generated/preview2_stream_pollable_traps.rs index 914d045db..f3f429c87 100644 --- a/tests/generated/preview2_stream_pollable_traps.rs +++ b/tests/generated/preview2_stream_pollable_traps.rs @@ -10,7 +10,6 @@ fn preview2_stream_pollable_traps() -> anyhow::Result<()> { let file_name = "preview2_stream_pollable_traps"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run().expect_err("test should exit with code 1"); + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_stream_pollable_traps --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run().expect_err("test should exit with code 1"); Ok(()) } diff --git a/tests/generated/preview2_tcp_bind.rs b/tests/generated/preview2_tcp_bind.rs index bf48657cf..dc3aeb74b 100644 --- a/tests/generated/preview2_tcp_bind.rs +++ b/tests/generated/preview2_tcp_bind.rs @@ -10,7 +10,6 @@ fn preview2_tcp_bind() -> anyhow::Result<()> { let file_name = "preview2_tcp_bind"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_tcp_bind --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_tcp_connect.rs b/tests/generated/preview2_tcp_connect.rs index 25cf5cfd3..8d9e48154 100644 --- a/tests/generated/preview2_tcp_connect.rs +++ b/tests/generated/preview2_tcp_connect.rs @@ -10,7 +10,6 @@ fn preview2_tcp_connect() -> anyhow::Result<()> { let file_name = "preview2_tcp_connect"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_tcp_connect --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_tcp_sample_application.rs b/tests/generated/preview2_tcp_sample_application.rs index b23deed31..6a04c5b1e 100644 --- a/tests/generated/preview2_tcp_sample_application.rs +++ b/tests/generated/preview2_tcp_sample_application.rs @@ -10,7 +10,6 @@ fn preview2_tcp_sample_application() -> anyhow::Result<()> { let file_name = "preview2_tcp_sample_application"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_tcp_sample_application --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_tcp_sockopts.rs b/tests/generated/preview2_tcp_sockopts.rs index b5b3783cc..41c470f42 100644 --- a/tests/generated/preview2_tcp_sockopts.rs +++ b/tests/generated/preview2_tcp_sockopts.rs @@ -10,7 +10,6 @@ fn preview2_tcp_sockopts() -> anyhow::Result<()> { let file_name = "preview2_tcp_sockopts"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_tcp_sockopts --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_tcp_states.rs b/tests/generated/preview2_tcp_states.rs index 7ab03a93a..0576f3a0d 100644 --- a/tests/generated/preview2_tcp_states.rs +++ b/tests/generated/preview2_tcp_states.rs @@ -10,7 +10,6 @@ fn preview2_tcp_states() -> anyhow::Result<()> { let file_name = "preview2_tcp_states"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_tcp_states --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_udp_bind.rs b/tests/generated/preview2_udp_bind.rs index 7594f6318..d1538ae87 100644 --- a/tests/generated/preview2_udp_bind.rs +++ b/tests/generated/preview2_udp_bind.rs @@ -10,7 +10,6 @@ fn preview2_udp_bind() -> anyhow::Result<()> { let file_name = "preview2_udp_bind"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_udp_bind --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_udp_connect.rs b/tests/generated/preview2_udp_connect.rs index 5ecb0b1a6..e53d276a4 100644 --- a/tests/generated/preview2_udp_connect.rs +++ b/tests/generated/preview2_udp_connect.rs @@ -10,7 +10,6 @@ fn preview2_udp_connect() -> anyhow::Result<()> { let file_name = "preview2_udp_connect"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_udp_connect --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_udp_sample_application.rs b/tests/generated/preview2_udp_sample_application.rs index 853850289..17bda2c2e 100644 --- a/tests/generated/preview2_udp_sample_application.rs +++ b/tests/generated/preview2_udp_sample_application.rs @@ -10,7 +10,6 @@ fn preview2_udp_sample_application() -> anyhow::Result<()> { let file_name = "preview2_udp_sample_application"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_udp_sample_application --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_udp_sockopts.rs b/tests/generated/preview2_udp_sockopts.rs index 993985fad..fbd5b7fd6 100644 --- a/tests/generated/preview2_udp_sockopts.rs +++ b/tests/generated/preview2_udp_sockopts.rs @@ -10,7 +10,6 @@ fn preview2_udp_sockopts() -> anyhow::Result<()> { let file_name = "preview2_udp_sockopts"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_udp_sockopts --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/generated/preview2_udp_states.rs b/tests/generated/preview2_udp_states.rs index 362757603..c680c6c14 100644 --- a/tests/generated/preview2_udp_states.rs +++ b/tests/generated/preview2_udp_states.rs @@ -10,7 +10,6 @@ fn preview2_udp_states() -> anyhow::Result<()> { let file_name = "preview2_udp_states"; let tempdir = TempDir::new("{file_name}")?; let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'") - .run()?; + cmd!(sh, "./src/jco.js run --jco-dir ./tests/rundir/preview2_udp_states --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'").run()?; Ok(()) } diff --git a/tests/virtualenvs/bar-jabberwock.js b/tests/virtualenvs/bar-jabberwock.js new file mode 100644 index 000000000..a97eb38c7 --- /dev/null +++ b/tests/virtualenvs/bar-jabberwock.js @@ -0,0 +1,5 @@ +import { writeFile } from 'node:fs/promises'; +import { testDir } from './base.js'; +import { resolve } from 'node:path'; + +await writeFile(resolve(testDir, 'bar.txt'), `'Twas brillig, and the slithy toves.\n`); diff --git a/tests/virtualenvs/base.js b/tests/virtualenvs/base.js index 9e64fe68e..058622be6 100644 --- a/tests/virtualenvs/base.js +++ b/tests/virtualenvs/base.js @@ -1,6 +1,29 @@ import { _setEnv } from "@bytecodealliance/preview2-shim/cli"; +import { _setPreopens } from "@bytecodealliance/preview2-shim/filesystem"; +import { mkdtemp, writeFile, mkdir } from 'node:fs/promises'; +import { rmdirSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { tmpdir } from 'node:os'; + +export const testDir = await mkdtemp(tmpdir()); + +_setPreopens({ "/": testDir }); + +await mkdir(resolve(testDir, "sub")); + +await Promise.all([ + writeFile(resolve(testDir, 'bar.txt'), `And stood awhile in thought`), + writeFile(resolve(testDir, 'foo.txt'), `foo`), + writeFile(resolve(testDir, 'baz.txt'), `baz`), + writeFile(resolve(testDir, 'sub/wow.txt'), `wow`), + writeFile(resolve(testDir, 'sub/yay.txt'), `yay`), +]); _setEnv({ callooh: "callay", frabjous: "day", }); + +process.on('exit', () => { + rmdirSync(testDir, { recursive: true }); +}); diff --git a/tests/virtualenvs/scratch.js b/tests/virtualenvs/scratch.js new file mode 100644 index 000000000..708af2092 --- /dev/null +++ b/tests/virtualenvs/scratch.js @@ -0,0 +1,16 @@ +import { _setArgs } from "@bytecodealliance/preview2-shim/cli"; +import { _setPreopens } from "@bytecodealliance/preview2-shim/filesystem"; +import { mkdtemp } from 'node:fs/promises'; +import { rmdirSync } from 'node:fs'; +import { tmpdir } from 'node:os'; + +_setArgs(['_', '/']); + +export const testDir = await mkdtemp(tmpdir()); +// console.error(testDir); + +_setPreopens({ '/': testDir }); + +process.on('exit', () => { + rmdirSync(testDir, { recursive: true }); +}); diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index 08bd23dfa..05b04bcec 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -1,7 +1,7 @@ use std::fs; use xshell::{cmd, Shell}; -const DEBUG: bool = false; +const TRACE: bool = false; pub fn run() -> anyhow::Result<()> { let sh = Shell::new()?; @@ -52,31 +52,41 @@ fn generate_test(test_name: &str) -> String { let virtual_env = match test_name { "api_time" => "fakeclocks", "preview1_stdio_not_isatty" => "notty", + "cli_file_append" => "bar-jabberwock", + "preview1_close_preopen" | "preview1_dangling_fd" | "preview1_dangling_symlink" => { + "scratch" + } _ => "base", }; let should_error = match test_name { "cli_exit_failure" | "cli_exit_panic" | "preview2_stream_pollable_traps" => true, _ => false, }; + let skip = match test_name { + // this test currently stalls + "api_read_only" => true, + _ => false, + }; + let skip_comment = if skip { "// " } else { "" }; format!( r##"//! This file has been auto-generated, please do not modify manually //! To regenerate this file re-run `cargo xtask generate tests` from the project root -use tempdir::TempDir; -use xshell::{{cmd, Shell}}; +{skip_comment}use tempdir::TempDir; +{skip_comment}use xshell::{{cmd, Shell}}; #[test] fn {test_name}() -> anyhow::Result<()> {{ - let sh = Shell::new()?; - let file_name = "{test_name}"; - let tempdir = TempDir::new("{{file_name}}")?; - let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; - cmd!(sh, "./src/jco.js run {} --jco-import ./tests/virtualenvs/{virtual_env}.js {{wasi_file}} hello this '' 'is an argument' 'with 🚩 emoji'") - .run(){}; - Ok(()) + {skip_comment}let sh = Shell::new()?; + {skip_comment}let file_name = "{test_name}"; + {skip_comment}let tempdir = TempDir::new("{{file_name}}")?; + {skip_comment}let wasi_file = test_utils::compile(&sh, &tempdir, &file_name)?; + {}cmd!(sh, "./src/jco.js run {} --jco-dir ./tests/rundir/{test_name} --jco-import ./tests/virtualenvs/{virtual_env}.js {{wasi_file}} hello this '' 'is an argument' 'with 🚩 emoji'").run(){}; + {skip_comment}Ok(()) }} "##, - if DEBUG { "--jco-debug" } else { "" }, + if skip { "panic!(\"skipped\"); // " } else { "" }, + if TRACE { "--jco-trace" } else { "" }, if !should_error { "?" } else { From 4c1f7f3939f84aff34316287af3de0598f6297c6 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 20 Nov 2023 17:33:18 -0800 Subject: [PATCH 2/2] lint fixes --- packages/preview2-shim/lib/nodejs/filesystem.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/preview2-shim/lib/nodejs/filesystem.js b/packages/preview2-shim/lib/nodejs/filesystem.js index 6b25f16ed..340e2acbf 100644 --- a/packages/preview2-shim/lib/nodejs/filesystem.js +++ b/packages/preview2-shim/lib/nodejs/filesystem.js @@ -1,6 +1,5 @@ import { ioCall, - streams, inputStreamCreate, outputStreamCreate, } from "../io/worker-io.js";