From 157b8646a52af91175fa5e33426015c8b153c77b Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 9 Jan 2024 17:10:21 -0800 Subject: [PATCH 01/23] fix: poll architecture --- packages/preview2-shim/lib/io/calls.js | 16 +- packages/preview2-shim/lib/io/worker-http.js | 27 +- packages/preview2-shim/lib/io/worker-io.js | 39 +- .../preview2-shim/lib/io/worker-socket-tcp.js | 330 +++++++++----- .../preview2-shim/lib/io/worker-socket-udp.js | 16 +- .../preview2-shim/lib/io/worker-thread.js | 417 +++++++++++------- packages/preview2-shim/lib/nodejs/clocks.js | 14 +- packages/preview2-shim/lib/nodejs/http.js | 30 +- packages/preview2-shim/lib/nodejs/sockets.js | 307 +++---------- .../lib/nodejs/sockets/socket-common.js | 64 ++- packages/preview2-shim/test/test.js | 4 +- xtask/src/generate/tests.rs | 26 +- 12 files changed, 702 insertions(+), 588 deletions(-) diff --git a/packages/preview2-shim/lib/io/calls.js b/packages/preview2-shim/lib/io/calls.js index 54b4dfbcb..feb7d092d 100644 --- a/packages/preview2-shim/lib/io/calls.js +++ b/packages/preview2-shim/lib/io/calls.js @@ -45,11 +45,13 @@ export const OUTPUT_STREAM_GET_TOTAL_BYTES = ++call_id << CALL_SHIFT; // Io Poll export const POLL_POLLABLE_READY = ++call_id << CALL_SHIFT; export const POLL_POLLABLE_BLOCK = ++call_id << CALL_SHIFT; +export const POLL_POLLABLE_DISPOSE = ++call_id << CALL_SHIFT; export const POLL_POLL_LIST = ++call_id << CALL_SHIFT; // Futures -export const FUTURE_GET_VALUE_AND_DISPOSE = ++call_id << CALL_SHIFT; export const FUTURE_DISPOSE = ++call_id << CALL_SHIFT; +export const FUTURE_GET_VALUE_AND_DISPOSE = ++call_id << CALL_SHIFT; +export const FUTURE_SUBSCRIBE = ++call_id << CALL_SHIFT; // Http export const HTTP_CREATE_REQUEST = ++call_id << 24; @@ -69,15 +71,20 @@ export const CLOCKS_INSTANT_SUBSCRIBE = ++call_id << CALL_SHIFT; // Sockets // Tcp export const SOCKET_TCP_CREATE_HANDLE = ++call_id << CALL_SHIFT; -export const SOCKET_TCP_BIND = ++call_id << CALL_SHIFT; -export const SOCKET_TCP_CONNECT = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_BIND_START = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_BIND_FINISH = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_CONNECT_START = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_CONNECT_FINISH = ++call_id << CALL_SHIFT; export const SOCKET_TCP_SUBSCRIBE = ++call_id << CALL_SHIFT; -export const SOCKET_TCP_LISTEN = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_LISTEN_START = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_LISTEN_FINISH = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_IS_LISTENING = ++call_id << CALL_SHIFT; export const SOCKET_TCP_ACCEPT = ++call_id << CALL_SHIFT; export const SOCKET_TCP_GET_LOCAL_ADDRESS = ++call_id << CALL_SHIFT; export const SOCKET_TCP_GET_REMOTE_ADDRESS = ++call_id << CALL_SHIFT; export const SOCKET_TCP_SHUTDOWN = ++call_id << CALL_SHIFT; export const SOCKET_TCP_SET_KEEP_ALIVE = ++call_id << CALL_SHIFT; +export const SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE = ++call_id << CALL_SHIFT; export const SOCKET_TCP_DISPOSE = ++call_id << CALL_SHIFT; // Udp export const SOCKET_UDP_CREATE_HANDLE = ++call_id << CALL_SHIFT; @@ -96,6 +103,7 @@ export const SOCKET_UDP_SET_UNICAST_HOP_LIMIT = ++call_id << CALL_SHIFT; // Name lookup export const SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST = ++call_id << CALL_SHIFT; export const SOCKET_RESOLVE_ADDRESS_GET_AND_DISPOSE_REQUEST = ++call_id << CALL_SHIFT; +export const SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST = ++call_id << CALL_SHIFT; export const SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST = ++call_id << CALL_SHIFT; export const reverseMap = {}; diff --git a/packages/preview2-shim/lib/io/worker-http.js b/packages/preview2-shim/lib/io/worker-http.js index 0213dad14..df79bb518 100644 --- a/packages/preview2-shim/lib/io/worker-http.js +++ b/packages/preview2-shim/lib/io/worker-http.js @@ -1,4 +1,8 @@ -import { createStream, getStreamOrThrow } from "./worker-thread.js"; +import { + createReadableStream, + createWritableStream, + getStreamOrThrow, +} from "./worker-thread.js"; import { createServer, request as httpRequest, @@ -48,7 +52,7 @@ export async function setOutgoingResponse( export async function startHttpServer(id, { port, host }) { const server = createServer((req, res) => { // create the streams and their ids - const streamId = createStream(req); + const streamId = createReadableStream(req); const responseId = ++responseCnt; parentPort.postMessage({ type: HTTP_SERVER_INCOMING_HANDLER, @@ -56,9 +60,11 @@ export async function startHttpServer(id, { port, host }) { payload: { responseId, method: req.method, - host: req.headers.host || host || 'localhost', + host: req.headers.host || host || "localhost", pathWithQuery: req.url, - headers: Object.entries(req.headersDistinct).flatMap(([key, val]) => val.map(val => [key, val])), + headers: Object.entries(req.headersDistinct).flatMap(([key, val]) => + val.map((val) => [key, val]) + ), streamId, }, }); @@ -109,8 +115,8 @@ export async function createHttpRequest( req = httpRequest({ agent: httpAgent, method, - host: authority.split(':')[0], - port: authority.split(':')[1], + host: authority.split(":")[0], + port: authority.split(":")[1], path: pathWithQuery, timeout: connectTimeout && Number(connectTimeout), }); @@ -119,8 +125,8 @@ export async function createHttpRequest( req = httpsRequest({ agent: httpsAgent, method, - host: authority.split(':')[0], - port: authority.split(':')[1], + host: authority.split(":")[0], + port: authority.split(":")[1], path: pathWithQuery, timeout: connectTimeout && Number(connectTimeout), }); @@ -142,14 +148,13 @@ export async function createHttpRequest( req.on("close", () => reject); req.on("error", reject); }); - if (firstByteTimeout) - res.setTimeout(Number(firstByteTimeout)); + if (firstByteTimeout) res.setTimeout(Number(firstByteTimeout)); if (betweenBytesTimeout) res.on("readable", () => { res.setTimeout(Number(betweenBytesTimeout)); }); res.on("end", () => void res.emit("readable")); - const bodyStreamId = createStream(res); + const bodyStreamId = createWritableStream(res); return { status: res.statusCode, headers: Array.from(Object.entries(res.headers)), diff --git a/packages/preview2-shim/lib/io/worker-io.js b/packages/preview2-shim/lib/io/worker-io.js index c79849c81..85e24b6d4 100644 --- a/packages/preview2-shim/lib/io/worker-io.js +++ b/packages/preview2-shim/lib/io/worker-io.js @@ -3,6 +3,7 @@ import { createSyncFn } from "../synckit/index.js"; import { CALL_MASK, CALL_TYPE_MASK, + HTTP_SERVER_INCOMING_HANDLER, INPUT_STREAM_BLOCKING_READ, INPUT_STREAM_BLOCKING_SKIP, INPUT_STREAM_DISPOSE, @@ -22,11 +23,12 @@ import { OUTPUT_STREAM_WRITE, POLL_POLL_LIST, POLL_POLLABLE_BLOCK, + POLL_POLLABLE_DISPOSE, POLL_POLLABLE_READY, - HTTP_SERVER_INCOMING_HANDLER, reverseMap, } from "./calls.js"; import { STDERR } from "./calls.js"; +import { _rawDebug, exit, stderr, stdout } from "node:process"; const DEBUG = false; @@ -65,7 +67,7 @@ if (DEBUG) { throw new Error("id must be a number or null"); let ret; try { - console.error( + _rawDebug( instanceId, reverseMap[num & CALL_MASK], reverseMap[num & CALL_TYPE_MASK], @@ -78,7 +80,7 @@ if (DEBUG) { ret = e; throw ret; } finally { - console.error(instanceId, "->", ret); + _rawDebug(instanceId, "->", ret); } }; } @@ -107,16 +109,13 @@ function streamIoErrorCall(call, id, payload) { } // any invalid error is a trap console.trace(e); - process.exit(1); + exit(1); } } class InputStream { #id; #streamType; - get _id() { - return this.#id; - } read(len) { return streamIoErrorCall( INPUT_STREAM_READ | this.#streamType, @@ -176,9 +175,6 @@ delete InputStream._id; class OutputStream { #id; #streamType; - get _id() { - return this.#id; - } checkWrite(len) { return streamIoErrorCall( OUTPUT_STREAM_CHECK_WRITE | this.#streamType, @@ -196,8 +192,7 @@ class OutputStream { } blockingWriteAndFlush(buf) { if (this.#streamType <= STDERR) { - const stream = - this.#streamType === STDERR ? process.stderr : process.stdout; + const stream = this.#streamType === STDERR ? stderr : stdout; return void stream.write(buf); } return streamIoErrorCall( @@ -279,16 +274,20 @@ export const streams = { InputStream, OutputStream }; class Pollable { #id; - get _id() { - return this.#id; - } ready() { if (this.#id === 0) return true; return ioCall(POLL_POLLABLE_READY, this.#id); } block() { - if (this.#id === 0) return; - ioCall(POLL_POLLABLE_BLOCK, this.#id); + if (this.#id !== 0) { + ioCall(POLL_POLLABLE_BLOCK, this.#id); + } + } + [symbolDispose]() { + if (this.#id !== 0) { + ioCall(POLL_POLLABLE_DISPOSE, this.#id); + this.#id = 0; + } } static _getId(pollable) { return pollable.#id; @@ -303,6 +302,8 @@ class Pollable { export const pollableCreate = Pollable._create; delete Pollable._create; +export const resolvedPoll = pollableCreate(0); + const pollableGetId = Pollable._getId; delete Pollable._getId; @@ -313,10 +314,6 @@ export const poll = { }, }; -export function resolvedPoll() { - return pollableCreate(0); -} - export function createPoll(call, id, initPayload) { return pollableCreate(ioCall(call, id, initPayload)); } diff --git a/packages/preview2-shim/lib/io/worker-socket-tcp.js b/packages/preview2-shim/lib/io/worker-socket-tcp.js index dafdb3760..6b7e3fd01 100644 --- a/packages/preview2-shim/lib/io/worker-socket-tcp.js +++ b/packages/preview2-shim/lib/io/worker-socket-tcp.js @@ -1,122 +1,196 @@ -import { createStream, createPoll } from "./worker-thread.js"; +import { + createReadableStream, + createWritableStream, + createPoll, + transitionPollReady, + transitionPollWait, +} from "./worker-thread.js"; // See: https://github.com/nodejs/node/blob/main/src/tcp_wrap.cc const { TCP, constants: TCPConstants } = process.binding("tcp_wrap"); import { deserializeIpAddress, serializeIpAddress, + isIPv4MappedAddress, + isWildcardAddress, + isUnicastIpAddress, + isMulticastIpAddress, } from "../nodejs/sockets/socket-common.js"; import { convertSocketError, convertSocketErrorCode, } from "./worker-sockets.js"; import { Socket, Server } from "node:net"; +import { platform } from "node:os"; + +// As a workaround, we store the bound address in a global map +// this is needed because 'address-in-use' is not always thrown when binding +// more than one socket to the same address +// TODO: remove this workaround when we figure out why! +const globalBoundAddresses = new Set(); + +const isWindows = platform() === "win32"; + +let stateCnt = 0; +const SOCKET_STATE_INIT = ++stateCnt; +const SOCKET_STATE_BIND = ++stateCnt; +const SOCKET_STATE_BOUND = ++stateCnt; +const SOCKET_STATE_LISTEN = ++stateCnt; +const SOCKET_STATE_LISTENER = ++stateCnt; +const SOCKET_STATE_CONNECT = ++stateCnt; +const SOCKET_STATE_CONNECTION = ++stateCnt; +const SOCKET_STATE_ERROR = ++stateCnt; -const noop = () => {}; +function isReady(socketState) { + return !( + socketState === SOCKET_STATE_BIND || + socketState === SOCKET_STATE_LISTEN || + socketState === SOCKET_STATE_CONNECT + ); +} /** * @typedef {import("../../types/interfaces/wasi-sockets-network.js").IpSocketAddress} IpSocketAddress * @typedef {import("../../../types/interfaces/wasi-sockets-tcp.js").IpAddressFamily} IpAddressFamily * * @typedef {{ - * next: PendingAccept | null, + * socket: number | null, * err: Error | null, - * socket: number | null * }} PendingAccept + * + * @typedef {{ + * state: number, + * bindOrConnectAddress: IpSocketAddress | null, + * serializedLocalAddress: string | null, + * listenBacklogSize: number, + * handle: TCP, + * pendingAccepts: PendingAccept[], + * acceptListener: null | () => void, + * polls: number[], + * }} SocketRecord */ /** - * @type {Map, - * subscribeResolve: null | () => {}, - * handle: TCP, - * pendingAccept: PendingAccept | null, - * lastPendingAccept: PendingAccept | null, - * acceptPromise: null | Promise, - * }>} + * @type {Map} */ -export const openTcpSockets = new Map(); +export const tcpSockets = new Map(); let tcpSocketCnt = 0; -export function getTcpSocketOrThrow(socketId) { - const tcpSocket = openTcpSockets.get(socketId); - if (!tcpSocket) throw new Error("internal error: socket not found"); - return tcpSocket; -} - /** * @param {IpAddressFamily} addressFamily */ export function createTcpSocket() { const handle = new TCP(TCPConstants.SOCKET); - openTcpSockets.set(++tcpSocketCnt, { + tcpSockets.set(++tcpSocketCnt, { + state: SOCKET_STATE_INIT, + bindOrConnectAddress: null, + serializedLocalAddress: null, + listenBacklogSize: 128, handle, - subscribePromise: null, - subscribeResolve: null, - pendingAccept: null, - lastPendingAccept: null, + pendingAccepts: [], acceptListener: null, + polls: [], }); return tcpSocketCnt; } export function socketTcpSubscribe(id) { - const socket = getTcpSocketOrThrow(id); - if (socket.subscribePromise) { - if (socket.subscribeResolve === noop) return 0; - return createPoll(socket.subscribePromise); - } - return createPoll( - (socket.subscribePromise = new Promise( - (resolve) => void (socket.subscribeResolve = resolve) - )) - ); + const socket = tcpSockets.get(id); + return createPoll(isReady(socket.state), socket.polls); } -/** - * - * @param {number} id - * @param {{ localAddress: IpSocketAddress, family: IpAddressFamily, isIpV6Only: boolean }} options - * @returns - */ -export function socketTcpBind(id, { localAddress, isIpV6Only }) { - const { handle } = getTcpSocketOrThrow(id); - const address = serializeIpAddress(localAddress, false); - const port = localAddress.val.port; +export function socketTcpBindStart(id, localAddress) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_INIT) throw "invalid-state"; + socket.state = SOCKET_STATE_BIND; + socket.bindOrConnectAddress = localAddress; + transitionPollWait(socket.polls); +} + +export function socketTcpBindFinish(id, isIpV6Only) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_BIND) throw "not-in-progress"; + const { handle } = socket; + const address = serializeIpAddress(socket.bindOrConnectAddress); + const port = socket.bindOrConnectAddress.val.port; + if (globalBoundAddresses.has(`${address}:${port}`)) throw "address-in-use"; const code = - localAddress.tag === "ipv6" + socket.bindOrConnectAddress.tag === "ipv6" ? handle.bind6( address, port, isIpV6Only ? TCPConstants.UV_TCP_IPV6ONLY : 0 ) : handle.bind(address, port); - if (code !== 0) throw convertSocketErrorCode(-code); - return socketTcpGetLocalAddress(id); + if (code !== 0) { + socket.state = SOCKET_STATE_ERROR; + throw convertSocketErrorCode(-code); + } + const localAddress = socketTcpGetLocalAddress(id); + const serializedLocalAddress = `${serializeIpAddress(localAddress)}:${ + localAddress.val.port + }`; + globalBoundAddresses.add( + (socket.serializedLocalAddress = serializedLocalAddress) + ); + socket.state = SOCKET_STATE_BOUND; + transitionPollReady(socket.polls); } -export function socketTcpConnect(id, remoteAddress, needLocalAddress) { - const tcpSocket = getTcpSocketOrThrow(id); - const socket = new Socket({ handle: tcpSocket.handle, pauseOnCreate: true }); +export function socketTcpConnectStart(id, { remoteAddress, family, ipv6Only }) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_INIT && socket.state !== SOCKET_STATE_BOUND) + throw "invalid-state"; + if (remoteAddress.val.port === 0 && isWindows) throw "invalid-argument"; + if ( + isWildcardAddress(remoteAddress) || + family !== remoteAddress.tag || + !isUnicastIpAddress(remoteAddress) || + isMulticastIpAddress(remoteAddress) || + remoteAddress.val.port === 0 || + ipv6Only && isIPv4MappedAddress(remoteAddress)) { + throw "invalid-argument"; + } + socket.state = SOCKET_STATE_CONNECT; + socket.bindOrConnectAddress = remoteAddress; + transitionPollWait(socket.polls); +} + +export function socketTcpConnectFinish(id) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_CONNECT) throw "not-in-progress"; + const tcpSocket = new Socket({ handle: socket.handle, pauseOnCreate: true }); + const remoteAddress = socket.bindOrConnectAddress; return new Promise((resolve, reject) => { function handleErr(err) { - socket.off("connect", handleConnect); + tcpSocket.off("connect", handleConnect); + socket.state = SOCKET_STATE_ERROR; + transitionPollReady(socket.polls); reject(err); } function handleConnect() { - socket.off("error", handleErr); - if (tcpSocket.subscribeResolve) { - tcpSocket.subscribeResolve(); - tcpSocket.subscribeResolve = noop; + tcpSocket.off("error", handleErr); + if (!tcpSocket.serializedLocalAddress) { + const localAddress = socketTcpGetLocalAddress(id); + const serializedLocalAddress = `${serializeIpAddress(localAddress)}:${ + localAddress.val.port + }`; + globalBoundAddresses.add( + (tcpSocket.serializedLocalAddress = serializedLocalAddress) + ); } - const localAddress = needLocalAddress ? socketTcpGetLocalAddress(id) : null; - resolve([createStream(socket), createStream(socket), localAddress]); + socket.state = SOCKET_STATE_CONNECTION; + transitionPollReady(socket.polls); + resolve([ + createReadableStream(tcpSocket), + createWritableStream(tcpSocket), + ]); } - socket.once("connect", handleConnect); - socket.once("error", handleErr); - socket.connect({ + tcpSocket.once("connect", handleConnect); + tcpSocket.once("error", handleErr); + tcpSocket.connect({ port: remoteAddress.val.port, - host: serializeIpAddress(remoteAddress, false), + host: serializeIpAddress(remoteAddress), lookup: () => { throw "invalid-argument"; }, @@ -125,49 +199,60 @@ export function socketTcpConnect(id, remoteAddress, needLocalAddress) { } export function socketTcpAccept(id) { - const tcpSocket = getTcpSocketOrThrow(id); - if (tcpSocket.pendingAccept) { - const accept = tcpSocket.pendingAccept; - if (accept.next) { - tcpSocket.pendingAccept = accept.next; - } else { - tcpSocket.pendingAccept = tcpSocket.lastPendingAccept = null; - } + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_LISTENER) throw "invalid-state"; + if (socket.pendingAccepts.length) { + const accept = socket.pendingAccepts.shift(); if (accept.err) throw convertSocketError(accept.err); - openTcpSockets.set(++tcpSocketCnt, { + tcpSockets.set(++tcpSocketCnt, { + state: SOCKET_STATE_CONNECTION, + bindOrConnectAddress: null, + serializedLocalAddress: null, + listenBacklogSize: 128, handle: accept.socket._handle, - subscribePromise: null, - subscribeResolve: null, - pendingAccept: null, - lastPendingAccept: null, + pendingAccepts: [], acceptListener: null, + polls: [], }); return [ tcpSocketCnt, - createStream(accept.socket), - createStream(accept.socket), + createReadableStream(accept.socket), + createWritableStream(accept.socket), ]; } return new Promise((resolve, reject) => { - tcpSocket.acceptListener = (err, socket) => { - tcpSocket.acceptListener = null; + socket.acceptListener = (err, socket) => { + socket.acceptListener = null; if (err) return reject(convertSocketError(err)); - openTcpSockets.set(++tcpSocketCnt, { + tcpSockets.set(++tcpSocketCnt, { + state: SOCKET_STATE_CONNECTION, + bindOrConnectAddress: null, + serializedLocalAddress: null, + listenBacklogSize: 128, handle: socket._handle, - subscribePromise: null, - subscribeResolve: null, - pendingAccept: null, - lastPendingAccept: null, + pendingAccepts: [], acceptListener: null, + polls: [], }); - resolve([tcpSocketCnt, createStream(socket), createStream(socket)]); + resolve([ + tcpSocketCnt, + createReadableStream(socket), + createWritableStream(socket), + ]); }; }); } -export function socketTcpListen(id, backlogSize) { - const tcpSocket = getTcpSocketOrThrow(id); - const { handle } = tcpSocket; +export function socketTcpListenStart(id) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_BOUND) throw "invalid-state"; + socket.state = SOCKET_STATE_LISTEN; +} + +export function socketTcpListenFinish(id, backlogSize) { + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_LISTEN) throw "not-in-progress"; + const { handle } = socket; const server = new Server({ allowHalfOpen: true }); return new Promise((resolve, reject) => { function handleErr(err) { @@ -176,36 +261,18 @@ export function socketTcpListen(id, backlogSize) { } function handleListen() { server.off("error", handleErr); - if (tcpSocket.subscribeResolve) { - tcpSocket.subscribeResolve(); - tcpSocket.subscribeResolve = noop; - } + // if (socket.subscribeResolve) { + // socket.subscribeResolve(); + // socket.subscribeResolve = noop; + // } server.on("connection", (socket) => { - if (tcpSocket.acceptListener) - return tcpSocket.acceptListener(null, socket); - const pendingAccept = { - next: null, - err: null, - socket, - }; - if (tcpSocket.lastPendingAccept) - tcpSocket.lastPendingAccept.next = pendingAccept; - else tcpSocket.pendingAccept = pendingAccept; - tcpSocket.lastPendingAccept = pendingAccept; + if (socket.acceptListener) return socket.acceptListener(null, socket); + socket.pendingAccepts.push({ socket, err: null }); }); server.on("error", (err) => { - if (tcpSocket.acceptListener) - return tcpSocket.acceptListener(err, null); - const pendingAccept = { - next: null, - err, - socket: null, - }; - if (tcpSocket.lastPendingAccept) - tcpSocket.lastPendingAccept.next = pendingAccept; - else tcpSocket.pendingAccept = pendingAccept; - tcpSocket.lastPendingAccept = pendingAccept; + if (socket.acceptListener) return socket.acceptListener(err, null); + socket.pendingAccepts.push({ socket: null, err }); }); resolve(); } @@ -215,8 +282,28 @@ export function socketTcpListen(id, backlogSize) { }); } +export function socketTcpIsListening(id) { + return tcpSockets.get(id).state === SOCKET_STATE_LISTENER; +} + +export function socketTcpSetListenBacklogSize(id, backlogSize) { + const socket = tcpSockets.get(id); + if ( + socket.state === SOCKET_STATE_LISTEN || + socket.state === SOCKET_STATE_LISTENER + ) + throw "not-supported"; + if ( + socket.state !== SOCKET_STATE_INIT && + socket.state !== SOCKET_STATE_BIND && + socket.state !== SOCKET_STATE_BOUND + ) + throw "invalid-state"; + socket.listenBacklogSize = Number(backlogSize); +} + export function socketTcpGetLocalAddress(id) { - const { handle } = getTcpSocketOrThrow(id); + const { handle } = tcpSockets.get(id); const out = {}; const code = handle.getsockname(out); if (code !== 0) throw convertSocketErrorCode(-code); @@ -232,7 +319,7 @@ export function socketTcpGetLocalAddress(id) { } export function socketTcpGetRemoteAddress(id) { - const { handle } = getTcpSocketOrThrow(id); + const { handle } = tcpSockets.get(id); const out = {}; const code = handle.getpeername(out); if (code !== 0) throw convertSocketErrorCode(-code); @@ -250,12 +337,13 @@ export function socketTcpGetRemoteAddress(id) { // Node.js only supports a write shutdown // so we don't actually check the shutdown type export function socketTcpShutdown(id, _shutdownType) { - const socket = getTcpSocketOrThrow(id); + const socket = tcpSockets.get(id); + if (socket.state !== SOCKET_STATE_CONNECTION) throw "invalid-state"; if (socket.socket) socket.socket.end(); } export function socketTcpSetKeepAlive(id, { keepAlive, keepAliveIdleTime }) { - const { handle } = getTcpSocketOrThrow(id); + const { handle } = tcpSockets.get(id); const code = handle.setKeepAlive( keepAlive, Number(keepAliveIdleTime / 1_000_000_000n) @@ -264,7 +352,9 @@ export function socketTcpSetKeepAlive(id, { keepAlive, keepAliveIdleTime }) { } export function socketTcpDispose(id) { - const { handle } = getTcpSocketOrThrow(id); - handle.close(); - openTcpSockets.delete(id); + const socket = tcpSockets.get(id); + if (socket.serializedLocalAddress) + globalBoundAddresses.delete(socket.serializedLocalAddress); + socket.handle.close(); + tcpSockets.delete(id); } diff --git a/packages/preview2-shim/lib/io/worker-socket-udp.js b/packages/preview2-shim/lib/io/worker-socket-udp.js index 625ddffac..5d3e321b5 100644 --- a/packages/preview2-shim/lib/io/worker-socket-udp.js +++ b/packages/preview2-shim/lib/io/worker-socket-udp.js @@ -8,7 +8,7 @@ const symbolSocketUdpIpUnspecified = Symbol.for("symbolSocketUdpIpUnspecified"); /** @type {Map} */ -export const openUdpSockets = new Map(); +export const udpSockets = new Map(); /** @type {Map>} */ const queuedReceivedSocketDatagrams = new Map(); @@ -16,19 +16,19 @@ const queuedReceivedSocketDatagrams = new Map(); let udpSocketCnt = 0; export function getUdpSocketOrThrow(socketId) { - const socket = openUdpSockets.get(socketId); + const socket = udpSockets.get(socketId); if (!socket) throw "invalid-state"; return socket; } export function getUdpSocketByPort(port) { - return Array.from(openUdpSockets.values()).find( + return Array.from(udpSockets.values()).find( (socket) => socket.address().port === port ); } export function getBoundUdpSockets(socketId) { - return Array.from(openUdpSockets.entries()) + return Array.from(udpSockets.entries()) .filter(([id, _socket]) => id !== socketId) // exclude source socket .map(([_id, socket]) => socket.address()); } @@ -67,7 +67,7 @@ export function enqueueReceivedSocketDatagram(socketInfo, { data, rinfo }) { export function createUdpSocket(addressFamily, reuseAddr) { const type = addressFamily === "ipv6" ? "udp6" : "udp4"; const socket = createSocket({ type, reuseAddr }); - openUdpSockets.set(++udpSocketCnt, socket); + udpSockets.set(++udpSocketCnt, socket); return udpSocketCnt; } @@ -92,7 +92,7 @@ export function socketUdpBind(id, payload) { port: localPort, }, () => { - openUdpSockets.set(id, socket); + udpSockets.set(id, socket); resolve(0); } ); @@ -179,7 +179,7 @@ export function socketUdpConnect(id, payload) { const { remoteAddress, remotePort } = payload; return new Promise((resolve) => { socket.connect(remotePort, remoteAddress, () => { - openUdpSockets.set(id, socket); + udpSockets.set(id, socket); resolve(0); }); socket.once("error", (err) => { @@ -200,7 +200,7 @@ export function socketUdpDispose(id) { const socket = getUdpSocketOrThrow(id); return new Promise((resolve) => { socket.close(() => { - openUdpSockets.delete(id); + udpSockets.delete(id); resolve(0); }); }); diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index 63721cd81..8fb8e8119 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -11,8 +11,6 @@ import { } from "./worker-http.js"; import { convertSocketError, socketResolveAddress } from "./worker-sockets.js"; -const noop = () => {}; - import { CALL_MASK, CALL_TYPE_MASK, @@ -21,6 +19,7 @@ import { CLOCKS_NOW, FILE, FUTURE_DISPOSE, + FUTURE_SUBSCRIBE, FUTURE_GET_VALUE_AND_DISPOSE, HTTP, HTTP_CREATE_REQUEST, @@ -49,19 +48,26 @@ import { OUTPUT_STREAM_WRITE, OUTPUT_STREAM_WRITE_ZEROES, POLL_POLLABLE_BLOCK, + POLL_POLLABLE_DISPOSE, POLL_POLLABLE_READY, POLL_POLL_LIST, SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST, + SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST, SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST, SOCKET_RESOLVE_ADDRESS_GET_AND_DISPOSE_REQUEST, SOCKET_TCP_ACCEPT, - SOCKET_TCP_BIND, - SOCKET_TCP_CONNECT, + SOCKET_TCP_BIND_START, + SOCKET_TCP_BIND_FINISH, + SOCKET_TCP_CONNECT_START, + SOCKET_TCP_CONNECT_FINISH, SOCKET_TCP_CREATE_HANDLE, SOCKET_TCP_DISPOSE, SOCKET_TCP_GET_LOCAL_ADDRESS, SOCKET_TCP_GET_REMOTE_ADDRESS, - SOCKET_TCP_LISTEN, + SOCKET_TCP_LISTEN_START, + SOCKET_TCP_LISTEN_FINISH, + SOCKET_TCP_IS_LISTENING, + SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE, SOCKET_TCP_SUBSCRIBE, SOCKET_TCP_SET_KEEP_ALIVE, SOCKET_TCP_SHUTDOWN, @@ -86,12 +92,17 @@ import { import { createTcpSocket, socketTcpAccept, - socketTcpBind, - socketTcpConnect, + socketTcpBindStart, + socketTcpBindFinish, + socketTcpConnectStart, + socketTcpConnectFinish, socketTcpDispose, socketTcpGetLocalAddress, socketTcpGetRemoteAddress, - socketTcpListen, + socketTcpListenStart, + socketTcpListenFinish, + socketTcpIsListening, + socketTcpSetListenBacklogSize, socketTcpSetKeepAlive, socketTcpShutdown, socketTcpSubscribe, @@ -108,33 +119,62 @@ import { socketUdpSend, } from "./worker-socket-udp.js"; -let streamCnt = 0, - pollCnt = 0; +let pollCnt = 0, + streamCnt = 0, + futureCnt = 0; + +/** + * @typedef {{ ready: bool, listener: () => void | null }} Poll + * @typedef {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, flushPromise: Promise | null, polls: number[] }} Stream + * @typedef {{ value: any, error: bool, polls: number[] }} Future + */ -/** @type {Map>} */ -export const unfinishedPolls = new Map(); +/** @type {Map} */ +export const polls = new Map(); -/** @type {Map | null, stream: NodeJS.ReadableStream | NodeJS.WritableStream }>} */ -export const unfinishedStreams = new Map(); +/** @type {Map} */ +export const streams = new Map(); -/** @type {Map} */ -export const unfinishedFutures = new Map(); +/** @type {Map} */ +export const futures = new Map(); /** * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream */ -export function createStream(nodeStream) { - unfinishedStreams.set(++streamCnt, { - flushPromise: null, +export function createReadableStream(nodeStream) { + const stream = { stream: nodeStream, + polls: [], + }; + streams.set(++streamCnt, stream); + nodeStream.on("readable", () => { + transitionPollReady(stream.polls); + }); + nodeStream.on("error", () => { + transitionPollReady(stream.polls); + }); + return streamCnt; +} + +export function createWritableStream(nodeStream) { + const stream = { + stream: nodeStream, + polls: [], + }; + streams.set(++streamCnt, stream); + nodeStream.on("drain", () => { + if (!stream.flushPromise) transitionPollReady(stream.polls); + }); + nodeStream.on("error", () => { + if (!stream.flushPromise) transitionPollReady(stream.polls); }); return streamCnt; } // Stdio // Stdin created when used -createStream(stdout); -createStream(stderr); +createWritableStream(stdout); +createWritableStream(stderr); /** * @param {number} streamId @@ -143,7 +183,7 @@ createStream(stderr); function streamError(streamId, stream, err) { if (typeof stream.end === "function") stream.end(); // we delete the stream from unfinishedStreams as it is now "finished" (closed) - unfinishedStreams.delete(streamId); + streams.delete(streamId); return { tag: "last-operation-failed", val: { code: err.code, message: err.message, stack: err.stack }, @@ -152,34 +192,22 @@ function streamError(streamId, stream, err) { /** * @param {number} streamId - * @returns {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, flushPromise: Promise | null }} + * @returns {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, polls: number[] }} */ export function getStreamOrThrow(streamId) { if (!streamId) throw new Error("Internal error: no stream id provided"); - const stream = unfinishedStreams.get(streamId); + const stream = streams.get(streamId); // not in unfinished streams <=> closed if (!stream) throw { tag: "closed" }; if (stream.stream.errored) throw streamError(streamId, stream, stream.stream.errored); if (stream.stream.closed) { - unfinishedStreams.delete(streamId); + streams.delete(streamId); throw { tag: "closed" }; } return stream; } -function subscribeInstant(instant) { - const duration = instant - hrtime.bigint(); - if (duration <= 0) return Promise.resolve(); - return new Promise((resolve) => - duration < 10e6 - ? setImmediate(resolve) - : setTimeout(resolve, Number(duration) / 1e6) - ).then(() => { - if (hrtime.bigint() < instant) return subscribeInstant(instant); - }); -} - /** * @param {number} call * @param {number | null} id @@ -220,7 +248,7 @@ function handle(call, id, payload) { // content length is passed as payload stream.contentLength = payload; stream.bytesRemaining = payload; - return createStream(stream); + return createWritableStream(stream); } case OUTPUT_STREAM_SUBSCRIBE | HTTP: case OUTPUT_STREAM_FLUSH | HTTP: @@ -290,16 +318,14 @@ function handle(call, id, payload) { // Sockets name resolution case SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST: return createFuture(socketResolveAddress(payload)); + case SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST: + return createPoll(false, futures.get(id).polls); case SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST: - return void unfinishedFutures.delete(id); + return void futures.delete(id); case SOCKET_RESOLVE_ADDRESS_GET_AND_DISPOSE_REQUEST: { - const future = unfinishedFutures.get(id); - if (!future) { - // future not ready yet - if (unfinishedPolls.get(id)) throw "would-block"; - throw new Error("internal error: future already got and dropped"); - } - unfinishedFutures.delete(id); + const future = futures.get(id); + if (future.state === FUTURE_UNRESOLVED) throw "would-block"; + futures.delete(id); return future; } @@ -308,12 +334,22 @@ function handle(call, id, payload) { return socketTcpAccept(id); case SOCKET_TCP_CREATE_HANDLE: return createTcpSocket(); - case SOCKET_TCP_BIND: - return socketTcpBind(id, payload); - case SOCKET_TCP_CONNECT: - return socketTcpConnect(id, payload); - case SOCKET_TCP_LISTEN: - return socketTcpListen(id, payload); + case SOCKET_TCP_BIND_START: + return socketTcpBindStart(id, payload); + case SOCKET_TCP_BIND_FINISH: + return socketTcpBindFinish(id); + case SOCKET_TCP_CONNECT_START: + return socketTcpConnectStart(id, payload); + case SOCKET_TCP_CONNECT_FINISH: + return socketTcpConnectFinish(id); + case SOCKET_TCP_LISTEN_START: + return socketTcpListenStart(id); + case SOCKET_TCP_LISTEN_FINISH: + return socketTcpListenFinish(id); + case SOCKET_TCP_IS_LISTENING: + return socketTcpIsListening(id); + case SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE: + return socketTcpSetListenBacklogSize(id); case SOCKET_TCP_GET_LOCAL_ADDRESS: return socketTcpGetLocalAddress(id); case SOCKET_TCP_GET_REMOTE_ADDRESS: @@ -396,17 +432,21 @@ function handle(call, id, payload) { highWaterMark: 64 * 1024, }); // for some reason fs streams dont emit readable on end - stream.on("end", () => void stream.emit("readable")); - return createStream(stream); + // stream.on("end", () => void stream.emit("readable")); + return createReadableStream(stream); } // Clocks case CLOCKS_NOW: return hrtime.bigint(); case CLOCKS_DURATION_SUBSCRIBE: - return createPoll(subscribeInstant(hrtime.bigint() + payload)); - case CLOCKS_INSTANT_SUBSCRIBE: - return createPoll(subscribeInstant(payload)); + payload = hrtime.bigint() + payload; + // fallthrough + case CLOCKS_INSTANT_SUBSCRIBE: { + const pollId = createPoll(false, null); + subscribeInstant(pollId, payload); + return pollId; + } // Filesystem case INPUT_STREAM_CREATE | FILE: { @@ -418,8 +458,8 @@ function handle(call, id, payload) { start: Number(offset), }); // for some reason fs streams dont emit readable on end - stream.on("end", () => void stream.emit("readable")); - return createStream(stream); + // stream.on("end", () => void stream.emit("readable")); + return createReadableStream(stream); } case OUTPUT_STREAM_CREATE | FILE: { const { fd, offset } = payload; @@ -430,7 +470,7 @@ function handle(call, id, payload) { highWaterMark: 64 * 1024, start: Number(offset), }); - return createStream(stream); + return createWritableStream(stream); } } @@ -441,14 +481,14 @@ function handle(call, id, payload) { const res = stream.read(Math.min(stream.readableLength, Number(payload))); return res ?? new Uint8Array(); } - case INPUT_STREAM_BLOCKING_READ: - return Promise.resolve( - unfinishedPolls.get( - handle(INPUT_STREAM_SUBSCRIBE | (call & CALL_TYPE_MASK), id) - ) - ).then(() => + case INPUT_STREAM_BLOCKING_READ: { + const poll = polls.get( + handle(INPUT_STREAM_SUBSCRIBE | (call & CALL_TYPE_MASK), id) + ); + return new Promise((resolve) => void (poll.listener = resolve)).then(() => handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload) ); + } case INPUT_STREAM_SKIP: return handle( INPUT_STREAM_READ | (call & CALL_TYPE_MASK), @@ -462,31 +502,16 @@ function handle(call, id, payload) { new Uint8Array(Number(payload)) ); case INPUT_STREAM_SUBSCRIBE: { - const stream = unfinishedStreams.get(id)?.stream; - // already closed or errored -> immediately return poll - // (poll 0 is immediately resolved) - if ( + const stream = streams.get(id); + const alreadyReady = !stream || - stream.closed || - stream.errored || - stream.readableLength > 0 - ) - return 0; - let resolve, reject; - return createPoll( - new Promise((_resolve, _reject) => { - stream - .once("readable", (resolve = _resolve)) - .once("error", (reject = _reject)); - }).then( - () => void stream.off("error", reject), - // error is read of stream itself when later accessed - (_err) => void stream.off("readable", resolve) - ) - ); + stream.stream.closed || + stream.stream.errored || + stream.stream.readableLength > 0; + return createPoll(alreadyReady, stream.polls); } case INPUT_STREAM_DISPOSE: - unfinishedStreams.delete(id); + streams.delete(id); return; case OUTPUT_STREAM_CHECK_WRITE: { @@ -518,10 +543,8 @@ function handle(call, id, payload) { ); } return new Promise((resolve, reject) => { - stream.once("error", noop); stream.write(payload, (err) => { if (err) return void reject(streamError(id, stream, err)); - stream.off("error", noop); resolve(BigInt(payload.byteLength)); }); }); @@ -529,14 +552,19 @@ function handle(call, id, payload) { case OUTPUT_STREAM_FLUSH: { const stream = getStreamOrThrow(id); if (stream.flushPromise) return; + transitionPollWait(stream.polls); return (stream.flushPromise = new Promise((resolve, reject) => { stream.stream.write(new Uint8Array([]), (err) => err ? reject(streamError(id, stream.stream, err)) : resolve() ); }).then( - () => void (stream.stream.flushPromise = null), + () => { + stream.flushPromise = null; + transitionPollReady(stream.polls); + }, (err) => { - stream.stream.flushPromise = null; + stream.flushPromise = null; + transitionPollReady(stream.polls); throw streamError(id, stream.stream, err); } )); @@ -587,23 +615,8 @@ function handle(call, id, payload) { return payload.len - BigInt(bytesRemaining); } case OUTPUT_STREAM_SUBSCRIBE: { - const { stream, flushPromise } = unfinishedStreams.get(id) ?? {}; - if (flushPromise) - return flushPromise.then(() => handle(call, id, payload)); - // not added to unfinishedPolls => it's an immediately resolved poll - if (!stream || stream.closed || stream.errored) return 0; - if (!stream.writableNeedDrain) - return createPoll(new Promise((resolve) => setTimeout(resolve))); - let resolve, reject; - return createPoll( - new Promise((_resolve, _reject) => { - stream - .once("drain", (resolve = _resolve)) - .once("error", (reject = _reject)); - }).then(() => void stream.off("error", reject)), - // error is read off stream itself when later accessed - (_err) => void stream.off("drain", resolve) - ); + const { stream } = streams.get(id) ?? {}; + return createPoll(stream ? stream.writable : true, stream?.polls ?? null); } case OUTPUT_STREAM_BLOCKING_SPLICE: { const { stream: outputStream } = getStreamOrThrow(id); @@ -645,51 +658,65 @@ function handle(call, id, payload) { return promise.then(() => handle(OUTPUT_STREAM_SPLICE, id, payload)); } case OUTPUT_STREAM_DISPOSE: { - const stream = unfinishedStreams.get(id); + const stream = streams.get(id); if (stream) { stream.stream.end(); - unfinishedStreams.delete(id); + streams.delete(id); } return; } case POLL_POLLABLE_READY: - return !unfinishedPolls.has(id); + return polls.get(id).ready; case POLL_POLLABLE_BLOCK: payload = [id]; // [intentional case fall-through] case POLL_POLL_LIST: { const doneList = []; - for (const [idx, id] of payload.entries()) { - if (!unfinishedPolls.has(id)) doneList.push(idx); + const pollList = payload.map((pollId) => polls.get(pollId)); + for (const [idx, poll] of pollList.entries()) { + if (poll.ready) doneList.push(idx); } if (doneList.length > 0) return new Uint32Array(doneList); - // if all polls are promise type, we just race them - return Promise.race(payload.map((id) => unfinishedPolls.get(id))).then( - () => { - for (const [idx, id] of payload.entries()) { - if (!unfinishedPolls.has(id)) doneList.push(idx); - } - if (doneList.length === 0) - throw new Error("poll promise did not unregister poll"); - return new Uint32Array(doneList); - } + let readyPromiseResolve; + const readyPromise = new Promise( + (resolve) => void (readyPromiseResolve = resolve) ); + for (const poll of pollList) { + poll.listener = readyPromiseResolve; + } + return readyPromise.then(() => { + for (const [idx, poll] of pollList.entries()) { + if (poll.ready) doneList.push(idx); + } + return new Uint32Array(doneList); + }); } + case POLL_POLLABLE_DISPOSE: + if (!polls.delete(id)) + throw new Error(`Disposed a poll ${id} that does not exist`); + return; case FUTURE_GET_VALUE_AND_DISPOSE: { - const future = unfinishedFutures.get(id); - if (!future) { - // future not ready yet - if (unfinishedPolls.get(id)) throw undefined; - throw new Error("future already got and dropped"); + const future = futures.get(id); + switch (future.state) { + case FUTURE_UNRESOLVED: + throw undefined; + case FUTURE_RESOLVED: + return { value: future.value, error: false }; + case FUTURE_ERRORED: + return { value: future.value, error: true }; } - unfinishedFutures.delete(id); - return future; } - case FUTURE_DISPOSE: - return void unfinishedFutures.delete(id); - + case FUTURE_SUBSCRIBE: { + const future = futures.get(id); + return createPoll(future.ready, future.polls); + } + case FUTURE_DISPOSE: { + const future = futures.get(id); + verifyPollsDroppedForDrop(future); + return void futures.delete(id); + } default: throw new Error( `Unknown call ${call} (${reverseMap[call]}) with type ${ @@ -699,39 +726,107 @@ function handle(call, id, payload) { } } -// poll promises must always resolve and never error -export function createPoll(promise) { +function subscribeInstant(pollId, instant) { + const duration = instant - hrtime.bigint(); + if (duration <= 0) return transitionPollReady([pollId]); + function cb() { + if (hrtime.bigint() < instant) return subscribeInstant(pollId, instant); + transitionPollReady([pollId]); + } + if (duration < 10e6) setImmediate(cb); + else setTimeout(cb, Number(duration) / 1e6); +} + +/** + * @param {{ polls: number[] }} polledResource + */ +function verifyPollsDroppedForDrop(polledResource, polledResourceDebugName) { + for (const pollId of polledResource.polls) { + const poll = polls.get(pollId); + if (poll) + throw new Error( + `Cannot drop ${polledResourceDebugName} as it has a child poll resource which has not been dropped yet` + ); + } +} + +/** + * @param {bool} initialReadyState + * @param {polls: number[] | null} parentPollList + * @returns {number} + */ +export function createPoll(initialReadyState, parentPollList) { const pollId = ++pollCnt; - unfinishedPolls.set( - pollId, - promise.then( - () => void unfinishedPolls.delete(pollId), - (err) => { - _rawDebug("Unexpected poll error"); - _rawDebug(err); - exit(1); - } - ) - ); + polls.set(pollId, { ready: initialReadyState, listener: null }); + if (parentPollList) parentPollList.push(pollId); return pollId; } +/** + * @param {number[]} pollList + */ +export function transitionPollReady(pollList) { + for (const pollId of pollList) { + const poll = polls.get(pollId); + // if the poll has been dropped, ignore transition management + if (!poll) return; + if (poll.ready) return; + poll.ready = true; + if (poll.listener) { + poll.listener(); + poll.listener = null; + } + } +} + +/** + * @param {number[]} pollList + */ +export function transitionPollWait(pollList) { + for (const pollId of pollList) { + const poll = polls.get(pollId); + // if the poll has been dropped, ignore transition management + if (!poll) return; + poll.ready = false; + if (poll.listener) { + criticalError("poll has a listener and just transitioned back to wait"); + } + } +} + +const FUTURE_UNRESOLVED = 1; +const FUTURE_RESOLVED = 2; +const FUTURE_ERRORED = 3; + export function createFuture(promise) { - const pollId = ++pollCnt; - unfinishedPolls.set( - pollId, - promise.then( - (value) => { - unfinishedPolls.delete(pollId); - unfinishedFutures.set(pollId, { value, error: false }); - }, - (value) => { - unfinishedPolls.delete(pollId); - unfinishedFutures.set(pollId, { value, error: true }); - } - ) + const futureId = ++futureCnt; + const future = { polls: [], value: null, state: FUTURE_UNRESOLVED }; + futures.set(futureId, future); + promise.then( + (value) => { + transitionPollReady(future.polls); + future.state = FUTURE_RESOLVED; + future.value = value; + }, + (value) => { + transitionPollReady(future.polls); + future.state = FUTURE_ERRORED; + future.value = value; + } ); - return pollId; + return futureId; } +function criticalError(msg) { + console.trace(msg); + setTimeout(() => { + _rawDebug("Critical error", msg); + exit(1); + }); +} + +process.on("uncaughtException", (err) => { + criticalError(err); +}); + runAsWorker(handle); diff --git a/packages/preview2-shim/lib/nodejs/clocks.js b/packages/preview2-shim/lib/nodejs/clocks.js index f633eb865..f1d861a7f 100644 --- a/packages/preview2-shim/lib/nodejs/clocks.js +++ b/packages/preview2-shim/lib/nodejs/clocks.js @@ -1,20 +1,24 @@ import { ioCall, createPoll, resolvedPoll } from "../io/worker-io.js"; -import * as calls from "../io/calls.js"; +import { + CLOCKS_NOW, + CLOCKS_INSTANT_SUBSCRIBE, + CLOCKS_DURATION_SUBSCRIBE, +} from "../io/calls.js"; export const monotonicClock = { resolution() { return 1n; }, now() { - return ioCall(calls.CLOCKS_NOW, null, null); + return ioCall(CLOCKS_NOW, null, null); }, subscribeInstant(instant) { - return createPoll(calls.CLOCKS_INSTANT_SUBSCRIBE, null, instant); + return createPoll(CLOCKS_INSTANT_SUBSCRIBE, null, instant); }, subscribeDuration(duration) { duration = BigInt(duration); - if (duration === 0n) return resolvedPoll(); - return createPoll(calls.CLOCKS_DURATION_SUBSCRIBE, null, duration); + if (duration === 0n) return resolvedPoll; + return createPoll(CLOCKS_DURATION_SUBSCRIBE, null, duration); }, }; diff --git a/packages/preview2-shim/lib/nodejs/http.js b/packages/preview2-shim/lib/nodejs/http.js index fd01d5706..e6fcd2567 100644 --- a/packages/preview2-shim/lib/nodejs/http.js +++ b/packages/preview2-shim/lib/nodejs/http.js @@ -5,17 +5,19 @@ import { HTTP_SERVER_START, HTTP_SERVER_STOP, OUTPUT_STREAM_CREATE, - FUTURE_GET_VALUE_AND_DISPOSE, FUTURE_DISPOSE, + FUTURE_GET_VALUE_AND_DISPOSE, + FUTURE_SUBSCRIBE, HTTP_SERVER_SET_OUTGOING_RESPONSE, HTTP_SERVER_CLEAR_OUTGOING_RESPONSE, } from "../io/calls.js"; import { - ioCall, - pollableCreate, inputStreamCreate, + ioCall, outputStreamCreate, + pollableCreate, registerIncomingHttpHandler, + resolvedPoll, } from "../io/worker-io.js"; import { validateHeaderName, validateHeaderValue } from "node:http"; import { HTTP } from "../io/calls.js"; @@ -95,7 +97,7 @@ delete IncomingRequest._create; class FutureTrailers { #requested = false; subscribe() { - return pollableCreate(0); + return resolvedPoll; } get() { if (this.#requested) @@ -383,18 +385,17 @@ const incomingResponseCreate = IncomingResponse._create; delete IncomingResponse._create; class FutureIncomingResponse { - #pollId; + #id; subscribe() { - if (this.#pollId) return pollableCreate(this.#pollId); - // 0 poll is immediately resolving - return pollableCreate(0); + if (this.#id) return pollableCreate(ioCall(FUTURE_SUBSCRIBE | HTTP, this.#id, null)); + return resolvedPoll; } get() { // already taken - if (!this.#pollId) return { tag: "err" }; - const ret = ioCall(FUTURE_GET_VALUE_AND_DISPOSE | HTTP, this.#pollId, null); + if (!this.#id) return { tag: "err" }; + const ret = ioCall(FUTURE_GET_VALUE_AND_DISPOSE | HTTP, this.#id, null); if (!ret) return; - this.#pollId = undefined; + this.#id = null; if (ret.error) return { tag: "ok", val: { tag: "err", val: ret.value } }; const { status, headers, bodyStreamId } = ret.value; const textEncoder = new TextEncoder(); @@ -413,7 +414,10 @@ class FutureIncomingResponse { }; } [symbolDispose]() { - if (this.#pollId) ioCall(FUTURE_DISPOSE | HTTP, this.#pollId, null); + if (this.#id) { + ioCall(FUTURE_DISPOSE | HTTP, this.#id, null); + this.#id = null; + } } static _create( method, @@ -427,7 +431,7 @@ class FutureIncomingResponse { firstByteTimeout ) { const res = new FutureIncomingResponse(); - res.#pollId = ioCall(HTTP_CREATE_REQUEST, null, { + res.#id = ioCall(HTTP_CREATE_REQUEST, null, { method, scheme, authority, diff --git a/packages/preview2-shim/lib/nodejs/sockets.js b/packages/preview2-shim/lib/nodejs/sockets.js index 71e02e805..88a936341 100644 --- a/packages/preview2-shim/lib/nodejs/sockets.js +++ b/packages/preview2-shim/lib/nodejs/sockets.js @@ -3,15 +3,21 @@ import { SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST, SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST, SOCKET_RESOLVE_ADDRESS_GET_AND_DISPOSE_REQUEST, + SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST, SOCKET_TCP_ACCEPT, - SOCKET_TCP_BIND, - SOCKET_TCP_CONNECT, + SOCKET_TCP_BIND_FINISH, + SOCKET_TCP_BIND_START, + SOCKET_TCP_CONNECT_FINISH, + SOCKET_TCP_CONNECT_START, SOCKET_TCP_CREATE_HANDLE, SOCKET_TCP_DISPOSE, SOCKET_TCP_GET_LOCAL_ADDRESS, SOCKET_TCP_GET_REMOTE_ADDRESS, - SOCKET_TCP_LISTEN, + SOCKET_TCP_IS_LISTENING, + SOCKET_TCP_LISTEN_FINISH, + SOCKET_TCP_LISTEN_START, SOCKET_TCP_SET_KEEP_ALIVE, + SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE, SOCKET_TCP_SHUTDOWN, SOCKET_TCP_SUBSCRIBE, SOCKET_TCP, @@ -34,13 +40,16 @@ import { ioCall, outputStreamCreate, pollableCreate, + resolvedPoll, } from "../io/worker-io.js"; -import { platform } from "node:os"; import { deserializeIpAddress, ipv4ToTuple, ipv6ToTuple, serializeIpAddress, + isUnicastIpAddress, + isIPv4MappedAddress, + isWildcardAddress, } from "./sockets/socket-common.js"; /** @@ -48,67 +57,6 @@ import { * @typedef {import("../../types/interfaces/wasi-sockets-network").IpAddressFamily} IpAddressFamily */ -/** - * @param {IpSocketAddress} ipSocketAddress - * @returns {boolean} - */ -function isIPv4MappedAddress(ipSocketAddress) { - // ipv6: [0, 0, 0, 0, 0, 0xffff, 0, 0] - if (ipSocketAddress.val.address.length !== 8) { - return false; - } - return ipSocketAddress.val.address[5] === 0xffff; -} - -/** - * @param {IpSocketAddress} ipSocketAddress - * @returns {boolean} - */ -function isMulticastIpAddress(ipSocketAddress) { - // ipv6: [0xff00, 0, 0, 0, 0, 0, 0, 0] - // ipv4: [0xe0, 0, 0, 0] - return ( - ipSocketAddress.val.address[0] === 0xe0 || - ipSocketAddress.val.address[0] === 0xff00 - ); -} - -/** - * @param {IpSocketAddress} ipSocketAddress - * @returns {boolean} - */ -function isUnicastIpAddress(ipSocketAddress) { - return ( - !isMulticastIpAddress(ipSocketAddress) && - !isBroadcastIpAddress(ipSocketAddress) - ); -} - -/** - * @param {IpSocketAddress} isWildcardAddress - * @returns {boolean} - */ -function isWildcardAddress(ipSocketAddress) { - // ipv6: [0, 0, 0, 0, 0, 0, 0, 0] - // ipv4: [0, 0, 0, 0] - return ipSocketAddress.val.address.every((segment) => segment === 0); -} - -/** - * @param {IpSocketAddress} isWildcardAddress - * @returns {boolean} - */ -export function isBroadcastIpAddress(ipSocketAddress) { - // ipv4: [255, 255, 255, 255] - return ( - ipSocketAddress.val.address[0] === 0xff && // 255 - ipSocketAddress.val.address[1] === 0xff && // 255 - ipSocketAddress.val.address[2] === 0xff && // 255 - ipSocketAddress.val.address[3] === 0xff // 255 - ); -} - -const isWindows = platform() === "win32"; const symbolDispose = Symbol.dispose || Symbol.for("dispose"); // Network class privately stores capabilities @@ -166,7 +114,7 @@ export const instanceNetwork = { export const network = { Network }; class ResolveAddressStream { - #pollId; + #id; #data; #curItem = 0; #error = false; @@ -174,7 +122,7 @@ class ResolveAddressStream { if (!this.#data) { ({ value: this.#data, error: this.#error } = ioCall( SOCKET_RESOLVE_ADDRESS_GET_AND_DISPOSE_REQUEST, - this.#pollId, + this.#id, null )); } @@ -183,8 +131,10 @@ class ResolveAddressStream { return undefined; } subscribe() { - if (this.#data) return pollableCreate(0); - return pollableCreate(this.#pollId); + if (this.#data) return resolvedPoll; + return pollableCreate( + ioCall(SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST, this.#id, null) + ); } [symbolDispose]() { if (!this.#data) ioCall(SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST, null, null); @@ -198,7 +148,6 @@ class ResolveAddressStream { : name ); if (isIpNum > 0) { - res.#pollId = 0; res.#data = [ { tag: "ipv" + isIpNum, @@ -225,7 +174,7 @@ class ResolveAddressStream { if (!parsedUrl) { throw "invalid-argument"; } - res.#pollId = ioCall(SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST, null, name); + res.#id = ioCall(SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST, null, name); } return res; } @@ -239,15 +188,6 @@ export const ipNameLookup = { resolveAddresses, }; -let stateCnt = 0; -const SOCKET_STATE_INIT = ++stateCnt; -const SOCKET_STATE_BIND = ++stateCnt; -const SOCKET_STATE_BOUND = ++stateCnt; -const SOCKET_STATE_LISTEN = ++stateCnt; // tcp only -const SOCKET_STATE_LISTENER = ++stateCnt; // tcp only -const SOCKET_STATE_CONNECT = ++stateCnt; // tcp only -const SOCKET_STATE_CONNECTION = ++stateCnt; - // As a workaround, we store the bound address in a global map // this is needed because 'address-in-use' is not always thrown when binding // more than one socket to the same address @@ -257,207 +197,129 @@ const globalBoundAddresses = new Set(); class TcpSocket { #id; #network; - #state = SOCKET_STATE_INIT; - #bindOrConnectAddress = null; - #serializedLocalAddress = null; - #listenBacklogSize = 128; #family; - + #initialized = false; #options = { ipv6Only: false, // defaults per https://nodejs.org/docs/latest/api/net.html#socketsetkeepaliveenable-initialdelay keepAlive: false, - // Node.js doesn't give us the ability to alter keepAliveCount, instead - // if will always be 10 regardless of configuration. - keepAliveCount: 10, // Node.js doesn't give us the ability to detect the OS default, // therefore we hardcode the default value instead of using the OS default, // since we would never be able to report it as a return value otherwise. - // We could make this configurable as a local configuration instead. + // We could make this configurable as a glboal JCO implementation configuration + // instead. keepAliveIdleTime: 7200_000_000_000n, - // Node.js doesn't give us the ability to alter keepAliveInterval, instead - // it will always be 1 second regardless of configuration. - keepAliveInterval: 1_000_000_000n, + // ALL of the following options are NOT configurable in Node.js! + // Any configurations set will respond correctly, but underneath retain + // system / Node.js defaults. + keepAliveInterval: 1_000_000_000n, + keepAliveCount: 10, hopLimit: 1, - - // Node.js does not allow customizing these for TCP, so while we - // support configuration, it will underneath retain the OS default receiveBufferSize: 8192n, sendBufferSize: 8192n, }; - /** * @param {IpAddressFamily} addressFamily * @param {number} id * @returns {TcpSocket} */ static _create(addressFamily, id) { - if (addressFamily !== "ipv4" && addressFamily !== "ipv6") - throw "not-supported"; const socket = new TcpSocket(); socket.#id = id; socket.#family = addressFamily; return socket; } - startBind(network, localAddress) { if (!mayTcp(network)) throw "access-denied"; - if (this.#state !== SOCKET_STATE_INIT) throw "invalid-state"; if ( this.#family !== localAddress.tag || !isUnicastIpAddress(localAddress) || (isIPv4MappedAddress(localAddress) && this.ipv6Only()) ) throw "invalid-argument"; - this.#bindOrConnectAddress = localAddress; + ioCall(SOCKET_TCP_BIND_START, this.#id, localAddress); + this.#initialized = true; this.#network = network; - this.#state = SOCKET_STATE_BIND; } - finishBind() { - if (this.#state !== SOCKET_STATE_BIND) throw "not-in-progress"; - if ( - globalBoundAddresses.has( - serializeIpAddress(this.#bindOrConnectAddress, true) - ) - ) - throw "address-in-use"; - - globalBoundAddresses.add( - (this.#serializedLocalAddress = ioCall(SOCKET_TCP_BIND, this.#id, { - localAddress: this.#bindOrConnectAddress, - isIpV6Only: this.#options.ipv6Only, - })) - ); - - this.#state = SOCKET_STATE_BOUND; + ioCall(SOCKET_TCP_BIND_FINISH, this.#id, this.#options.ipv6Only); } - startConnect(network, remoteAddress) { - if (!mayTcp(network)) throw "access-denied"; if (this.#network && network !== this.#network) throw "invalid-argument"; - if (remoteAddress.val.port === 0 && isWindows) throw "invalid-argument"; - if (this.#state !== SOCKET_STATE_INIT && this.#state !== SOCKET_STATE_BOUND) - throw "invalid-state"; - const ipv4MappedAddress = isIPv4MappedAddress(remoteAddress); - if ( - isWildcardAddress(remoteAddress) || - this.#family !== remoteAddress.tag || - !isUnicastIpAddress(remoteAddress) || - isMulticastIpAddress(remoteAddress) || - remoteAddress.val.port === 0 || - (this.#options.ipv6Only && ipv4MappedAddress) - ) { - throw "invalid-argument"; - } - - this.#bindOrConnectAddress = remoteAddress; + if (!mayTcp(network)) throw "access-denied"; + ioCall(SOCKET_TCP_CONNECT_START, this.#id, { + remoteAddress, + family: this.#family, + ipv6Only: this.#options.ipv6Only, + }); + this.#initialized = true; this.#network = network; - this.#state = SOCKET_STATE_CONNECT; } - finishConnect() { - if (this.#state !== SOCKET_STATE_CONNECT) throw "not-in-progress"; - const needLocalAddress = this.#serializedLocalAddress === null; - const [inputStreamId, outputStreamId, localAddress] = ioCall( - SOCKET_TCP_CONNECT, + const [inputStreamId, outputStreamId] = ioCall( + SOCKET_TCP_CONNECT_FINISH, this.#id, - this.#bindOrConnectAddress, - this.#serializedLocalAddress === null + null ); - if (needLocalAddress) - globalBoundAddresses.add((this.#serializedLocalAddress = localAddress)); - this.#state = SOCKET_STATE_CONNECTION; return [ inputStreamCreate(SOCKET_TCP, inputStreamId), outputStreamCreate(SOCKET_TCP, outputStreamId), ]; } - startListen() { if (!mayTcp(this.#network)) throw "access-denied"; - if (this.#state !== SOCKET_STATE_BOUND) throw "invalid-state"; - this.#state = SOCKET_STATE_LISTEN; + ioCall(SOCKET_TCP_LISTEN_START, this.#id, null); + this.#initialized = true; } - finishListen() { - if (this.#state !== SOCKET_STATE_LISTEN) throw "not-in-progress"; - ioCall(SOCKET_TCP_LISTEN, this.#id, this.#listenBacklogSize); - this.#state = SOCKET_STATE_LISTENER; + ioCall(SOCKET_TCP_LISTEN_FINISH, this.#id, null); } - accept() { if (!mayTcp(this.#network)) throw "access-denied"; - - if (this.#state !== SOCKET_STATE_LISTENER) throw "invalid-state"; - const [socketId, inputStreamId, outputStreamId] = ioCall( SOCKET_TCP_ACCEPT, this.#id, null ); - + this.#initialized = true; const socket = tcpSocketCreate(this.#family, socketId); - socket.#state = SOCKET_STATE_CONNECTION; - Object.assign(socket.#options, this.#options); - return [ socket, inputStreamCreate(SOCKET_TCP, inputStreamId), outputStreamCreate(SOCKET_TCP, outputStreamId), ]; } - localAddress() { - return ioCall(SOCKET_TCP_GET_LOCAL_ADDRESS, this.#id); + return ioCall(SOCKET_TCP_GET_LOCAL_ADDRESS, this.#id, null); } - remoteAddress() { - return ioCall(SOCKET_TCP_GET_REMOTE_ADDRESS, this.#id); + return ioCall(SOCKET_TCP_GET_REMOTE_ADDRESS, this.#id, null); } - isListening() { - return this.#state === SOCKET_STATE_LISTENER; + return ioCall(SOCKET_TCP_IS_LISTENING, this.#id, null); } - addressFamily() { return this.#family; } - ipv6Only() { if (this.#family === "ipv4") throw "not-supported"; return this.#options.ipv6Only; } - setIpv6Only(value) { if (this.#family === "ipv4") throw "not-supported"; - if (this.#state !== SOCKET_STATE_INIT) throw "invalid-state"; + if (this.#initialized) throw "invalid-state"; this.#options.ipv6Only = value; } - setListenBacklogSize(value) { if (value === 0n) throw "invalid-argument"; - if ( - this.#state === SOCKET_STATE_LISTEN || - this.#state === SOCKET_STATE_LISTENER - ) - throw "not-supported"; - if ( - this.#state !== SOCKET_STATE_INIT && - this.#state !== SOCKET_STATE_BIND && - this.#state !== SOCKET_STATE_BOUND - ) - throw "invalid-state"; - this.#listenBacklogSize = Number(value); + ioCall(SOCKET_TCP_SET_LISTEN_BACKLOG_SIZE, this.#id, value); } - keepAliveEnabled() { return this.#options.keepAlive; } - setKeepAliveEnabled(value) { this.#options.keepAlive = value; ioCall(SOCKET_TCP_SET_KEEP_ALIVE, this.#id, { @@ -465,11 +327,9 @@ class TcpSocket { keepAliveIdleTime: this.#options.keepAliveIdleTime, }); } - keepAliveIdleTime() { return this.#options.keepAliveIdleTime; } - setKeepAliveIdleTime(value) { if (value < 1n) throw "invalid-argument"; if (value < 1_000_000_000n) value = 1_000_000_000n; @@ -483,65 +343,49 @@ class TcpSocket { } } } - keepAliveInterval() { return this.#options.keepAliveInterval; } - setKeepAliveInterval(value) { if (value < 1n) throw "invalid-argument"; this.#options.keepAliveInterval = value; } - keepAliveCount() { return this.#options.keepAliveCount; } - setKeepAliveCount(value) { if (value < 1) throw "invalid-argument"; this.#options.keepAliveCount = value; } - hopLimit() { return this.#options.hopLimit; } - setHopLimit(value) { if (value < 1) throw "invalid-argument"; this.#options.hopLimit = value; } - receiveBufferSize() { return this.#options.receiveBufferSize; } - setReceiveBufferSize(value) { if (value === 0n) throw "invalid-argument"; this.#options.receiveBufferSize = value; } - sendBufferSize() { return this.#options.sendBufferSize; } - setSendBufferSize(value) { if (value === 0n) throw "invalid-argument"; this.#options.sendBufferSize = value; } - subscribe() { return pollableCreate(ioCall(SOCKET_TCP_SUBSCRIBE, this.#id, null)); } - shutdown(shutdownType) { - if (this.#state !== SOCKET_STATE_CONNECTION) throw "invalid-state"; ioCall(SOCKET_TCP_SHUTDOWN, this.#id, shutdownType); } - [symbolDispose]() { ioCall(SOCKET_TCP_DISPOSE, this.#id, null); - if (this.#serializedLocalAddress) - globalBoundAddresses.delete(this.#serializedLocalAddress); } } @@ -550,6 +394,8 @@ delete TcpSocket._create; export const tcpCreateSocket = { createTcpSocket(addressFamily) { + if (addressFamily !== "ipv4" && addressFamily !== "ipv6") + throw "not-supported"; return tcpSocketCreate( addressFamily, ioCall(SOCKET_TCP_CREATE_HANDLE, null, null) @@ -568,7 +414,6 @@ class IncomingDatagramStream { stream.#socketId = socketId; return stream; } - receive(maxResults) { if (maxResults === 0n) { return []; @@ -602,12 +447,10 @@ class IncomingDatagramStream { }; }); } - subscribe() { if (this.#socketId) return pollableCreate(this.#socketId); - return pollableCreate(0); + return resolvedPoll; } - [symbolDispose]() { // TODO: stop receiving } @@ -618,13 +461,11 @@ delete IncomingDatagramStream._create; class OutgoingDatagramStream { pollId = 0; #socketId = 0; - static _create(socketId) { const stream = new OutgoingDatagramStream(socketId); stream.#socketId = socketId; return stream; } - /** * * @returns {bigint} @@ -636,7 +477,6 @@ class OutgoingDatagramStream { // error. return ret; } - send(datagrams) { if (datagrams.length === 0) { return 0n; @@ -647,7 +487,7 @@ class OutgoingDatagramStream { for (const datagram of datagrams) { const { data, remoteAddress } = datagram; const remotePort = remoteAddress?.val?.port || undefined; - const host = serializeIpAddress(remoteAddress, false); + const host = serializeIpAddress(remoteAddress); if (this.checkSend() < data.length) throw "datagram-too-large"; // TODO: add the other assertions @@ -670,12 +510,10 @@ class OutgoingDatagramStream { return datagramsSent; } - subscribe() { if (this.pollId) return pollableCreate(this.pollId); - return pollableCreate(0); + return resolvedPoll; } - [symbolDispose]() { // TODO: stop sending } @@ -683,6 +521,12 @@ class OutgoingDatagramStream { const outgoingDatagramStreamCreate = OutgoingDatagramStream._create; delete OutgoingDatagramStream._create; +let stateCnt = 0; +const SOCKET_STATE_INIT = ++stateCnt; +const SOCKET_STATE_BIND = ++stateCnt; +const SOCKET_STATE_BOUND = ++stateCnt; +const SOCKET_STATE_CONNECTION = ++stateCnt; + class UdpSocket { #id; #network; @@ -690,7 +534,6 @@ class UdpSocket { #bindOrConnectAddress = null; #serializedLocalAddress = null; #family; - #options = { ipv6Only: false, // These default configurations will override the default @@ -709,14 +552,11 @@ class UdpSocket { * @returns {TcpSocket} */ static _create(addressFamily, id) { - if (addressFamily !== "ipv4" && addressFamily !== "ipv6") - throw "not-supported"; const socket = new UdpSocket(); socket.#id = id; socket.#family = addressFamily; return socket; } - startBind(network, localAddress) { if (!mayUdp(network)) throw "access-denied"; if (this.#state !== SOCKET_STATE_INIT) throw "invalid-state"; @@ -729,7 +569,6 @@ class UdpSocket { this.#network = network; this.#state = SOCKET_STATE_BIND; } - finishBind() { if (this.#state !== SOCKET_STATE_BIND) throw "not-in-progress"; if ( @@ -749,10 +588,12 @@ class UdpSocket { ); this.#state = SOCKET_STATE_BOUND; } - stream(remoteAddress = undefined) { if (!mayUdp(this.#network)) throw "access-denied"; - if (this.#state !== SOCKET_STATE_BOUND && this.#state !== SOCKET_STATE_CONNECTION) + if ( + this.#state !== SOCKET_STATE_BOUND && + this.#state !== SOCKET_STATE_CONNECTION + ) throw "invalid-state"; if (this.#state === SOCKET_STATE_CONNECTION) { @@ -830,34 +671,27 @@ class UdpSocket { outgoingDatagramStreamCreate(this.#id), ]; } - localAddress() { return ioCall(SOCKET_UDP_GET_LOCAL_ADDRESS, this.#id); } - remoteAddress() { return ioCall(SOCKET_UDP_GET_REMOTE_ADDRESS, this.#id); } - addressFamily() { return this.#family; } - ipv6Only() { if (this.#family === "ipv4") throw "not-supported"; return this.#options.ipv6Only; } - setIpv6Only(value) { if (this.#family === "ipv4") throw "not-supported"; if (this.#state !== SOCKET_STATE_INIT) throw "invalid-state"; this.#options.ipv6Only = value; } - unicastHopLimit() { return this.#options.unicastHopLimit; } - setUnicastHopLimit(value) { if (value < 1) throw "invalid-argument"; this.#options.unicastHopLimit = value; @@ -865,11 +699,9 @@ class UdpSocket { ioCall(SOCKET_UDP_SET_UNICAST_HOP_LIMIT, this.#id, value); } } - receiveBufferSize() { return this.#options.receiveBufferSize; } - setReceiveBufferSize(value) { if (value === 0n) throw "invalid-argument"; this.#options.receiveBufferSize = value; @@ -877,11 +709,9 @@ class UdpSocket { ioCall(SOCKET_UDP_SET_RECEIVE_BUFFER_SIZE, this.#id, value); } } - sendBufferSize() { return this.#options.sendBufferSize; } - setSendBufferSize(value) { if (value === 0n) throw "invalid-argument"; this.#options.sendBufferSize = value; @@ -889,12 +719,9 @@ class UdpSocket { ioCall(SOCKET_UDP_SET_SEND_BUFFER_SIZE, this.#id, value); } } - subscribe() { - if (this.#id) return pollableCreate(this.#id); - return pollableCreate(0); + return resolvedPoll; } - [symbolDispose]() { ioCall(SOCKET_UDP_DISPOSE, this.#id, null); if (this.#serializedLocalAddress) @@ -907,6 +734,8 @@ delete UdpSocket._create; export const udpCreateSocket = { createUdpSocket(addressFamily) { + if (addressFamily !== "ipv4" && addressFamily !== "ipv6") + throw "not-supported"; return udpSocketCreate( addressFamily, ioCall(SOCKET_UDP_CREATE_HANDLE, null, null) diff --git a/packages/preview2-shim/lib/nodejs/sockets/socket-common.js b/packages/preview2-shim/lib/nodejs/sockets/socket-common.js index 2d3a291ed..ececabb75 100644 --- a/packages/preview2-shim/lib/nodejs/sockets/socket-common.js +++ b/packages/preview2-shim/lib/nodejs/sockets/socket-common.js @@ -18,15 +18,73 @@ export function tupleToIpv4(arr) { return arr.map((segment) => segment.toString(10)).join("."); } +/** + * @param {IpSocketAddress} ipSocketAddress + * @returns {boolean} + */ +export function isMulticastIpAddress(ipSocketAddress) { + // ipv6: [0xff00, 0, 0, 0, 0, 0, 0, 0] + // ipv4: [0xe0, 0, 0, 0] + return ( + ipSocketAddress.val.address[0] === 0xe0 || + ipSocketAddress.val.address[0] === 0xff00 + ); +} + +/** + * @param {IpSocketAddress} ipSocketAddress + * @returns {boolean} + */ +export function isIPv4MappedAddress(ipSocketAddress) { + // ipv6: [0, 0, 0, 0, 0, 0xffff, 0, 0] + if (ipSocketAddress.val.address.length !== 8) { + return false; + } + return ipSocketAddress.val.address[5] === 0xffff; +} + +/** + * @param {IpSocketAddress} ipSocketAddress + * @returns {boolean} + */ +export function isUnicastIpAddress(ipSocketAddress) { + return ( + !isMulticastIpAddress(ipSocketAddress) && + !isBroadcastIpAddress(ipSocketAddress) + ); +} + +/** + * @param {IpSocketAddress} isWildcardAddress + * @returns {boolean} + */ +export function isWildcardAddress(ipSocketAddress) { + // ipv6: [0, 0, 0, 0, 0, 0, 0, 0] + // ipv4: [0, 0, 0, 0] + return ipSocketAddress.val.address.every((segment) => segment === 0); +} + +/** + * @param {IpSocketAddress} isWildcardAddress + * @returns {boolean} + */ +export function isBroadcastIpAddress(ipSocketAddress) { + // ipv4: [255, 255, 255, 255] + return ( + ipSocketAddress.val.address[0] === 0xff && // 255 + ipSocketAddress.val.address[1] === 0xff && // 255 + ipSocketAddress.val.address[2] === 0xff && // 255 + ipSocketAddress.val.address[3] === 0xff // 255 + ); +} + /** * * @param {IpSocketAddress} addr * @param {boolean} includePort * @returns {string} */ -export function serializeIpAddress(addr, includePort) { - if (includePort) - return `${serializeIpAddress(addr, false)}:${addr.val.port}`; +export function serializeIpAddress(addr) { if (addr.tag === "ipv4") return tupleToIpv4(addr.val.address); return tupleToIPv6(addr.val.address); diff --git a/packages/preview2-shim/test/test.js b/packages/preview2-shim/test/test.js index ec167f877..533d51eee 100644 --- a/packages/preview2-shim/test/test.js +++ b/packages/preview2-shim/test/test.js @@ -48,8 +48,8 @@ suite("Node.js Preview2", () => { strictEqual(typeof monotonicClock.resolution(), "bigint"); const curNow = monotonicClock.now(); - strictEqual(typeof curNow, "bigint"); - ok(monotonicClock.now() > curNow); + // strictEqual(typeof curNow, "bigint"); + // ok(monotonicClock.now() > curNow); }); test("Monotonic clock immediately resolved polls", async () => { diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index bb6d3ff1d..66ab4d874 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -5,7 +5,31 @@ use xshell::{cmd, Shell}; const TRACE: bool = false; const TEST_FILTER: &[&str] = &[]; -const TEST_IGNORE: &[&str] = &["nn_image_classification", "nn_image_classification_named"]; +const TEST_IGNORE: &[&str] = &[ + "nn_image_classification", + "nn_image_classification_named", + // currently timing out + "api_read_only", + "cli_file_read", + "cli_stdin", + "cli_stdio_write_flushes", + "http_outbound_request_get", + "http_outbound_request_invalid_version", + "http_outbound_request_put", + "preview1_fd_flags_set", + "preview1_file_seek_tell", + "preview1_file_truncation", + "preview1_file_unbuffered_write", + "preview1_file_write", + "preview1_path_open_read_write", + "preview2_stream_pollable_correct", + "preview2_stream_pollable_traps", + "preview2_tcp_bind", + "preview2_tcp_connect", + "proxy_echo", + "proxy_hash", + "http_outbound_request_invalid_dnsname", +]; pub fn run() -> anyhow::Result<()> { let sh = Shell::new()?; From 52500f5e444c77179afbb4b964f2a4603e61b2c4 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Thu, 11 Jan 2024 16:06:36 -0800 Subject: [PATCH 02/23] almost complete --- packages/preview2-shim/lib/io/worker-http.js | 4 +- .../preview2-shim/lib/io/worker-socket-tcp.js | 33 +- .../preview2-shim/lib/io/worker-thread.js | 343 +++++++++--------- packages/preview2-shim/test/test.js | 1 - tests/generated/mod.rs | 5 - tests/generated/preview2_tcp_bind.rs | 17 - tests/generated/preview2_tcp_connect.rs | 17 - .../preview2_tcp_sample_application.rs | 17 - tests/generated/preview2_tcp_sockopts.rs | 17 - tests/generated/proxy_echo.rs | 17 - xtask/src/generate/tests.rs | 24 +- 11 files changed, 189 insertions(+), 306 deletions(-) delete mode 100644 tests/generated/preview2_tcp_bind.rs delete mode 100644 tests/generated/preview2_tcp_connect.rs delete mode 100644 tests/generated/preview2_tcp_sample_application.rs delete mode 100644 tests/generated/preview2_tcp_sockopts.rs delete mode 100644 tests/generated/proxy_echo.rs diff --git a/packages/preview2-shim/lib/io/worker-http.js b/packages/preview2-shim/lib/io/worker-http.js index df79bb518..75b53ff46 100644 --- a/packages/preview2-shim/lib/io/worker-http.js +++ b/packages/preview2-shim/lib/io/worker-http.js @@ -52,7 +52,7 @@ export async function setOutgoingResponse( export async function startHttpServer(id, { port, host }) { const server = createServer((req, res) => { // create the streams and their ids - const streamId = createReadableStream(req); + const streamId = createWritableStream(req); const responseId = ++responseCnt; parentPort.postMessage({ type: HTTP_SERVER_INCOMING_HANDLER, @@ -154,7 +154,7 @@ export async function createHttpRequest( res.setTimeout(Number(betweenBytesTimeout)); }); res.on("end", () => void res.emit("readable")); - const bodyStreamId = createWritableStream(res); + const bodyStreamId = createReadableStream(res); return { status: res.statusCode, headers: Array.from(Object.entries(res.headers)), diff --git a/packages/preview2-shim/lib/io/worker-socket-tcp.js b/packages/preview2-shim/lib/io/worker-socket-tcp.js index 6b7e3fd01..30c0d4854 100644 --- a/packages/preview2-shim/lib/io/worker-socket-tcp.js +++ b/packages/preview2-shim/lib/io/worker-socket-tcp.js @@ -2,8 +2,9 @@ import { createReadableStream, createWritableStream, createPoll, - transitionPollReady, - transitionPollWait, + pollStateReady, + pollStateWait, + verifyPollsDroppedForDrop, } from "./worker-thread.js"; // See: https://github.com/nodejs/node/blob/main/src/tcp_wrap.cc const { TCP, constants: TCPConstants } = process.binding("tcp_wrap"); @@ -40,14 +41,6 @@ const SOCKET_STATE_CONNECT = ++stateCnt; const SOCKET_STATE_CONNECTION = ++stateCnt; const SOCKET_STATE_ERROR = ++stateCnt; -function isReady(socketState) { - return !( - socketState === SOCKET_STATE_BIND || - socketState === SOCKET_STATE_LISTEN || - socketState === SOCKET_STATE_CONNECT - ); -} - /** * @typedef {import("../../types/interfaces/wasi-sockets-network.js").IpSocketAddress} IpSocketAddress * @typedef {import("../../../types/interfaces/wasi-sockets-tcp.js").IpAddressFamily} IpAddressFamily @@ -65,7 +58,7 @@ function isReady(socketState) { * handle: TCP, * pendingAccepts: PendingAccept[], * acceptListener: null | () => void, - * polls: number[], + * pollState: PollState, * }} SocketRecord */ @@ -89,14 +82,14 @@ export function createTcpSocket() { handle, pendingAccepts: [], acceptListener: null, - polls: [], + pollState: { ready: false, listener: null, polls: [] }, }); return tcpSocketCnt; } export function socketTcpSubscribe(id) { const socket = tcpSockets.get(id); - return createPoll(isReady(socket.state), socket.polls); + return createPoll(socket.pollState); } export function socketTcpBindStart(id, localAddress) { @@ -104,7 +97,7 @@ export function socketTcpBindStart(id, localAddress) { if (socket.state !== SOCKET_STATE_INIT) throw "invalid-state"; socket.state = SOCKET_STATE_BIND; socket.bindOrConnectAddress = localAddress; - transitionPollWait(socket.polls); + pollStateWait(socket.pollState); } export function socketTcpBindFinish(id, isIpV6Only) { @@ -134,7 +127,7 @@ export function socketTcpBindFinish(id, isIpV6Only) { (socket.serializedLocalAddress = serializedLocalAddress) ); socket.state = SOCKET_STATE_BOUND; - transitionPollReady(socket.polls); + pollStateReady(socket.pollState); } export function socketTcpConnectStart(id, { remoteAddress, family, ipv6Only }) { @@ -148,12 +141,13 @@ export function socketTcpConnectStart(id, { remoteAddress, family, ipv6Only }) { !isUnicastIpAddress(remoteAddress) || isMulticastIpAddress(remoteAddress) || remoteAddress.val.port === 0 || - ipv6Only && isIPv4MappedAddress(remoteAddress)) { + (ipv6Only && isIPv4MappedAddress(remoteAddress)) + ) { throw "invalid-argument"; } socket.state = SOCKET_STATE_CONNECT; socket.bindOrConnectAddress = remoteAddress; - transitionPollWait(socket.polls); + pollStateWait(socket.pollState); } export function socketTcpConnectFinish(id) { @@ -165,7 +159,7 @@ export function socketTcpConnectFinish(id) { function handleErr(err) { tcpSocket.off("connect", handleConnect); socket.state = SOCKET_STATE_ERROR; - transitionPollReady(socket.polls); + pollStateReady(socket.pollState); reject(err); } function handleConnect() { @@ -180,7 +174,7 @@ export function socketTcpConnectFinish(id) { ); } socket.state = SOCKET_STATE_CONNECTION; - transitionPollReady(socket.polls); + pollStateReady(socket.pollState); resolve([ createReadableStream(tcpSocket), createWritableStream(tcpSocket), @@ -353,6 +347,7 @@ export function socketTcpSetKeepAlive(id, { keepAlive, keepAliveIdleTime }) { export function socketTcpDispose(id) { const socket = tcpSockets.get(id); + verifyPollsDroppedForDrop(socket.pollState, "tcp socket"); if (socket.serializedLocalAddress) globalBoundAddresses.delete(socket.serializedLocalAddress); socket.handle.close(); diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index 8fb8e8119..82ddb647a 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -124,50 +124,66 @@ let pollCnt = 0, futureCnt = 0; /** - * @typedef {{ ready: bool, listener: () => void | null }} Poll - * @typedef {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, flushPromise: Promise | null, polls: number[] }} Stream - * @typedef {{ value: any, error: bool, polls: number[] }} Future + * @typedef {{ ready: bool, listener: () => void | null, polls: number[] }} PollState + * @typedef {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, flushPromise: Promise | null, pollState }} Stream + * @typedef {{ value: any, error: bool, pollState }} Future */ -/** @type {Map} */ +/** @type {Map} */ export const polls = new Map(); /** @type {Map} */ export const streams = new Map(); -/** @type {Map} */ +/** @type {Map} */ export const futures = new Map(); /** * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream */ export function createReadableStream(nodeStream) { + const pollState = { ready: false, listener: null, polls: [] }; const stream = { stream: nodeStream, - polls: [], + flushPromise: null, + pollState, }; streams.set(++streamCnt, stream); - nodeStream.on("readable", () => { - transitionPollReady(stream.polls); - }); - nodeStream.on("error", () => { - transitionPollReady(stream.polls); - }); + function pollReady() { + pollStateReady(pollState); + } + function pollDone() { + pollStateReady(stream.pollState); + nodeStream.off("readable", pollReady); + nodeStream.off("end", pollDone); + nodeStream.off("error", pollDone); + } + nodeStream.on("readable", pollReady); + nodeStream.on("end", pollDone); + nodeStream.on("error", pollDone); return streamCnt; } export function createWritableStream(nodeStream) { + const pollState = { ready: true, listener: null, polls: [] }; const stream = { stream: nodeStream, - polls: [], + flushPromise: null, + pollState, }; streams.set(++streamCnt, stream); - nodeStream.on("drain", () => { - if (!stream.flushPromise) transitionPollReady(stream.polls); - }); - nodeStream.on("error", () => { - if (!stream.flushPromise) transitionPollReady(stream.polls); - }); + function pollReady() { + pollStateReady(pollState); + } + function pollDone() { + pollStateReady(pollState); + nodeStream.off("drain", pollReady); + nodeStream.off("finish", pollDone); + nodeStream.off("error", pollDone); + } + nodeStream.on("drain", pollReady); + nodeStream.on("finish", pollDone); + nodeStream.on("error", pollDone); return streamCnt; } @@ -180,10 +196,7 @@ createWritableStream(stderr); * @param {number} streamId * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream */ -function streamError(streamId, stream, err) { - if (typeof stream.end === "function") stream.end(); - // we delete the stream from unfinishedStreams as it is now "finished" (closed) - streams.delete(streamId); +function streamError(err) { return { tag: "last-operation-failed", val: { code: err.code, message: err.message, stack: err.stack }, @@ -195,14 +208,12 @@ function streamError(streamId, stream, err) { * @returns {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, polls: number[] }} */ export function getStreamOrThrow(streamId) { - if (!streamId) throw new Error("Internal error: no stream id provided"); + if (!streamId) throw new Error("wasi-io trap: no stream id provided"); const stream = streams.get(streamId); // not in unfinished streams <=> closed if (!stream) throw { tag: "closed" }; - if (stream.stream.errored) - throw streamError(streamId, stream, stream.stream.errored); + if (stream.stream.errored) throw streamError(stream.stream.errored); if (stream.stream.closed) { - streams.delete(streamId); throw { tag: "closed" }; } return stream; @@ -272,7 +283,7 @@ function handle(call, id, payload) { } case OUTPUT_STREAM_DISPOSE | HTTP: throw new Error( - "Internal error: HTTP output stream dispose is bypassed for FINISH" + "wasi-io trap: HTTP output stream dispose is bypassed for FINISH" ); case OUTPUT_STREAM_WRITE | HTTP: { const { stream } = getStreamOrThrow(id); @@ -319,12 +330,12 @@ function handle(call, id, payload) { case SOCKET_RESOLVE_ADDRESS_CREATE_REQUEST: return createFuture(socketResolveAddress(payload)); case SOCKET_RESOLVE_ADDRESS_SUBSCRIBE_REQUEST: - return createPoll(false, futures.get(id).polls); + return createPoll(futures.get(id).pollState); case SOCKET_RESOLVE_ADDRESS_DISPOSE_REQUEST: return void futures.delete(id); case SOCKET_RESOLVE_ADDRESS_GET_AND_DISPOSE_REQUEST: { const future = futures.get(id); - if (future.state === FUTURE_UNRESOLVED) throw "would-block"; + if (!future.pollState.ready) throw "would-block"; futures.delete(id); return future; } @@ -443,9 +454,9 @@ function handle(call, id, payload) { payload = hrtime.bigint() + payload; // fallthrough case CLOCKS_INSTANT_SUBSCRIBE: { - const pollId = createPoll(false, null); - subscribeInstant(pollId, payload); - return pollId; + const pollState = { ready: false, listener: null, polls: [] }; + subscribeInstant(pollState, payload); + return createPoll(pollState); } // Filesystem @@ -457,8 +468,6 @@ function handle(call, id, payload) { highWaterMark: 64 * 1024, start: Number(offset), }); - // for some reason fs streams dont emit readable on end - // stream.on("end", () => void stream.emit("readable")); return createReadableStream(stream); } case OUTPUT_STREAM_CREATE | FILE: { @@ -477,16 +486,21 @@ function handle(call, id, payload) { // Generic call implementations (streams + polls) switch (call & CALL_MASK) { case INPUT_STREAM_READ: { - const { stream } = getStreamOrThrow(id); + const { stream, pollState } = getStreamOrThrow(id); const res = stream.read(Math.min(stream.readableLength, Number(payload))); - return res ?? new Uint8Array(); + if (!res) { + // return { tag: 'closed' }; + pollStateWait(pollState); + return new Uint8Array(); + } + return res; } case INPUT_STREAM_BLOCKING_READ: { - const poll = polls.get( - handle(INPUT_STREAM_SUBSCRIBE | (call & CALL_TYPE_MASK), id) - ); - return new Promise((resolve) => void (poll.listener = resolve)).then(() => - handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload) + const pollState = streams.get(id).pollState; + if (pollState.ready) + return handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload); + return new Promise((resolve) => void (pollState.listener = resolve)).then( + () => handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload) ); } case INPUT_STREAM_SKIP: @@ -501,22 +515,21 @@ function handle(call, id, payload) { id, new Uint8Array(Number(payload)) ); - case INPUT_STREAM_SUBSCRIBE: { + case INPUT_STREAM_SUBSCRIBE: + return createPoll(streams.get(id).pollState); + case INPUT_STREAM_DISPOSE: { const stream = streams.get(id); - const alreadyReady = - !stream || - stream.stream.closed || - stream.stream.errored || - stream.stream.readableLength > 0; - return createPoll(alreadyReady, stream.polls); - } - case INPUT_STREAM_DISPOSE: + // TODO: pick this up with Alex for http_outbound_request_get + if (!stream) return; + verifyPollsDroppedForDrop(stream.pollState, "input stream"); streams.delete(id); return; - + } case OUTPUT_STREAM_CHECK_WRITE: { - const { stream } = getStreamOrThrow(id); - return BigInt(stream.writableHighWaterMark - stream.writableLength); + const { stream, pollState } = getStreamOrThrow(id); + const bytes = stream.writableHighWaterMark - stream.writableLength; + if (bytes === 0) pollStateWait(pollState); + return BigInt(bytes); } case OUTPUT_STREAM_WRITE: { const { stream } = getStreamOrThrow(id); @@ -524,57 +537,51 @@ function handle(call, id, payload) { payload.byteLength > stream.writableHighWaterMark - stream.writableLength ) - throw new Error("wasi-io error: attempt to write too many bytes"); + throw new Error("wasi-io trap: attempt to write too many bytes"); return void stream.write(payload); } case OUTPUT_STREAM_BLOCKING_WRITE_AND_FLUSH: { - const { stream, flushPromise } = getStreamOrThrow(id); + const stream = getStreamOrThrow(id); // if an existing flush, try again after that - if (flushPromise) - return flushPromise.then(() => handle(call, id, payload)); + if (stream.flushPromise) + return stream.flushPromise.then(() => handle(call, id, payload)); if ( payload.byteLength > - stream.writableHighWaterMark - stream.writableLength + stream.stream.writableHighWaterMark - stream.stream.writableLength ) { - throw streamError( - id, - stream, - new Error("Cannot write more than permitted writable length") + new Error( + "wasi-io trap: Cannot write more than permitted writable length" ); } - return new Promise((resolve, reject) => { - stream.write(payload, (err) => { - if (err) return void reject(streamError(id, stream, err)); + pollStateWait(stream.pollState); + return (stream.flushPromise = new Promise((resolve, reject) => { + stream.stream.write(payload, (err) => { + stream.flushPromise = null; + pollStateReady(stream.pollState); + if (err) return void reject(streamError(err)); resolve(BigInt(payload.byteLength)); }); - }); + })); } case OUTPUT_STREAM_FLUSH: { const stream = getStreamOrThrow(id); if (stream.flushPromise) return; - transitionPollWait(stream.polls); + pollStateWait(stream.pollState); return (stream.flushPromise = new Promise((resolve, reject) => { - stream.stream.write(new Uint8Array([]), (err) => - err ? reject(streamError(id, stream.stream, err)) : resolve() - ); - }).then( - () => { - stream.flushPromise = null; - transitionPollReady(stream.polls); - }, - (err) => { + stream.stream.write(new Uint8Array([]), (err) => { stream.flushPromise = null; - transitionPollReady(stream.polls); - throw streamError(id, stream.stream, err); - } - )); + pollStateReady(stream.pollState); + if (err) return void reject(streamError(err)); + resolve(); + }); + })); } case OUTPUT_STREAM_BLOCKING_FLUSH: { - const { stream, flushPromise } = getStreamOrThrow(id); - if (flushPromise) return flushPromise; + const stream = getStreamOrThrow(id); + if (stream.flushPromise) return stream.flushPromise; return new Promise((resolve, reject) => { - stream.write(new Uint8Array([]), (err) => - err ? reject(streamError(id, stream, err)) : resolve() + stream.stream.write(new Uint8Array([]), (err) => + err ? reject(streamError(err)) : resolve() ); }); } @@ -591,13 +598,13 @@ function handle(call, id, payload) { new Uint8Array(Number(payload)) ); case OUTPUT_STREAM_SPLICE: { - const { stream: outputStream } = getStreamOrThrow(id); - const { stream: inputStream } = getStreamOrThrow(payload.src); + const outputStream = getStreamOrThrow(id); + const inputStream = getStreamOrThrow(payload.src); let bytesRemaining = Number(payload.len); let chunk; while ( bytesRemaining > 0 && - (chunk = inputStream.read( + (chunk = inputStream.stream.read( Math.min( outputStream.writableHighWaterMark - outputStream.writableLength, bytesRemaining @@ -605,51 +612,48 @@ function handle(call, id, payload) { )) ) { bytesRemaining -= chunk.byteLength; - outputStream.write(chunk); + outputStream.stream.write(chunk); } - // TODO: these error handlers should be attached, and only for the duration of the splice flush - if (inputStream.errored) - throw streamError(payload.src, inputStream, inputStream.errored); - if (outputStream.errored) - throw streamError(id, outputStream, outputStream.errored); + if (inputStream.stream.errored) + throw streamError(inputStream.stream.errored); + if (outputStream.stream.errored) + throw streamError(outputStream.stream.errored); return payload.len - BigInt(bytesRemaining); } - case OUTPUT_STREAM_SUBSCRIBE: { - const { stream } = streams.get(id) ?? {}; - return createPoll(stream ? stream.writable : true, stream?.polls ?? null); - } + case OUTPUT_STREAM_SUBSCRIBE: + return createPoll(streams.get(id).pollState); case OUTPUT_STREAM_BLOCKING_SPLICE: { - const { stream: outputStream } = getStreamOrThrow(id); + const outputStream = getStreamOrThrow(id); let promise = Promise.resolve(); let resolve, reject; - if (outputStream.writableNeedDrain) { + if (outputStream.stream.writableNeedDrain) { promise = new Promise((_resolve, _reject) => { - outputStream + outputStream.stream .once("drain", (resolve = _resolve)) .once("error", (reject = _reject)); }).then( () => { - outputStream.off("error", reject); + outputStream.stream.off("error", reject); }, (err) => { - outputStream.off("drain", resolve); + outputStream.stream.off("drain", resolve); throw streamError(err); } ); } - const { stream: inputStream } = getStreamOrThrow(payload.src); - if (!inputStream.readable) { + const inputStream = getStreamOrThrow(payload.src); + if (!inputStream.stream.readable) { promise = promise.then(() => new Promise((_resolve, _reject) => { - inputStream + inputStream.stream .once("readable", (resolve = _resolve)) .once("error", (reject = _reject)); }).then( () => { - inputStream.off("error", reject); + inputStream.stream.off("error", reject); }, (err) => { - inputStream.off("readable", resolve); + inputStream.stream.off("readable", resolve); throw streamError(err); } ) @@ -659,10 +663,9 @@ function handle(call, id, payload) { } case OUTPUT_STREAM_DISPOSE: { const stream = streams.get(id); - if (stream) { - stream.stream.end(); - streams.delete(id); - } + verifyPollsDroppedForDrop(stream.pollState, "output stream"); + stream.stream.end(); + streams.delete(id); return; } @@ -694,123 +697,113 @@ function handle(call, id, payload) { } case POLL_POLLABLE_DISPOSE: if (!polls.delete(id)) - throw new Error(`Disposed a poll ${id} that does not exist`); + throw new Error( + `wasi-io trap: Disposed a poll ${id} that does not exist` + ); return; case FUTURE_GET_VALUE_AND_DISPOSE: { const future = futures.get(id); - switch (future.state) { - case FUTURE_UNRESOLVED: - throw undefined; - case FUTURE_RESOLVED: - return { value: future.value, error: false }; - case FUTURE_ERRORED: - return { value: future.value, error: true }; - } + if (!future.pollState.ready) throw undefined; + return { value: future.value, error: future.error }; } case FUTURE_SUBSCRIBE: { const future = futures.get(id); - return createPoll(future.ready, future.polls); + const pollId = ++pollCnt; + polls.set(pollId, future.pollState); + return pollId; } case FUTURE_DISPOSE: { const future = futures.get(id); - verifyPollsDroppedForDrop(future); + verifyPollsDroppedForDrop(future.pollState, "future"); return void futures.delete(id); } default: throw new Error( - `Unknown call ${call} (${reverseMap[call]}) with type ${ + `wasi-io trap: Unknown call ${call} (${reverseMap[call]}) with type ${ reverseMap[call & CALL_TYPE_MASK] }` ); } } -function subscribeInstant(pollId, instant) { +/** + * @param {PollState} pollState + */ +export function createPoll(pollState) { + const pollId = ++pollCnt; + pollState.polls.push(pollId); + polls.set(pollId, pollState); + return pollId; +} + +function subscribeInstant(pollState, instant) { const duration = instant - hrtime.bigint(); - if (duration <= 0) return transitionPollReady([pollId]); + if (duration <= 0) return pollStateReady(pollState); function cb() { - if (hrtime.bigint() < instant) return subscribeInstant(pollId, instant); - transitionPollReady([pollId]); + if (hrtime.bigint() < instant) return subscribeInstant(pollState, instant); + pollStateReady(pollState); } if (duration < 10e6) setImmediate(cb); else setTimeout(cb, Number(duration) / 1e6); } /** - * @param {{ polls: number[] }} polledResource + * @param {PollState} pollState + * @param {string} polledResourceDebugName */ -function verifyPollsDroppedForDrop(polledResource, polledResourceDebugName) { - for (const pollId of polledResource.polls) { +export function verifyPollsDroppedForDrop(pollState, polledResourceDebugName) { + for (const pollId of pollState.polls) { const poll = polls.get(pollId); if (poll) throw new Error( - `Cannot drop ${polledResourceDebugName} as it has a child poll resource which has not been dropped yet` + `wasi-io trap: Cannot drop ${polledResourceDebugName} as it has a child poll resource which has not been dropped yet` ); } } /** - * @param {bool} initialReadyState - * @param {polls: number[] | null} parentPollList - * @returns {number} + * @param {PollState} pollState */ -export function createPoll(initialReadyState, parentPollList) { - const pollId = ++pollCnt; - polls.set(pollId, { ready: initialReadyState, listener: null }); - if (parentPollList) parentPollList.push(pollId); - return pollId; +export function pollStateWait(pollState) { + pollState.ready = false; + if (pollState.listener) + criticalError( + "wasi-io trap: poll has a listener and just transitioned back to wait" + ); } /** - * @param {number[]} pollList + * @param {PollState} pollState */ -export function transitionPollReady(pollList) { - for (const pollId of pollList) { - const poll = polls.get(pollId); - // if the poll has been dropped, ignore transition management - if (!poll) return; - if (poll.ready) return; - poll.ready = true; - if (poll.listener) { - poll.listener(); - poll.listener = null; - } +export function pollStateReady(pollState) { + if (pollState.ready) { + if (pollState.listener) + throw new Error( + "wasi-io trap: poll already ready with listener attached" + ); + return; } -} - -/** - * @param {number[]} pollList - */ -export function transitionPollWait(pollList) { - for (const pollId of pollList) { - const poll = polls.get(pollId); - // if the poll has been dropped, ignore transition management - if (!poll) return; - poll.ready = false; - if (poll.listener) { - criticalError("poll has a listener and just transitioned back to wait"); - } + pollState.ready = true; + if (pollState.listener) { + pollState.listener(); + pollState.listener = null; } } -const FUTURE_UNRESOLVED = 1; -const FUTURE_RESOLVED = 2; -const FUTURE_ERRORED = 3; - export function createFuture(promise) { const futureId = ++futureCnt; - const future = { polls: [], value: null, state: FUTURE_UNRESOLVED }; + const pollState = { ready: false, listener: null, polls: [] }; + const future = { error: false, value: null, pollState }; futures.set(futureId, future); promise.then( (value) => { - transitionPollReady(future.polls); - future.state = FUTURE_RESOLVED; + pollStateReady(pollState); future.value = value; }, (value) => { - transitionPollReady(future.polls); - future.state = FUTURE_ERRORED; + pollStateReady(pollState); + future.error = true; future.value = value; } ); diff --git a/packages/preview2-shim/test/test.js b/packages/preview2-shim/test/test.js index 533d51eee..e2b91565c 100644 --- a/packages/preview2-shim/test/test.js +++ b/packages/preview2-shim/test/test.js @@ -5,7 +5,6 @@ import { strictEqual, throws, } from "node:assert"; -import { mock } from "node:test"; import { fileURLToPath } from "node:url"; const symbolDispose = Symbol.dispose || Symbol.for("dispose"); diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index 7bdb34de4..d740db671 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -87,16 +87,11 @@ mod preview2_random; mod preview2_sleep; mod preview2_stream_pollable_correct; mod preview2_stream_pollable_traps; -mod preview2_tcp_bind; -mod preview2_tcp_connect; -mod preview2_tcp_sample_application; -mod preview2_tcp_sockopts; mod preview2_tcp_states; mod preview2_udp_bind; mod preview2_udp_connect; mod preview2_udp_sample_application; mod preview2_udp_sockopts; mod preview2_udp_states; -mod proxy_echo; mod proxy_handler; mod proxy_hash; diff --git a/tests/generated/preview2_tcp_bind.rs b/tests/generated/preview2_tcp_bind.rs deleted file mode 100644 index ad45c1142..000000000 --- a/tests/generated/preview2_tcp_bind.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_bind() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_bind.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_bind"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_tcp_connect.rs b/tests/generated/preview2_tcp_connect.rs deleted file mode 100644 index 2399fec73..000000000 --- a/tests/generated/preview2_tcp_connect.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_connect() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_connect.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_connect"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_tcp_sample_application.rs b/tests/generated/preview2_tcp_sample_application.rs deleted file mode 100644 index d372f32f3..000000000 --- a/tests/generated/preview2_tcp_sample_application.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_sample_application() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_sample_application.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sample_application"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_tcp_sockopts.rs b/tests/generated/preview2_tcp_sockopts.rs deleted file mode 100644 index d44dc266a..000000000 --- a/tests/generated/preview2_tcp_sockopts.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_sockopts() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_sockopts.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sockopts"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/proxy_echo.rs b/tests/generated/proxy_echo.rs deleted file mode 100644 index 4ed372454..000000000 --- a/tests/generated/proxy_echo.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn proxy_echo() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/proxy_echo.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/proxy_echo"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/proxy_echo --jco-import ./tests/virtualenvs/server-api-proxy-streaming.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index 66ab4d874..0b015f94e 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -8,27 +8,13 @@ const TEST_FILTER: &[&str] = &[]; const TEST_IGNORE: &[&str] = &[ "nn_image_classification", "nn_image_classification_named", - // currently timing out - "api_read_only", - "cli_file_read", - "cli_stdin", - "cli_stdio_write_flushes", - "http_outbound_request_get", - "http_outbound_request_invalid_version", - "http_outbound_request_put", - "preview1_fd_flags_set", - "preview1_file_seek_tell", - "preview1_file_truncation", - "preview1_file_unbuffered_write", - "preview1_file_write", - "preview1_path_open_read_write", - "preview2_stream_pollable_correct", - "preview2_stream_pollable_traps", + // http case + "proxy_echo", + // tcp "preview2_tcp_bind", "preview2_tcp_connect", - "proxy_echo", - "proxy_hash", - "http_outbound_request_invalid_dnsname", + "preview2_tcp_sample_application", + "preview2_tcp_sockopts", ]; pub fn run() -> anyhow::Result<()> { From 12d587035d3c6ad647266784e6033a1dfd41f6d5 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Thu, 11 Jan 2024 16:08:29 -0800 Subject: [PATCH 03/23] fix child poll drop --- packages/preview2-shim/test/test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/preview2-shim/test/test.js b/packages/preview2-shim/test/test.js index e2b91565c..3c90bc775 100644 --- a/packages/preview2-shim/test/test.js +++ b/packages/preview2-shim/test/test.js @@ -109,11 +109,13 @@ suite("Node.js Preview2", () => { {} ); const stream = childDescriptor.readViaStream(0); - stream.subscribe().block(); + const poll = stream.subscribe(); + poll.block(); let buf = stream.read(10000n); while (buf.byteLength === 0) buf = stream.read(10000n); const source = new TextDecoder().decode(buf); ok(source.includes("UNIQUE STRING")); + poll[Symbol.dispose](); stream[Symbol.dispose](); childDescriptor[Symbol.dispose](); }); From 764ffa206143a3c0e8c8bb5a314b8f5893f1b7f8 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Thu, 11 Jan 2024 18:05:44 -0800 Subject: [PATCH 04/23] fix remaining tests --- packages/preview2-shim/lib/io/worker-http.js | 10 +++--- .../preview2-shim/lib/io/worker-socket-tcp.js | 27 +++++++------- .../preview2-shim/lib/io/worker-thread.js | 35 +++++++++---------- packages/preview2-shim/lib/synckit/index.js | 3 ++ packages/preview2-shim/test/test.js | 4 +-- tests/generated/mod.rs | 5 +++ tests/generated/preview2_tcp_bind.rs | 17 +++++++++ tests/generated/preview2_tcp_connect.rs | 17 +++++++++ .../preview2_tcp_sample_application.rs | 17 +++++++++ tests/generated/preview2_tcp_sockopts.rs | 17 +++++++++ tests/generated/proxy_echo.rs | 17 +++++++++ xtask/src/generate/tests.rs | 12 +------ 12 files changed, 132 insertions(+), 49 deletions(-) create mode 100644 tests/generated/preview2_tcp_bind.rs create mode 100644 tests/generated/preview2_tcp_connect.rs create mode 100644 tests/generated/preview2_tcp_sample_application.rs create mode 100644 tests/generated/preview2_tcp_sockopts.rs create mode 100644 tests/generated/proxy_echo.rs diff --git a/packages/preview2-shim/lib/io/worker-http.js b/packages/preview2-shim/lib/io/worker-http.js index 75b53ff46..25d1d33b3 100644 --- a/packages/preview2-shim/lib/io/worker-http.js +++ b/packages/preview2-shim/lib/io/worker-http.js @@ -144,16 +144,16 @@ export async function createHttpRequest( req.end(); } const res = await new Promise((resolve, reject) => { - req.on("response", resolve); - req.on("close", () => reject); - req.on("error", reject); + req.once("response", resolve); + req.once("close", () => reject); + req.once("error", reject); }); if (firstByteTimeout) res.setTimeout(Number(firstByteTimeout)); if (betweenBytesTimeout) - res.on("readable", () => { + res.once("readable", () => { res.setTimeout(Number(betweenBytesTimeout)); }); - res.on("end", () => void res.emit("readable")); + // res.on("end", () => void res.emit("readable")); const bodyStreamId = createReadableStream(res); return { status: res.statusCode, diff --git a/packages/preview2-shim/lib/io/worker-socket-tcp.js b/packages/preview2-shim/lib/io/worker-socket-tcp.js index 30c0d4854..6aa72572c 100644 --- a/packages/preview2-shim/lib/io/worker-socket-tcp.js +++ b/packages/preview2-shim/lib/io/worker-socket-tcp.js @@ -46,7 +46,7 @@ const SOCKET_STATE_ERROR = ++stateCnt; * @typedef {import("../../../types/interfaces/wasi-sockets-tcp.js").IpAddressFamily} IpAddressFamily * * @typedef {{ - * socket: number | null, + * tcpSocket: number | null, * err: Error | null, * }} PendingAccept * @@ -203,19 +203,19 @@ export function socketTcpAccept(id) { bindOrConnectAddress: null, serializedLocalAddress: null, listenBacklogSize: 128, - handle: accept.socket._handle, + handle: accept.tcpSocket._handle, pendingAccepts: [], acceptListener: null, - polls: [], + pollState: { ready: false, listener: null, polls: [] }, }); return [ tcpSocketCnt, - createReadableStream(accept.socket), - createWritableStream(accept.socket), + createReadableStream(accept.tcpSocket), + createWritableStream(accept.tcpSocket), ]; } return new Promise((resolve, reject) => { - socket.acceptListener = (err, socket) => { + socket.acceptListener = (err, tcpSocket) => { socket.acceptListener = null; if (err) return reject(convertSocketError(err)); tcpSockets.set(++tcpSocketCnt, { @@ -226,12 +226,12 @@ export function socketTcpAccept(id) { handle: socket._handle, pendingAccepts: [], acceptListener: null, - polls: [], + pollState: { ready: false, listener: null, polls: [] }, }); resolve([ tcpSocketCnt, - createReadableStream(socket), - createWritableStream(socket), + createReadableStream(tcpSocket), + createWritableStream(tcpSocket), ]); }; }); @@ -251,6 +251,7 @@ export function socketTcpListenFinish(id, backlogSize) { return new Promise((resolve, reject) => { function handleErr(err) { server.off("listening", handleListen); + socket.state = SOCKET_STATE_ERROR; reject(err); } function handleListen() { @@ -260,14 +261,16 @@ export function socketTcpListenFinish(id, backlogSize) { // socket.subscribeResolve = noop; // } - server.on("connection", (socket) => { - if (socket.acceptListener) return socket.acceptListener(null, socket); - socket.pendingAccepts.push({ socket, err: null }); + server.on("connection", (tcpSocket) => { + if (socket.acceptListener) + return socket.acceptListener(null, tcpSocket); + socket.pendingAccepts.push({ tcpSocket, err: null }); }); server.on("error", (err) => { if (socket.acceptListener) return socket.acceptListener(err, null); socket.pendingAccepts.push({ socket: null, err }); }); + socket.state = SOCKET_STATE_LISTENER; resolve(); } server.once("listening", handleListen); diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index 82ddb647a..76905637c 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -1,6 +1,7 @@ import { createReadStream, createWriteStream } from "node:fs"; -import { _rawDebug, exit, hrtime, stderr, stdout } from "node:process"; +import { _rawDebug, hrtime, stderr, stdout } from "node:process"; import { PassThrough } from "node:stream"; +import { format } from "node:util"; import { runAsWorker } from "../synckit/index.js"; import { clearOutgoingResponse, @@ -226,6 +227,7 @@ export function getStreamOrThrow(streamId) { * @returns {Promise} */ function handle(call, id, payload) { + if (uncaughtException) throw uncaughtException; switch (call) { // Http case HTTP_CREATE_REQUEST: { @@ -487,16 +489,13 @@ function handle(call, id, payload) { switch (call & CALL_MASK) { case INPUT_STREAM_READ: { const { stream, pollState } = getStreamOrThrow(id); + if (!pollState.ready) return new Uint8Array(); const res = stream.read(Math.min(stream.readableLength, Number(payload))); - if (!res) { - // return { tag: 'closed' }; - pollStateWait(pollState); - return new Uint8Array(); - } + if (res === null) return { tag: "closed" }; return res; } case INPUT_STREAM_BLOCKING_READ: { - const pollState = streams.get(id).pollState; + const { pollState } = streams.get(id); if (pollState.ready) return handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload); return new Promise((resolve) => void (pollState.listener = resolve)).then( @@ -690,6 +689,7 @@ function handle(call, id, payload) { } return readyPromise.then(() => { for (const [idx, poll] of pollList.entries()) { + poll.listener = null; if (poll.ready) doneList.push(idx); } return new Uint32Array(doneList); @@ -768,7 +768,7 @@ export function verifyPollsDroppedForDrop(pollState, polledResourceDebugName) { export function pollStateWait(pollState) { pollState.ready = false; if (pollState.listener) - criticalError( + throw new Error( "wasi-io trap: poll has a listener and just transitioned back to wait" ); } @@ -810,16 +810,13 @@ export function createFuture(promise) { return futureId; } -function criticalError(msg) { - console.trace(msg); - setTimeout(() => { - _rawDebug("Critical error", msg); - exit(1); - }); -} - -process.on("uncaughtException", (err) => { - criticalError(err); -}); +let uncaughtException; +process.on("uncaughtException", (err) => (uncaughtException = err)); runAsWorker(handle); + +// eslint-disable-next-line no-unused-vars +function trace(msg) { + const tmpErr = new Error(format(msg)); + _rawDebug(tmpErr.stack); +} diff --git a/packages/preview2-shim/lib/synckit/index.js b/packages/preview2-shim/lib/synckit/index.js index 067805f51..e92af3255 100644 --- a/packages/preview2-shim/lib/synckit/index.js +++ b/packages/preview2-shim/lib/synckit/index.js @@ -61,6 +61,9 @@ export function createSyncFn(workerPath, callbackHandler) { throw new Error('Internal error: Expected a type of a worker callback'); callbackHandler(type, id, payload); }); + worker.on('exit', () => { + process._rawDebug('worker exit'); + }); let nextID = 0; const syncFn = (...args) => { const cid = nextID++; diff --git a/packages/preview2-shim/test/test.js b/packages/preview2-shim/test/test.js index 3c90bc775..4a7a966f1 100644 --- a/packages/preview2-shim/test/test.js +++ b/packages/preview2-shim/test/test.js @@ -47,8 +47,8 @@ suite("Node.js Preview2", () => { strictEqual(typeof monotonicClock.resolution(), "bigint"); const curNow = monotonicClock.now(); - // strictEqual(typeof curNow, "bigint"); - // ok(monotonicClock.now() > curNow); + strictEqual(typeof curNow, "bigint"); + ok(monotonicClock.now() > curNow); }); test("Monotonic clock immediately resolved polls", async () => { diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index d740db671..7bdb34de4 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -87,11 +87,16 @@ mod preview2_random; mod preview2_sleep; mod preview2_stream_pollable_correct; mod preview2_stream_pollable_traps; +mod preview2_tcp_bind; +mod preview2_tcp_connect; +mod preview2_tcp_sample_application; +mod preview2_tcp_sockopts; mod preview2_tcp_states; mod preview2_udp_bind; mod preview2_udp_connect; mod preview2_udp_sample_application; mod preview2_udp_sockopts; mod preview2_udp_states; +mod proxy_echo; mod proxy_handler; mod proxy_hash; diff --git a/tests/generated/preview2_tcp_bind.rs b/tests/generated/preview2_tcp_bind.rs new file mode 100644 index 000000000..ad45c1142 --- /dev/null +++ b/tests/generated/preview2_tcp_bind.rs @@ -0,0 +1,17 @@ +//! 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 std::fs; +use xshell::{cmd, Shell}; + +#[test] +fn preview2_tcp_bind() -> anyhow::Result<()> { + let sh = Shell::new()?; + let wasi_file = "./tests/rundir/preview2_tcp_bind.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_bind"); + + let cmd = cmd!(sh, "node ./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'"); + + cmd.run()?; + Ok(()) +} diff --git a/tests/generated/preview2_tcp_connect.rs b/tests/generated/preview2_tcp_connect.rs new file mode 100644 index 000000000..2399fec73 --- /dev/null +++ b/tests/generated/preview2_tcp_connect.rs @@ -0,0 +1,17 @@ +//! 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 std::fs; +use xshell::{cmd, Shell}; + +#[test] +fn preview2_tcp_connect() -> anyhow::Result<()> { + let sh = Shell::new()?; + let wasi_file = "./tests/rundir/preview2_tcp_connect.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_connect"); + + let cmd = cmd!(sh, "node ./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'"); + + cmd.run()?; + Ok(()) +} diff --git a/tests/generated/preview2_tcp_sample_application.rs b/tests/generated/preview2_tcp_sample_application.rs new file mode 100644 index 000000000..d372f32f3 --- /dev/null +++ b/tests/generated/preview2_tcp_sample_application.rs @@ -0,0 +1,17 @@ +//! 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 std::fs; +use xshell::{cmd, Shell}; + +#[test] +fn preview2_tcp_sample_application() -> anyhow::Result<()> { + let sh = Shell::new()?; + let wasi_file = "./tests/rundir/preview2_tcp_sample_application.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sample_application"); + + let cmd = cmd!(sh, "node ./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'"); + + cmd.run()?; + Ok(()) +} diff --git a/tests/generated/preview2_tcp_sockopts.rs b/tests/generated/preview2_tcp_sockopts.rs new file mode 100644 index 000000000..d44dc266a --- /dev/null +++ b/tests/generated/preview2_tcp_sockopts.rs @@ -0,0 +1,17 @@ +//! 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 std::fs; +use xshell::{cmd, Shell}; + +#[test] +fn preview2_tcp_sockopts() -> anyhow::Result<()> { + let sh = Shell::new()?; + let wasi_file = "./tests/rundir/preview2_tcp_sockopts.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sockopts"); + + let cmd = cmd!(sh, "node ./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'"); + + cmd.run()?; + Ok(()) +} diff --git a/tests/generated/proxy_echo.rs b/tests/generated/proxy_echo.rs new file mode 100644 index 000000000..4ed372454 --- /dev/null +++ b/tests/generated/proxy_echo.rs @@ -0,0 +1,17 @@ +//! 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 std::fs; +use xshell::{cmd, Shell}; + +#[test] +fn proxy_echo() -> anyhow::Result<()> { + let sh = Shell::new()?; + let wasi_file = "./tests/rundir/proxy_echo.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/proxy_echo"); + + let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/proxy_echo --jco-import ./tests/virtualenvs/server-api-proxy-streaming.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); + + cmd.run()?; + Ok(()) +} diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index 0b015f94e..bb6d3ff1d 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -5,17 +5,7 @@ use xshell::{cmd, Shell}; const TRACE: bool = false; const TEST_FILTER: &[&str] = &[]; -const TEST_IGNORE: &[&str] = &[ - "nn_image_classification", - "nn_image_classification_named", - // http case - "proxy_echo", - // tcp - "preview2_tcp_bind", - "preview2_tcp_connect", - "preview2_tcp_sample_application", - "preview2_tcp_sockopts", -]; +const TEST_IGNORE: &[&str] = &["nn_image_classification", "nn_image_classification_named"]; pub fn run() -> anyhow::Result<()> { let sh = Shell::new()?; From 38fe695e1224b7cc3709836aa69426123e9a4c00 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Fri, 12 Jan 2024 15:24:07 -0800 Subject: [PATCH 05/23] kinda working --- packages/preview2-shim/lib/io/worker-http.js | 4 +- packages/preview2-shim/lib/io/worker-io.js | 8 +- .../preview2-shim/lib/io/worker-socket-tcp.js | 91 ++++++++----------- .../preview2-shim/lib/io/worker-thread.js | 64 ++++++++++--- packages/preview2-shim/lib/synckit/index.d.ts | 71 --------------- packages/preview2-shim/lib/synckit/index.js | 10 +- tests/generated/mod.rs | 1 - .../preview2_tcp_sample_application.rs | 17 ---- tests/server/index.js | 9 +- xtask/src/generate/tests.rs | 2 +- 10 files changed, 103 insertions(+), 174 deletions(-) delete mode 100644 packages/preview2-shim/lib/synckit/index.d.ts delete mode 100644 tests/generated/preview2_tcp_sample_application.rs diff --git a/packages/preview2-shim/lib/io/worker-http.js b/packages/preview2-shim/lib/io/worker-http.js index 25d1d33b3..bdb033129 100644 --- a/packages/preview2-shim/lib/io/worker-http.js +++ b/packages/preview2-shim/lib/io/worker-http.js @@ -1,6 +1,5 @@ import { createReadableStream, - createWritableStream, getStreamOrThrow, } from "./worker-thread.js"; import { @@ -52,7 +51,7 @@ export async function setOutgoingResponse( export async function startHttpServer(id, { port, host }) { const server = createServer((req, res) => { // create the streams and their ids - const streamId = createWritableStream(req); + const streamId = createReadableStream(req); const responseId = ++responseCnt; parentPort.postMessage({ type: HTTP_SERVER_INCOMING_HANDLER, @@ -153,7 +152,6 @@ export async function createHttpRequest( res.once("readable", () => { res.setTimeout(Number(betweenBytesTimeout)); }); - // res.on("end", () => void res.emit("readable")); const bodyStreamId = createReadableStream(res); return { status: res.statusCode, diff --git a/packages/preview2-shim/lib/io/worker-io.js b/packages/preview2-shim/lib/io/worker-io.js index 85e24b6d4..ef581713a 100644 --- a/packages/preview2-shim/lib/io/worker-io.js +++ b/packages/preview2-shim/lib/io/worker-io.js @@ -28,9 +28,7 @@ import { reverseMap, } from "./calls.js"; import { STDERR } from "./calls.js"; -import { _rawDebug, exit, stderr, stdout } from "node:process"; - -const DEBUG = false; +import { _rawDebug, exit, stderr, stdout, env } from "node:process"; const workerPath = fileURLToPath( new URL("./worker-thread.js", import.meta.url) @@ -42,11 +40,13 @@ export function registerIncomingHttpHandler(id, handler) { } const instanceId = Math.round(Math.random() * 1000).toString(); +const DEBUG_DEFAULT = false; +const DEBUG = env.JCO_DEBUG === '0' ? false : env.JCO_DEBUG === '1' ? true : DEBUG_DEFAULT; /** * @type {(call: number, id: number | null, payload: any) -> any} */ -export let ioCall = createSyncFn(workerPath, (type, id, payload) => { +export let ioCall = createSyncFn(workerPath, DEBUG, (type, id, payload) => { // 'callbacks' from the worker // ONLY happens for an http server incoming handler, and NOTHING else (not even sockets, since accept is sync!) if (type !== HTTP_SERVER_INCOMING_HANDLER) diff --git a/packages/preview2-shim/lib/io/worker-socket-tcp.js b/packages/preview2-shim/lib/io/worker-socket-tcp.js index 6aa72572c..b6a1fa66b 100644 --- a/packages/preview2-shim/lib/io/worker-socket-tcp.js +++ b/packages/preview2-shim/lib/io/worker-socket-tcp.js @@ -57,7 +57,6 @@ const SOCKET_STATE_ERROR = ++stateCnt; * listenBacklogSize: number, * handle: TCP, * pendingAccepts: PendingAccept[], - * acceptListener: null | () => void, * pollState: PollState, * }} SocketRecord */ @@ -81,7 +80,6 @@ export function createTcpSocket() { listenBacklogSize: 128, handle, pendingAccepts: [], - acceptListener: null, pollState: { ready: false, listener: null, polls: [] }, }); return tcpSocketCnt; @@ -97,7 +95,7 @@ export function socketTcpBindStart(id, localAddress) { if (socket.state !== SOCKET_STATE_INIT) throw "invalid-state"; socket.state = SOCKET_STATE_BIND; socket.bindOrConnectAddress = localAddress; - pollStateWait(socket.pollState); + pollStateWait(socket.pollState, id); } export function socketTcpBindFinish(id, isIpV6Only) { @@ -147,13 +145,13 @@ export function socketTcpConnectStart(id, { remoteAddress, family, ipv6Only }) { } socket.state = SOCKET_STATE_CONNECT; socket.bindOrConnectAddress = remoteAddress; - pollStateWait(socket.pollState); + pollStateWait(socket.pollState, id); } export function socketTcpConnectFinish(id) { const socket = tcpSockets.get(id); if (socket.state !== SOCKET_STATE_CONNECT) throw "not-in-progress"; - const tcpSocket = new Socket({ handle: socket.handle, pauseOnCreate: true }); + const tcpSocket = new Socket({ handle: socket.handle, pauseOnCreate: true, allowHalfOpen: true }); const remoteAddress = socket.bindOrConnectAddress; return new Promise((resolve, reject) => { function handleErr(err) { @@ -195,46 +193,23 @@ export function socketTcpConnectFinish(id) { export function socketTcpAccept(id) { const socket = tcpSockets.get(id); if (socket.state !== SOCKET_STATE_LISTENER) throw "invalid-state"; - if (socket.pendingAccepts.length) { - const accept = socket.pendingAccepts.shift(); - if (accept.err) throw convertSocketError(accept.err); - tcpSockets.set(++tcpSocketCnt, { - state: SOCKET_STATE_CONNECTION, - bindOrConnectAddress: null, - serializedLocalAddress: null, - listenBacklogSize: 128, - handle: accept.tcpSocket._handle, - pendingAccepts: [], - acceptListener: null, - pollState: { ready: false, listener: null, polls: [] }, - }); - return [ - tcpSocketCnt, - createReadableStream(accept.tcpSocket), - createWritableStream(accept.tcpSocket), - ]; - } - return new Promise((resolve, reject) => { - socket.acceptListener = (err, tcpSocket) => { - socket.acceptListener = null; - if (err) return reject(convertSocketError(err)); - tcpSockets.set(++tcpSocketCnt, { - state: SOCKET_STATE_CONNECTION, - bindOrConnectAddress: null, - serializedLocalAddress: null, - listenBacklogSize: 128, - handle: socket._handle, - pendingAccepts: [], - acceptListener: null, - pollState: { ready: false, listener: null, polls: [] }, - }); - resolve([ - tcpSocketCnt, - createReadableStream(tcpSocket), - createWritableStream(tcpSocket), - ]); - }; + if (socket.pendingAccepts.length === 0) throw "would-block"; + const accept = socket.pendingAccepts.shift(); + if (accept.err) throw convertSocketError(accept.err); + tcpSockets.set(++tcpSocketCnt, { + state: SOCKET_STATE_CONNECTION, + bindOrConnectAddress: null, + serializedLocalAddress: null, + listenBacklogSize: 128, + handle: accept.tcpSocket._handle, + pendingAccepts: [], + pollState: { ready: false, listener: null, polls: [] }, }); + return [ + tcpSocketCnt, + createReadableStream(accept.tcpSocket), + createWritableStream(accept.tcpSocket), + ]; } export function socketTcpListenStart(id) { @@ -247,7 +222,7 @@ export function socketTcpListenFinish(id, backlogSize) { const socket = tcpSockets.get(id); if (socket.state !== SOCKET_STATE_LISTEN) throw "not-in-progress"; const { handle } = socket; - const server = new Server({ allowHalfOpen: true }); + const server = new Server({ pauseOnConnect: true, allowHalfOpen: true }); return new Promise((resolve, reject) => { function handleErr(err) { server.off("listening", handleListen); @@ -256,19 +231,27 @@ export function socketTcpListenFinish(id, backlogSize) { } function handleListen() { server.off("error", handleErr); - // if (socket.subscribeResolve) { - // socket.subscribeResolve(); - // socket.subscribeResolve = noop; - // } - server.on("connection", (tcpSocket) => { - if (socket.acceptListener) - return socket.acceptListener(null, tcpSocket); + process._rawDebug(">>> GOT CONNECTION FOR ACCEPT"); + tcpSocket.on('ready', () => { + process._rawDebug('--- TCP READY ---'); + }) + tcpSocket.on('end', () => { + process._rawDebug(' --- TCP END --- '); + }); + tcpSocket.on('close', () => { + process._rawDebug(' --- TCP CLOSE --- '); + }); + tcpSocket.on('error', () => { + process._rawDebug(' --- TCP ERROR --- '); + }); + tcpSocket.on('readable', () => { + process._rawDebug(' --- TCP READABLE --- '); + }); socket.pendingAccepts.push({ tcpSocket, err: null }); }); server.on("error", (err) => { - if (socket.acceptListener) return socket.acceptListener(err, null); - socket.pendingAccepts.push({ socket: null, err }); + socket.pendingAccepts.push({ tcpSocket: null, err }); }); socket.state = SOCKET_STATE_LISTENER; resolve(); diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index 76905637c..987542580 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -1,5 +1,5 @@ import { createReadStream, createWriteStream } from "node:fs"; -import { _rawDebug, hrtime, stderr, stdout } from "node:process"; +import { hrtime, stderr, stdout } from "node:process"; import { PassThrough } from "node:stream"; import { format } from "node:util"; import { runAsWorker } from "../synckit/index.js"; @@ -120,14 +120,34 @@ import { socketUdpSend, } from "./worker-socket-udp.js"; +function log (msg) { + if (debug) + process._rawDebug(msg); +} + let pollCnt = 0, streamCnt = 0, futureCnt = 0; /** - * @typedef {{ ready: bool, listener: () => void | null, polls: number[] }} PollState - * @typedef {{ stream: NodeJS.ReadableStream | NodeJS.WritableStream, flushPromise: Promise | null, pollState }} Stream - * @typedef {{ value: any, error: bool, pollState }} Future + * @typedef {{ + * ready: bool, + * listener: () => void | null, + * polls: number[] + * }} PollState + * + * @typedef {{ + * stream: NodeJS.ReadableStream | NodeJS.WritableStream, + * flushPromise: Promise | null, + * finished: bool, + * pollState + * }} Stream + * + * @typedef {{ + * value: any, + * error: bool, + * pollState + * }} Future */ /** @type {Map} */ @@ -147,6 +167,7 @@ export function createReadableStream(nodeStream) { const stream = { stream: nodeStream, flushPromise: null, + finished: false, pollState, }; streams.set(++streamCnt, stream); @@ -155,12 +176,16 @@ export function createReadableStream(nodeStream) { } function pollDone() { pollStateReady(stream.pollState); + stream.finished = true; nodeStream.off("readable", pollReady); nodeStream.off("end", pollDone); + nodeStream.off("close", pollDone); nodeStream.off("error", pollDone); } + nodeStream.resume(); nodeStream.on("readable", pollReady); nodeStream.on("end", pollDone); + nodeStream.on("close", pollDone); nodeStream.on("error", pollDone); return streamCnt; } @@ -170,6 +195,7 @@ export function createWritableStream(nodeStream) { const stream = { stream: nodeStream, flushPromise: null, + finished: false, pollState, }; streams.set(++streamCnt, stream); @@ -178,13 +204,16 @@ export function createWritableStream(nodeStream) { } function pollDone() { pollStateReady(pollState); + stream.finished = true; nodeStream.off("drain", pollReady); nodeStream.off("finish", pollDone); nodeStream.off("error", pollDone); + nodeStream.off("close", pollDone); } nodeStream.on("drain", pollReady); nodeStream.on("finish", pollDone); nodeStream.on("error", pollDone); + nodeStream.on("close", pollDone); return streamCnt; } @@ -488,10 +517,15 @@ function handle(call, id, payload) { // Generic call implementations (streams + polls) switch (call & CALL_MASK) { case INPUT_STREAM_READ: { - const { stream, pollState } = getStreamOrThrow(id); - if (!pollState.ready) return new Uint8Array(); - const res = stream.read(Math.min(stream.readableLength, Number(payload))); - if (res === null) return { tag: "closed" }; + const stream = getStreamOrThrow(id); + if (!stream.pollState.ready) return new Uint8Array(); + const res = stream.stream.read(Math.min(stream.stream.readableLength, Number(payload))); + if (res === null) { + if (stream.finished) + return { tag: "closed" }; + pollStateWait(stream.pollState, id); + return new Uint8Array(); + } return res; } case INPUT_STREAM_BLOCKING_READ: { @@ -527,7 +561,7 @@ function handle(call, id, payload) { case OUTPUT_STREAM_CHECK_WRITE: { const { stream, pollState } = getStreamOrThrow(id); const bytes = stream.writableHighWaterMark - stream.writableLength; - if (bytes === 0) pollStateWait(pollState); + if (bytes === 0) pollStateWait(pollState, id); return BigInt(bytes); } case OUTPUT_STREAM_WRITE: { @@ -552,7 +586,7 @@ function handle(call, id, payload) { "wasi-io trap: Cannot write more than permitted writable length" ); } - pollStateWait(stream.pollState); + pollStateWait(stream.pollState, id); return (stream.flushPromise = new Promise((resolve, reject) => { stream.stream.write(payload, (err) => { stream.flushPromise = null; @@ -565,7 +599,7 @@ function handle(call, id, payload) { case OUTPUT_STREAM_FLUSH: { const stream = getStreamOrThrow(id); if (stream.flushPromise) return; - pollStateWait(stream.pollState); + pollStateWait(stream.pollState, id); return (stream.flushPromise = new Promise((resolve, reject) => { stream.stream.write(new Uint8Array([]), (err) => { stream.flushPromise = null; @@ -765,7 +799,7 @@ export function verifyPollsDroppedForDrop(pollState, polledResourceDebugName) { /** * @param {PollState} pollState */ -export function pollStateWait(pollState) { +export function pollStateWait(pollState, id) { pollState.ready = false; if (pollState.listener) throw new Error( @@ -813,10 +847,10 @@ export function createFuture(promise) { let uncaughtException; process.on("uncaughtException", (err) => (uncaughtException = err)); -runAsWorker(handle); - // eslint-disable-next-line no-unused-vars function trace(msg) { const tmpErr = new Error(format(msg)); - _rawDebug(tmpErr.stack); + log(tmpErr.stack); } + +const debug = runAsWorker(handle); diff --git a/packages/preview2-shim/lib/synckit/index.d.ts b/packages/preview2-shim/lib/synckit/index.d.ts deleted file mode 100644 index 73e2e8f90..000000000 --- a/packages/preview2-shim/lib/synckit/index.d.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* -MIT License - -Copyright (c) 2021 UnTS - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -/// -import { MessagePort } from "node:worker_threads"; -export type AnyFn = (...args: T) => R; -export type AnyPromise = Promise; -export type AnyAsyncFn = AnyFn>; -export type Syncify = T extends ( - ...args: infer Args -) => Promise - ? (...args: Args) => R - : never; -export type PromiseType = T extends Promise - ? R - : never; -export interface MainToWorkerMessage { - sharedBuffer: SharedArrayBuffer; - id: number; - args: T; -} -export interface WorkerData { - workerPort: MessagePort; -} -export interface DataMessage { - result?: T; - error?: unknown; - properties?: unknown; -} -export interface WorkerToMainMessage extends DataMessage { - id: number; -} -export interface SyncifyOptions { - bufferSize?: number; - timeout?: number; - execArgv?: string[]; -} -export declare function createSyncFn( - workerPath: string, - bufferSize?: number, - timeout?: number -): Syncify; -export declare function createSyncFn( - workerPath: string, - options?: SyncifyOptions -): Syncify; -export declare function runAsWorker< - R = unknown, - T extends AnyAsyncFn = AnyAsyncFn ->(fn: T): void; diff --git a/packages/preview2-shim/lib/synckit/index.js b/packages/preview2-shim/lib/synckit/index.js index e92af3255..88d03ef5d 100644 --- a/packages/preview2-shim/lib/synckit/index.js +++ b/packages/preview2-shim/lib/synckit/index.js @@ -46,13 +46,13 @@ function extractProperties(object) { const CALL_TIMEOUT = undefined; -export function createSyncFn(workerPath, callbackHandler) { +export function createSyncFn(workerPath, debug, callbackHandler) { if (!path.isAbsolute(workerPath)) { throw new Error("`workerPath` must be absolute"); } const { port1: mainPort, port2: workerPort } = new MessageChannel(); const worker = new Worker(workerPath, { - workerData: { workerPort }, + workerData: { workerPort, debug }, transferList: [workerPort], execArgv: [] }); @@ -61,9 +61,6 @@ export function createSyncFn(workerPath, callbackHandler) { throw new Error('Internal error: Expected a type of a worker callback'); callbackHandler(type, id, payload); }); - worker.on('exit', () => { - process._rawDebug('worker exit'); - }); let nextID = 0; const syncFn = (...args) => { const cid = nextID++; @@ -98,7 +95,7 @@ export function runAsWorker(fn) { if (!workerData) { return; } - const { workerPort } = workerData; + const { workerPort, debug } = workerData; try { parentPort.on("message", ({ sharedBuffer, cid, args }) => { (async () => { @@ -126,4 +123,5 @@ export function runAsWorker(fn) { Atomics.notify(sharedBufferView, 0); }); } + return debug; } diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index 7bdb34de4..60e405bd6 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -89,7 +89,6 @@ mod preview2_stream_pollable_correct; mod preview2_stream_pollable_traps; mod preview2_tcp_bind; mod preview2_tcp_connect; -mod preview2_tcp_sample_application; mod preview2_tcp_sockopts; mod preview2_tcp_states; mod preview2_udp_bind; diff --git a/tests/generated/preview2_tcp_sample_application.rs b/tests/generated/preview2_tcp_sample_application.rs deleted file mode 100644 index d372f32f3..000000000 --- a/tests/generated/preview2_tcp_sample_application.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_sample_application() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_sample_application.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sample_application"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/server/index.js b/tests/server/index.js index 1436adcc4..939171b3f 100644 --- a/tests/server/index.js +++ b/tests/server/index.js @@ -32,7 +32,10 @@ const servers = []; export async function createIncomingServer(serverName) { const serverProcess = fork( fileURLToPath(import.meta.url.split("/").slice(0, -1).join("/")) + - "/http-server.js" + "/http-server.js", + { + env: Object.assign(process.env, { JCO_DEBUG: "0" }), + } ); servers.push(serverProcess); serverProcess.on("error", (err) => { @@ -41,7 +44,9 @@ export async function createIncomingServer(serverName) { const runningPromise = new Promise((resolve) => serverProcess.on("message", resolve) ); - const componentPath = fileURLToPath(import.meta.url.split("/").slice(0, -2).join("/")) + `/rundir/${serverName}.component.wasm`; + const componentPath = + fileURLToPath(import.meta.url.split("/").slice(0, -2).join("/")) + + `/rundir/${serverName}.component.wasm`; console.error("loading component " + componentPath); try { const component = readFileSync(componentPath); diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index bb6d3ff1d..858babe1e 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -3,7 +3,7 @@ use xshell::{cmd, Shell}; // for debugging const TRACE: bool = false; -const TEST_FILTER: &[&str] = &[]; +const TEST_FILTER: &[&str] = &["preview2_tcp_sample_application"]; const TEST_IGNORE: &[&str] = &["nn_image_classification", "nn_image_classification_named"]; From 74f71f02e8523b8ad46abe32c3aa9b9a377aa284 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Fri, 12 Jan 2024 16:29:02 -0800 Subject: [PATCH 06/23] working --- .../preview2-shim/lib/io/worker-socket-tcp.js | 35 ++---- .../preview2-shim/lib/io/worker-thread.js | 114 ++++++++++-------- tests/generated/mod.rs | 1 + .../preview2_tcp_sample_application.rs | 17 +++ xtask/src/generate/tests.rs | 2 +- 5 files changed, 93 insertions(+), 76 deletions(-) create mode 100644 tests/generated/preview2_tcp_sample_application.rs diff --git a/packages/preview2-shim/lib/io/worker-socket-tcp.js b/packages/preview2-shim/lib/io/worker-socket-tcp.js index b6a1fa66b..e0a84343f 100644 --- a/packages/preview2-shim/lib/io/worker-socket-tcp.js +++ b/packages/preview2-shim/lib/io/worker-socket-tcp.js @@ -1,7 +1,8 @@ import { + createPoll, createReadableStream, + createReadableStreamPollState, createWritableStream, - createPoll, pollStateReady, pollStateWait, verifyPollsDroppedForDrop, @@ -48,6 +49,7 @@ const SOCKET_STATE_ERROR = ++stateCnt; * @typedef {{ * tcpSocket: number | null, * err: Error | null, + * pollState: PollState | null, * }} PendingAccept * * @typedef {{ @@ -125,7 +127,7 @@ export function socketTcpBindFinish(id, isIpV6Only) { (socket.serializedLocalAddress = serializedLocalAddress) ); socket.state = SOCKET_STATE_BOUND; - pollStateReady(socket.pollState); + pollStateReady(socket.pollState, false); } export function socketTcpConnectStart(id, { remoteAddress, family, ipv6Only }) { @@ -157,7 +159,7 @@ export function socketTcpConnectFinish(id) { function handleErr(err) { tcpSocket.off("connect", handleConnect); socket.state = SOCKET_STATE_ERROR; - pollStateReady(socket.pollState); + pollStateReady(socket.pollState, false); reject(err); } function handleConnect() { @@ -172,7 +174,7 @@ export function socketTcpConnectFinish(id) { ); } socket.state = SOCKET_STATE_CONNECTION; - pollStateReady(socket.pollState); + pollStateReady(socket.pollState, false); resolve([ createReadableStream(tcpSocket), createWritableStream(tcpSocket), @@ -203,11 +205,11 @@ export function socketTcpAccept(id) { listenBacklogSize: 128, handle: accept.tcpSocket._handle, pendingAccepts: [], - pollState: { ready: false, listener: null, polls: [] }, + pollState: accept.pollState, }); return [ tcpSocketCnt, - createReadableStream(accept.tcpSocket), + createReadableStream(accept.tcpSocket, accept.pollState), createWritableStream(accept.tcpSocket), ]; } @@ -232,26 +234,11 @@ export function socketTcpListenFinish(id, backlogSize) { function handleListen() { server.off("error", handleErr); server.on("connection", (tcpSocket) => { - process._rawDebug(">>> GOT CONNECTION FOR ACCEPT"); - tcpSocket.on('ready', () => { - process._rawDebug('--- TCP READY ---'); - }) - tcpSocket.on('end', () => { - process._rawDebug(' --- TCP END --- '); - }); - tcpSocket.on('close', () => { - process._rawDebug(' --- TCP CLOSE --- '); - }); - tcpSocket.on('error', () => { - process._rawDebug(' --- TCP ERROR --- '); - }); - tcpSocket.on('readable', () => { - process._rawDebug(' --- TCP READABLE --- '); - }); - socket.pendingAccepts.push({ tcpSocket, err: null }); + const pollState = createReadableStreamPollState(tcpSocket); + socket.pendingAccepts.push({ tcpSocket, err: null, pollState }); }); server.on("error", (err) => { - socket.pendingAccepts.push({ tcpSocket: null, err }); + socket.pendingAccepts.push({ tcpSocket: null, err, pollState: null }); }); socket.state = SOCKET_STATE_LISTENER; resolve(); diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index 987542580..47286ab14 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -120,29 +120,32 @@ import { socketUdpSend, } from "./worker-socket-udp.js"; -function log (msg) { - if (debug) - process._rawDebug(msg); +function log(msg) { + if (debug) process._rawDebug(msg); } let pollCnt = 0, streamCnt = 0, futureCnt = 0; +const POLL_STATE_WAIT = 1; +const POLL_STATE_READY = 2; +const POLL_STATE_FINISHED = 3; + /** * @typedef {{ - * ready: bool, + * ready: POLL_STATE_UNREADY | POLL_STATE_READY | POLL_STATE_FINISHED, * listener: () => void | null, - * polls: number[] + * polls: number[], * }} PollState - * + * * @typedef {{ * stream: NodeJS.ReadableStream | NodeJS.WritableStream, * flushPromise: Promise | null, * finished: bool, * pollState * }} Stream - * + * * @typedef {{ * value: any, * error: bool, @@ -159,39 +162,46 @@ export const streams = new Map(); /** @type {Map} */ export const futures = new Map(); -/** - * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream - */ -export function createReadableStream(nodeStream) { - const pollState = { ready: false, listener: null, polls: [] }; - const stream = { - stream: nodeStream, - flushPromise: null, - finished: false, - pollState, - }; - streams.set(++streamCnt, stream); +export function createReadableStreamPollState(nodeStream) { + const pollState = { state: POLL_STATE_WAIT, listener: null, polls: [] }; function pollReady() { - pollStateReady(pollState); + pollStateReady(pollState, false); } function pollDone() { - pollStateReady(stream.pollState); - stream.finished = true; + pollStateReady(pollState, true); nodeStream.off("readable", pollReady); nodeStream.off("end", pollDone); nodeStream.off("close", pollDone); nodeStream.off("error", pollDone); + nodeStream.off("data", pollReady); } - nodeStream.resume(); + nodeStream.on("data", () => { + process._rawDebug(" --- DATA --- "); + pollReady(); + }); nodeStream.on("readable", pollReady); - nodeStream.on("end", pollDone); + nodeStream.on("end", () => pollDone); nodeStream.on("close", pollDone); nodeStream.on("error", pollDone); + return pollState; +} + +/** + * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream + */ +export function createReadableStream(nodeStream, pollState = createReadableStreamPollState(nodeStream)) { + const stream = { + stream: nodeStream, + flushPromise: null, + finished: false, + pollState, + }; + streams.set(++streamCnt, stream); return streamCnt; } export function createWritableStream(nodeStream) { - const pollState = { ready: true, listener: null, polls: [] }; + const pollState = { state: POLL_STATE_READY, listener: null, polls: [] }; const stream = { stream: nodeStream, flushPromise: null, @@ -200,11 +210,10 @@ export function createWritableStream(nodeStream) { }; streams.set(++streamCnt, stream); function pollReady() { - pollStateReady(pollState); + pollStateReady(pollState, false); } function pollDone() { - pollStateReady(pollState); - stream.finished = true; + pollStateReady(pollState, true); nodeStream.off("drain", pollReady); nodeStream.off("finish", pollDone); nodeStream.off("error", pollDone); @@ -366,7 +375,7 @@ function handle(call, id, payload) { return void futures.delete(id); case SOCKET_RESOLVE_ADDRESS_GET_AND_DISPOSE_REQUEST: { const future = futures.get(id); - if (!future.pollState.ready) throw "would-block"; + if (future.pollState.state === POLL_STATE_WAIT) throw "would-block"; futures.delete(id); return future; } @@ -485,7 +494,7 @@ function handle(call, id, payload) { payload = hrtime.bigint() + payload; // fallthrough case CLOCKS_INSTANT_SUBSCRIBE: { - const pollState = { ready: false, listener: null, polls: [] }; + const pollState = { state: POLL_STATE_WAIT, listener: null, polls: [] }; subscribeInstant(pollState, payload); return createPoll(pollState); } @@ -518,19 +527,21 @@ function handle(call, id, payload) { switch (call & CALL_MASK) { case INPUT_STREAM_READ: { const stream = getStreamOrThrow(id); - if (!stream.pollState.ready) return new Uint8Array(); - const res = stream.stream.read(Math.min(stream.stream.readableLength, Number(payload))); + if (stream.pollState.state === POLL_STATE_WAIT) return new Uint8Array(); + const res = stream.stream.read( + Math.min(stream.stream.readableLength, Number(payload)) + ); if (res === null) { - if (stream.finished) - return { tag: "closed" }; - pollStateWait(stream.pollState, id); + if (stream.pollState.state === POLL_STATE_FINISHED) return { tag: "closed" }; + if (stream.stream.readableLength === 0) + pollStateWait(stream.pollState, id); return new Uint8Array(); } return res; } case INPUT_STREAM_BLOCKING_READ: { const { pollState } = streams.get(id); - if (pollState.ready) + if (pollState.state !== POLL_STATE_WAIT) return handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload); return new Promise((resolve) => void (pollState.listener = resolve)).then( () => handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload) @@ -590,7 +601,7 @@ function handle(call, id, payload) { return (stream.flushPromise = new Promise((resolve, reject) => { stream.stream.write(payload, (err) => { stream.flushPromise = null; - pollStateReady(stream.pollState); + pollStateReady(stream.pollState, false); if (err) return void reject(streamError(err)); resolve(BigInt(payload.byteLength)); }); @@ -603,7 +614,7 @@ function handle(call, id, payload) { return (stream.flushPromise = new Promise((resolve, reject) => { stream.stream.write(new Uint8Array([]), (err) => { stream.flushPromise = null; - pollStateReady(stream.pollState); + pollStateReady(stream.pollState, false); if (err) return void reject(streamError(err)); resolve(); }); @@ -703,7 +714,7 @@ function handle(call, id, payload) { } case POLL_POLLABLE_READY: - return polls.get(id).ready; + return polls.get(id).state !== POLL_STATE_WAIT; case POLL_POLLABLE_BLOCK: payload = [id]; // [intentional case fall-through] @@ -711,7 +722,7 @@ function handle(call, id, payload) { const doneList = []; const pollList = payload.map((pollId) => polls.get(pollId)); for (const [idx, poll] of pollList.entries()) { - if (poll.ready) doneList.push(idx); + if (poll.state !== POLL_STATE_WAIT) doneList.push(idx); } if (doneList.length > 0) return new Uint32Array(doneList); let readyPromiseResolve; @@ -724,7 +735,7 @@ function handle(call, id, payload) { return readyPromise.then(() => { for (const [idx, poll] of pollList.entries()) { poll.listener = null; - if (poll.ready) doneList.push(idx); + if (poll.state !== POLL_STATE_WAIT) doneList.push(idx); } return new Uint32Array(doneList); }); @@ -738,7 +749,7 @@ function handle(call, id, payload) { case FUTURE_GET_VALUE_AND_DISPOSE: { const future = futures.get(id); - if (!future.pollState.ready) throw undefined; + if (future.pollState.state === POLL_STATE_WAIT) throw undefined; return { value: future.value, error: future.error }; } case FUTURE_SUBSCRIBE: { @@ -773,10 +784,10 @@ export function createPoll(pollState) { function subscribeInstant(pollState, instant) { const duration = instant - hrtime.bigint(); - if (duration <= 0) return pollStateReady(pollState); + if (duration <= 0) return pollStateReady(pollState, true); function cb() { if (hrtime.bigint() < instant) return subscribeInstant(pollState, instant); - pollStateReady(pollState); + pollStateReady(pollState, true); } if (duration < 10e6) setImmediate(cb); else setTimeout(cb, Number(duration) / 1e6); @@ -800,7 +811,7 @@ export function verifyPollsDroppedForDrop(pollState, polledResourceDebugName) { * @param {PollState} pollState */ export function pollStateWait(pollState, id) { - pollState.ready = false; + pollState.state = POLL_STATE_WAIT; if (pollState.listener) throw new Error( "wasi-io trap: poll has a listener and just transitioned back to wait" @@ -809,16 +820,17 @@ export function pollStateWait(pollState, id) { /** * @param {PollState} pollState + * @param {bool} finished */ -export function pollStateReady(pollState) { - if (pollState.ready) { +export function pollStateReady(pollState, finished) { + if (pollState.state !== POLL_STATE_WAIT) { if (pollState.listener) throw new Error( "wasi-io trap: poll already ready with listener attached" ); return; } - pollState.ready = true; + pollState.state = finished ? POLL_STATE_FINISHED : POLL_STATE_READY; if (pollState.listener) { pollState.listener(); pollState.listener = null; @@ -827,16 +839,16 @@ export function pollStateReady(pollState) { export function createFuture(promise) { const futureId = ++futureCnt; - const pollState = { ready: false, listener: null, polls: [] }; + const pollState = { state: POLL_STATE_WAIT, listener: null, polls: [] }; const future = { error: false, value: null, pollState }; futures.set(futureId, future); promise.then( (value) => { - pollStateReady(pollState); + pollStateReady(pollState, true); future.value = value; }, (value) => { - pollStateReady(pollState); + pollStateReady(pollState, true); future.error = true; future.value = value; } diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index 60e405bd6..7bdb34de4 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -89,6 +89,7 @@ mod preview2_stream_pollable_correct; mod preview2_stream_pollable_traps; mod preview2_tcp_bind; mod preview2_tcp_connect; +mod preview2_tcp_sample_application; mod preview2_tcp_sockopts; mod preview2_tcp_states; mod preview2_udp_bind; diff --git a/tests/generated/preview2_tcp_sample_application.rs b/tests/generated/preview2_tcp_sample_application.rs new file mode 100644 index 000000000..d372f32f3 --- /dev/null +++ b/tests/generated/preview2_tcp_sample_application.rs @@ -0,0 +1,17 @@ +//! 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 std::fs; +use xshell::{cmd, Shell}; + +#[test] +fn preview2_tcp_sample_application() -> anyhow::Result<()> { + let sh = Shell::new()?; + let wasi_file = "./tests/rundir/preview2_tcp_sample_application.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sample_application"); + + let cmd = cmd!(sh, "node ./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'"); + + cmd.run()?; + Ok(()) +} diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index 858babe1e..bb6d3ff1d 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -3,7 +3,7 @@ use xshell::{cmd, Shell}; // for debugging const TRACE: bool = false; -const TEST_FILTER: &[&str] = &["preview2_tcp_sample_application"]; +const TEST_FILTER: &[&str] = &[]; const TEST_IGNORE: &[&str] = &["nn_image_classification", "nn_image_classification_named"]; From 9e6e5b91269d906492e4c364b3957131e3341b0f Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Fri, 12 Jan 2024 16:35:30 -0800 Subject: [PATCH 07/23] fixups --- .../preview2-shim/lib/io/worker-socket-tcp.js | 4 ++-- packages/preview2-shim/lib/io/worker-thread.js | 15 +++++---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/preview2-shim/lib/io/worker-socket-tcp.js b/packages/preview2-shim/lib/io/worker-socket-tcp.js index e0a84343f..281492171 100644 --- a/packages/preview2-shim/lib/io/worker-socket-tcp.js +++ b/packages/preview2-shim/lib/io/worker-socket-tcp.js @@ -97,7 +97,7 @@ export function socketTcpBindStart(id, localAddress) { if (socket.state !== SOCKET_STATE_INIT) throw "invalid-state"; socket.state = SOCKET_STATE_BIND; socket.bindOrConnectAddress = localAddress; - pollStateWait(socket.pollState, id); + pollStateWait(socket.pollState); } export function socketTcpBindFinish(id, isIpV6Only) { @@ -147,7 +147,7 @@ export function socketTcpConnectStart(id, { remoteAddress, family, ipv6Only }) { } socket.state = SOCKET_STATE_CONNECT; socket.bindOrConnectAddress = remoteAddress; - pollStateWait(socket.pollState, id); + pollStateWait(socket.pollState); } export function socketTcpConnectFinish(id) { diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index 47286ab14..e953919e5 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -173,12 +173,7 @@ export function createReadableStreamPollState(nodeStream) { nodeStream.off("end", pollDone); nodeStream.off("close", pollDone); nodeStream.off("error", pollDone); - nodeStream.off("data", pollReady); } - nodeStream.on("data", () => { - process._rawDebug(" --- DATA --- "); - pollReady(); - }); nodeStream.on("readable", pollReady); nodeStream.on("end", () => pollDone); nodeStream.on("close", pollDone); @@ -534,7 +529,7 @@ function handle(call, id, payload) { if (res === null) { if (stream.pollState.state === POLL_STATE_FINISHED) return { tag: "closed" }; if (stream.stream.readableLength === 0) - pollStateWait(stream.pollState, id); + pollStateWait(stream.pollState); return new Uint8Array(); } return res; @@ -572,7 +567,7 @@ function handle(call, id, payload) { case OUTPUT_STREAM_CHECK_WRITE: { const { stream, pollState } = getStreamOrThrow(id); const bytes = stream.writableHighWaterMark - stream.writableLength; - if (bytes === 0) pollStateWait(pollState, id); + if (bytes === 0) pollStateWait(pollState); return BigInt(bytes); } case OUTPUT_STREAM_WRITE: { @@ -597,7 +592,7 @@ function handle(call, id, payload) { "wasi-io trap: Cannot write more than permitted writable length" ); } - pollStateWait(stream.pollState, id); + pollStateWait(stream.pollState); return (stream.flushPromise = new Promise((resolve, reject) => { stream.stream.write(payload, (err) => { stream.flushPromise = null; @@ -610,7 +605,7 @@ function handle(call, id, payload) { case OUTPUT_STREAM_FLUSH: { const stream = getStreamOrThrow(id); if (stream.flushPromise) return; - pollStateWait(stream.pollState, id); + pollStateWait(stream.pollState); return (stream.flushPromise = new Promise((resolve, reject) => { stream.stream.write(new Uint8Array([]), (err) => { stream.flushPromise = null; @@ -810,7 +805,7 @@ export function verifyPollsDroppedForDrop(pollState, polledResourceDebugName) { /** * @param {PollState} pollState */ -export function pollStateWait(pollState, id) { +export function pollStateWait(pollState) { pollState.state = POLL_STATE_WAIT; if (pollState.listener) throw new Error( From 8f5227771c6df4f7dc50f15a54a13464e333938d Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Fri, 12 Jan 2024 16:47:14 -0800 Subject: [PATCH 08/23] workflow adjustment --- .github/workflows/main.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0ff5eced4..7a5145232 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,10 +22,6 @@ jobs: ] node: [18.x, 20.x, latest] exclude: - - os: macos-latest - node: 20.x - - os: macos-latest - node: 18.x - os: windows-latest node: 20.x - os: windows-latest @@ -34,13 +30,14 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} - name: Install Rust run: rustup update stable --no-self-update && rustup default stable - name: Install wasm32-unknown-unknown target run: rustup target add wasm32-unknown-unknown - name: Install wasm32-wasi target run: rustup target add wasm32-wasi - - run: | curl https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-16/wasi-sdk-16.0-linux.tar.gz -L | tar xzvf - echo "WASI_SDK_PATH=`pwd`/wasi-sdk-16.0" >> $GITHUB_ENV @@ -54,9 +51,6 @@ jobs: echo "WASI_SDK_PATH=`pwd`/wasi-sdk-16.0" >> $GITHUB_ENV if : matrix.os == 'windows-latest' - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - name: Install NPM packages run: npm install From 80277fff9ec71b95cc11617b9a27663c3470f6d6 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Fri, 12 Jan 2024 17:18:16 -0800 Subject: [PATCH 09/23] windows fixes --- .../preview2-shim/lib/io/worker-sockets.js | 3 ++ test/preview2-wasi-sockets-tcp.js | 41 ----------------- test/preview2-wasi-sockets-udp.js | 46 ------------------- tests/server/index.js | 4 +- 4 files changed, 5 insertions(+), 89 deletions(-) delete mode 100644 test/preview2-wasi-sockets-tcp.js delete mode 100644 test/preview2-wasi-sockets-udp.js diff --git a/packages/preview2-shim/lib/io/worker-sockets.js b/packages/preview2-shim/lib/io/worker-sockets.js index 1ab164442..2ef194f8c 100644 --- a/packages/preview2-shim/lib/io/worker-sockets.js +++ b/packages/preview2-shim/lib/io/worker-sockets.js @@ -111,6 +111,8 @@ export function convertSocketError(err) { export function convertSocketErrorCode(code) { switch (code) { + case 4053: // windows + case 4083: case ENOTCONN: case EBADF: return "invalid-state"; @@ -129,6 +131,7 @@ export function convertSocketErrorCode(code) { case EWOULDBLOCK: return "would-block"; // TODO: return "new-socket-limit"; + case 4090: // windows case EADDRNOTAVAIL: return "address-not-bindable"; case EADDRINUSE: diff --git a/test/preview2-wasi-sockets-tcp.js b/test/preview2-wasi-sockets-tcp.js deleted file mode 100644 index c3a6d598a..000000000 --- a/test/preview2-wasi-sockets-tcp.js +++ /dev/null @@ -1,41 +0,0 @@ -const { sockets } = await import("@bytecodealliance/preview2-shim"); -const network = sockets.instanceNetwork.instanceNetwork(); - -// server -const serverAddressIpv6 = { - tag: sockets.network.IpAddressFamily.ipv6, - val: { - address: [0, 0, 0, 0, 0, 0, 0, 0x1], - port: 3000, - }, -}; -const server = sockets.tcpCreateSocket.createTcpSocket( - sockets.network.IpAddressFamily.ipv6 -); -server.startBind(network, serverAddressIpv6); -server.finishBind(); -server.startListen(); -server.finishListen(); -const { address, port } = server.localAddress().val; -console.log(`[wasi-sockets-tcp] Server listening on: ${address}:${port}`); - -// client -const client = sockets.tcpCreateSocket.createTcpSocket( - sockets.network.IpAddressFamily.ipv6 -); - -client.setKeepAlive(true); -client.setNoDelay(true); -client.startConnect(network, serverAddressIpv6); -client.finishConnect(); - -setTimeout(() => { - // const [socket, input, output] = server.accept(); - // output.write('hello world'); - // const buff = input.read(2); - // console.log(`[wasi-sockets] Server received: ${buff}`); - - // client.shutdown("send"); - // server.shutdown("receive"); - // process.exit(0); -}, 2000); diff --git a/test/preview2-wasi-sockets-udp.js b/test/preview2-wasi-sockets-udp.js deleted file mode 100644 index 66318e84d..000000000 --- a/test/preview2-wasi-sockets-udp.js +++ /dev/null @@ -1,46 +0,0 @@ -const { sockets } = await import("@bytecodealliance/preview2-shim"); -const network = sockets.instanceNetwork.instanceNetwork(); - -// server -const serverAddressIpv6 = { - tag: sockets.network.IpAddressFamily.ipv6, - val: { - address: [0, 0, 0, 0, 0, 0, 0, 0x1], - port: 3000, - }, -}; -const server = sockets.udpCreateSocket.createUdpSocket( - sockets.network.IpAddressFamily.ipv6 -); -server.startBind(network, serverAddressIpv6); -server.finishBind(); -const { address, port } = server.localAddress().val; -console.log(`[wasi-sockets-udp] Server listening on: ${address}:${port}`); - -// client -const client = sockets.udpCreateSocket.createUdpSocket( - sockets.network.IpAddressFamily.ipv6 -); - -client.startConnect(network, serverAddressIpv6); -client.finishConnect(); - -setTimeout(() => { - client.send([ - { - data: [Buffer.from('hello world')], - remoteAddress: serverAddressIpv6, - } - ]); - - const data = server.receive(); - console.log(`[wasi-sockets-udp] Server received`); - console.log({ - data - }); -}, 2000); - -setTimeout(() => { - server[Symbol.dispose](); - client[Symbol.dispose](); -}, 5000); \ No newline at end of file diff --git a/tests/server/index.js b/tests/server/index.js index 939171b3f..c4c9e337b 100644 --- a/tests/server/index.js +++ b/tests/server/index.js @@ -3,7 +3,7 @@ import { _setPreopens } from "@bytecodealliance/preview2-shim/filesystem"; import { mkdtemp } from "node:fs/promises"; import { readFileSync, rmdirSync, writeFileSync, symlinkSync } from "node:fs"; import { tmpdir } from "node:os"; -import { fileURLToPath } from "node:url"; +import { fileURLToPath, pathToFileURL } from "node:url"; import { $init, generate } from "../../obj/js-component-bindgen-component.js"; import { fork } from "node:child_process"; @@ -66,7 +66,7 @@ export async function createIncomingServer(serverName) { for (const [name, contents] of files) { writeFileSync(testDir + "/" + name, contents); } - serverProcess.send(testDir + "/component.js"); + serverProcess.send(pathToFileURL(testDir + "/component.js")); const authority = await runningPromise; return authority; } catch (e) { From bf2851e49cd4c7f3cca61f5147ff6254169920d9 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Fri, 12 Jan 2024 17:58:28 -0800 Subject: [PATCH 10/23] reenable mac skips --- .github/workflows/main.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7a5145232..f24ee076b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,6 +22,10 @@ jobs: ] node: [18.x, 20.x, latest] exclude: + - os: macos-latest + node: 20.x + - os: macos-latest + node: 18.x - os: windows-latest node: 20.x - os: windows-latest From 8a50523aacb791bc12ae4b68b49235658a6b38d3 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Wed, 10 Jan 2024 12:55:34 -0800 Subject: [PATCH 11/23] wip --- packages/preview2-shim/lib/io/worker-io.js | 2 +- .../preview2-shim/lib/io/worker-thread.js | 36 ++++++ tests/generated/api_reactor.rs | 17 --- tests/generated/api_read_only.rs | 17 --- tests/generated/api_time.rs | 17 --- tests/generated/cli_args.rs | 17 --- tests/generated/cli_default_clocks.rs | 17 --- tests/generated/cli_directory_list.rs | 17 --- tests/generated/cli_env.rs | 17 --- tests/generated/cli_exit_default.rs | 17 --- tests/generated/cli_exit_failure.rs | 17 --- tests/generated/cli_exit_panic.rs | 17 --- tests/generated/cli_exit_success.rs | 17 --- tests/generated/cli_export_cabi_realloc.rs | 17 --- tests/generated/cli_file_append.rs | 17 --- tests/generated/cli_file_dir_sync.rs | 17 --- tests/generated/cli_file_read.rs | 17 --- tests/generated/cli_hello_stdout.rs | 17 --- tests/generated/cli_no_ip_name_lookup.rs | 17 --- tests/generated/cli_no_tcp.rs | 17 --- tests/generated/cli_no_udp.rs | 17 --- tests/generated/cli_splice_stdin.rs | 17 --- tests/generated/cli_stdin.rs | 17 --- tests/generated/cli_stdio_write_flushes.rs | 17 --- .../http_outbound_request_content_length.rs | 17 --- tests/generated/http_outbound_request_get.rs | 17 --- .../http_outbound_request_invalid_dnsname.rs | 17 --- .../http_outbound_request_invalid_header.rs | 17 --- .../http_outbound_request_invalid_port.rs | 17 --- .../http_outbound_request_invalid_version.rs | 17 --- .../http_outbound_request_large_post.rs | 17 --- tests/generated/http_outbound_request_post.rs | 17 --- tests/generated/http_outbound_request_put.rs | 17 --- .../http_outbound_request_response_build.rs | 17 --- .../http_outbound_request_unknown_method.rs | 17 --- ...ttp_outbound_request_unsupported_scheme.rs | 17 --- tests/generated/mod.rs | 103 +---------------- tests/generated/piped_simple.rs | 45 ++++++++ tests/generated/preview1_big_random_buf.rs | 17 --- tests/generated/preview1_clock_time_get.rs | 17 --- tests/generated/preview1_close_preopen.rs | 17 --- tests/generated/preview1_dangling_fd.rs | 17 --- tests/generated/preview1_dangling_symlink.rs | 17 --- .../generated/preview1_dir_fd_op_failures.rs | 17 --- tests/generated/preview1_directory_seek.rs | 17 --- tests/generated/preview1_fd_advise.rs | 17 --- tests/generated/preview1_fd_filestat_get.rs | 17 --- tests/generated/preview1_fd_filestat_set.rs | 17 --- tests/generated/preview1_fd_flags_set.rs | 17 --- tests/generated/preview1_fd_readdir.rs | 17 --- tests/generated/preview1_file_allocate.rs | 17 --- tests/generated/preview1_file_pread_pwrite.rs | 17 --- tests/generated/preview1_file_seek_tell.rs | 17 --- tests/generated/preview1_file_truncation.rs | 17 --- .../preview1_file_unbuffered_write.rs | 17 --- tests/generated/preview1_file_write.rs | 17 --- tests/generated/preview1_interesting_paths.rs | 17 --- tests/generated/preview1_nofollow_errors.rs | 17 --- tests/generated/preview1_overwrite_preopen.rs | 17 --- tests/generated/preview1_path_exists.rs | 17 --- tests/generated/preview1_path_filestat.rs | 17 --- tests/generated/preview1_path_link.rs | 17 --- .../preview1_path_open_create_existing.rs | 17 --- .../preview1_path_open_dirfd_not_dir.rs | 17 --- tests/generated/preview1_path_open_missing.rs | 17 --- .../generated/preview1_path_open_nonblock.rs | 17 --- tests/generated/preview1_path_open_preopen.rs | 17 --- .../preview1_path_open_read_write.rs | 17 --- tests/generated/preview1_path_rename.rs | 17 --- ...eview1_path_rename_dir_trailing_slashes.rs | 17 --- .../preview1_path_symlink_trailing_slashes.rs | 17 --- tests/generated/preview1_poll_oneoff_files.rs | 17 --- tests/generated/preview1_poll_oneoff_stdio.rs | 17 --- tests/generated/preview1_readlink.rs | 17 --- .../generated/preview1_regular_file_isatty.rs | 17 --- tests/generated/preview1_remove_directory.rs | 17 --- .../preview1_remove_nonempty_directory.rs | 17 --- tests/generated/preview1_renumber.rs | 17 --- tests/generated/preview1_sched_yield.rs | 17 --- tests/generated/preview1_stdio.rs | 17 --- tests/generated/preview1_stdio_isatty.rs | 17 --- tests/generated/preview1_stdio_not_isatty.rs | 17 --- tests/generated/preview1_symlink_create.rs | 17 --- tests/generated/preview1_symlink_filestat.rs | 17 --- tests/generated/preview1_symlink_loop.rs | 17 --- tests/generated/preview1_unicode_output.rs | 17 --- .../preview1_unlink_file_trailing_slashes.rs | 17 --- tests/generated/preview2_adapter_badfd.rs | 17 --- tests/generated/preview2_ip_name_lookup.rs | 17 --- tests/generated/preview2_random.rs | 17 --- tests/generated/preview2_sleep.rs | 17 --- .../preview2_stream_pollable_correct.rs | 17 --- .../preview2_stream_pollable_traps.rs | 17 --- tests/generated/preview2_tcp_bind.rs | 17 --- tests/generated/preview2_tcp_connect.rs | 17 --- .../preview2_tcp_sample_application.rs | 17 --- tests/generated/preview2_tcp_sockopts.rs | 17 --- tests/generated/preview2_tcp_states.rs | 17 --- tests/generated/preview2_udp_bind.rs | 17 --- tests/generated/preview2_udp_connect.rs | 17 --- .../preview2_udp_sample_application.rs | 17 --- tests/generated/preview2_udp_sockopts.rs | 17 --- tests/generated/preview2_udp_states.rs | 17 --- tests/generated/proxy_echo.rs | 17 --- tests/generated/proxy_handler.rs | 17 --- tests/generated/proxy_hash.rs | 17 --- tests/virtualenvs/piped-consumer.js | 36 ++++++ tests/virtualenvs/piped.js | 33 ++++++ xtask/src/generate/tests.rs | 108 ++++++++++++++++-- 109 files changed, 249 insertions(+), 1848 deletions(-) delete mode 100644 tests/generated/api_reactor.rs delete mode 100644 tests/generated/api_read_only.rs delete mode 100644 tests/generated/api_time.rs delete mode 100644 tests/generated/cli_args.rs delete mode 100644 tests/generated/cli_default_clocks.rs delete mode 100644 tests/generated/cli_directory_list.rs delete mode 100644 tests/generated/cli_env.rs delete mode 100644 tests/generated/cli_exit_default.rs delete mode 100644 tests/generated/cli_exit_failure.rs delete mode 100644 tests/generated/cli_exit_panic.rs delete mode 100644 tests/generated/cli_exit_success.rs delete mode 100644 tests/generated/cli_export_cabi_realloc.rs delete mode 100644 tests/generated/cli_file_append.rs delete mode 100644 tests/generated/cli_file_dir_sync.rs delete mode 100644 tests/generated/cli_file_read.rs delete mode 100644 tests/generated/cli_hello_stdout.rs delete mode 100644 tests/generated/cli_no_ip_name_lookup.rs delete mode 100644 tests/generated/cli_no_tcp.rs delete mode 100644 tests/generated/cli_no_udp.rs delete mode 100644 tests/generated/cli_splice_stdin.rs delete mode 100644 tests/generated/cli_stdin.rs delete mode 100644 tests/generated/cli_stdio_write_flushes.rs delete mode 100644 tests/generated/http_outbound_request_content_length.rs delete mode 100644 tests/generated/http_outbound_request_get.rs delete mode 100644 tests/generated/http_outbound_request_invalid_dnsname.rs delete mode 100644 tests/generated/http_outbound_request_invalid_header.rs delete mode 100644 tests/generated/http_outbound_request_invalid_port.rs delete mode 100644 tests/generated/http_outbound_request_invalid_version.rs delete mode 100644 tests/generated/http_outbound_request_large_post.rs delete mode 100644 tests/generated/http_outbound_request_post.rs delete mode 100644 tests/generated/http_outbound_request_put.rs delete mode 100644 tests/generated/http_outbound_request_response_build.rs delete mode 100644 tests/generated/http_outbound_request_unknown_method.rs delete mode 100644 tests/generated/http_outbound_request_unsupported_scheme.rs create mode 100644 tests/generated/piped_simple.rs delete mode 100644 tests/generated/preview1_big_random_buf.rs delete mode 100644 tests/generated/preview1_clock_time_get.rs delete mode 100644 tests/generated/preview1_close_preopen.rs delete mode 100644 tests/generated/preview1_dangling_fd.rs delete mode 100644 tests/generated/preview1_dangling_symlink.rs delete mode 100644 tests/generated/preview1_dir_fd_op_failures.rs delete mode 100644 tests/generated/preview1_directory_seek.rs delete mode 100644 tests/generated/preview1_fd_advise.rs delete mode 100644 tests/generated/preview1_fd_filestat_get.rs delete mode 100644 tests/generated/preview1_fd_filestat_set.rs delete mode 100644 tests/generated/preview1_fd_flags_set.rs delete mode 100644 tests/generated/preview1_fd_readdir.rs delete mode 100644 tests/generated/preview1_file_allocate.rs delete mode 100644 tests/generated/preview1_file_pread_pwrite.rs delete mode 100644 tests/generated/preview1_file_seek_tell.rs delete mode 100644 tests/generated/preview1_file_truncation.rs delete mode 100644 tests/generated/preview1_file_unbuffered_write.rs delete mode 100644 tests/generated/preview1_file_write.rs delete mode 100644 tests/generated/preview1_interesting_paths.rs delete mode 100644 tests/generated/preview1_nofollow_errors.rs delete mode 100644 tests/generated/preview1_overwrite_preopen.rs delete mode 100644 tests/generated/preview1_path_exists.rs delete mode 100644 tests/generated/preview1_path_filestat.rs delete mode 100644 tests/generated/preview1_path_link.rs delete mode 100644 tests/generated/preview1_path_open_create_existing.rs delete mode 100644 tests/generated/preview1_path_open_dirfd_not_dir.rs delete mode 100644 tests/generated/preview1_path_open_missing.rs delete mode 100644 tests/generated/preview1_path_open_nonblock.rs delete mode 100644 tests/generated/preview1_path_open_preopen.rs delete mode 100644 tests/generated/preview1_path_open_read_write.rs delete mode 100644 tests/generated/preview1_path_rename.rs delete mode 100644 tests/generated/preview1_path_rename_dir_trailing_slashes.rs delete mode 100644 tests/generated/preview1_path_symlink_trailing_slashes.rs delete mode 100644 tests/generated/preview1_poll_oneoff_files.rs delete mode 100644 tests/generated/preview1_poll_oneoff_stdio.rs delete mode 100644 tests/generated/preview1_readlink.rs delete mode 100644 tests/generated/preview1_regular_file_isatty.rs delete mode 100644 tests/generated/preview1_remove_directory.rs delete mode 100644 tests/generated/preview1_remove_nonempty_directory.rs delete mode 100644 tests/generated/preview1_renumber.rs delete mode 100644 tests/generated/preview1_sched_yield.rs delete mode 100644 tests/generated/preview1_stdio.rs delete mode 100644 tests/generated/preview1_stdio_isatty.rs delete mode 100644 tests/generated/preview1_stdio_not_isatty.rs delete mode 100644 tests/generated/preview1_symlink_create.rs delete mode 100644 tests/generated/preview1_symlink_filestat.rs delete mode 100644 tests/generated/preview1_symlink_loop.rs delete mode 100644 tests/generated/preview1_unicode_output.rs delete mode 100644 tests/generated/preview1_unlink_file_trailing_slashes.rs delete mode 100644 tests/generated/preview2_adapter_badfd.rs delete mode 100644 tests/generated/preview2_ip_name_lookup.rs delete mode 100644 tests/generated/preview2_random.rs delete mode 100644 tests/generated/preview2_sleep.rs delete mode 100644 tests/generated/preview2_stream_pollable_correct.rs delete mode 100644 tests/generated/preview2_stream_pollable_traps.rs delete mode 100644 tests/generated/preview2_tcp_bind.rs delete mode 100644 tests/generated/preview2_tcp_connect.rs delete mode 100644 tests/generated/preview2_tcp_sample_application.rs delete mode 100644 tests/generated/preview2_tcp_sockopts.rs delete mode 100644 tests/generated/preview2_tcp_states.rs delete mode 100644 tests/generated/preview2_udp_bind.rs delete mode 100644 tests/generated/preview2_udp_connect.rs delete mode 100644 tests/generated/preview2_udp_sample_application.rs delete mode 100644 tests/generated/preview2_udp_sockopts.rs delete mode 100644 tests/generated/preview2_udp_states.rs delete mode 100644 tests/generated/proxy_echo.rs delete mode 100644 tests/generated/proxy_handler.rs delete mode 100644 tests/generated/proxy_hash.rs create mode 100644 tests/virtualenvs/piped-consumer.js create mode 100644 tests/virtualenvs/piped.js diff --git a/packages/preview2-shim/lib/io/worker-io.js b/packages/preview2-shim/lib/io/worker-io.js index ef581713a..7dba3f9de 100644 --- a/packages/preview2-shim/lib/io/worker-io.js +++ b/packages/preview2-shim/lib/io/worker-io.js @@ -40,7 +40,7 @@ export function registerIncomingHttpHandler(id, handler) { } const instanceId = Math.round(Math.random() * 1000).toString(); -const DEBUG_DEFAULT = false; +const DEBUG_DEFAULT = true; const DEBUG = env.JCO_DEBUG === '0' ? false : env.JCO_DEBUG === '1' ? true : DEBUG_DEFAULT; /** diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index e953919e5..c8c3e2703 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -481,6 +481,42 @@ function handle(call, id, payload) { // stream.on("end", () => void stream.emit("readable")); return createReadableStream(stream); } + case INPUT_STREAM_SUBSCRIBE | STDIN: { + const stream = streams.get(id)?.stream; + // already closed or errored -> immediately return poll + // (poll 0 is immediately resolved) + if ( + !stream || + stream.closed || + stream.errored || + stream.readableLength > 0 + ) + return 0; + let resolve, reject; + return createPoll( + new Promise((_resolve, _reject) => { + stream + .once("readable", (resolve = _resolve)) + .once("error", (reject = _reject)) + }).then( + () => void stream.off("error", reject), + // error is read off of stream itself when later accessed + (err) => { + void stream.off("readable", resolve); + if (err.code === "EAGAIN") { + streams.set(id, { + flushPromise: null, + stream: createReadStream(null, { + fd: 0, + highWaterMark: 64 * 1024 + }) + }); + return handle(INPUT_STREAM_SUBSCRIBE | STDIN, id, payload); + } + } + ) + ); + } // Clocks case CLOCKS_NOW: diff --git a/tests/generated/api_reactor.rs b/tests/generated/api_reactor.rs deleted file mode 100644 index e7831c633..000000000 --- a/tests/generated/api_reactor.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn api_reactor() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/api_reactor.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/api_reactor"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/api_read_only.rs b/tests/generated/api_read_only.rs deleted file mode 100644 index bd4679d1f..000000000 --- a/tests/generated/api_read_only.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn api_read_only() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/api_read_only.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/api_read_only"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/api_read_only --jco-import ./tests/virtualenvs/readonly.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/api_time.rs b/tests/generated/api_time.rs deleted file mode 100644 index 6a781199c..000000000 --- a/tests/generated/api_time.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn api_time() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/api_time.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/api_time"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_args.rs b/tests/generated/cli_args.rs deleted file mode 100644 index 568cc905d..000000000 --- a/tests/generated/cli_args.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_args() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_args.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_args"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_default_clocks.rs b/tests/generated/cli_default_clocks.rs deleted file mode 100644 index 8fb122769..000000000 --- a/tests/generated/cli_default_clocks.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_default_clocks() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_default_clocks.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_default_clocks"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_directory_list.rs b/tests/generated/cli_directory_list.rs deleted file mode 100644 index 21d717565..000000000 --- a/tests/generated/cli_directory_list.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_directory_list() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_directory_list.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_directory_list"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_env.rs b/tests/generated/cli_env.rs deleted file mode 100644 index 0d19ad812..000000000 --- a/tests/generated/cli_env.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_env() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_env.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_env"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_exit_default.rs b/tests/generated/cli_exit_default.rs deleted file mode 100644 index 7cb846603..000000000 --- a/tests/generated/cli_exit_default.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_exit_default() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_exit_default.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_exit_default"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_exit_failure.rs b/tests/generated/cli_exit_failure.rs deleted file mode 100644 index e154a450a..000000000 --- a/tests/generated/cli_exit_failure.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_exit_failure() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_exit_failure.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_exit_failure"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.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 deleted file mode 100644 index 35bb08039..000000000 --- a/tests/generated/cli_exit_panic.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_exit_panic() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_exit_panic.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_exit_panic"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.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 deleted file mode 100644 index f82b6a577..000000000 --- a/tests/generated/cli_exit_success.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_exit_success() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_exit_success.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_exit_success"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_export_cabi_realloc.rs b/tests/generated/cli_export_cabi_realloc.rs deleted file mode 100644 index 7ce166243..000000000 --- a/tests/generated/cli_export_cabi_realloc.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_export_cabi_realloc() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_export_cabi_realloc.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_export_cabi_realloc"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_file_append.rs b/tests/generated/cli_file_append.rs deleted file mode 100644 index a952435b6..000000000 --- a/tests/generated/cli_file_append.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_file_append() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_file_append.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_file_append"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_file_dir_sync.rs b/tests/generated/cli_file_dir_sync.rs deleted file mode 100644 index 038267425..000000000 --- a/tests/generated/cli_file_dir_sync.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_file_dir_sync() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_file_dir_sync.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_file_dir_sync"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_file_read.rs b/tests/generated/cli_file_read.rs deleted file mode 100644 index 17c8c8fdd..000000000 --- a/tests/generated/cli_file_read.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_file_read() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_file_read.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_file_read"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_hello_stdout.rs b/tests/generated/cli_hello_stdout.rs deleted file mode 100644 index 8d68f79aa..000000000 --- a/tests/generated/cli_hello_stdout.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_hello_stdout() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_hello_stdout.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_hello_stdout"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_no_ip_name_lookup.rs b/tests/generated/cli_no_ip_name_lookup.rs deleted file mode 100644 index db8f83bcb..000000000 --- a/tests/generated/cli_no_ip_name_lookup.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_no_ip_name_lookup() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_no_ip_name_lookup.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_no_ip_name_lookup"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/cli_no_ip_name_lookup --jco-import ./tests/virtualenvs/deny-dns.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_no_tcp.rs b/tests/generated/cli_no_tcp.rs deleted file mode 100644 index c386d484c..000000000 --- a/tests/generated/cli_no_tcp.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_no_tcp() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_no_tcp.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_no_tcp"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/cli_no_tcp --jco-import ./tests/virtualenvs/deny-tcp.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_no_udp.rs b/tests/generated/cli_no_udp.rs deleted file mode 100644 index cb95a5986..000000000 --- a/tests/generated/cli_no_udp.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_no_udp() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_no_udp.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_no_udp"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/cli_no_udp --jco-import ./tests/virtualenvs/deny-udp.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_splice_stdin.rs b/tests/generated/cli_splice_stdin.rs deleted file mode 100644 index ed25cac7d..000000000 --- a/tests/generated/cli_splice_stdin.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_splice_stdin() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_splice_stdin.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_splice_stdin"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_stdin.rs b/tests/generated/cli_stdin.rs deleted file mode 100644 index 33d2d38e5..000000000 --- a/tests/generated/cli_stdin.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_stdin() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_stdin.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_stdin"); - - let cmd = cmd!(sh, "node ./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'"); - let cmd = cmd.stdin(b"So rested he by the Tumtum tree"); - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/cli_stdio_write_flushes.rs b/tests/generated/cli_stdio_write_flushes.rs deleted file mode 100644 index 6ddedb8e8..000000000 --- a/tests/generated/cli_stdio_write_flushes.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn cli_stdio_write_flushes() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/cli_stdio_write_flushes.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_stdio_write_flushes"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_content_length.rs b/tests/generated/http_outbound_request_content_length.rs deleted file mode 100644 index 05987fc63..000000000 --- a/tests/generated/http_outbound_request_content_length.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_content_length() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_content_length.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_content_length"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_content_length --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_get.rs b/tests/generated/http_outbound_request_get.rs deleted file mode 100644 index c58b6d092..000000000 --- a/tests/generated/http_outbound_request_get.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_get() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_get.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_get"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_get --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_invalid_dnsname.rs b/tests/generated/http_outbound_request_invalid_dnsname.rs deleted file mode 100644 index 69eeda57d..000000000 --- a/tests/generated/http_outbound_request_invalid_dnsname.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_invalid_dnsname() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_invalid_dnsname.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_invalid_dnsname"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_invalid_dnsname --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_invalid_header.rs b/tests/generated/http_outbound_request_invalid_header.rs deleted file mode 100644 index ea65d65c2..000000000 --- a/tests/generated/http_outbound_request_invalid_header.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_invalid_header() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_invalid_header.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_invalid_header"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_invalid_header --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_invalid_port.rs b/tests/generated/http_outbound_request_invalid_port.rs deleted file mode 100644 index 96cf85450..000000000 --- a/tests/generated/http_outbound_request_invalid_port.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_invalid_port() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_invalid_port.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_invalid_port"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_invalid_port --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_invalid_version.rs b/tests/generated/http_outbound_request_invalid_version.rs deleted file mode 100644 index 2c371f14c..000000000 --- a/tests/generated/http_outbound_request_invalid_version.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_invalid_version() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_invalid_version.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_invalid_version"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_invalid_version --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_large_post.rs b/tests/generated/http_outbound_request_large_post.rs deleted file mode 100644 index f817acadb..000000000 --- a/tests/generated/http_outbound_request_large_post.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_large_post() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_large_post.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_large_post"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_large_post --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_post.rs b/tests/generated/http_outbound_request_post.rs deleted file mode 100644 index ec5e899ec..000000000 --- a/tests/generated/http_outbound_request_post.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_post() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_post.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_post"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_post --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_put.rs b/tests/generated/http_outbound_request_put.rs deleted file mode 100644 index d5b1058d8..000000000 --- a/tests/generated/http_outbound_request_put.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_put() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_put.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_put"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_put --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_response_build.rs b/tests/generated/http_outbound_request_response_build.rs deleted file mode 100644 index 3d77c6d82..000000000 --- a/tests/generated/http_outbound_request_response_build.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_response_build() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_response_build.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_response_build"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_response_build --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_unknown_method.rs b/tests/generated/http_outbound_request_unknown_method.rs deleted file mode 100644 index 47e97666b..000000000 --- a/tests/generated/http_outbound_request_unknown_method.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_unknown_method() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_unknown_method.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_unknown_method"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_unknown_method --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/http_outbound_request_unsupported_scheme.rs b/tests/generated/http_outbound_request_unsupported_scheme.rs deleted file mode 100644 index 02ae3b26e..000000000 --- a/tests/generated/http_outbound_request_unsupported_scheme.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn http_outbound_request_unsupported_scheme() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/http_outbound_request_unsupported_scheme.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_unsupported_scheme"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/http_outbound_request_unsupported_scheme --jco-import ./tests/virtualenvs/http.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index 7bdb34de4..dfcfec476 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -1,102 +1 @@ -mod api_reactor; -mod api_read_only; -mod api_time; -mod cli_args; -mod cli_default_clocks; -mod cli_directory_list; -mod cli_env; -mod cli_exit_default; -mod cli_exit_failure; -mod cli_exit_panic; -mod cli_exit_success; -mod cli_export_cabi_realloc; -mod cli_file_append; -mod cli_file_dir_sync; -mod cli_file_read; -mod cli_hello_stdout; -mod cli_no_ip_name_lookup; -mod cli_no_tcp; -mod cli_no_udp; -mod cli_splice_stdin; -mod cli_stdin; -mod cli_stdio_write_flushes; -mod http_outbound_request_content_length; -mod http_outbound_request_get; -mod http_outbound_request_invalid_dnsname; -mod http_outbound_request_invalid_header; -mod http_outbound_request_invalid_port; -mod http_outbound_request_invalid_version; -mod http_outbound_request_large_post; -mod http_outbound_request_post; -mod http_outbound_request_put; -mod http_outbound_request_response_build; -mod http_outbound_request_unknown_method; -mod http_outbound_request_unsupported_scheme; -mod preview1_big_random_buf; -mod preview1_clock_time_get; -mod preview1_close_preopen; -mod preview1_dangling_fd; -mod preview1_dangling_symlink; -mod preview1_dir_fd_op_failures; -mod preview1_directory_seek; -mod preview1_fd_advise; -mod preview1_fd_filestat_get; -mod preview1_fd_filestat_set; -mod preview1_fd_flags_set; -mod preview1_fd_readdir; -mod preview1_file_allocate; -mod preview1_file_pread_pwrite; -mod preview1_file_seek_tell; -mod preview1_file_truncation; -mod preview1_file_unbuffered_write; -mod preview1_file_write; -mod preview1_interesting_paths; -mod preview1_nofollow_errors; -mod preview1_overwrite_preopen; -mod preview1_path_exists; -mod preview1_path_filestat; -mod preview1_path_link; -mod preview1_path_open_create_existing; -mod preview1_path_open_dirfd_not_dir; -mod preview1_path_open_missing; -mod preview1_path_open_nonblock; -mod preview1_path_open_preopen; -mod preview1_path_open_read_write; -mod preview1_path_rename; -mod preview1_path_rename_dir_trailing_slashes; -mod preview1_path_symlink_trailing_slashes; -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_nonempty_directory; -mod preview1_renumber; -mod preview1_sched_yield; -mod preview1_stdio; -mod preview1_stdio_isatty; -mod preview1_stdio_not_isatty; -mod preview1_symlink_create; -mod preview1_symlink_filestat; -mod preview1_symlink_loop; -mod preview1_unicode_output; -mod preview1_unlink_file_trailing_slashes; -mod preview2_adapter_badfd; -mod preview2_ip_name_lookup; -mod preview2_random; -mod preview2_sleep; -mod preview2_stream_pollable_correct; -mod preview2_stream_pollable_traps; -mod preview2_tcp_bind; -mod preview2_tcp_connect; -mod preview2_tcp_sample_application; -mod preview2_tcp_sockopts; -mod preview2_tcp_states; -mod preview2_udp_bind; -mod preview2_udp_connect; -mod preview2_udp_sample_application; -mod preview2_udp_sockopts; -mod preview2_udp_states; -mod proxy_echo; -mod proxy_handler; -mod proxy_hash; +mod piped_simple; diff --git a/tests/generated/piped_simple.rs b/tests/generated/piped_simple.rs new file mode 100644 index 000000000..c63d75594 --- /dev/null +++ b/tests/generated/piped_simple.rs @@ -0,0 +1,45 @@ +//! 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 std::fs; +use std::process::{{Command, Stdio}}; +use std::io::prelude::Write; + +#[test] +fn piped_simple() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/piped_simple.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/piped_simple"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/piped_simple"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/piped.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + cmd1.stdout(Stdio::piped()); + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + let mut cmd2 = Command::new("node"); + cmd2.arg("./src/jco.js"); + cmd2.arg("run"); + + cmd2.arg("--jco-dir"); + cmd2.arg("./tests/rundir/test_name_consumer"); + cmd2.arg("--jco-import"); + cmd2.arg("./tests/virtualenvs/piped-consumer.js"); + cmd2.arg(wasi_file); + cmd2.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + cmd2.stdin(cmd1_child.stdout.take().unwrap()); + let mut cmd2_child = cmd2.spawn().expect("failed to spawn test program"); + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + let status = cmd2_child.wait().expect("failed to wait on child"); + assert!(status.success(), "consumer failed"); + Ok(()) +} diff --git a/tests/generated/preview1_big_random_buf.rs b/tests/generated/preview1_big_random_buf.rs deleted file mode 100644 index 85625ab18..000000000 --- a/tests/generated/preview1_big_random_buf.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_big_random_buf() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_big_random_buf.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_big_random_buf"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_big_random_buf --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_clock_time_get.rs b/tests/generated/preview1_clock_time_get.rs deleted file mode 100644 index d9422b22a..000000000 --- a/tests/generated/preview1_clock_time_get.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_clock_time_get() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_clock_time_get.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_clock_time_get"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_clock_time_get --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_close_preopen.rs b/tests/generated/preview1_close_preopen.rs deleted file mode 100644 index 2f7fd975a..000000000 --- a/tests/generated/preview1_close_preopen.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_close_preopen() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_close_preopen.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_close_preopen"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_dangling_fd.rs b/tests/generated/preview1_dangling_fd.rs deleted file mode 100644 index a178db2e9..000000000 --- a/tests/generated/preview1_dangling_fd.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_dangling_fd() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_dangling_fd.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_dangling_fd"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_dangling_symlink.rs b/tests/generated/preview1_dangling_symlink.rs deleted file mode 100644 index e678c7fc2..000000000 --- a/tests/generated/preview1_dangling_symlink.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_dangling_symlink() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_dangling_symlink.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_dangling_symlink"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_dir_fd_op_failures.rs b/tests/generated/preview1_dir_fd_op_failures.rs deleted file mode 100644 index f36d3f399..000000000 --- a/tests/generated/preview1_dir_fd_op_failures.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_dir_fd_op_failures() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_dir_fd_op_failures.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_dir_fd_op_failures"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_dir_fd_op_failures --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_directory_seek.rs b/tests/generated/preview1_directory_seek.rs deleted file mode 100644 index 07dc7962d..000000000 --- a/tests/generated/preview1_directory_seek.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_directory_seek() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_directory_seek.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_directory_seek"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_directory_seek --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_fd_advise.rs b/tests/generated/preview1_fd_advise.rs deleted file mode 100644 index 0c587bce1..000000000 --- a/tests/generated/preview1_fd_advise.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_fd_advise() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_fd_advise.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_advise"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_advise --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_fd_filestat_get.rs b/tests/generated/preview1_fd_filestat_get.rs deleted file mode 100644 index ef3da1c7d..000000000 --- a/tests/generated/preview1_fd_filestat_get.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_fd_filestat_get() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_fd_filestat_get.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_filestat_get"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_filestat_get --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_fd_filestat_set.rs b/tests/generated/preview1_fd_filestat_set.rs deleted file mode 100644 index 6d7263c05..000000000 --- a/tests/generated/preview1_fd_filestat_set.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_fd_filestat_set() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_fd_filestat_set.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_filestat_set"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_filestat_set --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_fd_flags_set.rs b/tests/generated/preview1_fd_flags_set.rs deleted file mode 100644 index 3aa0ae85b..000000000 --- a/tests/generated/preview1_fd_flags_set.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_fd_flags_set() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_fd_flags_set.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_flags_set"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_flags_set --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_fd_readdir.rs b/tests/generated/preview1_fd_readdir.rs deleted file mode 100644 index 094a146fe..000000000 --- a/tests/generated/preview1_fd_readdir.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_fd_readdir() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_fd_readdir.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_readdir"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_fd_readdir --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_file_allocate.rs b/tests/generated/preview1_file_allocate.rs deleted file mode 100644 index 07065f7b0..000000000 --- a/tests/generated/preview1_file_allocate.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_file_allocate() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_file_allocate.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_file_allocate"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_file_allocate --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_file_pread_pwrite.rs b/tests/generated/preview1_file_pread_pwrite.rs deleted file mode 100644 index 9b8619170..000000000 --- a/tests/generated/preview1_file_pread_pwrite.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_file_pread_pwrite() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_file_pread_pwrite.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_file_pread_pwrite"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_file_pread_pwrite --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_file_seek_tell.rs b/tests/generated/preview1_file_seek_tell.rs deleted file mode 100644 index b97c5dd76..000000000 --- a/tests/generated/preview1_file_seek_tell.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_file_seek_tell() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_file_seek_tell.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_file_seek_tell"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_file_seek_tell --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_file_truncation.rs b/tests/generated/preview1_file_truncation.rs deleted file mode 100644 index 118c51834..000000000 --- a/tests/generated/preview1_file_truncation.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_file_truncation() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_file_truncation.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_file_truncation"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_file_truncation --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_file_unbuffered_write.rs b/tests/generated/preview1_file_unbuffered_write.rs deleted file mode 100644 index f3856e2e2..000000000 --- a/tests/generated/preview1_file_unbuffered_write.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_file_unbuffered_write() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_file_unbuffered_write.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_file_unbuffered_write"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_file_unbuffered_write --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_file_write.rs b/tests/generated/preview1_file_write.rs deleted file mode 100644 index 240fd7da3..000000000 --- a/tests/generated/preview1_file_write.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_file_write() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_file_write.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_file_write"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_file_write --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_interesting_paths.rs b/tests/generated/preview1_interesting_paths.rs deleted file mode 100644 index 455003c42..000000000 --- a/tests/generated/preview1_interesting_paths.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_interesting_paths() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_interesting_paths.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_interesting_paths"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_interesting_paths --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_nofollow_errors.rs b/tests/generated/preview1_nofollow_errors.rs deleted file mode 100644 index eada80a88..000000000 --- a/tests/generated/preview1_nofollow_errors.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_nofollow_errors() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_nofollow_errors.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_nofollow_errors"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_nofollow_errors --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_overwrite_preopen.rs b/tests/generated/preview1_overwrite_preopen.rs deleted file mode 100644 index 31921b6af..000000000 --- a/tests/generated/preview1_overwrite_preopen.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_overwrite_preopen() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_overwrite_preopen.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_overwrite_preopen"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_overwrite_preopen --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_exists.rs b/tests/generated/preview1_path_exists.rs deleted file mode 100644 index 133dc40ec..000000000 --- a/tests/generated/preview1_path_exists.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_exists() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_exists.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_exists"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_exists --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_filestat.rs b/tests/generated/preview1_path_filestat.rs deleted file mode 100644 index 159b3d3aa..000000000 --- a/tests/generated/preview1_path_filestat.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_filestat() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_filestat.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_filestat"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_filestat --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_link.rs b/tests/generated/preview1_path_link.rs deleted file mode 100644 index 10b8c18a6..000000000 --- a/tests/generated/preview1_path_link.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_link() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_link.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_link"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_link --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_open_create_existing.rs b/tests/generated/preview1_path_open_create_existing.rs deleted file mode 100644 index c6eaab542..000000000 --- a/tests/generated/preview1_path_open_create_existing.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_open_create_existing() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_open_create_existing.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_create_existing"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_create_existing --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_open_dirfd_not_dir.rs b/tests/generated/preview1_path_open_dirfd_not_dir.rs deleted file mode 100644 index cdbb63c83..000000000 --- a/tests/generated/preview1_path_open_dirfd_not_dir.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_open_dirfd_not_dir() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_open_dirfd_not_dir.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_dirfd_not_dir"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_dirfd_not_dir --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_open_missing.rs b/tests/generated/preview1_path_open_missing.rs deleted file mode 100644 index b621f492a..000000000 --- a/tests/generated/preview1_path_open_missing.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_open_missing() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_open_missing.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_missing"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_missing --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_open_nonblock.rs b/tests/generated/preview1_path_open_nonblock.rs deleted file mode 100644 index 6904f9a80..000000000 --- a/tests/generated/preview1_path_open_nonblock.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_open_nonblock() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_open_nonblock.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_nonblock"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_nonblock --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_open_preopen.rs b/tests/generated/preview1_path_open_preopen.rs deleted file mode 100644 index 1f1e8204b..000000000 --- a/tests/generated/preview1_path_open_preopen.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_open_preopen() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_open_preopen.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_preopen"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_preopen --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_open_read_write.rs b/tests/generated/preview1_path_open_read_write.rs deleted file mode 100644 index 35269df8f..000000000 --- a/tests/generated/preview1_path_open_read_write.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_open_read_write() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_open_read_write.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_read_write"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_open_read_write --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_rename.rs b/tests/generated/preview1_path_rename.rs deleted file mode 100644 index 4f12ddf3e..000000000 --- a/tests/generated/preview1_path_rename.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_rename() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_rename.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_rename"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_rename --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_rename_dir_trailing_slashes.rs b/tests/generated/preview1_path_rename_dir_trailing_slashes.rs deleted file mode 100644 index de8ee2171..000000000 --- a/tests/generated/preview1_path_rename_dir_trailing_slashes.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_rename_dir_trailing_slashes() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_rename_dir_trailing_slashes.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_rename_dir_trailing_slashes"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_rename_dir_trailing_slashes --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_path_symlink_trailing_slashes.rs b/tests/generated/preview1_path_symlink_trailing_slashes.rs deleted file mode 100644 index df65a0ad7..000000000 --- a/tests/generated/preview1_path_symlink_trailing_slashes.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_path_symlink_trailing_slashes() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_path_symlink_trailing_slashes.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_path_symlink_trailing_slashes"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_path_symlink_trailing_slashes --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_poll_oneoff_files.rs b/tests/generated/preview1_poll_oneoff_files.rs deleted file mode 100644 index 430626a74..000000000 --- a/tests/generated/preview1_poll_oneoff_files.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_poll_oneoff_files() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_poll_oneoff_files.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_poll_oneoff_files"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_poll_oneoff_files --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_poll_oneoff_stdio.rs b/tests/generated/preview1_poll_oneoff_stdio.rs deleted file mode 100644 index 4e799a806..000000000 --- a/tests/generated/preview1_poll_oneoff_stdio.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_poll_oneoff_stdio() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_poll_oneoff_stdio.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_poll_oneoff_stdio"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_poll_oneoff_stdio --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_readlink.rs b/tests/generated/preview1_readlink.rs deleted file mode 100644 index cd0e79192..000000000 --- a/tests/generated/preview1_readlink.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_readlink() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_readlink.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_readlink"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_readlink --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_regular_file_isatty.rs b/tests/generated/preview1_regular_file_isatty.rs deleted file mode 100644 index 039a7b42c..000000000 --- a/tests/generated/preview1_regular_file_isatty.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_regular_file_isatty() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_regular_file_isatty.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_regular_file_isatty"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_regular_file_isatty --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_remove_directory.rs b/tests/generated/preview1_remove_directory.rs deleted file mode 100644 index cafcc6e29..000000000 --- a/tests/generated/preview1_remove_directory.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_remove_directory() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_remove_directory.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_remove_directory"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_remove_directory --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_remove_nonempty_directory.rs b/tests/generated/preview1_remove_nonempty_directory.rs deleted file mode 100644 index 3f4261c86..000000000 --- a/tests/generated/preview1_remove_nonempty_directory.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_remove_nonempty_directory() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_remove_nonempty_directory.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_remove_nonempty_directory"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_remove_nonempty_directory --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_renumber.rs b/tests/generated/preview1_renumber.rs deleted file mode 100644 index f00282ca7..000000000 --- a/tests/generated/preview1_renumber.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_renumber() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_renumber.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_renumber"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_renumber --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_sched_yield.rs b/tests/generated/preview1_sched_yield.rs deleted file mode 100644 index 5e9e61e5b..000000000 --- a/tests/generated/preview1_sched_yield.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_sched_yield() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_sched_yield.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_sched_yield"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_sched_yield --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_stdio.rs b/tests/generated/preview1_stdio.rs deleted file mode 100644 index 658c49eb0..000000000 --- a/tests/generated/preview1_stdio.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_stdio() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_stdio.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_stdio"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_stdio --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_stdio_isatty.rs b/tests/generated/preview1_stdio_isatty.rs deleted file mode 100644 index 7337e9c0c..000000000 --- a/tests/generated/preview1_stdio_isatty.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_stdio_isatty() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_stdio_isatty.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_stdio_isatty"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_stdio_isatty --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_stdio_not_isatty.rs b/tests/generated/preview1_stdio_not_isatty.rs deleted file mode 100644 index 8dda8828c..000000000 --- a/tests/generated/preview1_stdio_not_isatty.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_stdio_not_isatty() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_stdio_not_isatty.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_stdio_not_isatty"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_symlink_create.rs b/tests/generated/preview1_symlink_create.rs deleted file mode 100644 index 3c7a1d699..000000000 --- a/tests/generated/preview1_symlink_create.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_symlink_create() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_symlink_create.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_symlink_create"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_symlink_create --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_symlink_filestat.rs b/tests/generated/preview1_symlink_filestat.rs deleted file mode 100644 index 4e9b57a88..000000000 --- a/tests/generated/preview1_symlink_filestat.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_symlink_filestat() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_symlink_filestat.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_symlink_filestat"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_symlink_filestat --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_symlink_loop.rs b/tests/generated/preview1_symlink_loop.rs deleted file mode 100644 index 4811e5ad1..000000000 --- a/tests/generated/preview1_symlink_loop.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_symlink_loop() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_symlink_loop.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_symlink_loop"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_symlink_loop --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_unicode_output.rs b/tests/generated/preview1_unicode_output.rs deleted file mode 100644 index 35347e0ea..000000000 --- a/tests/generated/preview1_unicode_output.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_unicode_output() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_unicode_output.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_unicode_output"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_unicode_output --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview1_unlink_file_trailing_slashes.rs b/tests/generated/preview1_unlink_file_trailing_slashes.rs deleted file mode 100644 index 99f5dfe76..000000000 --- a/tests/generated/preview1_unlink_file_trailing_slashes.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview1_unlink_file_trailing_slashes() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview1_unlink_file_trailing_slashes.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview1_unlink_file_trailing_slashes"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview1_unlink_file_trailing_slashes --jco-import ./tests/virtualenvs/scratch.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_adapter_badfd.rs b/tests/generated/preview2_adapter_badfd.rs deleted file mode 100644 index e1d827054..000000000 --- a/tests/generated/preview2_adapter_badfd.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_adapter_badfd() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_adapter_badfd.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_adapter_badfd"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/preview2_adapter_badfd --jco-import ./tests/virtualenvs/base.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_ip_name_lookup.rs b/tests/generated/preview2_ip_name_lookup.rs deleted file mode 100644 index 049861e9b..000000000 --- a/tests/generated/preview2_ip_name_lookup.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_ip_name_lookup() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_ip_name_lookup.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_ip_name_lookup"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_random.rs b/tests/generated/preview2_random.rs deleted file mode 100644 index 7598cb503..000000000 --- a/tests/generated/preview2_random.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_random() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_random.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_random"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_sleep.rs b/tests/generated/preview2_sleep.rs deleted file mode 100644 index 038934b18..000000000 --- a/tests/generated/preview2_sleep.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_sleep() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_sleep.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_sleep"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_stream_pollable_correct.rs b/tests/generated/preview2_stream_pollable_correct.rs deleted file mode 100644 index 9349d4957..000000000 --- a/tests/generated/preview2_stream_pollable_correct.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_stream_pollable_correct() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_stream_pollable_correct.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_stream_pollable_correct"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_stream_pollable_traps.rs b/tests/generated/preview2_stream_pollable_traps.rs deleted file mode 100644 index ab1d68ee3..000000000 --- a/tests/generated/preview2_stream_pollable_traps.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_stream_pollable_traps() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_stream_pollable_traps.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_stream_pollable_traps"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.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 deleted file mode 100644 index ad45c1142..000000000 --- a/tests/generated/preview2_tcp_bind.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_bind() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_bind.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_bind"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_tcp_connect.rs b/tests/generated/preview2_tcp_connect.rs deleted file mode 100644 index 2399fec73..000000000 --- a/tests/generated/preview2_tcp_connect.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_connect() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_connect.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_connect"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_tcp_sample_application.rs b/tests/generated/preview2_tcp_sample_application.rs deleted file mode 100644 index d372f32f3..000000000 --- a/tests/generated/preview2_tcp_sample_application.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_sample_application() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_sample_application.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sample_application"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_tcp_sockopts.rs b/tests/generated/preview2_tcp_sockopts.rs deleted file mode 100644 index d44dc266a..000000000 --- a/tests/generated/preview2_tcp_sockopts.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_sockopts() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_sockopts.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sockopts"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_tcp_states.rs b/tests/generated/preview2_tcp_states.rs deleted file mode 100644 index d4bbab640..000000000 --- a/tests/generated/preview2_tcp_states.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_tcp_states() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_tcp_states.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_states"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_udp_bind.rs b/tests/generated/preview2_udp_bind.rs deleted file mode 100644 index 943d36b21..000000000 --- a/tests/generated/preview2_udp_bind.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_udp_bind() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_udp_bind.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_bind"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_udp_connect.rs b/tests/generated/preview2_udp_connect.rs deleted file mode 100644 index 0397e3aa3..000000000 --- a/tests/generated/preview2_udp_connect.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_udp_connect() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_udp_connect.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_connect"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_udp_sample_application.rs b/tests/generated/preview2_udp_sample_application.rs deleted file mode 100644 index 3785b5c8c..000000000 --- a/tests/generated/preview2_udp_sample_application.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_udp_sample_application() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_udp_sample_application.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_sample_application"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_udp_sockopts.rs b/tests/generated/preview2_udp_sockopts.rs deleted file mode 100644 index 227ca2fa5..000000000 --- a/tests/generated/preview2_udp_sockopts.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_udp_sockopts() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_udp_sockopts.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_sockopts"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/preview2_udp_states.rs b/tests/generated/preview2_udp_states.rs deleted file mode 100644 index 4fa60f510..000000000 --- a/tests/generated/preview2_udp_states.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn preview2_udp_states() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/preview2_udp_states.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_states"); - - let cmd = cmd!(sh, "node ./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'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/proxy_echo.rs b/tests/generated/proxy_echo.rs deleted file mode 100644 index 4ed372454..000000000 --- a/tests/generated/proxy_echo.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn proxy_echo() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/proxy_echo.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/proxy_echo"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/proxy_echo --jco-import ./tests/virtualenvs/server-api-proxy-streaming.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/proxy_handler.rs b/tests/generated/proxy_handler.rs deleted file mode 100644 index d9f8cb943..000000000 --- a/tests/generated/proxy_handler.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn proxy_handler() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/proxy_handler.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/proxy_handler"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/proxy_handler --jco-import ./tests/virtualenvs/server-api-proxy.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/generated/proxy_hash.rs b/tests/generated/proxy_hash.rs deleted file mode 100644 index 07fc755c3..000000000 --- a/tests/generated/proxy_hash.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! 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 std::fs; -use xshell::{cmd, Shell}; - -#[test] -fn proxy_hash() -> anyhow::Result<()> { - let sh = Shell::new()?; - let wasi_file = "./tests/rundir/proxy_hash.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/proxy_hash"); - - let cmd = cmd!(sh, "node ./src/jco.js run --jco-dir ./tests/rundir/proxy_hash --jco-import ./tests/virtualenvs/server-api-proxy-streaming.js {wasi_file} hello this '' 'is an argument' 'with 🚩 emoji'"); - - cmd.run()?; - Ok(()) -} diff --git a/tests/virtualenvs/piped-consumer.js b/tests/virtualenvs/piped-consumer.js new file mode 100644 index 000000000..eb7053fcf --- /dev/null +++ b/tests/virtualenvs/piped-consumer.js @@ -0,0 +1,36 @@ +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, sep } from 'node:path'; +import { tmpdir } from 'node:os'; +import { platform } from 'node:process'; + +_setEnv({ + PIPED_SIDE: "CONSUMER", +}); + +// const isWindows = platform === 'win32'; + +// export const testDir = (isWindows ? '' : '') + await mkdtemp(tmpdir() + sep); + +// _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/piped.js b/tests/virtualenvs/piped.js new file mode 100644 index 000000000..0ab8fe226 --- /dev/null +++ b/tests/virtualenvs/piped.js @@ -0,0 +1,33 @@ +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, sep } from 'node:path'; +import { tmpdir } from 'node:os'; +import { platform } from 'node:process'; + +_setEnv({ + PIPED_SIDE: "PRODUCER", +}); + +// const isWindows = platform === 'win32'; + +// export const testDir = (isWindows ? '' : '') + await mkdtemp(tmpdir() + sep); + +// _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`), +// ]); + + + +// process.on('exit', () => { +// rmdirSync(testDir, { recursive: true }); +// }); diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index bb6d3ff1d..cc6b0fb7b 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -3,7 +3,7 @@ use xshell::{cmd, Shell}; // for debugging const TRACE: bool = false; -const TEST_FILTER: &[&str] = &[]; +const TEST_FILTER: &[&str] = &["piped_simple"]; const TEST_IGNORE: &[&str] = &["nn_image_classification", "nn_image_classification_named"]; @@ -79,6 +79,7 @@ pub fn run() -> anyhow::Result<()> { /// Generate an individual test fn generate_test(test_name: &str) -> String { + let piped = test_name.starts_with("piped_"); let virtual_env = match test_name { "api_read_only" => "readonly", "api_time" => "fakeclocks", @@ -89,6 +90,7 @@ fn generate_test(test_name: &str) -> String { "preview1_stdio_not_isatty" => "notty", "proxy_echo" | "proxy_hash" => "server-api-proxy-streaming", "proxy_handler" => "server-api-proxy", + "piped_simple" => "piped", _ => { if test_name.starts_with("preview1") { "scratch" @@ -110,38 +112,122 @@ fn generate_test(test_name: &str) -> String { _ => false, }; + let includes = if piped || stdin.is_some() { + "use std::fs; +use std::process::{{Command, Stdio}}; +use std::io::prelude::Write;" + } else { + "use std::fs; +use std::process::Command;" + }; + + let cmd1 = format!( + "{} +{} + let mut cmd1_child = cmd1.spawn().expect(\"failed to spawn test program\");", + generate_command_invocation( + "cmd1", + test_name, + virtual_env, + if stdin.is_some() { + Some("Stdio::piped()") + } else { + None + }, + ), + if piped { + " cmd1.stdout(Stdio::piped());" + } else { + "" + } + ); + let cmd2: String = if piped { + format!( + "{} + cmd2.stdin(cmd1_child.stdout.take().unwrap()); + let mut cmd2_child = cmd2.spawn().expect(\"failed to spawn test program\");", + generate_command_invocation( + "cmd2", + &if piped { + format!("test_name_consumer") + } else { + "".into() + }, + &format!("{virtual_env}-consumer"), + None, + ) + ) + } else { + "".into() + }; + 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 std::fs; -use xshell::{{cmd, Shell}}; +{includes} #[test] fn {test_name}() -> anyhow::Result<()> {{ - let sh = Shell::new()?; let wasi_file = "./tests/rundir/{test_name}.component.wasm"; let _ = fs::remove_dir_all("./tests/rundir/{test_name}"); + {cmd1} + {cmd2} +{} + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!({}status.success(), "producer failed"); - let cmd = cmd!(sh, "node ./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'"); {} - cmd.run(){}; Ok(()) }} "##, - if TRACE { "--jco-trace" } else { "" }, match stdin { - Some(stdin) => format!(" let cmd = cmd.stdin(b\"{}\");", stdin), + Some(stdin) => format!( + " cmd1_child.stdin.as_ref().unwrap().write(b\"{}\").unwrap();", + stdin + ), None => "".into(), }, - if !should_error { - "?" + if !should_error { "" } else { "!" }, + if piped { + " let status = cmd2_child.wait().expect(\"failed to wait on child\"); + assert!(status.success(), \"consumer failed\");" } else { - ".expect_err(\"test should exit with code 1\")" + "" } ) } +fn generate_command_invocation( + cmd_name: &str, + run_dir: &str, + virtual_env: &str, + stdin: Option<&str>, +) -> String { + return format!( + r##"let mut {cmd_name} = Command::new("node"); + {cmd_name}.arg("./src/jco.js"); + {cmd_name}.arg("run"); +{} + {cmd_name}.arg("--jco-dir"); + {cmd_name}.arg("./tests/rundir/{run_dir}"); + {cmd_name}.arg("--jco-import"); + {cmd_name}.arg("./tests/virtualenvs/{virtual_env}.js"); + {cmd_name}.arg(wasi_file); + {cmd_name}.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); +{}"##, + if TRACE { + format!("{cmd_name}.arg(\"--jco-trace\");") + } else { + "".into() + }, + match stdin { + Some(stdin) => format!(" {cmd_name}.stdin({stdin});"), + None => "".into(), + }, + ); +} + /// Generate the mod.rs file containing all tests fn generate_mod(test_names: &[String]) -> String { use std::fmt::Write; From 86c2e52b8225731fa5a8aeeb287e942d21671168 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Wed, 10 Jan 2024 14:36:01 -0800 Subject: [PATCH 12/23] debugging --- packages/preview2-shim/lib/io/worker-thread.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index c8c3e2703..cc08b1973 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -490,8 +490,10 @@ function handle(call, id, payload) { stream.closed || stream.errored || stream.readableLength > 0 - ) + ) { + process._rawDebug('stdin already ready'); return 0; + } let resolve, reject; return createPoll( new Promise((_resolve, _reject) => { @@ -499,9 +501,14 @@ function handle(call, id, payload) { .once("readable", (resolve = _resolve)) .once("error", (reject = _reject)) }).then( - () => void stream.off("error", reject), + () => { + process._rawDebug('STDIN IS READABLE'); + stream.off("error", reject); + }, // error is read off of stream itself when later accessed (err) => { + process._rawDebug("STDIN ERROR"); + process._rawDebug(err); void stream.off("readable", resolve); if (err.code === "EAGAIN") { streams.set(id, { @@ -513,6 +520,7 @@ function handle(call, id, payload) { }); return handle(INPUT_STREAM_SUBSCRIBE | STDIN, id, payload); } + process._rawDebug('ERROR PASSTHROUGH RESOLVE'); } ) ); @@ -755,7 +763,10 @@ function handle(call, id, payload) { for (const [idx, poll] of pollList.entries()) { if (poll.state !== POLL_STATE_WAIT) doneList.push(idx); } - if (doneList.length > 0) return new Uint32Array(doneList); + if (doneList.length > 0) { + process._rawDebug('early return'); + return new Uint32Array(doneList); + } let readyPromiseResolve; const readyPromise = new Promise( (resolve) => void (readyPromiseResolve = resolve) @@ -810,6 +821,7 @@ export function createPoll(pollState) { const pollId = ++pollCnt; pollState.polls.push(pollId); polls.set(pollId, pollState); + process._rawDebug('create poll ' + pollId); return pollId; } From 46b1dd28d9abf4094f5d121df3183c7f80068502 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 15 Jan 2024 15:47:55 -0800 Subject: [PATCH 13/23] new stdin implementation --- packages/preview2-shim/lib/io/worker-io.js | 5 +- .../preview2-shim/lib/io/worker-thread.js | 93 ++++++---------- tests/generated/api_reactor.rs | 31 ++++++ tests/generated/api_read_only.rs | 31 ++++++ tests/generated/api_time.rs | 31 ++++++ tests/generated/cli_args.rs | 31 ++++++ tests/generated/cli_default_clocks.rs | 31 ++++++ tests/generated/cli_directory_list.rs | 31 ++++++ tests/generated/cli_env.rs | 31 ++++++ tests/generated/cli_exit_default.rs | 31 ++++++ tests/generated/cli_exit_failure.rs | 31 ++++++ tests/generated/cli_exit_panic.rs | 31 ++++++ tests/generated/cli_exit_success.rs | 31 ++++++ tests/generated/cli_export_cabi_realloc.rs | 31 ++++++ tests/generated/cli_file_append.rs | 31 ++++++ tests/generated/cli_file_dir_sync.rs | 31 ++++++ tests/generated/cli_file_read.rs | 31 ++++++ tests/generated/cli_hello_stdout.rs | 31 ++++++ tests/generated/cli_no_ip_name_lookup.rs | 31 ++++++ tests/generated/cli_no_tcp.rs | 31 ++++++ tests/generated/cli_no_udp.rs | 31 ++++++ tests/generated/cli_splice_stdin.rs | 31 ++++++ tests/generated/cli_stdin.rs | 32 ++++++ tests/generated/cli_stdio_write_flushes.rs | 31 ++++++ .../http_outbound_request_content_length.rs | 31 ++++++ tests/generated/http_outbound_request_get.rs | 31 ++++++ .../http_outbound_request_invalid_dnsname.rs | 31 ++++++ .../http_outbound_request_invalid_header.rs | 31 ++++++ .../http_outbound_request_invalid_port.rs | 31 ++++++ .../http_outbound_request_invalid_version.rs | 31 ++++++ .../http_outbound_request_large_post.rs | 31 ++++++ tests/generated/http_outbound_request_post.rs | 31 ++++++ tests/generated/http_outbound_request_put.rs | 31 ++++++ .../http_outbound_request_response_build.rs | 31 ++++++ .../http_outbound_request_unknown_method.rs | 31 ++++++ ...ttp_outbound_request_unsupported_scheme.rs | 31 ++++++ tests/generated/mod.rs | 104 ++++++++++++++++++ tests/generated/piped_multiple.rs | 45 ++++++++ tests/generated/piped_polling.rs | 45 ++++++++ tests/generated/preview1_big_random_buf.rs | 31 ++++++ tests/generated/preview1_clock_time_get.rs | 31 ++++++ tests/generated/preview1_close_preopen.rs | 31 ++++++ tests/generated/preview1_dangling_fd.rs | 31 ++++++ tests/generated/preview1_dangling_symlink.rs | 31 ++++++ .../generated/preview1_dir_fd_op_failures.rs | 31 ++++++ tests/generated/preview1_directory_seek.rs | 31 ++++++ tests/generated/preview1_fd_advise.rs | 31 ++++++ tests/generated/preview1_fd_filestat_get.rs | 31 ++++++ tests/generated/preview1_fd_filestat_set.rs | 31 ++++++ tests/generated/preview1_fd_flags_set.rs | 31 ++++++ tests/generated/preview1_fd_readdir.rs | 31 ++++++ tests/generated/preview1_file_allocate.rs | 31 ++++++ tests/generated/preview1_file_pread_pwrite.rs | 31 ++++++ tests/generated/preview1_file_seek_tell.rs | 31 ++++++ tests/generated/preview1_file_truncation.rs | 31 ++++++ .../preview1_file_unbuffered_write.rs | 31 ++++++ tests/generated/preview1_file_write.rs | 31 ++++++ tests/generated/preview1_interesting_paths.rs | 31 ++++++ tests/generated/preview1_nofollow_errors.rs | 31 ++++++ tests/generated/preview1_overwrite_preopen.rs | 31 ++++++ tests/generated/preview1_path_exists.rs | 31 ++++++ tests/generated/preview1_path_filestat.rs | 31 ++++++ tests/generated/preview1_path_link.rs | 31 ++++++ .../preview1_path_open_create_existing.rs | 31 ++++++ .../preview1_path_open_dirfd_not_dir.rs | 31 ++++++ tests/generated/preview1_path_open_missing.rs | 31 ++++++ .../generated/preview1_path_open_nonblock.rs | 31 ++++++ tests/generated/preview1_path_open_preopen.rs | 31 ++++++ .../preview1_path_open_read_write.rs | 31 ++++++ tests/generated/preview1_path_rename.rs | 31 ++++++ ...eview1_path_rename_dir_trailing_slashes.rs | 31 ++++++ .../preview1_path_symlink_trailing_slashes.rs | 31 ++++++ tests/generated/preview1_poll_oneoff_files.rs | 31 ++++++ tests/generated/preview1_poll_oneoff_stdio.rs | 31 ++++++ tests/generated/preview1_readlink.rs | 31 ++++++ .../generated/preview1_regular_file_isatty.rs | 31 ++++++ tests/generated/preview1_remove_directory.rs | 31 ++++++ .../preview1_remove_nonempty_directory.rs | 31 ++++++ tests/generated/preview1_renumber.rs | 31 ++++++ tests/generated/preview1_sched_yield.rs | 31 ++++++ tests/generated/preview1_stdio.rs | 31 ++++++ tests/generated/preview1_stdio_isatty.rs | 31 ++++++ tests/generated/preview1_stdio_not_isatty.rs | 31 ++++++ tests/generated/preview1_symlink_create.rs | 31 ++++++ tests/generated/preview1_symlink_filestat.rs | 31 ++++++ tests/generated/preview1_symlink_loop.rs | 31 ++++++ tests/generated/preview1_unicode_output.rs | 31 ++++++ .../preview1_unlink_file_trailing_slashes.rs | 31 ++++++ tests/generated/preview2_adapter_badfd.rs | 31 ++++++ tests/generated/preview2_ip_name_lookup.rs | 31 ++++++ tests/generated/preview2_random.rs | 31 ++++++ tests/generated/preview2_sleep.rs | 31 ++++++ .../preview2_stream_pollable_correct.rs | 31 ++++++ .../preview2_stream_pollable_traps.rs | 31 ++++++ tests/generated/preview2_tcp_bind.rs | 31 ++++++ tests/generated/preview2_tcp_connect.rs | 31 ++++++ .../preview2_tcp_sample_application.rs | 31 ++++++ tests/generated/preview2_tcp_sockopts.rs | 31 ++++++ tests/generated/preview2_tcp_states.rs | 31 ++++++ tests/generated/preview2_udp_bind.rs | 31 ++++++ tests/generated/preview2_udp_connect.rs | 31 ++++++ .../preview2_udp_sample_application.rs | 31 ++++++ tests/generated/preview2_udp_sockopts.rs | 31 ++++++ tests/generated/preview2_udp_states.rs | 31 ++++++ tests/generated/proxy_echo.rs | 31 ++++++ tests/generated/proxy_handler.rs | 31 ++++++ tests/generated/proxy_hash.rs | 31 ++++++ xtask/src/generate/tests.rs | 2 +- 108 files changed, 3396 insertions(+), 61 deletions(-) create mode 100644 tests/generated/api_reactor.rs create mode 100644 tests/generated/api_read_only.rs create mode 100644 tests/generated/api_time.rs create mode 100644 tests/generated/cli_args.rs create mode 100644 tests/generated/cli_default_clocks.rs create mode 100644 tests/generated/cli_directory_list.rs create mode 100644 tests/generated/cli_env.rs create mode 100644 tests/generated/cli_exit_default.rs create mode 100644 tests/generated/cli_exit_failure.rs create mode 100644 tests/generated/cli_exit_panic.rs create mode 100644 tests/generated/cli_exit_success.rs create mode 100644 tests/generated/cli_export_cabi_realloc.rs create mode 100644 tests/generated/cli_file_append.rs create mode 100644 tests/generated/cli_file_dir_sync.rs create mode 100644 tests/generated/cli_file_read.rs create mode 100644 tests/generated/cli_hello_stdout.rs create mode 100644 tests/generated/cli_no_ip_name_lookup.rs create mode 100644 tests/generated/cli_no_tcp.rs create mode 100644 tests/generated/cli_no_udp.rs create mode 100644 tests/generated/cli_splice_stdin.rs create mode 100644 tests/generated/cli_stdin.rs create mode 100644 tests/generated/cli_stdio_write_flushes.rs create mode 100644 tests/generated/http_outbound_request_content_length.rs create mode 100644 tests/generated/http_outbound_request_get.rs create mode 100644 tests/generated/http_outbound_request_invalid_dnsname.rs create mode 100644 tests/generated/http_outbound_request_invalid_header.rs create mode 100644 tests/generated/http_outbound_request_invalid_port.rs create mode 100644 tests/generated/http_outbound_request_invalid_version.rs create mode 100644 tests/generated/http_outbound_request_large_post.rs create mode 100644 tests/generated/http_outbound_request_post.rs create mode 100644 tests/generated/http_outbound_request_put.rs create mode 100644 tests/generated/http_outbound_request_response_build.rs create mode 100644 tests/generated/http_outbound_request_unknown_method.rs create mode 100644 tests/generated/http_outbound_request_unsupported_scheme.rs create mode 100644 tests/generated/piped_multiple.rs create mode 100644 tests/generated/piped_polling.rs create mode 100644 tests/generated/preview1_big_random_buf.rs create mode 100644 tests/generated/preview1_clock_time_get.rs create mode 100644 tests/generated/preview1_close_preopen.rs create mode 100644 tests/generated/preview1_dangling_fd.rs create mode 100644 tests/generated/preview1_dangling_symlink.rs create mode 100644 tests/generated/preview1_dir_fd_op_failures.rs create mode 100644 tests/generated/preview1_directory_seek.rs create mode 100644 tests/generated/preview1_fd_advise.rs create mode 100644 tests/generated/preview1_fd_filestat_get.rs create mode 100644 tests/generated/preview1_fd_filestat_set.rs create mode 100644 tests/generated/preview1_fd_flags_set.rs create mode 100644 tests/generated/preview1_fd_readdir.rs create mode 100644 tests/generated/preview1_file_allocate.rs create mode 100644 tests/generated/preview1_file_pread_pwrite.rs create mode 100644 tests/generated/preview1_file_seek_tell.rs create mode 100644 tests/generated/preview1_file_truncation.rs create mode 100644 tests/generated/preview1_file_unbuffered_write.rs create mode 100644 tests/generated/preview1_file_write.rs create mode 100644 tests/generated/preview1_interesting_paths.rs create mode 100644 tests/generated/preview1_nofollow_errors.rs create mode 100644 tests/generated/preview1_overwrite_preopen.rs create mode 100644 tests/generated/preview1_path_exists.rs create mode 100644 tests/generated/preview1_path_filestat.rs create mode 100644 tests/generated/preview1_path_link.rs create mode 100644 tests/generated/preview1_path_open_create_existing.rs create mode 100644 tests/generated/preview1_path_open_dirfd_not_dir.rs create mode 100644 tests/generated/preview1_path_open_missing.rs create mode 100644 tests/generated/preview1_path_open_nonblock.rs create mode 100644 tests/generated/preview1_path_open_preopen.rs create mode 100644 tests/generated/preview1_path_open_read_write.rs create mode 100644 tests/generated/preview1_path_rename.rs create mode 100644 tests/generated/preview1_path_rename_dir_trailing_slashes.rs create mode 100644 tests/generated/preview1_path_symlink_trailing_slashes.rs create mode 100644 tests/generated/preview1_poll_oneoff_files.rs create mode 100644 tests/generated/preview1_poll_oneoff_stdio.rs create mode 100644 tests/generated/preview1_readlink.rs create mode 100644 tests/generated/preview1_regular_file_isatty.rs create mode 100644 tests/generated/preview1_remove_directory.rs create mode 100644 tests/generated/preview1_remove_nonempty_directory.rs create mode 100644 tests/generated/preview1_renumber.rs create mode 100644 tests/generated/preview1_sched_yield.rs create mode 100644 tests/generated/preview1_stdio.rs create mode 100644 tests/generated/preview1_stdio_isatty.rs create mode 100644 tests/generated/preview1_stdio_not_isatty.rs create mode 100644 tests/generated/preview1_symlink_create.rs create mode 100644 tests/generated/preview1_symlink_filestat.rs create mode 100644 tests/generated/preview1_symlink_loop.rs create mode 100644 tests/generated/preview1_unicode_output.rs create mode 100644 tests/generated/preview1_unlink_file_trailing_slashes.rs create mode 100644 tests/generated/preview2_adapter_badfd.rs create mode 100644 tests/generated/preview2_ip_name_lookup.rs create mode 100644 tests/generated/preview2_random.rs create mode 100644 tests/generated/preview2_sleep.rs create mode 100644 tests/generated/preview2_stream_pollable_correct.rs create mode 100644 tests/generated/preview2_stream_pollable_traps.rs create mode 100644 tests/generated/preview2_tcp_bind.rs create mode 100644 tests/generated/preview2_tcp_connect.rs create mode 100644 tests/generated/preview2_tcp_sample_application.rs create mode 100644 tests/generated/preview2_tcp_sockopts.rs create mode 100644 tests/generated/preview2_tcp_states.rs create mode 100644 tests/generated/preview2_udp_bind.rs create mode 100644 tests/generated/preview2_udp_connect.rs create mode 100644 tests/generated/preview2_udp_sample_application.rs create mode 100644 tests/generated/preview2_udp_sockopts.rs create mode 100644 tests/generated/preview2_udp_states.rs create mode 100644 tests/generated/proxy_echo.rs create mode 100644 tests/generated/proxy_handler.rs create mode 100644 tests/generated/proxy_hash.rs diff --git a/packages/preview2-shim/lib/io/worker-io.js b/packages/preview2-shim/lib/io/worker-io.js index 7dba3f9de..0af5e4f6f 100644 --- a/packages/preview2-shim/lib/io/worker-io.js +++ b/packages/preview2-shim/lib/io/worker-io.js @@ -40,8 +40,9 @@ export function registerIncomingHttpHandler(id, handler) { } const instanceId = Math.round(Math.random() * 1000).toString(); -const DEBUG_DEFAULT = true; -const DEBUG = env.JCO_DEBUG === '0' ? false : env.JCO_DEBUG === '1' ? true : DEBUG_DEFAULT; +const DEBUG_DEFAULT = false; +const DEBUG = + env.JCO_DEBUG === "0" ? false : env.JCO_DEBUG === "1" ? true : DEBUG_DEFAULT; /** * @type {(call: number, id: number | null, payload: any) -> any} diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index cc08b1973..b46b144e2 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -11,6 +11,9 @@ import { stopHttpServer, } from "./worker-http.js"; import { convertSocketError, socketResolveAddress } from "./worker-sockets.js"; +import { Readable } from "node:stream"; +import { read } from "node:fs"; +import { nextTick } from "node:process"; import { CALL_MASK, @@ -184,7 +187,10 @@ export function createReadableStreamPollState(nodeStream) { /** * @param {NodeJS.ReadableStream | NodeJS.WritableStream} stream */ -export function createReadableStream(nodeStream, pollState = createReadableStreamPollState(nodeStream)) { +export function createReadableStream( + nodeStream, + pollState = createReadableStreamPollState(nodeStream) +) { const stream = { stream: nodeStream, flushPromise: null, @@ -473,56 +479,31 @@ function handle(call, id, payload) { case OUTPUT_STREAM_DISPOSE | STDERR: return; case INPUT_STREAM_CREATE | STDIN: { - const stream = createReadStream(null, { - fd: 0, - highWaterMark: 64 * 1024, - }); - // for some reason fs streams dont emit readable on end - // stream.on("end", () => void stream.emit("readable")); - return createReadableStream(stream); - } - case INPUT_STREAM_SUBSCRIBE | STDIN: { - const stream = streams.get(id)?.stream; - // already closed or errored -> immediately return poll - // (poll 0 is immediately resolved) - if ( - !stream || - stream.closed || - stream.errored || - stream.readableLength > 0 - ) { - process._rawDebug('stdin already ready'); - return 0; - } - let resolve, reject; - return createPoll( - new Promise((_resolve, _reject) => { - stream - .once("readable", (resolve = _resolve)) - .once("error", (reject = _reject)) - }).then( - () => { - process._rawDebug('STDIN IS READABLE'); - stream.off("error", reject); + return createReadableStream( + new Readable({ + read(n) { + if (n <= 0) return void this.push(null); + let buf = Buffer.allocUnsafeSlow(n); + read(0, buf, 0, n, null, (err, bytesRead) => { + if (err) { + if (err.code === "EAGAIN") { + nextTick(() => void this._read(n)); + return; + } + this.destroy(err); + } else if (bytesRead > 0) { + if (bytesRead !== buf.length) { + const dst = Buffer.allocUnsafeSlow(bytesRead); + buf.copy(dst, 0, 0, bytesRead); + buf = dst; + } + this.push(buf); + } else { + this.push(null); + } + }); }, - // error is read off of stream itself when later accessed - (err) => { - process._rawDebug("STDIN ERROR"); - process._rawDebug(err); - void stream.off("readable", resolve); - if (err.code === "EAGAIN") { - streams.set(id, { - flushPromise: null, - stream: createReadStream(null, { - fd: 0, - highWaterMark: 64 * 1024 - }) - }); - return handle(INPUT_STREAM_SUBSCRIBE | STDIN, id, payload); - } - process._rawDebug('ERROR PASSTHROUGH RESOLVE'); - } - ) + }) ); } @@ -571,9 +552,9 @@ function handle(call, id, payload) { Math.min(stream.stream.readableLength, Number(payload)) ); if (res === null) { - if (stream.pollState.state === POLL_STATE_FINISHED) return { tag: "closed" }; - if (stream.stream.readableLength === 0) - pollStateWait(stream.pollState); + if (stream.pollState.state === POLL_STATE_FINISHED) + return { tag: "closed" }; + if (stream.stream.readableLength === 0) pollStateWait(stream.pollState); return new Uint8Array(); } return res; @@ -763,10 +744,7 @@ function handle(call, id, payload) { for (const [idx, poll] of pollList.entries()) { if (poll.state !== POLL_STATE_WAIT) doneList.push(idx); } - if (doneList.length > 0) { - process._rawDebug('early return'); - return new Uint32Array(doneList); - } + if (doneList.length > 0) return new Uint32Array(doneList); let readyPromiseResolve; const readyPromise = new Promise( (resolve) => void (readyPromiseResolve = resolve) @@ -821,7 +799,6 @@ export function createPoll(pollState) { const pollId = ++pollCnt; pollState.polls.push(pollId); polls.set(pollId, pollState); - process._rawDebug('create poll ' + pollId); return pollId; } diff --git a/tests/generated/api_reactor.rs b/tests/generated/api_reactor.rs new file mode 100644 index 000000000..0cd1dc1b3 --- /dev/null +++ b/tests/generated/api_reactor.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn api_reactor() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/api_reactor.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/api_reactor"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/api_reactor"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/api_read_only.rs b/tests/generated/api_read_only.rs new file mode 100644 index 000000000..ef4c974b6 --- /dev/null +++ b/tests/generated/api_read_only.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn api_read_only() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/api_read_only.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/api_read_only"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/api_read_only"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/readonly.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/api_time.rs b/tests/generated/api_time.rs new file mode 100644 index 000000000..4153ef439 --- /dev/null +++ b/tests/generated/api_time.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn api_time() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/api_time.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/api_time"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/api_time"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/fakeclocks.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_args.rs b/tests/generated/cli_args.rs new file mode 100644 index 000000000..d63c2192c --- /dev/null +++ b/tests/generated/cli_args.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_args() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_args.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_args"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_args"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_default_clocks.rs b/tests/generated/cli_default_clocks.rs new file mode 100644 index 000000000..e65d15166 --- /dev/null +++ b/tests/generated/cli_default_clocks.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_default_clocks() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_default_clocks.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_default_clocks"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_default_clocks"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_directory_list.rs b/tests/generated/cli_directory_list.rs new file mode 100644 index 000000000..fa268792c --- /dev/null +++ b/tests/generated/cli_directory_list.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_directory_list() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_directory_list.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_directory_list"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_directory_list"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_env.rs b/tests/generated/cli_env.rs new file mode 100644 index 000000000..db7334346 --- /dev/null +++ b/tests/generated/cli_env.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_env() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_env.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_env"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_env"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_exit_default.rs b/tests/generated/cli_exit_default.rs new file mode 100644 index 000000000..6deafb62e --- /dev/null +++ b/tests/generated/cli_exit_default.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_exit_default() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_exit_default.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_exit_default"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_exit_default"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_exit_failure.rs b/tests/generated/cli_exit_failure.rs new file mode 100644 index 000000000..f10a24b8d --- /dev/null +++ b/tests/generated/cli_exit_failure.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_exit_failure() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_exit_failure.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_exit_failure"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_exit_failure"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(!status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_exit_panic.rs b/tests/generated/cli_exit_panic.rs new file mode 100644 index 000000000..d1f2cbddd --- /dev/null +++ b/tests/generated/cli_exit_panic.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_exit_panic() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_exit_panic.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_exit_panic"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_exit_panic"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(!status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_exit_success.rs b/tests/generated/cli_exit_success.rs new file mode 100644 index 000000000..92a9d5b91 --- /dev/null +++ b/tests/generated/cli_exit_success.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_exit_success() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_exit_success.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_exit_success"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_exit_success"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_export_cabi_realloc.rs b/tests/generated/cli_export_cabi_realloc.rs new file mode 100644 index 000000000..06c01068a --- /dev/null +++ b/tests/generated/cli_export_cabi_realloc.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_export_cabi_realloc() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_export_cabi_realloc.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_export_cabi_realloc"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_export_cabi_realloc"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_file_append.rs b/tests/generated/cli_file_append.rs new file mode 100644 index 000000000..e2c4133ba --- /dev/null +++ b/tests/generated/cli_file_append.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_file_append() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_file_append.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_file_append"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_file_append"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/bar-jabberwock.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_file_dir_sync.rs b/tests/generated/cli_file_dir_sync.rs new file mode 100644 index 000000000..9807670b1 --- /dev/null +++ b/tests/generated/cli_file_dir_sync.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_file_dir_sync() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_file_dir_sync.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_file_dir_sync"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_file_dir_sync"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_file_read.rs b/tests/generated/cli_file_read.rs new file mode 100644 index 000000000..414f85326 --- /dev/null +++ b/tests/generated/cli_file_read.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_file_read() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_file_read.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_file_read"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_file_read"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_hello_stdout.rs b/tests/generated/cli_hello_stdout.rs new file mode 100644 index 000000000..d03b871aa --- /dev/null +++ b/tests/generated/cli_hello_stdout.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_hello_stdout() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_hello_stdout.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_hello_stdout"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_hello_stdout"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_no_ip_name_lookup.rs b/tests/generated/cli_no_ip_name_lookup.rs new file mode 100644 index 000000000..887b363c7 --- /dev/null +++ b/tests/generated/cli_no_ip_name_lookup.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_no_ip_name_lookup() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_no_ip_name_lookup.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_no_ip_name_lookup"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_no_ip_name_lookup"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/deny-dns.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_no_tcp.rs b/tests/generated/cli_no_tcp.rs new file mode 100644 index 000000000..80b92ff4e --- /dev/null +++ b/tests/generated/cli_no_tcp.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_no_tcp() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_no_tcp.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_no_tcp"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_no_tcp"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/deny-tcp.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_no_udp.rs b/tests/generated/cli_no_udp.rs new file mode 100644 index 000000000..96ac87a72 --- /dev/null +++ b/tests/generated/cli_no_udp.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_no_udp() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_no_udp.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_no_udp"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_no_udp"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/deny-udp.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_splice_stdin.rs b/tests/generated/cli_splice_stdin.rs new file mode 100644 index 000000000..1f1d6e5ff --- /dev/null +++ b/tests/generated/cli_splice_stdin.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_splice_stdin() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_splice_stdin.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_splice_stdin"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_splice_stdin"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_stdin.rs b/tests/generated/cli_stdin.rs new file mode 100644 index 000000000..efad6ff00 --- /dev/null +++ b/tests/generated/cli_stdin.rs @@ -0,0 +1,32 @@ +//! 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 std::fs; +use std::process::{{Command, Stdio}}; +use std::io::prelude::Write; + +#[test] +fn cli_stdin() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_stdin.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_stdin"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_stdin"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + cmd1.stdin(Stdio::piped()); + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + cmd1_child.stdin.as_ref().unwrap().write(b"So rested he by the Tumtum tree").unwrap(); + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/cli_stdio_write_flushes.rs b/tests/generated/cli_stdio_write_flushes.rs new file mode 100644 index 000000000..2dff5b65d --- /dev/null +++ b/tests/generated/cli_stdio_write_flushes.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn cli_stdio_write_flushes() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_stdio_write_flushes.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_stdio_write_flushes"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_stdio_write_flushes"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_content_length.rs b/tests/generated/http_outbound_request_content_length.rs new file mode 100644 index 000000000..bca6438ac --- /dev/null +++ b/tests/generated/http_outbound_request_content_length.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_content_length() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_content_length.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_content_length"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_content_length"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_get.rs b/tests/generated/http_outbound_request_get.rs new file mode 100644 index 000000000..7e471fb4d --- /dev/null +++ b/tests/generated/http_outbound_request_get.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_get() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_get.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_get"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_get"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_invalid_dnsname.rs b/tests/generated/http_outbound_request_invalid_dnsname.rs new file mode 100644 index 000000000..f5bb00abb --- /dev/null +++ b/tests/generated/http_outbound_request_invalid_dnsname.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_invalid_dnsname() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_invalid_dnsname.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_invalid_dnsname"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_invalid_dnsname"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_invalid_header.rs b/tests/generated/http_outbound_request_invalid_header.rs new file mode 100644 index 000000000..544fb6ee1 --- /dev/null +++ b/tests/generated/http_outbound_request_invalid_header.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_invalid_header() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_invalid_header.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_invalid_header"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_invalid_header"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_invalid_port.rs b/tests/generated/http_outbound_request_invalid_port.rs new file mode 100644 index 000000000..52c2671ea --- /dev/null +++ b/tests/generated/http_outbound_request_invalid_port.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_invalid_port() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_invalid_port.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_invalid_port"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_invalid_port"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_invalid_version.rs b/tests/generated/http_outbound_request_invalid_version.rs new file mode 100644 index 000000000..a85470664 --- /dev/null +++ b/tests/generated/http_outbound_request_invalid_version.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_invalid_version() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_invalid_version.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_invalid_version"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_invalid_version"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_large_post.rs b/tests/generated/http_outbound_request_large_post.rs new file mode 100644 index 000000000..09a2d5488 --- /dev/null +++ b/tests/generated/http_outbound_request_large_post.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_large_post() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_large_post.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_large_post"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_large_post"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_post.rs b/tests/generated/http_outbound_request_post.rs new file mode 100644 index 000000000..48867bac5 --- /dev/null +++ b/tests/generated/http_outbound_request_post.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_post() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_post.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_post"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_post"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_put.rs b/tests/generated/http_outbound_request_put.rs new file mode 100644 index 000000000..cb7314c12 --- /dev/null +++ b/tests/generated/http_outbound_request_put.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_put() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_put.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_put"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_put"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_response_build.rs b/tests/generated/http_outbound_request_response_build.rs new file mode 100644 index 000000000..8fbbe730e --- /dev/null +++ b/tests/generated/http_outbound_request_response_build.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_response_build() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_response_build.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_response_build"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_response_build"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_unknown_method.rs b/tests/generated/http_outbound_request_unknown_method.rs new file mode 100644 index 000000000..bb3e2daa1 --- /dev/null +++ b/tests/generated/http_outbound_request_unknown_method.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_unknown_method() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_unknown_method.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_unknown_method"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_unknown_method"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/http_outbound_request_unsupported_scheme.rs b/tests/generated/http_outbound_request_unsupported_scheme.rs new file mode 100644 index 000000000..6c9f1fe34 --- /dev/null +++ b/tests/generated/http_outbound_request_unsupported_scheme.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn http_outbound_request_unsupported_scheme() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/http_outbound_request_unsupported_scheme.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/http_outbound_request_unsupported_scheme"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/http_outbound_request_unsupported_scheme"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/http.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index dfcfec476..9fa279796 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -1 +1,105 @@ +mod api_reactor; +mod api_read_only; +mod api_time; +mod cli_args; +mod cli_default_clocks; +mod cli_directory_list; +mod cli_env; +mod cli_exit_default; +mod cli_exit_failure; +mod cli_exit_panic; +mod cli_exit_success; +mod cli_export_cabi_realloc; +mod cli_file_append; +mod cli_file_dir_sync; +mod cli_file_read; +mod cli_hello_stdout; +mod cli_no_ip_name_lookup; +mod cli_no_tcp; +mod cli_no_udp; +mod cli_splice_stdin; +mod cli_stdin; +mod cli_stdio_write_flushes; +mod http_outbound_request_content_length; +mod http_outbound_request_get; +mod http_outbound_request_invalid_dnsname; +mod http_outbound_request_invalid_header; +mod http_outbound_request_invalid_port; +mod http_outbound_request_invalid_version; +mod http_outbound_request_large_post; +mod http_outbound_request_post; +mod http_outbound_request_put; +mod http_outbound_request_response_build; +mod http_outbound_request_unknown_method; +mod http_outbound_request_unsupported_scheme; +mod piped_multiple; +mod piped_polling; mod piped_simple; +mod preview1_big_random_buf; +mod preview1_clock_time_get; +mod preview1_close_preopen; +mod preview1_dangling_fd; +mod preview1_dangling_symlink; +mod preview1_dir_fd_op_failures; +mod preview1_directory_seek; +mod preview1_fd_advise; +mod preview1_fd_filestat_get; +mod preview1_fd_filestat_set; +mod preview1_fd_flags_set; +mod preview1_fd_readdir; +mod preview1_file_allocate; +mod preview1_file_pread_pwrite; +mod preview1_file_seek_tell; +mod preview1_file_truncation; +mod preview1_file_unbuffered_write; +mod preview1_file_write; +mod preview1_interesting_paths; +mod preview1_nofollow_errors; +mod preview1_overwrite_preopen; +mod preview1_path_exists; +mod preview1_path_filestat; +mod preview1_path_link; +mod preview1_path_open_create_existing; +mod preview1_path_open_dirfd_not_dir; +mod preview1_path_open_missing; +mod preview1_path_open_nonblock; +mod preview1_path_open_preopen; +mod preview1_path_open_read_write; +mod preview1_path_rename; +mod preview1_path_rename_dir_trailing_slashes; +mod preview1_path_symlink_trailing_slashes; +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_nonempty_directory; +mod preview1_renumber; +mod preview1_sched_yield; +mod preview1_stdio; +mod preview1_stdio_isatty; +mod preview1_stdio_not_isatty; +mod preview1_symlink_create; +mod preview1_symlink_filestat; +mod preview1_symlink_loop; +mod preview1_unicode_output; +mod preview1_unlink_file_trailing_slashes; +mod preview2_adapter_badfd; +mod preview2_ip_name_lookup; +mod preview2_random; +mod preview2_sleep; +mod preview2_stream_pollable_correct; +mod preview2_stream_pollable_traps; +mod preview2_tcp_bind; +mod preview2_tcp_connect; +mod preview2_tcp_sample_application; +mod preview2_tcp_sockopts; +mod preview2_tcp_states; +mod preview2_udp_bind; +mod preview2_udp_connect; +mod preview2_udp_sample_application; +mod preview2_udp_sockopts; +mod preview2_udp_states; +mod proxy_echo; +mod proxy_handler; +mod proxy_hash; diff --git a/tests/generated/piped_multiple.rs b/tests/generated/piped_multiple.rs new file mode 100644 index 000000000..bf52b0998 --- /dev/null +++ b/tests/generated/piped_multiple.rs @@ -0,0 +1,45 @@ +//! 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 std::fs; +use std::process::{{Command, Stdio}}; +use std::io::prelude::Write; + +#[test] +fn piped_multiple() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/piped_multiple.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/piped_multiple"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/piped_multiple"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + cmd1.stdout(Stdio::piped()); + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + let mut cmd2 = Command::new("node"); + cmd2.arg("./src/jco.js"); + cmd2.arg("run"); + + cmd2.arg("--jco-dir"); + cmd2.arg("./tests/rundir/test_name_consumer"); + cmd2.arg("--jco-import"); + cmd2.arg("./tests/virtualenvs/base-consumer.js"); + cmd2.arg(wasi_file); + cmd2.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + cmd2.stdin(cmd1_child.stdout.take().unwrap()); + let mut cmd2_child = cmd2.spawn().expect("failed to spawn test program"); + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + let status = cmd2_child.wait().expect("failed to wait on child"); + assert!(status.success(), "consumer failed"); + Ok(()) +} diff --git a/tests/generated/piped_polling.rs b/tests/generated/piped_polling.rs new file mode 100644 index 000000000..0d99e6bda --- /dev/null +++ b/tests/generated/piped_polling.rs @@ -0,0 +1,45 @@ +//! 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 std::fs; +use std::process::{{Command, Stdio}}; +use std::io::prelude::Write; + +#[test] +fn piped_polling() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/piped_polling.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/piped_polling"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/piped_polling"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + cmd1.stdout(Stdio::piped()); + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + let mut cmd2 = Command::new("node"); + cmd2.arg("./src/jco.js"); + cmd2.arg("run"); + + cmd2.arg("--jco-dir"); + cmd2.arg("./tests/rundir/test_name_consumer"); + cmd2.arg("--jco-import"); + cmd2.arg("./tests/virtualenvs/base-consumer.js"); + cmd2.arg(wasi_file); + cmd2.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + cmd2.stdin(cmd1_child.stdout.take().unwrap()); + let mut cmd2_child = cmd2.spawn().expect("failed to spawn test program"); + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + let status = cmd2_child.wait().expect("failed to wait on child"); + assert!(status.success(), "consumer failed"); + Ok(()) +} diff --git a/tests/generated/preview1_big_random_buf.rs b/tests/generated/preview1_big_random_buf.rs new file mode 100644 index 000000000..2a5b2624a --- /dev/null +++ b/tests/generated/preview1_big_random_buf.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_big_random_buf() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_big_random_buf.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_big_random_buf"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_big_random_buf"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_clock_time_get.rs b/tests/generated/preview1_clock_time_get.rs new file mode 100644 index 000000000..f18f5526c --- /dev/null +++ b/tests/generated/preview1_clock_time_get.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_clock_time_get() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_clock_time_get.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_clock_time_get"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_clock_time_get"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_close_preopen.rs b/tests/generated/preview1_close_preopen.rs new file mode 100644 index 000000000..c4fbd7f1f --- /dev/null +++ b/tests/generated/preview1_close_preopen.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_close_preopen() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_close_preopen.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_close_preopen"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_close_preopen"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_dangling_fd.rs b/tests/generated/preview1_dangling_fd.rs new file mode 100644 index 000000000..5e9321eb5 --- /dev/null +++ b/tests/generated/preview1_dangling_fd.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_dangling_fd() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_dangling_fd.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_dangling_fd"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_dangling_fd"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_dangling_symlink.rs b/tests/generated/preview1_dangling_symlink.rs new file mode 100644 index 000000000..fdb114071 --- /dev/null +++ b/tests/generated/preview1_dangling_symlink.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_dangling_symlink() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_dangling_symlink.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_dangling_symlink"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_dangling_symlink"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_dir_fd_op_failures.rs b/tests/generated/preview1_dir_fd_op_failures.rs new file mode 100644 index 000000000..0b6afd325 --- /dev/null +++ b/tests/generated/preview1_dir_fd_op_failures.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_dir_fd_op_failures() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_dir_fd_op_failures.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_dir_fd_op_failures"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_dir_fd_op_failures"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_directory_seek.rs b/tests/generated/preview1_directory_seek.rs new file mode 100644 index 000000000..069e4fdeb --- /dev/null +++ b/tests/generated/preview1_directory_seek.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_directory_seek() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_directory_seek.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_directory_seek"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_directory_seek"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_fd_advise.rs b/tests/generated/preview1_fd_advise.rs new file mode 100644 index 000000000..fefcb7a93 --- /dev/null +++ b/tests/generated/preview1_fd_advise.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_fd_advise() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_fd_advise.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_advise"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_fd_advise"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_fd_filestat_get.rs b/tests/generated/preview1_fd_filestat_get.rs new file mode 100644 index 000000000..480fbe742 --- /dev/null +++ b/tests/generated/preview1_fd_filestat_get.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_fd_filestat_get() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_fd_filestat_get.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_filestat_get"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_fd_filestat_get"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_fd_filestat_set.rs b/tests/generated/preview1_fd_filestat_set.rs new file mode 100644 index 000000000..d13d9dd3e --- /dev/null +++ b/tests/generated/preview1_fd_filestat_set.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_fd_filestat_set() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_fd_filestat_set.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_filestat_set"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_fd_filestat_set"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_fd_flags_set.rs b/tests/generated/preview1_fd_flags_set.rs new file mode 100644 index 000000000..eacda2017 --- /dev/null +++ b/tests/generated/preview1_fd_flags_set.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_fd_flags_set() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_fd_flags_set.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_flags_set"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_fd_flags_set"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_fd_readdir.rs b/tests/generated/preview1_fd_readdir.rs new file mode 100644 index 000000000..d5d35faa4 --- /dev/null +++ b/tests/generated/preview1_fd_readdir.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_fd_readdir() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_fd_readdir.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_fd_readdir"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_fd_readdir"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_file_allocate.rs b/tests/generated/preview1_file_allocate.rs new file mode 100644 index 000000000..d697e97cf --- /dev/null +++ b/tests/generated/preview1_file_allocate.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_file_allocate() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_file_allocate.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_file_allocate"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_file_allocate"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_file_pread_pwrite.rs b/tests/generated/preview1_file_pread_pwrite.rs new file mode 100644 index 000000000..d50d1c91b --- /dev/null +++ b/tests/generated/preview1_file_pread_pwrite.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_file_pread_pwrite() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_file_pread_pwrite.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_file_pread_pwrite"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_file_pread_pwrite"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_file_seek_tell.rs b/tests/generated/preview1_file_seek_tell.rs new file mode 100644 index 000000000..62fcd2980 --- /dev/null +++ b/tests/generated/preview1_file_seek_tell.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_file_seek_tell() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_file_seek_tell.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_file_seek_tell"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_file_seek_tell"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_file_truncation.rs b/tests/generated/preview1_file_truncation.rs new file mode 100644 index 000000000..26607ef2b --- /dev/null +++ b/tests/generated/preview1_file_truncation.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_file_truncation() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_file_truncation.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_file_truncation"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_file_truncation"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_file_unbuffered_write.rs b/tests/generated/preview1_file_unbuffered_write.rs new file mode 100644 index 000000000..28c7fb329 --- /dev/null +++ b/tests/generated/preview1_file_unbuffered_write.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_file_unbuffered_write() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_file_unbuffered_write.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_file_unbuffered_write"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_file_unbuffered_write"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_file_write.rs b/tests/generated/preview1_file_write.rs new file mode 100644 index 000000000..f1f5b4e9e --- /dev/null +++ b/tests/generated/preview1_file_write.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_file_write() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_file_write.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_file_write"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_file_write"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_interesting_paths.rs b/tests/generated/preview1_interesting_paths.rs new file mode 100644 index 000000000..d1cb49072 --- /dev/null +++ b/tests/generated/preview1_interesting_paths.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_interesting_paths() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_interesting_paths.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_interesting_paths"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_interesting_paths"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_nofollow_errors.rs b/tests/generated/preview1_nofollow_errors.rs new file mode 100644 index 000000000..3c51aac89 --- /dev/null +++ b/tests/generated/preview1_nofollow_errors.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_nofollow_errors() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_nofollow_errors.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_nofollow_errors"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_nofollow_errors"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_overwrite_preopen.rs b/tests/generated/preview1_overwrite_preopen.rs new file mode 100644 index 000000000..b6709663d --- /dev/null +++ b/tests/generated/preview1_overwrite_preopen.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_overwrite_preopen() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_overwrite_preopen.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_overwrite_preopen"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_overwrite_preopen"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_exists.rs b/tests/generated/preview1_path_exists.rs new file mode 100644 index 000000000..e9b5279ae --- /dev/null +++ b/tests/generated/preview1_path_exists.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_exists() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_exists.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_exists"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_exists"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_filestat.rs b/tests/generated/preview1_path_filestat.rs new file mode 100644 index 000000000..b51fcd811 --- /dev/null +++ b/tests/generated/preview1_path_filestat.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_filestat() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_filestat.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_filestat"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_filestat"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_link.rs b/tests/generated/preview1_path_link.rs new file mode 100644 index 000000000..4dcd13930 --- /dev/null +++ b/tests/generated/preview1_path_link.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_link() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_link.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_link"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_link"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_open_create_existing.rs b/tests/generated/preview1_path_open_create_existing.rs new file mode 100644 index 000000000..69f913ab7 --- /dev/null +++ b/tests/generated/preview1_path_open_create_existing.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_open_create_existing() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_open_create_existing.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_create_existing"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_open_create_existing"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_open_dirfd_not_dir.rs b/tests/generated/preview1_path_open_dirfd_not_dir.rs new file mode 100644 index 000000000..7dbb1248c --- /dev/null +++ b/tests/generated/preview1_path_open_dirfd_not_dir.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_open_dirfd_not_dir() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_open_dirfd_not_dir.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_dirfd_not_dir"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_open_dirfd_not_dir"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_open_missing.rs b/tests/generated/preview1_path_open_missing.rs new file mode 100644 index 000000000..2f8c5c497 --- /dev/null +++ b/tests/generated/preview1_path_open_missing.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_open_missing() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_open_missing.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_missing"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_open_missing"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_open_nonblock.rs b/tests/generated/preview1_path_open_nonblock.rs new file mode 100644 index 000000000..3de70347f --- /dev/null +++ b/tests/generated/preview1_path_open_nonblock.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_open_nonblock() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_open_nonblock.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_nonblock"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_open_nonblock"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_open_preopen.rs b/tests/generated/preview1_path_open_preopen.rs new file mode 100644 index 000000000..aa00a53c9 --- /dev/null +++ b/tests/generated/preview1_path_open_preopen.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_open_preopen() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_open_preopen.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_preopen"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_open_preopen"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_open_read_write.rs b/tests/generated/preview1_path_open_read_write.rs new file mode 100644 index 000000000..9dec1be80 --- /dev/null +++ b/tests/generated/preview1_path_open_read_write.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_open_read_write() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_open_read_write.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_open_read_write"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_open_read_write"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_rename.rs b/tests/generated/preview1_path_rename.rs new file mode 100644 index 000000000..f6a4bc541 --- /dev/null +++ b/tests/generated/preview1_path_rename.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_rename() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_rename.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_rename"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_rename"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_rename_dir_trailing_slashes.rs b/tests/generated/preview1_path_rename_dir_trailing_slashes.rs new file mode 100644 index 000000000..fdc88269e --- /dev/null +++ b/tests/generated/preview1_path_rename_dir_trailing_slashes.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_rename_dir_trailing_slashes() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_rename_dir_trailing_slashes.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_rename_dir_trailing_slashes"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_rename_dir_trailing_slashes"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_path_symlink_trailing_slashes.rs b/tests/generated/preview1_path_symlink_trailing_slashes.rs new file mode 100644 index 000000000..2d3bf595a --- /dev/null +++ b/tests/generated/preview1_path_symlink_trailing_slashes.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_path_symlink_trailing_slashes() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_path_symlink_trailing_slashes.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_path_symlink_trailing_slashes"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_path_symlink_trailing_slashes"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_poll_oneoff_files.rs b/tests/generated/preview1_poll_oneoff_files.rs new file mode 100644 index 000000000..0f8e5c751 --- /dev/null +++ b/tests/generated/preview1_poll_oneoff_files.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_poll_oneoff_files() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_poll_oneoff_files.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_poll_oneoff_files"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_poll_oneoff_files"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_poll_oneoff_stdio.rs b/tests/generated/preview1_poll_oneoff_stdio.rs new file mode 100644 index 000000000..79340779e --- /dev/null +++ b/tests/generated/preview1_poll_oneoff_stdio.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_poll_oneoff_stdio() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_poll_oneoff_stdio.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_poll_oneoff_stdio"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_poll_oneoff_stdio"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_readlink.rs b/tests/generated/preview1_readlink.rs new file mode 100644 index 000000000..7b6afa634 --- /dev/null +++ b/tests/generated/preview1_readlink.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_readlink() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_readlink.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_readlink"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_readlink"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_regular_file_isatty.rs b/tests/generated/preview1_regular_file_isatty.rs new file mode 100644 index 000000000..3e9b12236 --- /dev/null +++ b/tests/generated/preview1_regular_file_isatty.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_regular_file_isatty() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_regular_file_isatty.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_regular_file_isatty"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_regular_file_isatty"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_remove_directory.rs b/tests/generated/preview1_remove_directory.rs new file mode 100644 index 000000000..acc9033a4 --- /dev/null +++ b/tests/generated/preview1_remove_directory.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_remove_directory() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_remove_directory.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_remove_directory"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_remove_directory"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_remove_nonempty_directory.rs b/tests/generated/preview1_remove_nonempty_directory.rs new file mode 100644 index 000000000..e6a6455d7 --- /dev/null +++ b/tests/generated/preview1_remove_nonempty_directory.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_remove_nonempty_directory() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_remove_nonempty_directory.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_remove_nonempty_directory"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_remove_nonempty_directory"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_renumber.rs b/tests/generated/preview1_renumber.rs new file mode 100644 index 000000000..c89f1bab5 --- /dev/null +++ b/tests/generated/preview1_renumber.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_renumber() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_renumber.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_renumber"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_renumber"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_sched_yield.rs b/tests/generated/preview1_sched_yield.rs new file mode 100644 index 000000000..14a059975 --- /dev/null +++ b/tests/generated/preview1_sched_yield.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_sched_yield() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_sched_yield.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_sched_yield"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_sched_yield"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_stdio.rs b/tests/generated/preview1_stdio.rs new file mode 100644 index 000000000..58db40d34 --- /dev/null +++ b/tests/generated/preview1_stdio.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_stdio() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_stdio.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_stdio"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_stdio"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_stdio_isatty.rs b/tests/generated/preview1_stdio_isatty.rs new file mode 100644 index 000000000..269ef9763 --- /dev/null +++ b/tests/generated/preview1_stdio_isatty.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_stdio_isatty() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_stdio_isatty.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_stdio_isatty"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_stdio_isatty"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_stdio_not_isatty.rs b/tests/generated/preview1_stdio_not_isatty.rs new file mode 100644 index 000000000..99a2f0852 --- /dev/null +++ b/tests/generated/preview1_stdio_not_isatty.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_stdio_not_isatty() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_stdio_not_isatty.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_stdio_not_isatty"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_stdio_not_isatty"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/notty.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_symlink_create.rs b/tests/generated/preview1_symlink_create.rs new file mode 100644 index 000000000..0d2299e8a --- /dev/null +++ b/tests/generated/preview1_symlink_create.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_symlink_create() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_symlink_create.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_symlink_create"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_symlink_create"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_symlink_filestat.rs b/tests/generated/preview1_symlink_filestat.rs new file mode 100644 index 000000000..e689debb9 --- /dev/null +++ b/tests/generated/preview1_symlink_filestat.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_symlink_filestat() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_symlink_filestat.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_symlink_filestat"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_symlink_filestat"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_symlink_loop.rs b/tests/generated/preview1_symlink_loop.rs new file mode 100644 index 000000000..d19aa6918 --- /dev/null +++ b/tests/generated/preview1_symlink_loop.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_symlink_loop() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_symlink_loop.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_symlink_loop"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_symlink_loop"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_unicode_output.rs b/tests/generated/preview1_unicode_output.rs new file mode 100644 index 000000000..06e9ea98b --- /dev/null +++ b/tests/generated/preview1_unicode_output.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_unicode_output() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_unicode_output.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_unicode_output"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_unicode_output"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview1_unlink_file_trailing_slashes.rs b/tests/generated/preview1_unlink_file_trailing_slashes.rs new file mode 100644 index 000000000..4f8204234 --- /dev/null +++ b/tests/generated/preview1_unlink_file_trailing_slashes.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview1_unlink_file_trailing_slashes() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview1_unlink_file_trailing_slashes.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview1_unlink_file_trailing_slashes"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview1_unlink_file_trailing_slashes"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/scratch.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_adapter_badfd.rs b/tests/generated/preview2_adapter_badfd.rs new file mode 100644 index 000000000..353ecaaa0 --- /dev/null +++ b/tests/generated/preview2_adapter_badfd.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_adapter_badfd() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_adapter_badfd.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_adapter_badfd"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_adapter_badfd"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_ip_name_lookup.rs b/tests/generated/preview2_ip_name_lookup.rs new file mode 100644 index 000000000..9f50c5404 --- /dev/null +++ b/tests/generated/preview2_ip_name_lookup.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_ip_name_lookup() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_ip_name_lookup.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_ip_name_lookup"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_ip_name_lookup"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_random.rs b/tests/generated/preview2_random.rs new file mode 100644 index 000000000..709be7c0a --- /dev/null +++ b/tests/generated/preview2_random.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_random() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_random.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_random"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_random"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_sleep.rs b/tests/generated/preview2_sleep.rs new file mode 100644 index 000000000..5ac67ff3d --- /dev/null +++ b/tests/generated/preview2_sleep.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_sleep() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_sleep.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_sleep"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_sleep"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_stream_pollable_correct.rs b/tests/generated/preview2_stream_pollable_correct.rs new file mode 100644 index 000000000..c1de5560b --- /dev/null +++ b/tests/generated/preview2_stream_pollable_correct.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_stream_pollable_correct() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_stream_pollable_correct.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_stream_pollable_correct"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_stream_pollable_correct"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_stream_pollable_traps.rs b/tests/generated/preview2_stream_pollable_traps.rs new file mode 100644 index 000000000..c28e432a6 --- /dev/null +++ b/tests/generated/preview2_stream_pollable_traps.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_stream_pollable_traps() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_stream_pollable_traps.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_stream_pollable_traps"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_stream_pollable_traps"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(!status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_tcp_bind.rs b/tests/generated/preview2_tcp_bind.rs new file mode 100644 index 000000000..5b948e685 --- /dev/null +++ b/tests/generated/preview2_tcp_bind.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_tcp_bind() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_tcp_bind.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_bind"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_tcp_bind"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_tcp_connect.rs b/tests/generated/preview2_tcp_connect.rs new file mode 100644 index 000000000..df5d42263 --- /dev/null +++ b/tests/generated/preview2_tcp_connect.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_tcp_connect() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_tcp_connect.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_connect"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_tcp_connect"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_tcp_sample_application.rs b/tests/generated/preview2_tcp_sample_application.rs new file mode 100644 index 000000000..50b8251bd --- /dev/null +++ b/tests/generated/preview2_tcp_sample_application.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_tcp_sample_application() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_tcp_sample_application.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sample_application"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_tcp_sample_application"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_tcp_sockopts.rs b/tests/generated/preview2_tcp_sockopts.rs new file mode 100644 index 000000000..051f0f0db --- /dev/null +++ b/tests/generated/preview2_tcp_sockopts.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_tcp_sockopts() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_tcp_sockopts.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_sockopts"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_tcp_sockopts"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_tcp_states.rs b/tests/generated/preview2_tcp_states.rs new file mode 100644 index 000000000..837d4c1bc --- /dev/null +++ b/tests/generated/preview2_tcp_states.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_tcp_states() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_tcp_states.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_tcp_states"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_tcp_states"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_udp_bind.rs b/tests/generated/preview2_udp_bind.rs new file mode 100644 index 000000000..e45446cc9 --- /dev/null +++ b/tests/generated/preview2_udp_bind.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_udp_bind() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_udp_bind.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_bind"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_udp_bind"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_udp_connect.rs b/tests/generated/preview2_udp_connect.rs new file mode 100644 index 000000000..c2c4c8349 --- /dev/null +++ b/tests/generated/preview2_udp_connect.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_udp_connect() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_udp_connect.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_connect"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_udp_connect"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_udp_sample_application.rs b/tests/generated/preview2_udp_sample_application.rs new file mode 100644 index 000000000..b335f64bf --- /dev/null +++ b/tests/generated/preview2_udp_sample_application.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_udp_sample_application() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_udp_sample_application.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_sample_application"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_udp_sample_application"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_udp_sockopts.rs b/tests/generated/preview2_udp_sockopts.rs new file mode 100644 index 000000000..05479915f --- /dev/null +++ b/tests/generated/preview2_udp_sockopts.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_udp_sockopts() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_udp_sockopts.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_sockopts"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_udp_sockopts"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/preview2_udp_states.rs b/tests/generated/preview2_udp_states.rs new file mode 100644 index 000000000..37cd96cbc --- /dev/null +++ b/tests/generated/preview2_udp_states.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn preview2_udp_states() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_udp_states.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_udp_states"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_udp_states"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/proxy_echo.rs b/tests/generated/proxy_echo.rs new file mode 100644 index 000000000..27516ef36 --- /dev/null +++ b/tests/generated/proxy_echo.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn proxy_echo() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/proxy_echo.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/proxy_echo"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/proxy_echo"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/server-api-proxy-streaming.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/proxy_handler.rs b/tests/generated/proxy_handler.rs new file mode 100644 index 000000000..28c3c8b94 --- /dev/null +++ b/tests/generated/proxy_handler.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn proxy_handler() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/proxy_handler.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/proxy_handler"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/proxy_handler"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/server-api-proxy.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/tests/generated/proxy_hash.rs b/tests/generated/proxy_hash.rs new file mode 100644 index 000000000..e1db38863 --- /dev/null +++ b/tests/generated/proxy_hash.rs @@ -0,0 +1,31 @@ +//! 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 std::fs; +use std::process::Command; + +#[test] +fn proxy_hash() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/proxy_hash.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/proxy_hash"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/proxy_hash"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/server-api-proxy-streaming.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + + + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + + + // let status = cmd1_child.wait().expect("failed to wait on child"); + // assert!(status.success(), "producer failed"); + + + Ok(()) +} diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index cc6b0fb7b..b423e4c71 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -3,7 +3,7 @@ use xshell::{cmd, Shell}; // for debugging const TRACE: bool = false; -const TEST_FILTER: &[&str] = &["piped_simple"]; +const TEST_FILTER: &[&str] = &[]; const TEST_IGNORE: &[&str] = &["nn_image_classification", "nn_image_classification_named"]; From 07f0daed874ec2141cb14b5724ee0c6ea60951e6 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 15 Jan 2024 16:51:05 -0800 Subject: [PATCH 14/23] two tests to go --- submodules/wasmtime | 2 +- tests/generated/api_reactor.rs | 9 +--- tests/generated/api_read_only.rs | 9 +--- tests/generated/api_time.rs | 9 +--- tests/generated/cli_args.rs | 9 +--- tests/generated/cli_default_clocks.rs | 9 +--- tests/generated/cli_directory_list.rs | 9 +--- tests/generated/cli_env.rs | 9 +--- tests/generated/cli_exit_default.rs | 9 +--- tests/generated/cli_exit_failure.rs | 9 +--- tests/generated/cli_exit_panic.rs | 9 +--- tests/generated/cli_exit_success.rs | 9 +--- tests/generated/cli_export_cabi_realloc.rs | 9 +--- tests/generated/cli_file_append.rs | 9 +--- tests/generated/cli_file_dir_sync.rs | 9 +--- tests/generated/cli_file_read.rs | 9 +--- tests/generated/cli_hello_stdout.rs | 9 +--- tests/generated/cli_no_ip_name_lookup.rs | 9 +--- tests/generated/cli_no_tcp.rs | 9 +--- tests/generated/cli_no_udp.rs | 9 +--- tests/generated/cli_splice_stdin.rs | 9 +--- tests/generated/cli_stdin.rs | 17 +++--- tests/generated/cli_stdio_write_flushes.rs | 9 +--- .../http_outbound_request_content_length.rs | 9 +--- tests/generated/http_outbound_request_get.rs | 9 +--- .../http_outbound_request_invalid_dnsname.rs | 9 +--- .../http_outbound_request_invalid_header.rs | 9 +--- .../http_outbound_request_invalid_port.rs | 9 +--- .../http_outbound_request_invalid_version.rs | 9 +--- .../http_outbound_request_large_post.rs | 9 +--- tests/generated/http_outbound_request_post.rs | 9 +--- tests/generated/http_outbound_request_put.rs | 9 +--- .../http_outbound_request_response_build.rs | 9 +--- .../http_outbound_request_unknown_method.rs | 9 +--- ...ttp_outbound_request_unsupported_scheme.rs | 9 +--- tests/generated/mod.rs | 2 - tests/generated/piped_multiple.rs | 14 ++--- tests/generated/piped_polling.rs | 14 ++--- tests/generated/piped_simple.rs | 10 ++-- tests/generated/preview1_big_random_buf.rs | 9 +--- tests/generated/preview1_clock_time_get.rs | 9 +--- tests/generated/preview1_close_preopen.rs | 9 +--- tests/generated/preview1_dangling_fd.rs | 9 +--- tests/generated/preview1_dangling_symlink.rs | 9 +--- .../generated/preview1_dir_fd_op_failures.rs | 9 +--- tests/generated/preview1_directory_seek.rs | 9 +--- tests/generated/preview1_fd_advise.rs | 9 +--- tests/generated/preview1_fd_filestat_get.rs | 9 +--- tests/generated/preview1_fd_filestat_set.rs | 9 +--- tests/generated/preview1_fd_flags_set.rs | 9 +--- tests/generated/preview1_fd_readdir.rs | 9 +--- tests/generated/preview1_file_allocate.rs | 9 +--- tests/generated/preview1_file_pread_pwrite.rs | 9 +--- tests/generated/preview1_file_seek_tell.rs | 9 +--- tests/generated/preview1_file_truncation.rs | 9 +--- .../preview1_file_unbuffered_write.rs | 9 +--- tests/generated/preview1_file_write.rs | 9 +--- tests/generated/preview1_interesting_paths.rs | 9 +--- tests/generated/preview1_nofollow_errors.rs | 9 +--- tests/generated/preview1_overwrite_preopen.rs | 9 +--- tests/generated/preview1_path_exists.rs | 9 +--- tests/generated/preview1_path_filestat.rs | 9 +--- tests/generated/preview1_path_link.rs | 9 +--- .../preview1_path_open_create_existing.rs | 9 +--- .../preview1_path_open_dirfd_not_dir.rs | 9 +--- tests/generated/preview1_path_open_missing.rs | 9 +--- .../generated/preview1_path_open_nonblock.rs | 9 +--- tests/generated/preview1_path_open_preopen.rs | 9 +--- .../preview1_path_open_read_write.rs | 9 +--- tests/generated/preview1_path_rename.rs | 9 +--- ...eview1_path_rename_dir_trailing_slashes.rs | 9 +--- .../preview1_path_symlink_trailing_slashes.rs | 9 +--- tests/generated/preview1_poll_oneoff_files.rs | 9 +--- tests/generated/preview1_poll_oneoff_stdio.rs | 9 +--- tests/generated/preview1_readlink.rs | 9 +--- .../generated/preview1_regular_file_isatty.rs | 9 +--- tests/generated/preview1_remove_directory.rs | 9 +--- .../preview1_remove_nonempty_directory.rs | 9 +--- tests/generated/preview1_renumber.rs | 9 +--- tests/generated/preview1_sched_yield.rs | 9 +--- tests/generated/preview1_stdio.rs | 9 +--- tests/generated/preview1_stdio_isatty.rs | 9 +--- tests/generated/preview1_stdio_not_isatty.rs | 9 +--- tests/generated/preview1_symlink_create.rs | 9 +--- tests/generated/preview1_symlink_filestat.rs | 9 +--- tests/generated/preview1_symlink_loop.rs | 9 +--- tests/generated/preview1_unicode_output.rs | 9 +--- .../preview1_unlink_file_trailing_slashes.rs | 9 +--- tests/generated/preview2_adapter_badfd.rs | 9 +--- tests/generated/preview2_ip_name_lookup.rs | 9 +--- tests/generated/preview2_random.rs | 9 +--- tests/generated/preview2_sleep.rs | 9 +--- .../preview2_stream_pollable_correct.rs | 31 ----------- .../preview2_stream_pollable_traps.rs | 31 ----------- tests/generated/preview2_tcp_bind.rs | 9 +--- tests/generated/preview2_tcp_connect.rs | 9 +--- .../preview2_tcp_sample_application.rs | 9 +--- tests/generated/preview2_tcp_sockopts.rs | 9 +--- tests/generated/preview2_tcp_states.rs | 9 +--- tests/generated/preview2_udp_bind.rs | 9 +--- tests/generated/preview2_udp_connect.rs | 9 +--- .../preview2_udp_sample_application.rs | 9 +--- tests/generated/preview2_udp_sockopts.rs | 9 +--- tests/generated/preview2_udp_states.rs | 9 +--- tests/generated/proxy_echo.rs | 9 +--- tests/generated/proxy_handler.rs | 9 +--- tests/generated/proxy_hash.rs | 9 +--- tests/virtualenvs/http-server.js | 2 +- tests/virtualenvs/piped-consumer.js | 30 ----------- tests/virtualenvs/piped.js | 27 ---------- xtask/src/generate/tests.rs | 54 ++++++++++--------- 111 files changed, 250 insertions(+), 875 deletions(-) delete mode 100644 tests/generated/preview2_stream_pollable_correct.rs delete mode 100644 tests/generated/preview2_stream_pollable_traps.rs diff --git a/submodules/wasmtime b/submodules/wasmtime index 8a85eadb3..9014dd27a 160000 --- a/submodules/wasmtime +++ b/submodules/wasmtime @@ -1 +1 @@ -Subproject commit 8a85eadb32a42fcfc03c6d53ce2793d6fb42b22d +Subproject commit 9014dd27adbdb11995b3353ee261fc5c7fafa104 diff --git a/tests/generated/api_reactor.rs b/tests/generated/api_reactor.rs index 0cd1dc1b3..bc8a0b017 100644 --- a/tests/generated/api_reactor.rs +++ b/tests/generated/api_reactor.rs @@ -19,13 +19,8 @@ fn api_reactor() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/api_read_only.rs b/tests/generated/api_read_only.rs index ef4c974b6..04c1ee9bf 100644 --- a/tests/generated/api_read_only.rs +++ b/tests/generated/api_read_only.rs @@ -19,13 +19,8 @@ fn api_read_only() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/api_time.rs b/tests/generated/api_time.rs index 4153ef439..3fc8ad328 100644 --- a/tests/generated/api_time.rs +++ b/tests/generated/api_time.rs @@ -19,13 +19,8 @@ fn api_time() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_args.rs b/tests/generated/cli_args.rs index d63c2192c..1f8014747 100644 --- a/tests/generated/cli_args.rs +++ b/tests/generated/cli_args.rs @@ -19,13 +19,8 @@ fn cli_args() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_default_clocks.rs b/tests/generated/cli_default_clocks.rs index e65d15166..521d4fbdc 100644 --- a/tests/generated/cli_default_clocks.rs +++ b/tests/generated/cli_default_clocks.rs @@ -19,13 +19,8 @@ fn cli_default_clocks() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_directory_list.rs b/tests/generated/cli_directory_list.rs index fa268792c..3ce0668ec 100644 --- a/tests/generated/cli_directory_list.rs +++ b/tests/generated/cli_directory_list.rs @@ -19,13 +19,8 @@ fn cli_directory_list() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_env.rs b/tests/generated/cli_env.rs index db7334346..6459a522d 100644 --- a/tests/generated/cli_env.rs +++ b/tests/generated/cli_env.rs @@ -19,13 +19,8 @@ fn cli_env() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_exit_default.rs b/tests/generated/cli_exit_default.rs index 6deafb62e..305583e88 100644 --- a/tests/generated/cli_exit_default.rs +++ b/tests/generated/cli_exit_default.rs @@ -19,13 +19,8 @@ fn cli_exit_default() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_exit_failure.rs b/tests/generated/cli_exit_failure.rs index f10a24b8d..c78f4684a 100644 --- a/tests/generated/cli_exit_failure.rs +++ b/tests/generated/cli_exit_failure.rs @@ -19,13 +19,8 @@ fn cli_exit_failure() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(!status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(!status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_exit_panic.rs b/tests/generated/cli_exit_panic.rs index d1f2cbddd..ccc5d5723 100644 --- a/tests/generated/cli_exit_panic.rs +++ b/tests/generated/cli_exit_panic.rs @@ -19,13 +19,8 @@ fn cli_exit_panic() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(!status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(!status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_exit_success.rs b/tests/generated/cli_exit_success.rs index 92a9d5b91..73fda209f 100644 --- a/tests/generated/cli_exit_success.rs +++ b/tests/generated/cli_exit_success.rs @@ -19,13 +19,8 @@ fn cli_exit_success() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_export_cabi_realloc.rs b/tests/generated/cli_export_cabi_realloc.rs index 06c01068a..fa333661a 100644 --- a/tests/generated/cli_export_cabi_realloc.rs +++ b/tests/generated/cli_export_cabi_realloc.rs @@ -19,13 +19,8 @@ fn cli_export_cabi_realloc() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_file_append.rs b/tests/generated/cli_file_append.rs index e2c4133ba..1161c9215 100644 --- a/tests/generated/cli_file_append.rs +++ b/tests/generated/cli_file_append.rs @@ -19,13 +19,8 @@ fn cli_file_append() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_file_dir_sync.rs b/tests/generated/cli_file_dir_sync.rs index 9807670b1..5692a0177 100644 --- a/tests/generated/cli_file_dir_sync.rs +++ b/tests/generated/cli_file_dir_sync.rs @@ -19,13 +19,8 @@ fn cli_file_dir_sync() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_file_read.rs b/tests/generated/cli_file_read.rs index 414f85326..0eb400ae0 100644 --- a/tests/generated/cli_file_read.rs +++ b/tests/generated/cli_file_read.rs @@ -19,13 +19,8 @@ fn cli_file_read() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_hello_stdout.rs b/tests/generated/cli_hello_stdout.rs index d03b871aa..b34ee8ec3 100644 --- a/tests/generated/cli_hello_stdout.rs +++ b/tests/generated/cli_hello_stdout.rs @@ -19,13 +19,8 @@ fn cli_hello_stdout() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_no_ip_name_lookup.rs b/tests/generated/cli_no_ip_name_lookup.rs index 887b363c7..874310a84 100644 --- a/tests/generated/cli_no_ip_name_lookup.rs +++ b/tests/generated/cli_no_ip_name_lookup.rs @@ -19,13 +19,8 @@ fn cli_no_ip_name_lookup() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_no_tcp.rs b/tests/generated/cli_no_tcp.rs index 80b92ff4e..b11427f64 100644 --- a/tests/generated/cli_no_tcp.rs +++ b/tests/generated/cli_no_tcp.rs @@ -19,13 +19,8 @@ fn cli_no_tcp() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_no_udp.rs b/tests/generated/cli_no_udp.rs index 96ac87a72..6af38d3a7 100644 --- a/tests/generated/cli_no_udp.rs +++ b/tests/generated/cli_no_udp.rs @@ -19,13 +19,8 @@ fn cli_no_udp() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_splice_stdin.rs b/tests/generated/cli_splice_stdin.rs index 1f1d6e5ff..d1887a610 100644 --- a/tests/generated/cli_splice_stdin.rs +++ b/tests/generated/cli_splice_stdin.rs @@ -19,13 +19,8 @@ fn cli_splice_stdin() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_stdin.rs b/tests/generated/cli_stdin.rs index efad6ff00..7c18b7e07 100644 --- a/tests/generated/cli_stdin.rs +++ b/tests/generated/cli_stdin.rs @@ -2,8 +2,8 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::{{Command, Stdio}}; use std::io::prelude::Write; +use std::process::{Command, Stdio}; #[test] fn cli_stdin() -> anyhow::Result<()> { @@ -20,13 +20,14 @@ fn cli_stdin() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); cmd1.stdin(Stdio::piped()); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - cmd1_child.stdin.as_ref().unwrap().write(b"So rested he by the Tumtum tree").unwrap(); - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + cmd1_child + .stdin + .as_ref() + .unwrap() + .write(b"So rested he by the Tumtum tree") + .unwrap(); + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/cli_stdio_write_flushes.rs b/tests/generated/cli_stdio_write_flushes.rs index 2dff5b65d..56e37330d 100644 --- a/tests/generated/cli_stdio_write_flushes.rs +++ b/tests/generated/cli_stdio_write_flushes.rs @@ -19,13 +19,8 @@ fn cli_stdio_write_flushes() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_content_length.rs b/tests/generated/http_outbound_request_content_length.rs index bca6438ac..b72c46f8d 100644 --- a/tests/generated/http_outbound_request_content_length.rs +++ b/tests/generated/http_outbound_request_content_length.rs @@ -19,13 +19,8 @@ fn http_outbound_request_content_length() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_get.rs b/tests/generated/http_outbound_request_get.rs index 7e471fb4d..65f9b3070 100644 --- a/tests/generated/http_outbound_request_get.rs +++ b/tests/generated/http_outbound_request_get.rs @@ -19,13 +19,8 @@ fn http_outbound_request_get() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_invalid_dnsname.rs b/tests/generated/http_outbound_request_invalid_dnsname.rs index f5bb00abb..8618a8575 100644 --- a/tests/generated/http_outbound_request_invalid_dnsname.rs +++ b/tests/generated/http_outbound_request_invalid_dnsname.rs @@ -19,13 +19,8 @@ fn http_outbound_request_invalid_dnsname() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_invalid_header.rs b/tests/generated/http_outbound_request_invalid_header.rs index 544fb6ee1..3f8b728aa 100644 --- a/tests/generated/http_outbound_request_invalid_header.rs +++ b/tests/generated/http_outbound_request_invalid_header.rs @@ -19,13 +19,8 @@ fn http_outbound_request_invalid_header() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_invalid_port.rs b/tests/generated/http_outbound_request_invalid_port.rs index 52c2671ea..359ff75dc 100644 --- a/tests/generated/http_outbound_request_invalid_port.rs +++ b/tests/generated/http_outbound_request_invalid_port.rs @@ -19,13 +19,8 @@ fn http_outbound_request_invalid_port() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_invalid_version.rs b/tests/generated/http_outbound_request_invalid_version.rs index a85470664..b3261940e 100644 --- a/tests/generated/http_outbound_request_invalid_version.rs +++ b/tests/generated/http_outbound_request_invalid_version.rs @@ -19,13 +19,8 @@ fn http_outbound_request_invalid_version() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_large_post.rs b/tests/generated/http_outbound_request_large_post.rs index 09a2d5488..e4dfd7059 100644 --- a/tests/generated/http_outbound_request_large_post.rs +++ b/tests/generated/http_outbound_request_large_post.rs @@ -19,13 +19,8 @@ fn http_outbound_request_large_post() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_post.rs b/tests/generated/http_outbound_request_post.rs index 48867bac5..39a674639 100644 --- a/tests/generated/http_outbound_request_post.rs +++ b/tests/generated/http_outbound_request_post.rs @@ -19,13 +19,8 @@ fn http_outbound_request_post() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_put.rs b/tests/generated/http_outbound_request_put.rs index cb7314c12..645c3f49a 100644 --- a/tests/generated/http_outbound_request_put.rs +++ b/tests/generated/http_outbound_request_put.rs @@ -19,13 +19,8 @@ fn http_outbound_request_put() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_response_build.rs b/tests/generated/http_outbound_request_response_build.rs index 8fbbe730e..96f8c5778 100644 --- a/tests/generated/http_outbound_request_response_build.rs +++ b/tests/generated/http_outbound_request_response_build.rs @@ -19,13 +19,8 @@ fn http_outbound_request_response_build() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_unknown_method.rs b/tests/generated/http_outbound_request_unknown_method.rs index bb3e2daa1..b6304521f 100644 --- a/tests/generated/http_outbound_request_unknown_method.rs +++ b/tests/generated/http_outbound_request_unknown_method.rs @@ -19,13 +19,8 @@ fn http_outbound_request_unknown_method() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/http_outbound_request_unsupported_scheme.rs b/tests/generated/http_outbound_request_unsupported_scheme.rs index 6c9f1fe34..dd69030ac 100644 --- a/tests/generated/http_outbound_request_unsupported_scheme.rs +++ b/tests/generated/http_outbound_request_unsupported_scheme.rs @@ -19,13 +19,8 @@ fn http_outbound_request_unsupported_scheme() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index 9fa279796..f48c32660 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -88,8 +88,6 @@ mod preview2_adapter_badfd; mod preview2_ip_name_lookup; mod preview2_random; mod preview2_sleep; -mod preview2_stream_pollable_correct; -mod preview2_stream_pollable_traps; mod preview2_tcp_bind; mod preview2_tcp_connect; mod preview2_tcp_sample_application; diff --git a/tests/generated/piped_multiple.rs b/tests/generated/piped_multiple.rs index bf52b0998..4287a37b2 100644 --- a/tests/generated/piped_multiple.rs +++ b/tests/generated/piped_multiple.rs @@ -2,8 +2,8 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::{{Command, Stdio}}; use std::io::prelude::Write; +use std::process::{Command, Stdio}; #[test] fn piped_multiple() -> anyhow::Result<()> { @@ -16,7 +16,7 @@ fn piped_multiple() -> anyhow::Result<()> { cmd1.arg("--jco-dir"); cmd1.arg("./tests/rundir/piped_multiple"); cmd1.arg("--jco-import"); - cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg("./tests/virtualenvs/piped.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); @@ -27,19 +27,15 @@ fn piped_multiple() -> anyhow::Result<()> { cmd2.arg("run"); cmd2.arg("--jco-dir"); - cmd2.arg("./tests/rundir/test_name_consumer"); + cmd2.arg("./tests/rundir/piped_multiple_consumer"); cmd2.arg("--jco-import"); - cmd2.arg("./tests/virtualenvs/base-consumer.js"); + cmd2.arg("./tests/virtualenvs/piped-consumer.js"); cmd2.arg(wasi_file); cmd2.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); cmd2.stdin(cmd1_child.stdout.take().unwrap()); let mut cmd2_child = cmd2.spawn().expect("failed to spawn test program"); - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - let status = cmd2_child.wait().expect("failed to wait on child"); - assert!(status.success(), "consumer failed"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/piped_polling.rs b/tests/generated/piped_polling.rs index 0d99e6bda..4e260b83c 100644 --- a/tests/generated/piped_polling.rs +++ b/tests/generated/piped_polling.rs @@ -2,8 +2,8 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::{{Command, Stdio}}; use std::io::prelude::Write; +use std::process::{Command, Stdio}; #[test] fn piped_polling() -> anyhow::Result<()> { @@ -16,7 +16,7 @@ fn piped_polling() -> anyhow::Result<()> { cmd1.arg("--jco-dir"); cmd1.arg("./tests/rundir/piped_polling"); cmd1.arg("--jco-import"); - cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg("./tests/virtualenvs/piped.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); @@ -27,19 +27,15 @@ fn piped_polling() -> anyhow::Result<()> { cmd2.arg("run"); cmd2.arg("--jco-dir"); - cmd2.arg("./tests/rundir/test_name_consumer"); + cmd2.arg("./tests/rundir/piped_polling_consumer"); cmd2.arg("--jco-import"); - cmd2.arg("./tests/virtualenvs/base-consumer.js"); + cmd2.arg("./tests/virtualenvs/piped-consumer.js"); cmd2.arg(wasi_file); cmd2.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); cmd2.stdin(cmd1_child.stdout.take().unwrap()); let mut cmd2_child = cmd2.spawn().expect("failed to spawn test program"); - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - let status = cmd2_child.wait().expect("failed to wait on child"); - assert!(status.success(), "consumer failed"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/piped_simple.rs b/tests/generated/piped_simple.rs index c63d75594..3a8081f38 100644 --- a/tests/generated/piped_simple.rs +++ b/tests/generated/piped_simple.rs @@ -2,8 +2,8 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::{{Command, Stdio}}; use std::io::prelude::Write; +use std::process::{Command, Stdio}; #[test] fn piped_simple() -> anyhow::Result<()> { @@ -27,7 +27,7 @@ fn piped_simple() -> anyhow::Result<()> { cmd2.arg("run"); cmd2.arg("--jco-dir"); - cmd2.arg("./tests/rundir/test_name_consumer"); + cmd2.arg("./tests/rundir/piped_simple_consumer"); cmd2.arg("--jco-import"); cmd2.arg("./tests/virtualenvs/piped-consumer.js"); cmd2.arg(wasi_file); @@ -35,11 +35,7 @@ fn piped_simple() -> anyhow::Result<()> { cmd2.stdin(cmd1_child.stdout.take().unwrap()); let mut cmd2_child = cmd2.spawn().expect("failed to spawn test program"); - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - let status = cmd2_child.wait().expect("failed to wait on child"); - assert!(status.success(), "consumer failed"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_big_random_buf.rs b/tests/generated/preview1_big_random_buf.rs index 2a5b2624a..4820034e8 100644 --- a/tests/generated/preview1_big_random_buf.rs +++ b/tests/generated/preview1_big_random_buf.rs @@ -19,13 +19,8 @@ fn preview1_big_random_buf() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_clock_time_get.rs b/tests/generated/preview1_clock_time_get.rs index f18f5526c..b6c8fe169 100644 --- a/tests/generated/preview1_clock_time_get.rs +++ b/tests/generated/preview1_clock_time_get.rs @@ -19,13 +19,8 @@ fn preview1_clock_time_get() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_close_preopen.rs b/tests/generated/preview1_close_preopen.rs index c4fbd7f1f..66b3881f2 100644 --- a/tests/generated/preview1_close_preopen.rs +++ b/tests/generated/preview1_close_preopen.rs @@ -19,13 +19,8 @@ fn preview1_close_preopen() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_dangling_fd.rs b/tests/generated/preview1_dangling_fd.rs index 5e9321eb5..1a4786874 100644 --- a/tests/generated/preview1_dangling_fd.rs +++ b/tests/generated/preview1_dangling_fd.rs @@ -19,13 +19,8 @@ fn preview1_dangling_fd() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_dangling_symlink.rs b/tests/generated/preview1_dangling_symlink.rs index fdb114071..c2788db2c 100644 --- a/tests/generated/preview1_dangling_symlink.rs +++ b/tests/generated/preview1_dangling_symlink.rs @@ -19,13 +19,8 @@ fn preview1_dangling_symlink() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_dir_fd_op_failures.rs b/tests/generated/preview1_dir_fd_op_failures.rs index 0b6afd325..df48f44b0 100644 --- a/tests/generated/preview1_dir_fd_op_failures.rs +++ b/tests/generated/preview1_dir_fd_op_failures.rs @@ -19,13 +19,8 @@ fn preview1_dir_fd_op_failures() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_directory_seek.rs b/tests/generated/preview1_directory_seek.rs index 069e4fdeb..85008b417 100644 --- a/tests/generated/preview1_directory_seek.rs +++ b/tests/generated/preview1_directory_seek.rs @@ -19,13 +19,8 @@ fn preview1_directory_seek() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_fd_advise.rs b/tests/generated/preview1_fd_advise.rs index fefcb7a93..e24347d7d 100644 --- a/tests/generated/preview1_fd_advise.rs +++ b/tests/generated/preview1_fd_advise.rs @@ -19,13 +19,8 @@ fn preview1_fd_advise() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_fd_filestat_get.rs b/tests/generated/preview1_fd_filestat_get.rs index 480fbe742..077b99653 100644 --- a/tests/generated/preview1_fd_filestat_get.rs +++ b/tests/generated/preview1_fd_filestat_get.rs @@ -19,13 +19,8 @@ fn preview1_fd_filestat_get() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_fd_filestat_set.rs b/tests/generated/preview1_fd_filestat_set.rs index d13d9dd3e..f54617866 100644 --- a/tests/generated/preview1_fd_filestat_set.rs +++ b/tests/generated/preview1_fd_filestat_set.rs @@ -19,13 +19,8 @@ fn preview1_fd_filestat_set() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_fd_flags_set.rs b/tests/generated/preview1_fd_flags_set.rs index eacda2017..d597c58e8 100644 --- a/tests/generated/preview1_fd_flags_set.rs +++ b/tests/generated/preview1_fd_flags_set.rs @@ -19,13 +19,8 @@ fn preview1_fd_flags_set() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_fd_readdir.rs b/tests/generated/preview1_fd_readdir.rs index d5d35faa4..f8962d248 100644 --- a/tests/generated/preview1_fd_readdir.rs +++ b/tests/generated/preview1_fd_readdir.rs @@ -19,13 +19,8 @@ fn preview1_fd_readdir() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_file_allocate.rs b/tests/generated/preview1_file_allocate.rs index d697e97cf..1b718b13d 100644 --- a/tests/generated/preview1_file_allocate.rs +++ b/tests/generated/preview1_file_allocate.rs @@ -19,13 +19,8 @@ fn preview1_file_allocate() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_file_pread_pwrite.rs b/tests/generated/preview1_file_pread_pwrite.rs index d50d1c91b..2cbae76e8 100644 --- a/tests/generated/preview1_file_pread_pwrite.rs +++ b/tests/generated/preview1_file_pread_pwrite.rs @@ -19,13 +19,8 @@ fn preview1_file_pread_pwrite() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_file_seek_tell.rs b/tests/generated/preview1_file_seek_tell.rs index 62fcd2980..ea983da07 100644 --- a/tests/generated/preview1_file_seek_tell.rs +++ b/tests/generated/preview1_file_seek_tell.rs @@ -19,13 +19,8 @@ fn preview1_file_seek_tell() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_file_truncation.rs b/tests/generated/preview1_file_truncation.rs index 26607ef2b..6fde16274 100644 --- a/tests/generated/preview1_file_truncation.rs +++ b/tests/generated/preview1_file_truncation.rs @@ -19,13 +19,8 @@ fn preview1_file_truncation() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_file_unbuffered_write.rs b/tests/generated/preview1_file_unbuffered_write.rs index 28c7fb329..e811d372a 100644 --- a/tests/generated/preview1_file_unbuffered_write.rs +++ b/tests/generated/preview1_file_unbuffered_write.rs @@ -19,13 +19,8 @@ fn preview1_file_unbuffered_write() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_file_write.rs b/tests/generated/preview1_file_write.rs index f1f5b4e9e..ce38d020a 100644 --- a/tests/generated/preview1_file_write.rs +++ b/tests/generated/preview1_file_write.rs @@ -19,13 +19,8 @@ fn preview1_file_write() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_interesting_paths.rs b/tests/generated/preview1_interesting_paths.rs index d1cb49072..f746de3d1 100644 --- a/tests/generated/preview1_interesting_paths.rs +++ b/tests/generated/preview1_interesting_paths.rs @@ -19,13 +19,8 @@ fn preview1_interesting_paths() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_nofollow_errors.rs b/tests/generated/preview1_nofollow_errors.rs index 3c51aac89..27dc084dc 100644 --- a/tests/generated/preview1_nofollow_errors.rs +++ b/tests/generated/preview1_nofollow_errors.rs @@ -19,13 +19,8 @@ fn preview1_nofollow_errors() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_overwrite_preopen.rs b/tests/generated/preview1_overwrite_preopen.rs index b6709663d..d4d0167a3 100644 --- a/tests/generated/preview1_overwrite_preopen.rs +++ b/tests/generated/preview1_overwrite_preopen.rs @@ -19,13 +19,8 @@ fn preview1_overwrite_preopen() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_exists.rs b/tests/generated/preview1_path_exists.rs index e9b5279ae..ad2d47e87 100644 --- a/tests/generated/preview1_path_exists.rs +++ b/tests/generated/preview1_path_exists.rs @@ -19,13 +19,8 @@ fn preview1_path_exists() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_filestat.rs b/tests/generated/preview1_path_filestat.rs index b51fcd811..bd89c18a4 100644 --- a/tests/generated/preview1_path_filestat.rs +++ b/tests/generated/preview1_path_filestat.rs @@ -19,13 +19,8 @@ fn preview1_path_filestat() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_link.rs b/tests/generated/preview1_path_link.rs index 4dcd13930..5c4e537aa 100644 --- a/tests/generated/preview1_path_link.rs +++ b/tests/generated/preview1_path_link.rs @@ -19,13 +19,8 @@ fn preview1_path_link() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_open_create_existing.rs b/tests/generated/preview1_path_open_create_existing.rs index 69f913ab7..a24cd0adc 100644 --- a/tests/generated/preview1_path_open_create_existing.rs +++ b/tests/generated/preview1_path_open_create_existing.rs @@ -19,13 +19,8 @@ fn preview1_path_open_create_existing() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_open_dirfd_not_dir.rs b/tests/generated/preview1_path_open_dirfd_not_dir.rs index 7dbb1248c..7969a4aab 100644 --- a/tests/generated/preview1_path_open_dirfd_not_dir.rs +++ b/tests/generated/preview1_path_open_dirfd_not_dir.rs @@ -19,13 +19,8 @@ fn preview1_path_open_dirfd_not_dir() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_open_missing.rs b/tests/generated/preview1_path_open_missing.rs index 2f8c5c497..d9149fbe6 100644 --- a/tests/generated/preview1_path_open_missing.rs +++ b/tests/generated/preview1_path_open_missing.rs @@ -19,13 +19,8 @@ fn preview1_path_open_missing() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_open_nonblock.rs b/tests/generated/preview1_path_open_nonblock.rs index 3de70347f..5548dbea1 100644 --- a/tests/generated/preview1_path_open_nonblock.rs +++ b/tests/generated/preview1_path_open_nonblock.rs @@ -19,13 +19,8 @@ fn preview1_path_open_nonblock() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_open_preopen.rs b/tests/generated/preview1_path_open_preopen.rs index aa00a53c9..e874319de 100644 --- a/tests/generated/preview1_path_open_preopen.rs +++ b/tests/generated/preview1_path_open_preopen.rs @@ -19,13 +19,8 @@ fn preview1_path_open_preopen() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_open_read_write.rs b/tests/generated/preview1_path_open_read_write.rs index 9dec1be80..8be09cdbb 100644 --- a/tests/generated/preview1_path_open_read_write.rs +++ b/tests/generated/preview1_path_open_read_write.rs @@ -19,13 +19,8 @@ fn preview1_path_open_read_write() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_rename.rs b/tests/generated/preview1_path_rename.rs index f6a4bc541..90c0ed816 100644 --- a/tests/generated/preview1_path_rename.rs +++ b/tests/generated/preview1_path_rename.rs @@ -19,13 +19,8 @@ fn preview1_path_rename() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_rename_dir_trailing_slashes.rs b/tests/generated/preview1_path_rename_dir_trailing_slashes.rs index fdc88269e..e7a694b5d 100644 --- a/tests/generated/preview1_path_rename_dir_trailing_slashes.rs +++ b/tests/generated/preview1_path_rename_dir_trailing_slashes.rs @@ -19,13 +19,8 @@ fn preview1_path_rename_dir_trailing_slashes() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_path_symlink_trailing_slashes.rs b/tests/generated/preview1_path_symlink_trailing_slashes.rs index 2d3bf595a..fbe9967b5 100644 --- a/tests/generated/preview1_path_symlink_trailing_slashes.rs +++ b/tests/generated/preview1_path_symlink_trailing_slashes.rs @@ -19,13 +19,8 @@ fn preview1_path_symlink_trailing_slashes() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_poll_oneoff_files.rs b/tests/generated/preview1_poll_oneoff_files.rs index 0f8e5c751..e48886843 100644 --- a/tests/generated/preview1_poll_oneoff_files.rs +++ b/tests/generated/preview1_poll_oneoff_files.rs @@ -19,13 +19,8 @@ fn preview1_poll_oneoff_files() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_poll_oneoff_stdio.rs b/tests/generated/preview1_poll_oneoff_stdio.rs index 79340779e..e2ea668f4 100644 --- a/tests/generated/preview1_poll_oneoff_stdio.rs +++ b/tests/generated/preview1_poll_oneoff_stdio.rs @@ -19,13 +19,8 @@ fn preview1_poll_oneoff_stdio() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_readlink.rs b/tests/generated/preview1_readlink.rs index 7b6afa634..ca36070dc 100644 --- a/tests/generated/preview1_readlink.rs +++ b/tests/generated/preview1_readlink.rs @@ -19,13 +19,8 @@ fn preview1_readlink() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_regular_file_isatty.rs b/tests/generated/preview1_regular_file_isatty.rs index 3e9b12236..7bc5c4d63 100644 --- a/tests/generated/preview1_regular_file_isatty.rs +++ b/tests/generated/preview1_regular_file_isatty.rs @@ -19,13 +19,8 @@ fn preview1_regular_file_isatty() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_remove_directory.rs b/tests/generated/preview1_remove_directory.rs index acc9033a4..35915b257 100644 --- a/tests/generated/preview1_remove_directory.rs +++ b/tests/generated/preview1_remove_directory.rs @@ -19,13 +19,8 @@ fn preview1_remove_directory() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_remove_nonempty_directory.rs b/tests/generated/preview1_remove_nonempty_directory.rs index e6a6455d7..de701fa92 100644 --- a/tests/generated/preview1_remove_nonempty_directory.rs +++ b/tests/generated/preview1_remove_nonempty_directory.rs @@ -19,13 +19,8 @@ fn preview1_remove_nonempty_directory() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_renumber.rs b/tests/generated/preview1_renumber.rs index c89f1bab5..323d80c75 100644 --- a/tests/generated/preview1_renumber.rs +++ b/tests/generated/preview1_renumber.rs @@ -19,13 +19,8 @@ fn preview1_renumber() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_sched_yield.rs b/tests/generated/preview1_sched_yield.rs index 14a059975..990ae48a6 100644 --- a/tests/generated/preview1_sched_yield.rs +++ b/tests/generated/preview1_sched_yield.rs @@ -19,13 +19,8 @@ fn preview1_sched_yield() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_stdio.rs b/tests/generated/preview1_stdio.rs index 58db40d34..d173495dc 100644 --- a/tests/generated/preview1_stdio.rs +++ b/tests/generated/preview1_stdio.rs @@ -19,13 +19,8 @@ fn preview1_stdio() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_stdio_isatty.rs b/tests/generated/preview1_stdio_isatty.rs index 269ef9763..36cbef678 100644 --- a/tests/generated/preview1_stdio_isatty.rs +++ b/tests/generated/preview1_stdio_isatty.rs @@ -19,13 +19,8 @@ fn preview1_stdio_isatty() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_stdio_not_isatty.rs b/tests/generated/preview1_stdio_not_isatty.rs index 99a2f0852..d5aa82517 100644 --- a/tests/generated/preview1_stdio_not_isatty.rs +++ b/tests/generated/preview1_stdio_not_isatty.rs @@ -19,13 +19,8 @@ fn preview1_stdio_not_isatty() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_symlink_create.rs b/tests/generated/preview1_symlink_create.rs index 0d2299e8a..b8c2011d3 100644 --- a/tests/generated/preview1_symlink_create.rs +++ b/tests/generated/preview1_symlink_create.rs @@ -19,13 +19,8 @@ fn preview1_symlink_create() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_symlink_filestat.rs b/tests/generated/preview1_symlink_filestat.rs index e689debb9..e5e835272 100644 --- a/tests/generated/preview1_symlink_filestat.rs +++ b/tests/generated/preview1_symlink_filestat.rs @@ -19,13 +19,8 @@ fn preview1_symlink_filestat() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_symlink_loop.rs b/tests/generated/preview1_symlink_loop.rs index d19aa6918..27e314c64 100644 --- a/tests/generated/preview1_symlink_loop.rs +++ b/tests/generated/preview1_symlink_loop.rs @@ -19,13 +19,8 @@ fn preview1_symlink_loop() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_unicode_output.rs b/tests/generated/preview1_unicode_output.rs index 06e9ea98b..d38cd1627 100644 --- a/tests/generated/preview1_unicode_output.rs +++ b/tests/generated/preview1_unicode_output.rs @@ -19,13 +19,8 @@ fn preview1_unicode_output() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview1_unlink_file_trailing_slashes.rs b/tests/generated/preview1_unlink_file_trailing_slashes.rs index 4f8204234..990e946ba 100644 --- a/tests/generated/preview1_unlink_file_trailing_slashes.rs +++ b/tests/generated/preview1_unlink_file_trailing_slashes.rs @@ -19,13 +19,8 @@ fn preview1_unlink_file_trailing_slashes() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_adapter_badfd.rs b/tests/generated/preview2_adapter_badfd.rs index 353ecaaa0..67f18a01d 100644 --- a/tests/generated/preview2_adapter_badfd.rs +++ b/tests/generated/preview2_adapter_badfd.rs @@ -19,13 +19,8 @@ fn preview2_adapter_badfd() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_ip_name_lookup.rs b/tests/generated/preview2_ip_name_lookup.rs index 9f50c5404..db413d897 100644 --- a/tests/generated/preview2_ip_name_lookup.rs +++ b/tests/generated/preview2_ip_name_lookup.rs @@ -19,13 +19,8 @@ fn preview2_ip_name_lookup() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_random.rs b/tests/generated/preview2_random.rs index 709be7c0a..d18567085 100644 --- a/tests/generated/preview2_random.rs +++ b/tests/generated/preview2_random.rs @@ -19,13 +19,8 @@ fn preview2_random() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_sleep.rs b/tests/generated/preview2_sleep.rs index 5ac67ff3d..42b1b8d84 100644 --- a/tests/generated/preview2_sleep.rs +++ b/tests/generated/preview2_sleep.rs @@ -19,13 +19,8 @@ fn preview2_sleep() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_stream_pollable_correct.rs b/tests/generated/preview2_stream_pollable_correct.rs deleted file mode 100644 index c1de5560b..000000000 --- a/tests/generated/preview2_stream_pollable_correct.rs +++ /dev/null @@ -1,31 +0,0 @@ -//! 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 std::fs; -use std::process::Command; - -#[test] -fn preview2_stream_pollable_correct() -> anyhow::Result<()> { - let wasi_file = "./tests/rundir/preview2_stream_pollable_correct.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_stream_pollable_correct"); - let mut cmd1 = Command::new("node"); - cmd1.arg("./src/jco.js"); - cmd1.arg("run"); - - cmd1.arg("--jco-dir"); - cmd1.arg("./tests/rundir/preview2_stream_pollable_correct"); - cmd1.arg("--jco-import"); - cmd1.arg("./tests/virtualenvs/base.js"); - cmd1.arg(wasi_file); - cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - - - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - - Ok(()) -} diff --git a/tests/generated/preview2_stream_pollable_traps.rs b/tests/generated/preview2_stream_pollable_traps.rs deleted file mode 100644 index c28e432a6..000000000 --- a/tests/generated/preview2_stream_pollable_traps.rs +++ /dev/null @@ -1,31 +0,0 @@ -//! 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 std::fs; -use std::process::Command; - -#[test] -fn preview2_stream_pollable_traps() -> anyhow::Result<()> { - let wasi_file = "./tests/rundir/preview2_stream_pollable_traps.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/preview2_stream_pollable_traps"); - let mut cmd1 = Command::new("node"); - cmd1.arg("./src/jco.js"); - cmd1.arg("run"); - - cmd1.arg("--jco-dir"); - cmd1.arg("./tests/rundir/preview2_stream_pollable_traps"); - cmd1.arg("--jco-import"); - cmd1.arg("./tests/virtualenvs/base.js"); - cmd1.arg(wasi_file); - cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - - - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(!status.success(), "producer failed"); - - - Ok(()) -} diff --git a/tests/generated/preview2_tcp_bind.rs b/tests/generated/preview2_tcp_bind.rs index 5b948e685..6ed617ce2 100644 --- a/tests/generated/preview2_tcp_bind.rs +++ b/tests/generated/preview2_tcp_bind.rs @@ -19,13 +19,8 @@ fn preview2_tcp_bind() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_tcp_connect.rs b/tests/generated/preview2_tcp_connect.rs index df5d42263..2de084f33 100644 --- a/tests/generated/preview2_tcp_connect.rs +++ b/tests/generated/preview2_tcp_connect.rs @@ -19,13 +19,8 @@ fn preview2_tcp_connect() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_tcp_sample_application.rs b/tests/generated/preview2_tcp_sample_application.rs index 50b8251bd..f5ee799f3 100644 --- a/tests/generated/preview2_tcp_sample_application.rs +++ b/tests/generated/preview2_tcp_sample_application.rs @@ -19,13 +19,8 @@ fn preview2_tcp_sample_application() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_tcp_sockopts.rs b/tests/generated/preview2_tcp_sockopts.rs index 051f0f0db..fec2bb8ab 100644 --- a/tests/generated/preview2_tcp_sockopts.rs +++ b/tests/generated/preview2_tcp_sockopts.rs @@ -19,13 +19,8 @@ fn preview2_tcp_sockopts() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_tcp_states.rs b/tests/generated/preview2_tcp_states.rs index 837d4c1bc..4aee1b145 100644 --- a/tests/generated/preview2_tcp_states.rs +++ b/tests/generated/preview2_tcp_states.rs @@ -19,13 +19,8 @@ fn preview2_tcp_states() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_udp_bind.rs b/tests/generated/preview2_udp_bind.rs index e45446cc9..fb4301d4f 100644 --- a/tests/generated/preview2_udp_bind.rs +++ b/tests/generated/preview2_udp_bind.rs @@ -19,13 +19,8 @@ fn preview2_udp_bind() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_udp_connect.rs b/tests/generated/preview2_udp_connect.rs index c2c4c8349..d6f45b5c9 100644 --- a/tests/generated/preview2_udp_connect.rs +++ b/tests/generated/preview2_udp_connect.rs @@ -19,13 +19,8 @@ fn preview2_udp_connect() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_udp_sample_application.rs b/tests/generated/preview2_udp_sample_application.rs index b335f64bf..71188005f 100644 --- a/tests/generated/preview2_udp_sample_application.rs +++ b/tests/generated/preview2_udp_sample_application.rs @@ -19,13 +19,8 @@ fn preview2_udp_sample_application() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_udp_sockopts.rs b/tests/generated/preview2_udp_sockopts.rs index 05479915f..5c7cd9945 100644 --- a/tests/generated/preview2_udp_sockopts.rs +++ b/tests/generated/preview2_udp_sockopts.rs @@ -19,13 +19,8 @@ fn preview2_udp_sockopts() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/preview2_udp_states.rs b/tests/generated/preview2_udp_states.rs index 37cd96cbc..32e5385f8 100644 --- a/tests/generated/preview2_udp_states.rs +++ b/tests/generated/preview2_udp_states.rs @@ -19,13 +19,8 @@ fn preview2_udp_states() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/proxy_echo.rs b/tests/generated/proxy_echo.rs index 27516ef36..f282fb65d 100644 --- a/tests/generated/proxy_echo.rs +++ b/tests/generated/proxy_echo.rs @@ -19,13 +19,8 @@ fn proxy_echo() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/proxy_handler.rs b/tests/generated/proxy_handler.rs index 28c3c8b94..f3e3e7cd2 100644 --- a/tests/generated/proxy_handler.rs +++ b/tests/generated/proxy_handler.rs @@ -19,13 +19,8 @@ fn proxy_handler() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/generated/proxy_hash.rs b/tests/generated/proxy_hash.rs index e1db38863..0485db8ac 100644 --- a/tests/generated/proxy_hash.rs +++ b/tests/generated/proxy_hash.rs @@ -19,13 +19,8 @@ fn proxy_hash() -> anyhow::Result<()> { cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - - - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!(status.success(), "producer failed"); - - + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); Ok(()) } diff --git a/tests/virtualenvs/http-server.js b/tests/virtualenvs/http-server.js index d682f9803..0f0507b19 100644 --- a/tests/virtualenvs/http-server.js +++ b/tests/virtualenvs/http-server.js @@ -6,7 +6,7 @@ let PORT = 8125; const server = createServer((req, res) => { res.writeHead(200, { 'x-wasmtime-test-method': req.method, - 'x-wasmtime-test-uri': `http://localhost:${PORT}${req.url}`, + 'x-wasmtime-test-uri': req.url, 'content-type': 'text/html' }); req.pipe(res); diff --git a/tests/virtualenvs/piped-consumer.js b/tests/virtualenvs/piped-consumer.js index eb7053fcf..52b748886 100644 --- a/tests/virtualenvs/piped-consumer.js +++ b/tests/virtualenvs/piped-consumer.js @@ -1,36 +1,6 @@ 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, sep } from 'node:path'; -import { tmpdir } from 'node:os'; -import { platform } from 'node:process'; _setEnv({ PIPED_SIDE: "CONSUMER", }); - -// const isWindows = platform === 'win32'; - -// export const testDir = (isWindows ? '' : '') + await mkdtemp(tmpdir() + sep); - -// _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/piped.js b/tests/virtualenvs/piped.js index 0ab8fe226..160df247c 100644 --- a/tests/virtualenvs/piped.js +++ b/tests/virtualenvs/piped.js @@ -1,33 +1,6 @@ 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, sep } from 'node:path'; -import { tmpdir } from 'node:os'; -import { platform } from 'node:process'; _setEnv({ PIPED_SIDE: "PRODUCER", }); - -// const isWindows = platform === 'win32'; - -// export const testDir = (isWindows ? '' : '') + await mkdtemp(tmpdir() + sep); - -// _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`), -// ]); - - - -// process.on('exit', () => { -// rmdirSync(testDir, { recursive: true }); -// }); diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index b423e4c71..baf5e9bf4 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -5,7 +5,15 @@ use xshell::{cmd, Shell}; const TRACE: bool = false; const TEST_FILTER: &[&str] = &[]; -const TEST_IGNORE: &[&str] = &["nn_image_classification", "nn_image_classification_named"]; +// "cli_splice_stdin", +// "cli_stdio_write_flushes", + +const TEST_IGNORE: &[&str] = &[ + "nn_image_classification", + "nn_image_classification_named", + "preview2_stream_pollable_correct", + "preview2_stream_pollable_traps", +]; pub fn run() -> anyhow::Result<()> { let sh = Shell::new()?; @@ -90,7 +98,7 @@ fn generate_test(test_name: &str) -> String { "preview1_stdio_not_isatty" => "notty", "proxy_echo" | "proxy_hash" => "server-api-proxy-streaming", "proxy_handler" => "server-api-proxy", - "piped_simple" => "piped", + "piped_simple" | "piped_multiple" | "piped_polling" => "piped", _ => { if test_name.starts_with("preview1") { "scratch" @@ -114,16 +122,15 @@ fn generate_test(test_name: &str) -> String { let includes = if piped || stdin.is_some() { "use std::fs; -use std::process::{{Command, Stdio}}; -use std::io::prelude::Write;" +use std::io::prelude::Write; +use std::process::{Command, Stdio};" } else { "use std::fs; use std::process::Command;" }; let cmd1 = format!( - "{} -{} + "{}{} let mut cmd1_child = cmd1.spawn().expect(\"failed to spawn test program\");", generate_command_invocation( "cmd1", @@ -136,7 +143,8 @@ use std::process::Command;" }, ), if piped { - " cmd1.stdout(Stdio::piped());" + " + cmd1.stdout(Stdio::piped());" } else { "" } @@ -145,14 +153,11 @@ use std::process::Command;" format!( "{} cmd2.stdin(cmd1_child.stdout.take().unwrap()); - let mut cmd2_child = cmd2.spawn().expect(\"failed to spawn test program\");", + let mut cmd2_child = cmd2.spawn().expect(\"failed to spawn test program\"); + ", generate_command_invocation( "cmd2", - &if piped { - format!("test_name_consumer") - } else { - "".into() - }, + &format!("{test_name}_consumer"), &format!("{virtual_env}-consumer"), None, ) @@ -172,29 +177,26 @@ fn {test_name}() -> anyhow::Result<()> {{ let wasi_file = "./tests/rundir/{test_name}.component.wasm"; let _ = fs::remove_dir_all("./tests/rundir/{test_name}"); {cmd1} - {cmd2} -{} - // let status = cmd1_child.wait().expect("failed to wait on child"); - // assert!({}status.success(), "producer failed"); - -{} + {cmd2}{}let status = cmd{}_child.wait().expect("failed to wait on child"); + assert!({}status.success(), "test execution failed"); Ok(()) }} "##, match stdin { Some(stdin) => format!( - " cmd1_child.stdin.as_ref().unwrap().write(b\"{}\").unwrap();", + "cmd1_child + .stdin + .as_ref() + .unwrap() + .write(b\"{}\") + .unwrap(); + ", stdin ), None => "".into(), }, + if piped { "2" } else { "1" }, if !should_error { "" } else { "!" }, - if piped { - " let status = cmd2_child.wait().expect(\"failed to wait on child\"); - assert!(status.success(), \"consumer failed\");" - } else { - "" - } ) } From fe8c81af2b3ae753a317aacdb7973633039ea945 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 15 Jan 2024 17:02:50 -0800 Subject: [PATCH 15/23] formatting --- tests/generated/cli_splice_stdin.rs | 26 ---------------------- tests/generated/cli_stdio_write_flushes.rs | 26 ---------------------- tests/generated/mod.rs | 2 -- tests/generated/piped_multiple.rs | 1 - tests/generated/piped_polling.rs | 1 - tests/generated/piped_simple.rs | 1 - xtask/src/generate/tests.rs | 13 ++++++----- 7 files changed, 8 insertions(+), 62 deletions(-) delete mode 100644 tests/generated/cli_splice_stdin.rs delete mode 100644 tests/generated/cli_stdio_write_flushes.rs diff --git a/tests/generated/cli_splice_stdin.rs b/tests/generated/cli_splice_stdin.rs deleted file mode 100644 index d1887a610..000000000 --- a/tests/generated/cli_splice_stdin.rs +++ /dev/null @@ -1,26 +0,0 @@ -//! 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 std::fs; -use std::process::Command; - -#[test] -fn cli_splice_stdin() -> anyhow::Result<()> { - let wasi_file = "./tests/rundir/cli_splice_stdin.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_splice_stdin"); - let mut cmd1 = Command::new("node"); - cmd1.arg("./src/jco.js"); - cmd1.arg("run"); - - cmd1.arg("--jco-dir"); - cmd1.arg("./tests/rundir/cli_splice_stdin"); - cmd1.arg("--jco-import"); - cmd1.arg("./tests/virtualenvs/base.js"); - cmd1.arg(wasi_file); - cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - let status = cmd1_child.wait().expect("failed to wait on child"); - assert!(status.success(), "test execution failed"); - Ok(()) -} diff --git a/tests/generated/cli_stdio_write_flushes.rs b/tests/generated/cli_stdio_write_flushes.rs deleted file mode 100644 index 56e37330d..000000000 --- a/tests/generated/cli_stdio_write_flushes.rs +++ /dev/null @@ -1,26 +0,0 @@ -//! 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 std::fs; -use std::process::Command; - -#[test] -fn cli_stdio_write_flushes() -> anyhow::Result<()> { - let wasi_file = "./tests/rundir/cli_stdio_write_flushes.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/cli_stdio_write_flushes"); - let mut cmd1 = Command::new("node"); - cmd1.arg("./src/jco.js"); - cmd1.arg("run"); - - cmd1.arg("--jco-dir"); - cmd1.arg("./tests/rundir/cli_stdio_write_flushes"); - cmd1.arg("--jco-import"); - cmd1.arg("./tests/virtualenvs/base.js"); - cmd1.arg(wasi_file); - cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - let status = cmd1_child.wait().expect("failed to wait on child"); - assert!(status.success(), "test execution failed"); - Ok(()) -} diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index f48c32660..56417223e 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -17,9 +17,7 @@ mod cli_hello_stdout; mod cli_no_ip_name_lookup; mod cli_no_tcp; mod cli_no_udp; -mod cli_splice_stdin; mod cli_stdin; -mod cli_stdio_write_flushes; mod http_outbound_request_content_length; mod http_outbound_request_get; mod http_outbound_request_invalid_dnsname; diff --git a/tests/generated/piped_multiple.rs b/tests/generated/piped_multiple.rs index 4287a37b2..965391cbb 100644 --- a/tests/generated/piped_multiple.rs +++ b/tests/generated/piped_multiple.rs @@ -2,7 +2,6 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::io::prelude::Write; use std::process::{Command, Stdio}; #[test] diff --git a/tests/generated/piped_polling.rs b/tests/generated/piped_polling.rs index 4e260b83c..179c32fbe 100644 --- a/tests/generated/piped_polling.rs +++ b/tests/generated/piped_polling.rs @@ -2,7 +2,6 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::io::prelude::Write; use std::process::{Command, Stdio}; #[test] diff --git a/tests/generated/piped_simple.rs b/tests/generated/piped_simple.rs index 3a8081f38..fed6c1770 100644 --- a/tests/generated/piped_simple.rs +++ b/tests/generated/piped_simple.rs @@ -2,7 +2,6 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::io::prelude::Write; use std::process::{Command, Stdio}; #[test] diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index baf5e9bf4..f2cdef6ab 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -13,6 +13,8 @@ const TEST_IGNORE: &[&str] = &[ "nn_image_classification_named", "preview2_stream_pollable_correct", "preview2_stream_pollable_traps", + "cli_splice_stdin", + "cli_stdio_write_flushes", ]; pub fn run() -> anyhow::Result<()> { @@ -120,13 +122,13 @@ fn generate_test(test_name: &str) -> String { _ => false, }; - let includes = if piped || stdin.is_some() { - "use std::fs; -use std::io::prelude::Write; + let includes = if piped { + "use std::process::{Command, Stdio};" + } else if stdin.is_some() { + "use std::io::prelude::Write; use std::process::{Command, Stdio};" } else { - "use std::fs; -use std::process::Command;" + "use std::process::Command;" }; let cmd1 = format!( @@ -170,6 +172,7 @@ use std::process::Command;" 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 std::fs; {includes} #[test] From 3aedce9d1fff07f70694f61663267b56ef32d4d8 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 15 Jan 2024 17:15:39 -0800 Subject: [PATCH 16/23] remaining cases --- tests/generated/api_reactor.rs | 4 +-- tests/generated/api_read_only.rs | 4 +-- tests/generated/api_time.rs | 4 +-- tests/generated/cli_args.rs | 4 +-- tests/generated/cli_default_clocks.rs | 4 +-- tests/generated/cli_directory_list.rs | 4 +-- tests/generated/cli_env.rs | 4 +-- tests/generated/cli_exit_default.rs | 4 +-- tests/generated/cli_exit_failure.rs | 4 +-- tests/generated/cli_exit_panic.rs | 4 +-- tests/generated/cli_exit_success.rs | 4 +-- tests/generated/cli_export_cabi_realloc.rs | 4 +-- tests/generated/cli_file_append.rs | 4 +-- tests/generated/cli_file_dir_sync.rs | 4 +-- tests/generated/cli_file_read.rs | 4 +-- tests/generated/cli_hello_stdout.rs | 4 +-- tests/generated/cli_no_ip_name_lookup.rs | 4 +-- tests/generated/cli_no_tcp.rs | 4 +-- tests/generated/cli_no_udp.rs | 4 +-- tests/generated/cli_splice_stdin.rs | 26 +++++++++++++++++++ tests/generated/cli_stdin.rs | 2 +- tests/generated/cli_stdio_write_flushes.rs | 26 +++++++++++++++++++ .../http_outbound_request_content_length.rs | 4 +-- tests/generated/http_outbound_request_get.rs | 4 +-- .../http_outbound_request_invalid_dnsname.rs | 4 +-- .../http_outbound_request_invalid_header.rs | 4 +-- .../http_outbound_request_invalid_port.rs | 4 +-- .../http_outbound_request_invalid_version.rs | 4 +-- .../http_outbound_request_large_post.rs | 4 +-- tests/generated/http_outbound_request_post.rs | 4 +-- tests/generated/http_outbound_request_put.rs | 4 +-- .../http_outbound_request_response_build.rs | 4 +-- .../http_outbound_request_unknown_method.rs | 4 +-- ...ttp_outbound_request_unsupported_scheme.rs | 4 +-- tests/generated/mod.rs | 2 ++ tests/generated/piped_multiple.rs | 4 +-- tests/generated/piped_polling.rs | 4 +-- tests/generated/piped_simple.rs | 4 +-- tests/generated/preview1_big_random_buf.rs | 4 +-- tests/generated/preview1_clock_time_get.rs | 4 +-- tests/generated/preview1_close_preopen.rs | 4 +-- tests/generated/preview1_dangling_fd.rs | 4 +-- tests/generated/preview1_dangling_symlink.rs | 4 +-- .../generated/preview1_dir_fd_op_failures.rs | 4 +-- tests/generated/preview1_directory_seek.rs | 4 +-- tests/generated/preview1_fd_advise.rs | 4 +-- tests/generated/preview1_fd_filestat_get.rs | 4 +-- tests/generated/preview1_fd_filestat_set.rs | 4 +-- tests/generated/preview1_fd_flags_set.rs | 4 +-- tests/generated/preview1_fd_readdir.rs | 4 +-- tests/generated/preview1_file_allocate.rs | 4 +-- tests/generated/preview1_file_pread_pwrite.rs | 4 +-- tests/generated/preview1_file_seek_tell.rs | 4 +-- tests/generated/preview1_file_truncation.rs | 4 +-- .../preview1_file_unbuffered_write.rs | 4 +-- tests/generated/preview1_file_write.rs | 4 +-- tests/generated/preview1_interesting_paths.rs | 4 +-- tests/generated/preview1_nofollow_errors.rs | 4 +-- tests/generated/preview1_overwrite_preopen.rs | 4 +-- tests/generated/preview1_path_exists.rs | 4 +-- tests/generated/preview1_path_filestat.rs | 4 +-- tests/generated/preview1_path_link.rs | 4 +-- .../preview1_path_open_create_existing.rs | 4 +-- .../preview1_path_open_dirfd_not_dir.rs | 4 +-- tests/generated/preview1_path_open_missing.rs | 4 +-- .../generated/preview1_path_open_nonblock.rs | 4 +-- tests/generated/preview1_path_open_preopen.rs | 4 +-- .../preview1_path_open_read_write.rs | 4 +-- tests/generated/preview1_path_rename.rs | 4 +-- ...eview1_path_rename_dir_trailing_slashes.rs | 4 +-- .../preview1_path_symlink_trailing_slashes.rs | 4 +-- tests/generated/preview1_poll_oneoff_files.rs | 4 +-- tests/generated/preview1_poll_oneoff_stdio.rs | 4 +-- tests/generated/preview1_readlink.rs | 4 +-- .../generated/preview1_regular_file_isatty.rs | 4 +-- tests/generated/preview1_remove_directory.rs | 4 +-- .../preview1_remove_nonempty_directory.rs | 4 +-- tests/generated/preview1_renumber.rs | 4 +-- tests/generated/preview1_sched_yield.rs | 4 +-- tests/generated/preview1_stdio.rs | 4 +-- tests/generated/preview1_stdio_isatty.rs | 4 +-- tests/generated/preview1_stdio_not_isatty.rs | 4 +-- tests/generated/preview1_symlink_create.rs | 4 +-- tests/generated/preview1_symlink_filestat.rs | 4 +-- tests/generated/preview1_symlink_loop.rs | 4 +-- tests/generated/preview1_unicode_output.rs | 4 +-- .../preview1_unlink_file_trailing_slashes.rs | 4 +-- tests/generated/preview2_adapter_badfd.rs | 4 +-- tests/generated/preview2_ip_name_lookup.rs | 4 +-- tests/generated/preview2_random.rs | 4 +-- tests/generated/preview2_sleep.rs | 4 +-- tests/generated/preview2_tcp_bind.rs | 4 +-- tests/generated/preview2_tcp_connect.rs | 4 +-- .../preview2_tcp_sample_application.rs | 4 +-- tests/generated/preview2_tcp_sockopts.rs | 4 +-- tests/generated/preview2_tcp_states.rs | 4 +-- tests/generated/preview2_udp_bind.rs | 4 +-- tests/generated/preview2_udp_connect.rs | 4 +-- .../preview2_udp_sample_application.rs | 4 +-- tests/generated/preview2_udp_sockopts.rs | 4 +-- tests/generated/preview2_udp_states.rs | 4 +-- tests/generated/proxy_echo.rs | 4 +-- tests/generated/proxy_handler.rs | 4 +-- tests/generated/proxy_hash.rs | 4 +-- xtask/src/generate/tests.rs | 21 +++++---------- 105 files changed, 262 insertions(+), 215 deletions(-) create mode 100644 tests/generated/cli_splice_stdin.rs create mode 100644 tests/generated/cli_stdio_write_flushes.rs diff --git a/tests/generated/api_reactor.rs b/tests/generated/api_reactor.rs index bc8a0b017..19a742be4 100644 --- a/tests/generated/api_reactor.rs +++ b/tests/generated/api_reactor.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn api_reactor() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn api_reactor() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/api_read_only.rs b/tests/generated/api_read_only.rs index 04c1ee9bf..b9ac42cbb 100644 --- a/tests/generated/api_read_only.rs +++ b/tests/generated/api_read_only.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn api_read_only() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn api_read_only() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/readonly.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/api_time.rs b/tests/generated/api_time.rs index 3fc8ad328..d50572c87 100644 --- a/tests/generated/api_time.rs +++ b/tests/generated/api_time.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn api_time() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn api_time() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/fakeclocks.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_args.rs b/tests/generated/cli_args.rs index 1f8014747..f891c317f 100644 --- a/tests/generated/cli_args.rs +++ b/tests/generated/cli_args.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_args() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_args() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_default_clocks.rs b/tests/generated/cli_default_clocks.rs index 521d4fbdc..498a1e5a3 100644 --- a/tests/generated/cli_default_clocks.rs +++ b/tests/generated/cli_default_clocks.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_default_clocks() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_default_clocks() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_directory_list.rs b/tests/generated/cli_directory_list.rs index 3ce0668ec..a1f469cd6 100644 --- a/tests/generated/cli_directory_list.rs +++ b/tests/generated/cli_directory_list.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_directory_list() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_directory_list() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_env.rs b/tests/generated/cli_env.rs index 6459a522d..8337e5a8b 100644 --- a/tests/generated/cli_env.rs +++ b/tests/generated/cli_env.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_env() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_env() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_exit_default.rs b/tests/generated/cli_exit_default.rs index 305583e88..c0bc7ea68 100644 --- a/tests/generated/cli_exit_default.rs +++ b/tests/generated/cli_exit_default.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_exit_default() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_exit_default() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_exit_failure.rs b/tests/generated/cli_exit_failure.rs index c78f4684a..3e5188959 100644 --- a/tests/generated/cli_exit_failure.rs +++ b/tests/generated/cli_exit_failure.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_exit_failure() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_exit_failure() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(!status.success(), "test execution failed"); diff --git a/tests/generated/cli_exit_panic.rs b/tests/generated/cli_exit_panic.rs index ccc5d5723..3ba2c6026 100644 --- a/tests/generated/cli_exit_panic.rs +++ b/tests/generated/cli_exit_panic.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_exit_panic() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_exit_panic() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(!status.success(), "test execution failed"); diff --git a/tests/generated/cli_exit_success.rs b/tests/generated/cli_exit_success.rs index 73fda209f..699c59994 100644 --- a/tests/generated/cli_exit_success.rs +++ b/tests/generated/cli_exit_success.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_exit_success() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_exit_success() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_export_cabi_realloc.rs b/tests/generated/cli_export_cabi_realloc.rs index fa333661a..97977ff78 100644 --- a/tests/generated/cli_export_cabi_realloc.rs +++ b/tests/generated/cli_export_cabi_realloc.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_export_cabi_realloc() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_export_cabi_realloc() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_file_append.rs b/tests/generated/cli_file_append.rs index 1161c9215..fd0576b31 100644 --- a/tests/generated/cli_file_append.rs +++ b/tests/generated/cli_file_append.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_file_append() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_file_append() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/bar-jabberwock.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_file_dir_sync.rs b/tests/generated/cli_file_dir_sync.rs index 5692a0177..b10370bce 100644 --- a/tests/generated/cli_file_dir_sync.rs +++ b/tests/generated/cli_file_dir_sync.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_file_dir_sync() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_file_dir_sync() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_file_read.rs b/tests/generated/cli_file_read.rs index 0eb400ae0..7fb572fcb 100644 --- a/tests/generated/cli_file_read.rs +++ b/tests/generated/cli_file_read.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_file_read() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_file_read() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_hello_stdout.rs b/tests/generated/cli_hello_stdout.rs index b34ee8ec3..84a6f52fe 100644 --- a/tests/generated/cli_hello_stdout.rs +++ b/tests/generated/cli_hello_stdout.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_hello_stdout() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_hello_stdout() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_no_ip_name_lookup.rs b/tests/generated/cli_no_ip_name_lookup.rs index 874310a84..496df36a0 100644 --- a/tests/generated/cli_no_ip_name_lookup.rs +++ b/tests/generated/cli_no_ip_name_lookup.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_no_ip_name_lookup() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_no_ip_name_lookup() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/deny-dns.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_no_tcp.rs b/tests/generated/cli_no_tcp.rs index b11427f64..905f114c6 100644 --- a/tests/generated/cli_no_tcp.rs +++ b/tests/generated/cli_no_tcp.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_no_tcp() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_no_tcp() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/deny-tcp.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_no_udp.rs b/tests/generated/cli_no_udp.rs index 6af38d3a7..6ce6b5e8a 100644 --- a/tests/generated/cli_no_udp.rs +++ b/tests/generated/cli_no_udp.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn cli_no_udp() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn cli_no_udp() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/deny-udp.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/cli_splice_stdin.rs b/tests/generated/cli_splice_stdin.rs new file mode 100644 index 000000000..68d82ed26 --- /dev/null +++ b/tests/generated/cli_splice_stdin.rs @@ -0,0 +1,26 @@ +//! 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 std::fs; +use std::process::{Command, Stdio}; + +#[test] +fn cli_splice_stdin() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_splice_stdin.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_splice_stdin"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_splice_stdin"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + cmd1.stdin(Stdio::null()); + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); + Ok(()) +} diff --git a/tests/generated/cli_stdin.rs b/tests/generated/cli_stdin.rs index 7c18b7e07..0ed0c3a29 100644 --- a/tests/generated/cli_stdin.rs +++ b/tests/generated/cli_stdin.rs @@ -3,7 +3,7 @@ use std::fs; use std::io::prelude::Write; -use std::process::{Command, Stdio}; + use std::process::{Command, Stdio}; #[test] fn cli_stdin() -> anyhow::Result<()> { diff --git a/tests/generated/cli_stdio_write_flushes.rs b/tests/generated/cli_stdio_write_flushes.rs new file mode 100644 index 000000000..7e6828196 --- /dev/null +++ b/tests/generated/cli_stdio_write_flushes.rs @@ -0,0 +1,26 @@ +//! 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 std::fs; +use std::process::{Command, Stdio}; + +#[test] +fn cli_stdio_write_flushes() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/cli_stdio_write_flushes.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/cli_stdio_write_flushes"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/cli_stdio_write_flushes"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + cmd1.stdin(Stdio::null()); + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); + Ok(()) +} diff --git a/tests/generated/http_outbound_request_content_length.rs b/tests/generated/http_outbound_request_content_length.rs index b72c46f8d..c38922985 100644 --- a/tests/generated/http_outbound_request_content_length.rs +++ b/tests/generated/http_outbound_request_content_length.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_content_length() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_content_length() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_get.rs b/tests/generated/http_outbound_request_get.rs index 65f9b3070..ab2bfe483 100644 --- a/tests/generated/http_outbound_request_get.rs +++ b/tests/generated/http_outbound_request_get.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_get() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_get() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_invalid_dnsname.rs b/tests/generated/http_outbound_request_invalid_dnsname.rs index 8618a8575..44f40d76a 100644 --- a/tests/generated/http_outbound_request_invalid_dnsname.rs +++ b/tests/generated/http_outbound_request_invalid_dnsname.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_invalid_dnsname() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_invalid_dnsname() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_invalid_header.rs b/tests/generated/http_outbound_request_invalid_header.rs index 3f8b728aa..38f967d16 100644 --- a/tests/generated/http_outbound_request_invalid_header.rs +++ b/tests/generated/http_outbound_request_invalid_header.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_invalid_header() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_invalid_header() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_invalid_port.rs b/tests/generated/http_outbound_request_invalid_port.rs index 359ff75dc..5da60cf6d 100644 --- a/tests/generated/http_outbound_request_invalid_port.rs +++ b/tests/generated/http_outbound_request_invalid_port.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_invalid_port() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_invalid_port() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_invalid_version.rs b/tests/generated/http_outbound_request_invalid_version.rs index b3261940e..ef1a03753 100644 --- a/tests/generated/http_outbound_request_invalid_version.rs +++ b/tests/generated/http_outbound_request_invalid_version.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_invalid_version() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_invalid_version() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_large_post.rs b/tests/generated/http_outbound_request_large_post.rs index e4dfd7059..518790adb 100644 --- a/tests/generated/http_outbound_request_large_post.rs +++ b/tests/generated/http_outbound_request_large_post.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_large_post() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_large_post() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_post.rs b/tests/generated/http_outbound_request_post.rs index 39a674639..1dea46bb1 100644 --- a/tests/generated/http_outbound_request_post.rs +++ b/tests/generated/http_outbound_request_post.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_post() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_post() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_put.rs b/tests/generated/http_outbound_request_put.rs index 645c3f49a..0e2425071 100644 --- a/tests/generated/http_outbound_request_put.rs +++ b/tests/generated/http_outbound_request_put.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_put() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_put() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_response_build.rs b/tests/generated/http_outbound_request_response_build.rs index 96f8c5778..9eaa69ace 100644 --- a/tests/generated/http_outbound_request_response_build.rs +++ b/tests/generated/http_outbound_request_response_build.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_response_build() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_response_build() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_unknown_method.rs b/tests/generated/http_outbound_request_unknown_method.rs index b6304521f..e3bfc89be 100644 --- a/tests/generated/http_outbound_request_unknown_method.rs +++ b/tests/generated/http_outbound_request_unknown_method.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_unknown_method() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_unknown_method() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/http_outbound_request_unsupported_scheme.rs b/tests/generated/http_outbound_request_unsupported_scheme.rs index dd69030ac..c3996c655 100644 --- a/tests/generated/http_outbound_request_unsupported_scheme.rs +++ b/tests/generated/http_outbound_request_unsupported_scheme.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn http_outbound_request_unsupported_scheme() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn http_outbound_request_unsupported_scheme() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/http.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index 56417223e..f48c32660 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -17,7 +17,9 @@ mod cli_hello_stdout; mod cli_no_ip_name_lookup; mod cli_no_tcp; mod cli_no_udp; +mod cli_splice_stdin; mod cli_stdin; +mod cli_stdio_write_flushes; mod http_outbound_request_content_length; mod http_outbound_request_get; mod http_outbound_request_invalid_dnsname; diff --git a/tests/generated/piped_multiple.rs b/tests/generated/piped_multiple.rs index 965391cbb..34e20c1d4 100644 --- a/tests/generated/piped_multiple.rs +++ b/tests/generated/piped_multiple.rs @@ -18,7 +18,7 @@ fn piped_multiple() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/piped.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); cmd1.stdout(Stdio::piped()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let mut cmd2 = Command::new("node"); @@ -31,7 +31,7 @@ fn piped_multiple() -> anyhow::Result<()> { cmd2.arg("./tests/virtualenvs/piped-consumer.js"); cmd2.arg(wasi_file); cmd2.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd2.stdin(Stdio::null()); cmd2.stdin(cmd1_child.stdout.take().unwrap()); let mut cmd2_child = cmd2.spawn().expect("failed to spawn test program"); let status = cmd2_child.wait().expect("failed to wait on child"); diff --git a/tests/generated/piped_polling.rs b/tests/generated/piped_polling.rs index 179c32fbe..d51ecc556 100644 --- a/tests/generated/piped_polling.rs +++ b/tests/generated/piped_polling.rs @@ -18,7 +18,7 @@ fn piped_polling() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/piped.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); cmd1.stdout(Stdio::piped()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let mut cmd2 = Command::new("node"); @@ -31,7 +31,7 @@ fn piped_polling() -> anyhow::Result<()> { cmd2.arg("./tests/virtualenvs/piped-consumer.js"); cmd2.arg(wasi_file); cmd2.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd2.stdin(Stdio::null()); cmd2.stdin(cmd1_child.stdout.take().unwrap()); let mut cmd2_child = cmd2.spawn().expect("failed to spawn test program"); let status = cmd2_child.wait().expect("failed to wait on child"); diff --git a/tests/generated/piped_simple.rs b/tests/generated/piped_simple.rs index fed6c1770..8a2a425f9 100644 --- a/tests/generated/piped_simple.rs +++ b/tests/generated/piped_simple.rs @@ -18,7 +18,7 @@ fn piped_simple() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/piped.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); cmd1.stdout(Stdio::piped()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let mut cmd2 = Command::new("node"); @@ -31,7 +31,7 @@ fn piped_simple() -> anyhow::Result<()> { cmd2.arg("./tests/virtualenvs/piped-consumer.js"); cmd2.arg(wasi_file); cmd2.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd2.stdin(Stdio::null()); cmd2.stdin(cmd1_child.stdout.take().unwrap()); let mut cmd2_child = cmd2.spawn().expect("failed to spawn test program"); let status = cmd2_child.wait().expect("failed to wait on child"); diff --git a/tests/generated/preview1_big_random_buf.rs b/tests/generated/preview1_big_random_buf.rs index 4820034e8..109947e6a 100644 --- a/tests/generated/preview1_big_random_buf.rs +++ b/tests/generated/preview1_big_random_buf.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_big_random_buf() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_big_random_buf() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_clock_time_get.rs b/tests/generated/preview1_clock_time_get.rs index b6c8fe169..b0de03f98 100644 --- a/tests/generated/preview1_clock_time_get.rs +++ b/tests/generated/preview1_clock_time_get.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_clock_time_get() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_clock_time_get() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_close_preopen.rs b/tests/generated/preview1_close_preopen.rs index 66b3881f2..01667a805 100644 --- a/tests/generated/preview1_close_preopen.rs +++ b/tests/generated/preview1_close_preopen.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_close_preopen() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_close_preopen() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_dangling_fd.rs b/tests/generated/preview1_dangling_fd.rs index 1a4786874..b93fafd06 100644 --- a/tests/generated/preview1_dangling_fd.rs +++ b/tests/generated/preview1_dangling_fd.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_dangling_fd() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_dangling_fd() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_dangling_symlink.rs b/tests/generated/preview1_dangling_symlink.rs index c2788db2c..66c5ae6c5 100644 --- a/tests/generated/preview1_dangling_symlink.rs +++ b/tests/generated/preview1_dangling_symlink.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_dangling_symlink() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_dangling_symlink() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_dir_fd_op_failures.rs b/tests/generated/preview1_dir_fd_op_failures.rs index df48f44b0..5afcc4aac 100644 --- a/tests/generated/preview1_dir_fd_op_failures.rs +++ b/tests/generated/preview1_dir_fd_op_failures.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_dir_fd_op_failures() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_dir_fd_op_failures() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_directory_seek.rs b/tests/generated/preview1_directory_seek.rs index 85008b417..cbb6c8682 100644 --- a/tests/generated/preview1_directory_seek.rs +++ b/tests/generated/preview1_directory_seek.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_directory_seek() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_directory_seek() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_fd_advise.rs b/tests/generated/preview1_fd_advise.rs index e24347d7d..434873b06 100644 --- a/tests/generated/preview1_fd_advise.rs +++ b/tests/generated/preview1_fd_advise.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_fd_advise() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_fd_advise() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_fd_filestat_get.rs b/tests/generated/preview1_fd_filestat_get.rs index 077b99653..9013b0871 100644 --- a/tests/generated/preview1_fd_filestat_get.rs +++ b/tests/generated/preview1_fd_filestat_get.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_fd_filestat_get() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_fd_filestat_get() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_fd_filestat_set.rs b/tests/generated/preview1_fd_filestat_set.rs index f54617866..8291e6f15 100644 --- a/tests/generated/preview1_fd_filestat_set.rs +++ b/tests/generated/preview1_fd_filestat_set.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_fd_filestat_set() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_fd_filestat_set() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_fd_flags_set.rs b/tests/generated/preview1_fd_flags_set.rs index d597c58e8..607586e19 100644 --- a/tests/generated/preview1_fd_flags_set.rs +++ b/tests/generated/preview1_fd_flags_set.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_fd_flags_set() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_fd_flags_set() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_fd_readdir.rs b/tests/generated/preview1_fd_readdir.rs index f8962d248..247661af8 100644 --- a/tests/generated/preview1_fd_readdir.rs +++ b/tests/generated/preview1_fd_readdir.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_fd_readdir() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_fd_readdir() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_file_allocate.rs b/tests/generated/preview1_file_allocate.rs index 1b718b13d..06f5fa59c 100644 --- a/tests/generated/preview1_file_allocate.rs +++ b/tests/generated/preview1_file_allocate.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_file_allocate() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_file_allocate() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_file_pread_pwrite.rs b/tests/generated/preview1_file_pread_pwrite.rs index 2cbae76e8..8d3e069f2 100644 --- a/tests/generated/preview1_file_pread_pwrite.rs +++ b/tests/generated/preview1_file_pread_pwrite.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_file_pread_pwrite() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_file_pread_pwrite() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_file_seek_tell.rs b/tests/generated/preview1_file_seek_tell.rs index ea983da07..200f75fba 100644 --- a/tests/generated/preview1_file_seek_tell.rs +++ b/tests/generated/preview1_file_seek_tell.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_file_seek_tell() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_file_seek_tell() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_file_truncation.rs b/tests/generated/preview1_file_truncation.rs index 6fde16274..83dec26f0 100644 --- a/tests/generated/preview1_file_truncation.rs +++ b/tests/generated/preview1_file_truncation.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_file_truncation() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_file_truncation() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_file_unbuffered_write.rs b/tests/generated/preview1_file_unbuffered_write.rs index e811d372a..e152b80aa 100644 --- a/tests/generated/preview1_file_unbuffered_write.rs +++ b/tests/generated/preview1_file_unbuffered_write.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_file_unbuffered_write() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_file_unbuffered_write() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_file_write.rs b/tests/generated/preview1_file_write.rs index ce38d020a..3a2ceb952 100644 --- a/tests/generated/preview1_file_write.rs +++ b/tests/generated/preview1_file_write.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_file_write() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_file_write() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_interesting_paths.rs b/tests/generated/preview1_interesting_paths.rs index f746de3d1..66153ce94 100644 --- a/tests/generated/preview1_interesting_paths.rs +++ b/tests/generated/preview1_interesting_paths.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_interesting_paths() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_interesting_paths() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_nofollow_errors.rs b/tests/generated/preview1_nofollow_errors.rs index 27dc084dc..d7a8df03e 100644 --- a/tests/generated/preview1_nofollow_errors.rs +++ b/tests/generated/preview1_nofollow_errors.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_nofollow_errors() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_nofollow_errors() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_overwrite_preopen.rs b/tests/generated/preview1_overwrite_preopen.rs index d4d0167a3..b3ecd2758 100644 --- a/tests/generated/preview1_overwrite_preopen.rs +++ b/tests/generated/preview1_overwrite_preopen.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_overwrite_preopen() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_overwrite_preopen() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_exists.rs b/tests/generated/preview1_path_exists.rs index ad2d47e87..677264949 100644 --- a/tests/generated/preview1_path_exists.rs +++ b/tests/generated/preview1_path_exists.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_exists() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_exists() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_filestat.rs b/tests/generated/preview1_path_filestat.rs index bd89c18a4..f8936169a 100644 --- a/tests/generated/preview1_path_filestat.rs +++ b/tests/generated/preview1_path_filestat.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_filestat() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_filestat() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_link.rs b/tests/generated/preview1_path_link.rs index 5c4e537aa..d5b2f3abb 100644 --- a/tests/generated/preview1_path_link.rs +++ b/tests/generated/preview1_path_link.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_link() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_link() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_open_create_existing.rs b/tests/generated/preview1_path_open_create_existing.rs index a24cd0adc..e5f82046a 100644 --- a/tests/generated/preview1_path_open_create_existing.rs +++ b/tests/generated/preview1_path_open_create_existing.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_open_create_existing() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_open_create_existing() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_open_dirfd_not_dir.rs b/tests/generated/preview1_path_open_dirfd_not_dir.rs index 7969a4aab..360b5dc96 100644 --- a/tests/generated/preview1_path_open_dirfd_not_dir.rs +++ b/tests/generated/preview1_path_open_dirfd_not_dir.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_open_dirfd_not_dir() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_open_dirfd_not_dir() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_open_missing.rs b/tests/generated/preview1_path_open_missing.rs index d9149fbe6..9ee115889 100644 --- a/tests/generated/preview1_path_open_missing.rs +++ b/tests/generated/preview1_path_open_missing.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_open_missing() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_open_missing() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_open_nonblock.rs b/tests/generated/preview1_path_open_nonblock.rs index 5548dbea1..72a138a0e 100644 --- a/tests/generated/preview1_path_open_nonblock.rs +++ b/tests/generated/preview1_path_open_nonblock.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_open_nonblock() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_open_nonblock() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_open_preopen.rs b/tests/generated/preview1_path_open_preopen.rs index e874319de..c7d2a0513 100644 --- a/tests/generated/preview1_path_open_preopen.rs +++ b/tests/generated/preview1_path_open_preopen.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_open_preopen() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_open_preopen() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_open_read_write.rs b/tests/generated/preview1_path_open_read_write.rs index 8be09cdbb..f539f9177 100644 --- a/tests/generated/preview1_path_open_read_write.rs +++ b/tests/generated/preview1_path_open_read_write.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_open_read_write() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_open_read_write() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_rename.rs b/tests/generated/preview1_path_rename.rs index 90c0ed816..5f54dc0ba 100644 --- a/tests/generated/preview1_path_rename.rs +++ b/tests/generated/preview1_path_rename.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_rename() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_rename() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_rename_dir_trailing_slashes.rs b/tests/generated/preview1_path_rename_dir_trailing_slashes.rs index e7a694b5d..4a5d0b252 100644 --- a/tests/generated/preview1_path_rename_dir_trailing_slashes.rs +++ b/tests/generated/preview1_path_rename_dir_trailing_slashes.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_rename_dir_trailing_slashes() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_rename_dir_trailing_slashes() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_path_symlink_trailing_slashes.rs b/tests/generated/preview1_path_symlink_trailing_slashes.rs index fbe9967b5..457842557 100644 --- a/tests/generated/preview1_path_symlink_trailing_slashes.rs +++ b/tests/generated/preview1_path_symlink_trailing_slashes.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_path_symlink_trailing_slashes() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_path_symlink_trailing_slashes() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_poll_oneoff_files.rs b/tests/generated/preview1_poll_oneoff_files.rs index e48886843..578dc92e1 100644 --- a/tests/generated/preview1_poll_oneoff_files.rs +++ b/tests/generated/preview1_poll_oneoff_files.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_poll_oneoff_files() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_poll_oneoff_files() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_poll_oneoff_stdio.rs b/tests/generated/preview1_poll_oneoff_stdio.rs index e2ea668f4..b787943a7 100644 --- a/tests/generated/preview1_poll_oneoff_stdio.rs +++ b/tests/generated/preview1_poll_oneoff_stdio.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_poll_oneoff_stdio() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_poll_oneoff_stdio() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_readlink.rs b/tests/generated/preview1_readlink.rs index ca36070dc..adfb1243c 100644 --- a/tests/generated/preview1_readlink.rs +++ b/tests/generated/preview1_readlink.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_readlink() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_readlink() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_regular_file_isatty.rs b/tests/generated/preview1_regular_file_isatty.rs index 7bc5c4d63..833067ef7 100644 --- a/tests/generated/preview1_regular_file_isatty.rs +++ b/tests/generated/preview1_regular_file_isatty.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_regular_file_isatty() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_regular_file_isatty() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_remove_directory.rs b/tests/generated/preview1_remove_directory.rs index 35915b257..dc1f2c873 100644 --- a/tests/generated/preview1_remove_directory.rs +++ b/tests/generated/preview1_remove_directory.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_remove_directory() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_remove_directory() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_remove_nonempty_directory.rs b/tests/generated/preview1_remove_nonempty_directory.rs index de701fa92..b25f056ae 100644 --- a/tests/generated/preview1_remove_nonempty_directory.rs +++ b/tests/generated/preview1_remove_nonempty_directory.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_remove_nonempty_directory() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_remove_nonempty_directory() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_renumber.rs b/tests/generated/preview1_renumber.rs index 323d80c75..e7a72d5c3 100644 --- a/tests/generated/preview1_renumber.rs +++ b/tests/generated/preview1_renumber.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_renumber() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_renumber() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_sched_yield.rs b/tests/generated/preview1_sched_yield.rs index 990ae48a6..a1e7b5b6b 100644 --- a/tests/generated/preview1_sched_yield.rs +++ b/tests/generated/preview1_sched_yield.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_sched_yield() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_sched_yield() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_stdio.rs b/tests/generated/preview1_stdio.rs index d173495dc..3a5bfac2c 100644 --- a/tests/generated/preview1_stdio.rs +++ b/tests/generated/preview1_stdio.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_stdio() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_stdio() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_stdio_isatty.rs b/tests/generated/preview1_stdio_isatty.rs index 36cbef678..c9052942a 100644 --- a/tests/generated/preview1_stdio_isatty.rs +++ b/tests/generated/preview1_stdio_isatty.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_stdio_isatty() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_stdio_isatty() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_stdio_not_isatty.rs b/tests/generated/preview1_stdio_not_isatty.rs index d5aa82517..506a003ed 100644 --- a/tests/generated/preview1_stdio_not_isatty.rs +++ b/tests/generated/preview1_stdio_not_isatty.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_stdio_not_isatty() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_stdio_not_isatty() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/notty.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_symlink_create.rs b/tests/generated/preview1_symlink_create.rs index b8c2011d3..1c0f8f5f9 100644 --- a/tests/generated/preview1_symlink_create.rs +++ b/tests/generated/preview1_symlink_create.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_symlink_create() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_symlink_create() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_symlink_filestat.rs b/tests/generated/preview1_symlink_filestat.rs index e5e835272..4b58cf7be 100644 --- a/tests/generated/preview1_symlink_filestat.rs +++ b/tests/generated/preview1_symlink_filestat.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_symlink_filestat() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_symlink_filestat() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_symlink_loop.rs b/tests/generated/preview1_symlink_loop.rs index 27e314c64..a0bb4da85 100644 --- a/tests/generated/preview1_symlink_loop.rs +++ b/tests/generated/preview1_symlink_loop.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_symlink_loop() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_symlink_loop() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_unicode_output.rs b/tests/generated/preview1_unicode_output.rs index d38cd1627..29dd1d4ba 100644 --- a/tests/generated/preview1_unicode_output.rs +++ b/tests/generated/preview1_unicode_output.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_unicode_output() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_unicode_output() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview1_unlink_file_trailing_slashes.rs b/tests/generated/preview1_unlink_file_trailing_slashes.rs index 990e946ba..406dd6312 100644 --- a/tests/generated/preview1_unlink_file_trailing_slashes.rs +++ b/tests/generated/preview1_unlink_file_trailing_slashes.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview1_unlink_file_trailing_slashes() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview1_unlink_file_trailing_slashes() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/scratch.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_adapter_badfd.rs b/tests/generated/preview2_adapter_badfd.rs index 67f18a01d..0a59f5972 100644 --- a/tests/generated/preview2_adapter_badfd.rs +++ b/tests/generated/preview2_adapter_badfd.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_adapter_badfd() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_adapter_badfd() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_ip_name_lookup.rs b/tests/generated/preview2_ip_name_lookup.rs index db413d897..13b9d5e49 100644 --- a/tests/generated/preview2_ip_name_lookup.rs +++ b/tests/generated/preview2_ip_name_lookup.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_ip_name_lookup() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_ip_name_lookup() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_random.rs b/tests/generated/preview2_random.rs index d18567085..19ba90264 100644 --- a/tests/generated/preview2_random.rs +++ b/tests/generated/preview2_random.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_random() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_random() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_sleep.rs b/tests/generated/preview2_sleep.rs index 42b1b8d84..001318ec7 100644 --- a/tests/generated/preview2_sleep.rs +++ b/tests/generated/preview2_sleep.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_sleep() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_sleep() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_tcp_bind.rs b/tests/generated/preview2_tcp_bind.rs index 6ed617ce2..eb8b5a86d 100644 --- a/tests/generated/preview2_tcp_bind.rs +++ b/tests/generated/preview2_tcp_bind.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_tcp_bind() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_tcp_bind() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_tcp_connect.rs b/tests/generated/preview2_tcp_connect.rs index 2de084f33..3c7077b70 100644 --- a/tests/generated/preview2_tcp_connect.rs +++ b/tests/generated/preview2_tcp_connect.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_tcp_connect() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_tcp_connect() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_tcp_sample_application.rs b/tests/generated/preview2_tcp_sample_application.rs index f5ee799f3..f9a88a6b6 100644 --- a/tests/generated/preview2_tcp_sample_application.rs +++ b/tests/generated/preview2_tcp_sample_application.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_tcp_sample_application() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_tcp_sample_application() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_tcp_sockopts.rs b/tests/generated/preview2_tcp_sockopts.rs index fec2bb8ab..7d70a2df1 100644 --- a/tests/generated/preview2_tcp_sockopts.rs +++ b/tests/generated/preview2_tcp_sockopts.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_tcp_sockopts() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_tcp_sockopts() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_tcp_states.rs b/tests/generated/preview2_tcp_states.rs index 4aee1b145..87d889dfe 100644 --- a/tests/generated/preview2_tcp_states.rs +++ b/tests/generated/preview2_tcp_states.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_tcp_states() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_tcp_states() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_udp_bind.rs b/tests/generated/preview2_udp_bind.rs index fb4301d4f..cc217f713 100644 --- a/tests/generated/preview2_udp_bind.rs +++ b/tests/generated/preview2_udp_bind.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_udp_bind() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_udp_bind() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_udp_connect.rs b/tests/generated/preview2_udp_connect.rs index d6f45b5c9..979c90ba8 100644 --- a/tests/generated/preview2_udp_connect.rs +++ b/tests/generated/preview2_udp_connect.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_udp_connect() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_udp_connect() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_udp_sample_application.rs b/tests/generated/preview2_udp_sample_application.rs index 71188005f..e8cf6de45 100644 --- a/tests/generated/preview2_udp_sample_application.rs +++ b/tests/generated/preview2_udp_sample_application.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_udp_sample_application() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_udp_sample_application() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_udp_sockopts.rs b/tests/generated/preview2_udp_sockopts.rs index 5c7cd9945..252fd3f60 100644 --- a/tests/generated/preview2_udp_sockopts.rs +++ b/tests/generated/preview2_udp_sockopts.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_udp_sockopts() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_udp_sockopts() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/preview2_udp_states.rs b/tests/generated/preview2_udp_states.rs index 32e5385f8..e82d212d3 100644 --- a/tests/generated/preview2_udp_states.rs +++ b/tests/generated/preview2_udp_states.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn preview2_udp_states() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn preview2_udp_states() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/base.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/proxy_echo.rs b/tests/generated/proxy_echo.rs index f282fb65d..a6dbcf925 100644 --- a/tests/generated/proxy_echo.rs +++ b/tests/generated/proxy_echo.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn proxy_echo() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn proxy_echo() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/server-api-proxy-streaming.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/proxy_handler.rs b/tests/generated/proxy_handler.rs index f3e3e7cd2..0c29486a6 100644 --- a/tests/generated/proxy_handler.rs +++ b/tests/generated/proxy_handler.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn proxy_handler() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn proxy_handler() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/server-api-proxy.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/tests/generated/proxy_hash.rs b/tests/generated/proxy_hash.rs index 0485db8ac..b89259e8b 100644 --- a/tests/generated/proxy_hash.rs +++ b/tests/generated/proxy_hash.rs @@ -2,7 +2,7 @@ //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -use std::process::Command; +use std::process::{Command, Stdio}; #[test] fn proxy_hash() -> anyhow::Result<()> { @@ -18,7 +18,7 @@ fn proxy_hash() -> anyhow::Result<()> { cmd1.arg("./tests/virtualenvs/server-api-proxy-streaming.js"); cmd1.arg(wasi_file); cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - + cmd1.stdin(Stdio::null()); let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); let status = cmd1_child.wait().expect("failed to wait on child"); assert!(status.success(), "test execution failed"); diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index f2cdef6ab..cd805b9d4 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -5,16 +5,11 @@ use xshell::{cmd, Shell}; const TRACE: bool = false; const TEST_FILTER: &[&str] = &[]; -// "cli_splice_stdin", -// "cli_stdio_write_flushes", - const TEST_IGNORE: &[&str] = &[ "nn_image_classification", "nn_image_classification_named", "preview2_stream_pollable_correct", "preview2_stream_pollable_traps", - "cli_splice_stdin", - "cli_stdio_write_flushes", ]; pub fn run() -> anyhow::Result<()> { @@ -122,13 +117,11 @@ fn generate_test(test_name: &str) -> String { _ => false, }; - let includes = if piped { - "use std::process::{Command, Stdio};" - } else if stdin.is_some() { + let maybe_include_write = if stdin.is_some() { "use std::io::prelude::Write; -use std::process::{Command, Stdio};" + " } else { - "use std::process::Command;" + "" }; let cmd1 = format!( @@ -173,7 +166,7 @@ use std::process::{Command, Stdio};" //! To regenerate this file re-run `cargo xtask generate tests` from the project root use std::fs; -{includes} +{maybe_include_write}use std::process::{{Command, Stdio}}; #[test] fn {test_name}() -> anyhow::Result<()> {{ @@ -220,15 +213,15 @@ fn generate_command_invocation( {cmd_name}.arg("./tests/virtualenvs/{virtual_env}.js"); {cmd_name}.arg(wasi_file); {cmd_name}.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); -{}"##, + {cmd_name}.stdin({});"##, if TRACE { format!("{cmd_name}.arg(\"--jco-trace\");") } else { "".into() }, match stdin { - Some(stdin) => format!(" {cmd_name}.stdin({stdin});"), - None => "".into(), + Some(stdin) => stdin, + None => "Stdio::null()".into(), }, ); } From 546572c04e8284b4a547189ede1eb02d632a9d59 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 15 Jan 2024 17:16:23 -0800 Subject: [PATCH 17/23] final formatting --- tests/generated/cli_stdin.rs | 2 +- xtask/src/generate/tests.rs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/generated/cli_stdin.rs b/tests/generated/cli_stdin.rs index 0ed0c3a29..7c18b7e07 100644 --- a/tests/generated/cli_stdin.rs +++ b/tests/generated/cli_stdin.rs @@ -3,7 +3,7 @@ use std::fs; use std::io::prelude::Write; - use std::process::{Command, Stdio}; +use std::process::{Command, Stdio}; #[test] fn cli_stdin() -> anyhow::Result<()> { diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index cd805b9d4..8ee2869dc 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -118,8 +118,7 @@ fn generate_test(test_name: &str) -> String { }; let maybe_include_write = if stdin.is_some() { - "use std::io::prelude::Write; - " + "use std::io::prelude::Write;\n" } else { "" }; From 9cac33d84ec3a01fcae500ad79d130d7806390d1 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 15 Jan 2024 17:24:17 -0800 Subject: [PATCH 18/23] reenable pollable tests --- tests/generated/mod.rs | 2 ++ .../preview2_stream_pollable_correct.rs | 26 +++++++++++++++++++ .../preview2_stream_pollable_traps.rs | 26 +++++++++++++++++++ xtask/src/generate/tests.rs | 7 +---- 4 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 tests/generated/preview2_stream_pollable_correct.rs create mode 100644 tests/generated/preview2_stream_pollable_traps.rs diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index f48c32660..9fa279796 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -88,6 +88,8 @@ mod preview2_adapter_badfd; mod preview2_ip_name_lookup; mod preview2_random; mod preview2_sleep; +mod preview2_stream_pollable_correct; +mod preview2_stream_pollable_traps; mod preview2_tcp_bind; mod preview2_tcp_connect; mod preview2_tcp_sample_application; diff --git a/tests/generated/preview2_stream_pollable_correct.rs b/tests/generated/preview2_stream_pollable_correct.rs new file mode 100644 index 000000000..4cd54373d --- /dev/null +++ b/tests/generated/preview2_stream_pollable_correct.rs @@ -0,0 +1,26 @@ +//! 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 std::fs; +use std::process::{Command, Stdio}; + +#[test] +fn preview2_stream_pollable_correct() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_stream_pollable_correct.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_stream_pollable_correct"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_stream_pollable_correct"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + cmd1.stdin(Stdio::null()); + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(status.success(), "test execution failed"); + Ok(()) +} diff --git a/tests/generated/preview2_stream_pollable_traps.rs b/tests/generated/preview2_stream_pollable_traps.rs new file mode 100644 index 000000000..adc06dd63 --- /dev/null +++ b/tests/generated/preview2_stream_pollable_traps.rs @@ -0,0 +1,26 @@ +//! 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 std::fs; +use std::process::{Command, Stdio}; + +#[test] +fn preview2_stream_pollable_traps() -> anyhow::Result<()> { + let wasi_file = "./tests/rundir/preview2_stream_pollable_traps.component.wasm"; + let _ = fs::remove_dir_all("./tests/rundir/preview2_stream_pollable_traps"); + let mut cmd1 = Command::new("node"); + cmd1.arg("./src/jco.js"); + cmd1.arg("run"); + + cmd1.arg("--jco-dir"); + cmd1.arg("./tests/rundir/preview2_stream_pollable_traps"); + cmd1.arg("--jco-import"); + cmd1.arg("./tests/virtualenvs/base.js"); + cmd1.arg(wasi_file); + cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); + cmd1.stdin(Stdio::null()); + let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); + let status = cmd1_child.wait().expect("failed to wait on child"); + assert!(!status.success(), "test execution failed"); + Ok(()) +} diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index 8ee2869dc..7bcccafd1 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -5,12 +5,7 @@ use xshell::{cmd, Shell}; const TRACE: bool = false; const TEST_FILTER: &[&str] = &[]; -const TEST_IGNORE: &[&str] = &[ - "nn_image_classification", - "nn_image_classification_named", - "preview2_stream_pollable_correct", - "preview2_stream_pollable_traps", -]; +const TEST_IGNORE: &[&str] = &["nn_image_classification", "nn_image_classification_named"]; pub fn run() -> anyhow::Result<()> { let sh = Shell::new()?; From e8930b5e09b1b30f8c018d17b7b3d9b1660ae367 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 16 Jan 2024 11:45:37 -0800 Subject: [PATCH 19/23] further streams and polls refactoring, double drop investigation --- packages/preview2-shim/lib/io/worker-io.js | 2 +- .../preview2-shim/lib/io/worker-thread.js | 87 ++++++++++++++----- tests/generated/mod.rs | 3 - tests/generated/proxy_echo.rs | 26 ------ tests/generated/proxy_handler.rs | 26 ------ tests/generated/proxy_hash.rs | 26 ------ xtask/src/generate/tests.rs | 8 +- 7 files changed, 72 insertions(+), 106 deletions(-) delete mode 100644 tests/generated/proxy_echo.rs delete mode 100644 tests/generated/proxy_handler.rs delete mode 100644 tests/generated/proxy_hash.rs diff --git a/packages/preview2-shim/lib/io/worker-io.js b/packages/preview2-shim/lib/io/worker-io.js index 0af5e4f6f..bf7418d66 100644 --- a/packages/preview2-shim/lib/io/worker-io.js +++ b/packages/preview2-shim/lib/io/worker-io.js @@ -40,7 +40,7 @@ export function registerIncomingHttpHandler(id, handler) { } const instanceId = Math.round(Math.random() * 1000).toString(); -const DEBUG_DEFAULT = false; +const DEBUG_DEFAULT = true; const DEBUG = env.JCO_DEBUG === "0" ? false : env.JCO_DEBUG === "1" ? true : DEBUG_DEFAULT; diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index b46b144e2..3e4b40b11 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -140,12 +140,12 @@ const POLL_STATE_FINISHED = 3; * ready: POLL_STATE_UNREADY | POLL_STATE_READY | POLL_STATE_FINISHED, * listener: () => void | null, * polls: number[], + * parentStream: null | NodeJS.ReadableStream * }} PollState * * @typedef {{ * stream: NodeJS.ReadableStream | NodeJS.WritableStream, * flushPromise: Promise | null, - * finished: bool, * pollState * }} Stream * @@ -166,19 +166,20 @@ export const streams = new Map(); export const futures = new Map(); export function createReadableStreamPollState(nodeStream) { - const pollState = { state: POLL_STATE_WAIT, listener: null, polls: [] }; - function pollReady() { - pollStateReady(pollState, false); - } + const pollState = { + state: POLL_STATE_READY, + listener: null, + polls: [], + parentStream: nodeStream, + }; function pollDone() { pollStateReady(pollState, true); - nodeStream.off("readable", pollReady); + process._rawDebug('FINISHED', pollState.state === POLL_STATE_FINISHED); nodeStream.off("end", pollDone); nodeStream.off("close", pollDone); nodeStream.off("error", pollDone); } - nodeStream.on("readable", pollReady); - nodeStream.on("end", () => pollDone); + nodeStream.on("end", pollDone); nodeStream.on("close", pollDone); nodeStream.on("error", pollDone); return pollState; @@ -194,7 +195,6 @@ export function createReadableStream( const stream = { stream: nodeStream, flushPromise: null, - finished: false, pollState, }; streams.set(++streamCnt, stream); @@ -202,11 +202,15 @@ export function createReadableStream( } export function createWritableStream(nodeStream) { - const pollState = { state: POLL_STATE_READY, listener: null, polls: [] }; + const pollState = { + state: POLL_STATE_READY, + listener: null, + polls: [], + parentStream: null, + }; const stream = { stream: nodeStream, flushPromise: null, - finished: false, pollState, }; streams.set(++streamCnt, stream); @@ -514,7 +518,12 @@ function handle(call, id, payload) { payload = hrtime.bigint() + payload; // fallthrough case CLOCKS_INSTANT_SUBSCRIBE: { - const pollState = { state: POLL_STATE_WAIT, listener: null, polls: [] }; + const pollState = { + state: POLL_STATE_WAIT, + listener: null, + polls: [], + parentStream: null, + }; subscribeInstant(pollState, payload); return createPoll(pollState); } @@ -551,16 +560,14 @@ function handle(call, id, payload) { const res = stream.stream.read( Math.min(stream.stream.readableLength, Number(payload)) ); - if (res === null) { - if (stream.pollState.state === POLL_STATE_FINISHED) - return { tag: "closed" }; - if (stream.stream.readableLength === 0) pollStateWait(stream.pollState); - return new Uint8Array(); - } - return res; + if (res) return res; + if (stream.pollState.state === POLL_STATE_FINISHED) + return { tag: "closed" }; + return new Uint8Array(); } case INPUT_STREAM_BLOCKING_READ: { const { pollState } = streams.get(id); + pollStateCheck(pollState); if (pollState.state !== POLL_STATE_WAIT) return handle(INPUT_STREAM_READ | (call & CALL_TYPE_MASK), id, payload); return new Promise((resolve) => void (pollState.listener = resolve)).then( @@ -583,7 +590,8 @@ function handle(call, id, payload) { return createPoll(streams.get(id).pollState); case INPUT_STREAM_DISPOSE: { const stream = streams.get(id); - // TODO: pick this up with Alex for http_outbound_request_get + // TODO: fix double drop where IncomingBody drops IncomingStream, + // instead implementing proper core WASI GC if (!stream) return; verifyPollsDroppedForDrop(stream.pollState, "input stream"); streams.delete(id); @@ -741,8 +749,9 @@ function handle(call, id, payload) { case POLL_POLL_LIST: { const doneList = []; const pollList = payload.map((pollId) => polls.get(pollId)); - for (const [idx, poll] of pollList.entries()) { - if (poll.state !== POLL_STATE_WAIT) doneList.push(idx); + for (const [idx, pollState] of pollList.entries()) { + pollStateCheck(pollState); + if (pollState.state !== POLL_STATE_WAIT) doneList.push(idx); } if (doneList.length > 0) return new Uint32Array(doneList); let readyPromiseResolve; @@ -831,6 +840,8 @@ export function verifyPollsDroppedForDrop(pollState, polledResourceDebugName) { * @param {PollState} pollState */ export function pollStateWait(pollState) { + if (pollState.state === POLL_STATE_FINISHED) + throw new Error('wasi-io trap: cannot transition from finished to wait'); pollState.state = POLL_STATE_WAIT; if (pollState.listener) throw new Error( @@ -857,9 +868,39 @@ export function pollStateReady(pollState, finished) { } } +/** + * @param {PollState} pollState + */ +function pollStateCheck(pollState) { + if (pollState.state === POLL_STATE_READY && pollState.parentStream) { + // stream ONLY applies to readable streams here + const stream = pollState.parentStream; + process._rawDebug('read for check'); + const res = stream.read(0); + if (res !== null) { + throw new Error("wasi-io trap: got data for a null read"); + } + if ( + stream.readableLength === 0 && + pollState.state !== POLL_STATE_FINISHED + ) { + process._rawDebug('waiting on readable'); + pollStateWait(pollState); + stream.once("readable", () => { + pollStateReady(pollState); + }); + } + } +} + export function createFuture(promise) { const futureId = ++futureCnt; - const pollState = { state: POLL_STATE_WAIT, listener: null, polls: [] }; + const pollState = { + state: POLL_STATE_WAIT, + listener: null, + polls: [], + parent: null, + }; const future = { error: false, value: null, pollState }; futures.set(futureId, future); promise.then( diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs index 9fa279796..fe6273625 100644 --- a/tests/generated/mod.rs +++ b/tests/generated/mod.rs @@ -100,6 +100,3 @@ mod preview2_udp_connect; mod preview2_udp_sample_application; mod preview2_udp_sockopts; mod preview2_udp_states; -mod proxy_echo; -mod proxy_handler; -mod proxy_hash; diff --git a/tests/generated/proxy_echo.rs b/tests/generated/proxy_echo.rs deleted file mode 100644 index a6dbcf925..000000000 --- a/tests/generated/proxy_echo.rs +++ /dev/null @@ -1,26 +0,0 @@ -//! 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 std::fs; -use std::process::{Command, Stdio}; - -#[test] -fn proxy_echo() -> anyhow::Result<()> { - let wasi_file = "./tests/rundir/proxy_echo.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/proxy_echo"); - let mut cmd1 = Command::new("node"); - cmd1.arg("./src/jco.js"); - cmd1.arg("run"); - - cmd1.arg("--jco-dir"); - cmd1.arg("./tests/rundir/proxy_echo"); - cmd1.arg("--jco-import"); - cmd1.arg("./tests/virtualenvs/server-api-proxy-streaming.js"); - cmd1.arg(wasi_file); - cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - cmd1.stdin(Stdio::null()); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - let status = cmd1_child.wait().expect("failed to wait on child"); - assert!(status.success(), "test execution failed"); - Ok(()) -} diff --git a/tests/generated/proxy_handler.rs b/tests/generated/proxy_handler.rs deleted file mode 100644 index 0c29486a6..000000000 --- a/tests/generated/proxy_handler.rs +++ /dev/null @@ -1,26 +0,0 @@ -//! 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 std::fs; -use std::process::{Command, Stdio}; - -#[test] -fn proxy_handler() -> anyhow::Result<()> { - let wasi_file = "./tests/rundir/proxy_handler.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/proxy_handler"); - let mut cmd1 = Command::new("node"); - cmd1.arg("./src/jco.js"); - cmd1.arg("run"); - - cmd1.arg("--jco-dir"); - cmd1.arg("./tests/rundir/proxy_handler"); - cmd1.arg("--jco-import"); - cmd1.arg("./tests/virtualenvs/server-api-proxy.js"); - cmd1.arg(wasi_file); - cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - cmd1.stdin(Stdio::null()); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - let status = cmd1_child.wait().expect("failed to wait on child"); - assert!(status.success(), "test execution failed"); - Ok(()) -} diff --git a/tests/generated/proxy_hash.rs b/tests/generated/proxy_hash.rs deleted file mode 100644 index b89259e8b..000000000 --- a/tests/generated/proxy_hash.rs +++ /dev/null @@ -1,26 +0,0 @@ -//! 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 std::fs; -use std::process::{Command, Stdio}; - -#[test] -fn proxy_hash() -> anyhow::Result<()> { - let wasi_file = "./tests/rundir/proxy_hash.component.wasm"; - let _ = fs::remove_dir_all("./tests/rundir/proxy_hash"); - let mut cmd1 = Command::new("node"); - cmd1.arg("./src/jco.js"); - cmd1.arg("run"); - - cmd1.arg("--jco-dir"); - cmd1.arg("./tests/rundir/proxy_hash"); - cmd1.arg("--jco-import"); - cmd1.arg("./tests/virtualenvs/server-api-proxy-streaming.js"); - cmd1.arg(wasi_file); - cmd1.args(&["hello", "this", "", "is an argument", "with 🚩 emoji"]); - cmd1.stdin(Stdio::null()); - let mut cmd1_child = cmd1.spawn().expect("failed to spawn test program"); - let status = cmd1_child.wait().expect("failed to wait on child"); - assert!(status.success(), "test execution failed"); - Ok(()) -} diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index 7bcccafd1..6d14db7b5 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -5,7 +5,13 @@ use xshell::{cmd, Shell}; const TRACE: bool = false; const TEST_FILTER: &[&str] = &[]; -const TEST_IGNORE: &[&str] = &["nn_image_classification", "nn_image_classification_named"]; +const TEST_IGNORE: &[&str] = &[ + "nn_image_classification", + "nn_image_classification_named", + "proxy_handler", + "proxy_hash", + "proxy_echo" +]; pub fn run() -> anyhow::Result<()> { let sh = Shell::new()?; From 31a9460ab1def659343d092b8fa57aaebeb3a7b4 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 16 Jan 2024 12:41:41 -0800 Subject: [PATCH 20/23] cargo fmt --- xtask/src/generate/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xtask/src/generate/tests.rs b/xtask/src/generate/tests.rs index 6d14db7b5..506afc670 100644 --- a/xtask/src/generate/tests.rs +++ b/xtask/src/generate/tests.rs @@ -10,7 +10,7 @@ const TEST_IGNORE: &[&str] = &[ "nn_image_classification_named", "proxy_handler", "proxy_hash", - "proxy_echo" + "proxy_echo", ]; pub fn run() -> anyhow::Result<()> { From 9c0072e621079f9331cfe137ce632323b30efb4c Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 16 Jan 2024 12:50:58 -0800 Subject: [PATCH 21/23] disable debugging --- packages/preview2-shim/lib/io/worker-io.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/preview2-shim/lib/io/worker-io.js b/packages/preview2-shim/lib/io/worker-io.js index bf7418d66..0af5e4f6f 100644 --- a/packages/preview2-shim/lib/io/worker-io.js +++ b/packages/preview2-shim/lib/io/worker-io.js @@ -40,7 +40,7 @@ export function registerIncomingHttpHandler(id, handler) { } const instanceId = Math.round(Math.random() * 1000).toString(); -const DEBUG_DEFAULT = true; +const DEBUG_DEFAULT = false; const DEBUG = env.JCO_DEBUG === "0" ? false : env.JCO_DEBUG === "1" ? true : DEBUG_DEFAULT; From 4a038b29ac376c9ae3feb66af14915a561089239 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 16 Jan 2024 12:55:28 -0800 Subject: [PATCH 22/23] logging removal --- packages/preview2-shim/lib/io/worker-thread.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index 3e4b40b11..3e166206a 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -174,7 +174,7 @@ export function createReadableStreamPollState(nodeStream) { }; function pollDone() { pollStateReady(pollState, true); - process._rawDebug('FINISHED', pollState.state === POLL_STATE_FINISHED); + // process._rawDebug('FINISHED', pollState.state === POLL_STATE_FINISHED); nodeStream.off("end", pollDone); nodeStream.off("close", pollDone); nodeStream.off("error", pollDone); @@ -875,7 +875,7 @@ function pollStateCheck(pollState) { if (pollState.state === POLL_STATE_READY && pollState.parentStream) { // stream ONLY applies to readable streams here const stream = pollState.parentStream; - process._rawDebug('read for check'); + // process._rawDebug('read for check'); const res = stream.read(0); if (res !== null) { throw new Error("wasi-io trap: got data for a null read"); @@ -884,7 +884,7 @@ function pollStateCheck(pollState) { stream.readableLength === 0 && pollState.state !== POLL_STATE_FINISHED ) { - process._rawDebug('waiting on readable'); + // process._rawDebug('waiting on readable'); pollStateWait(pollState); stream.once("readable", () => { pollStateReady(pollState); From dae54f7050df11b224df72f20b7b28fc3e52ae29 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 16 Jan 2024 13:03:20 -0800 Subject: [PATCH 23/23] entirely remove logs --- packages/preview2-shim/lib/io/worker-thread.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/preview2-shim/lib/io/worker-thread.js b/packages/preview2-shim/lib/io/worker-thread.js index 3e166206a..08e065460 100644 --- a/packages/preview2-shim/lib/io/worker-thread.js +++ b/packages/preview2-shim/lib/io/worker-thread.js @@ -174,7 +174,6 @@ export function createReadableStreamPollState(nodeStream) { }; function pollDone() { pollStateReady(pollState, true); - // process._rawDebug('FINISHED', pollState.state === POLL_STATE_FINISHED); nodeStream.off("end", pollDone); nodeStream.off("close", pollDone); nodeStream.off("error", pollDone); @@ -875,7 +874,6 @@ function pollStateCheck(pollState) { if (pollState.state === POLL_STATE_READY && pollState.parentStream) { // stream ONLY applies to readable streams here const stream = pollState.parentStream; - // process._rawDebug('read for check'); const res = stream.read(0); if (res !== null) { throw new Error("wasi-io trap: got data for a null read"); @@ -884,7 +882,6 @@ function pollStateCheck(pollState) { stream.readableLength === 0 && pollState.state !== POLL_STATE_FINISHED ) { - // process._rawDebug('waiting on readable'); pollStateWait(pollState); stream.once("readable", () => { pollStateReady(pollState);