Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WASI improvements #550

Merged
merged 16 commits into from
Oct 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public class Specification {
private final List<String> args;
private final List<String> dirs;
private final Map<String, String> env;
private final int exitCode;
private final String stderr;
private final String stdout;
private final Optional<String> stderr;
private final Optional<String> stdout;

@JsonCreator
public Specification(
Expand All @@ -29,8 +30,8 @@ public Specification(
this.dirs = requireNonNullElse(dirs, emptyList());
this.env = requireNonNullElse(env, emptyMap());
this.exitCode = exitCode;
this.stderr = requireNonNullElse(stderr, "");
this.stdout = requireNonNullElse(stdout, "");
this.stderr = Optional.ofNullable(stderr);
this.stdout = Optional.ofNullable(stdout);
}

public List<String> args() {
Expand All @@ -49,11 +50,11 @@ public int exitCode() {
return exitCode;
}

public String stderr() {
public Optional<String> stderr() {
return stderr;
}

public String stdout() {
public Optional<String> stdout() {
return stdout;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import static com.dylibso.chicory.maven.StringUtils.capitalize;
import static com.dylibso.chicory.maven.StringUtils.escapedCamelCase;
import static com.github.javaparser.utils.StringEscapeUtils.escapeJava;
import static java.util.Objects.requireNonNullElse;
import static java.lang.String.format;
import static java.util.stream.Collectors.toList;
import static org.apache.maven.plugins.annotations.LifecyclePhase.GENERATE_TEST_SOURCES;

Expand All @@ -23,6 +23,7 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.maven.plugin.AbstractMojo;
Expand Down Expand Up @@ -159,6 +160,7 @@ public void execute() throws MojoExecutionException {
cu.addImport("java.io.File");
cu.addImport("java.util.List");
cu.addImport("java.util.Map");
cu.addImport("java.util.Optional");
cu.addImport(JUNIT_TEST);

// generate test methods
Expand Down Expand Up @@ -204,19 +206,13 @@ public void execute() throws MojoExecutionException {
AssignExpr.Operator.ASSIGN))
.addStatement(
new AssignExpr(
new NameExpr("var stderr"),
new NameExpr(
javaString(
requireNonNullElse(
specification.stderr(), ""))),
new NameExpr("Optional<String> stderr"),
new NameExpr(optionalOf(specification.stderr())),
AssignExpr.Operator.ASSIGN))
.addStatement(
new AssignExpr(
new NameExpr("var stdout"),
new NameExpr(
javaString(
requireNonNullElse(
specification.stdout(), ""))),
new NameExpr("Optional<String> stdout"),
new NameExpr(optionalOf(specification.stdout())),
AssignExpr.Operator.ASSIGN))
.addStatement(
new NameExpr(
Expand Down Expand Up @@ -262,6 +258,11 @@ private static String mapOf(Map<String, String> map) {
+ ")";
}

private static String optionalOf(Optional<String> optional) {
return optional.map(s -> format("Optional.of(%s)", javaString(s)))
.orElse("Optional.empty()");
}

private static String javaString(String value) {
return "\"" + escapeJava(value) + "\"";
}
Expand Down
108 changes: 52 additions & 56 deletions wasi/README.md

Large diffs are not rendered by default.

35 changes: 11 additions & 24 deletions wasi/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,43 +73,30 @@
<include>tests/rust/testsuite/*.wasm</include>
</includes>
<excludes>
<!-- pread is not implemented -->
<exclude>tests/c/testsuite/pread-with-access.wasm</exclude>
<!-- pwrite is not implemented -->
<exclude>tests/c/testsuite/pwrite-with-access.wasm</exclude>
<exclude>tests/c/testsuite/pwrite-with-append.wasm</exclude>
<!-- sockets are not implemented -->
<exclude>tests/c/testsuite/sock_shutdown-invalid_fd.wasm</exclude>
<exclude>tests/c/testsuite/sock_shutdown-not_sock.wasm</exclude>
<!-- Java does not support READ+APPEND -->
<exclude>tests/rust/testsuite/fd_flags_set.wasm</exclude>
<!-- pread is not implemented -->
<!-- fd_pread is not implemented -->
<exclude>tests/c/testsuite/pread-with-access.wasm</exclude>
<exclude>tests/rust/testsuite/dir_fd_op_failures.wasm</exclude>
<exclude>tests/rust/testsuite/file_pread_pwrite.wasm</exclude>
<!-- fd_pwrite is not implemented -->
<exclude>tests/c/testsuite/pwrite-with-access.wasm</exclude>
<exclude>tests/c/testsuite/pwrite-with-append.wasm</exclude>
<!-- poll_oneoff is not implemented -->
<exclude>tests/rust/testsuite/poll_oneoff_stdio.wasm</exclude>
<!-- TODO: triage and fix or exclude -->
<!-- path_symlink is not implemented -->
<exclude>tests/rust/testsuite/dangling_symlink.wasm</exclude>
<exclude>tests/rust/testsuite/dir_fd_op_failures.wasm</exclude>
<exclude>tests/rust/testsuite/fd_advise.wasm</exclude>
<exclude>tests/rust/testsuite/fd_fdstat_set_rights.wasm</exclude>
<exclude>tests/rust/testsuite/fd_filestat_set.wasm</exclude>
<exclude>tests/rust/testsuite/file_allocate.wasm</exclude>
<exclude>tests/rust/testsuite/fstflags_validate.wasm</exclude>
<exclude>tests/rust/testsuite/interesting_paths.wasm</exclude>
<exclude>tests/rust/testsuite/nofollow_errors.wasm</exclude>
<exclude>tests/rust/testsuite/overwrite_preopen.wasm</exclude>
<exclude>tests/rust/testsuite/path_exists.wasm</exclude>
<exclude>tests/rust/testsuite/path_filestat.wasm</exclude>
<exclude>tests/rust/testsuite/path_link.wasm</exclude>
<exclude>tests/rust/testsuite/path_open_preopen.wasm</exclude>
<exclude>tests/rust/testsuite/path_open_read_write.wasm</exclude>
<exclude>tests/rust/testsuite/path_symlink_trailing_slashes.wasm</exclude>
<exclude>tests/rust/testsuite/readlink.wasm</exclude>
<exclude>tests/rust/testsuite/renumber.wasm</exclude>
<exclude>tests/rust/testsuite/stdio.wasm</exclude>
<exclude>tests/rust/testsuite/symlink_create.wasm</exclude>
<exclude>tests/rust/testsuite/symlink_filestat.wasm</exclude>
<exclude>tests/rust/testsuite/symlink_loop.wasm</exclude>
<!-- path_link is not implemented -->
<exclude>tests/rust/testsuite/path_link.wasm</exclude>
<!-- fd_fdstat_set_rights is not implemented -->
<exclude>tests/rust/testsuite/fd_fdstat_set_rights.wasm</exclude>
<exclude>tests/rust/testsuite/truncation_rights.wasm</exclude>
</excludes>
</testSuiteFiles>
Expand Down
12 changes: 11 additions & 1 deletion wasi/src/main/java/com/dylibso/chicory/wasi/Descriptors.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ public void free(int fd) {
freeFds.add(fd);
}

public void set(int fd, Descriptor descriptor) {
descriptors.set(fd, descriptor);
}

public void closeAll() {
RuntimeException exception = null;
for (var descriptor : descriptors) {
Expand Down Expand Up @@ -138,11 +142,13 @@ public static final class OpenFile implements Descriptor, Closeable, DataReader,
private final Path path;
private final SeekableByteChannel channel;
private final int fdFlags;
private final long rights;

public OpenFile(Path path, SeekableByteChannel channel, int fdFlags) {
public OpenFile(Path path, SeekableByteChannel channel, int fdFlags, long rights) {
this.path = requireNonNull(path);
this.channel = requireNonNull(channel);
this.fdFlags = fdFlags;
this.rights = rights;
}

public Path path() {
Expand All @@ -157,6 +163,10 @@ public int fdFlags() {
return fdFlags;
}

public long rights() {
return rights;
}

@Override
public int read(byte[] data) throws IOException {
return channel.read(ByteBuffer.wrap(data));
Expand Down
3 changes: 3 additions & 0 deletions wasi/src/main/java/com/dylibso/chicory/wasi/WasiClockId.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.dylibso.chicory.wasi;

/**
* WASI <a href="https://github.com/WebAssembly/WASI/blob/v0.2.1/legacy/preview1/docs.md#clockid">clockid</a>
*/
final class WasiClockId {
private WasiClockId() {}

Expand Down
3 changes: 3 additions & 0 deletions wasi/src/main/java/com/dylibso/chicory/wasi/WasiErrno.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.dylibso.chicory.wasi;

/**
* WASI <a href="https://github.com/WebAssembly/WASI/blob/v0.2.1/legacy/preview1/docs.md#errno">errno</a>
*/
enum WasiErrno {
ESUCCESS,
E2BIG,
Expand Down
3 changes: 3 additions & 0 deletions wasi/src/main/java/com/dylibso/chicory/wasi/WasiFdFlags.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.dylibso.chicory.wasi;

/**
* WASI <a href="https://github.com/WebAssembly/WASI/blob/v0.2.1/legacy/preview1/docs.md#fdflags">fdflags</a>
*/
final class WasiFdFlags {
private WasiFdFlags() {}

Expand Down
3 changes: 3 additions & 0 deletions wasi/src/main/java/com/dylibso/chicory/wasi/WasiFileType.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.dylibso.chicory.wasi;

/**
* WASI <a href="https://github.com/WebAssembly/WASI/blob/v0.2.1/legacy/preview1/docs.md#filetype">filetype</a>
*/
enum WasiFileType {
UNKNOWN,
BLOCK_DEVICE,
Expand Down
17 changes: 17 additions & 0 deletions wasi/src/main/java/com/dylibso/chicory/wasi/WasiFstFlags.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.dylibso.chicory.wasi;

/**
* WASI <a href="https://github.com/WebAssembly/WASI/blob/v0.2.1/legacy/preview1/docs.md#fstflags">fstflags</a>
*/
final class WasiFstFlags {
private WasiFstFlags() {}

public static final int ATIM = bit(0);
electrum marked this conversation as resolved.
Show resolved Hide resolved
public static final int ATIM_NOW = bit(1);
public static final int MTIM = bit(2);
public static final int MTIM_NOW = bit(3);

private static int bit(int n) {
return 1 << n;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.dylibso.chicory.wasi;

/**
* WASI <a href="https://github.com/WebAssembly/WASI/blob/v0.2.1/legacy/preview1/docs.md#lookupflags">lookupflags</a> flags
*/
final class WasiLookupFlags {
private WasiLookupFlags() {}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.dylibso.chicory.wasi;

/**
* WASI <a href="https://github.com/WebAssembly/WASI/blob/v0.2.1/legacy/preview1/docs.md#oflags">oflags</a>
*/
final class WasiOpenFlags {
private WasiOpenFlags() {}

Expand Down
16 changes: 15 additions & 1 deletion wasi/src/main/java/com/dylibso/chicory/wasi/WasiOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
import java.io.OutputStream;
import java.nio.file.Path;
import java.security.SecureRandom;
import java.time.Clock;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

public final class WasiOptions {
private final Random random;
private final Clock clock;
private final OutputStream stdout;
private final OutputStream stderr;
private final InputStream stdin;
Expand All @@ -27,13 +29,15 @@ public static Builder builder() {

private WasiOptions(
Random random,
Clock clock,
OutputStream stdout,
OutputStream stderr,
InputStream stdin,
List<String> arguments,
Map<String, String> environment,
Map<String, Path> directories) {
this.random = requireNonNull(random);
this.clock = requireNonNull(clock);
this.stdout = requireNonNull(stdout);
this.stderr = requireNonNull(stderr);
this.stdin = requireNonNull(stdin);
Expand All @@ -46,6 +50,10 @@ public Random random() {
return random;
}

public Clock clock() {
return clock;
}

public OutputStream stdout() {
return stdout;
}
Expand All @@ -72,6 +80,7 @@ public Map<String, Path> directories() {

public static final class Builder {
private Random random = new SecureRandom();
private Clock clock = Clock.systemUTC();
private OutputStream stdout = OutputStream.nullOutputStream();
private OutputStream stderr = OutputStream.nullOutputStream();
private InputStream stdin = InputStream.nullInputStream();
Expand All @@ -86,6 +95,11 @@ public Builder withRandom(Random random) {
return this;
}

public Builder withClock(Clock clock) {
this.clock = clock;
return this;
}

public Builder withStdout(OutputStream stdout) {
this.stdout = stdout;
return this;
Expand Down Expand Up @@ -125,7 +139,7 @@ public Builder withDirectory(String guest, Path host) {

public WasiOptions build() {
return new WasiOptions(
random, stdout, stderr, stdin, arguments, environment, directories);
random, clock, stdout, stderr, stdin, arguments, environment, directories);
}
}
}
Loading
Loading