From abcddcedb332ac6154c5ef49eab78209a5d07c62 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 20 Jun 2023 19:22:55 +0100 Subject: Add serialization to binary format of empty WASM module --- .../shedlang/compiler/backends/ExampleTests.java | 19 +------- .../compiler/backends/llvm/ExecutionResult.java | 7 +++ .../structure/WasmBinaryFormatModuleTests.java | 52 ++++++++++++++++++++++ .../snapshots/WasmBinaryFormatModuleTests.snap | 3 ++ .../shedlang/compiler/testing/ProcessRunner.java | 31 +++++++++++++ 5 files changed, 95 insertions(+), 17 deletions(-) create mode 100644 src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormatModuleTests.java create mode 100644 src/test/java/org/shedlang/compiler/backends/wasm/structure/snapshots/WasmBinaryFormatModuleTests.snap create mode 100644 src/test/java/org/shedlang/compiler/testing/ProcessRunner.java (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/backends/ExampleTests.java b/src/test/java/org/shedlang/compiler/backends/ExampleTests.java index df0aae24..c5f584d8 100644 --- a/src/test/java/org/shedlang/compiler/backends/ExampleTests.java +++ b/src/test/java/org/shedlang/compiler/backends/ExampleTests.java @@ -6,13 +6,12 @@ import org.shedlang.compiler.ShedCompiler; import org.shedlang.compiler.backends.llvm.ExecutionResult; import org.shedlang.compiler.config.ProjectConfig; import org.shedlang.compiler.filesystem.ShedCompilerFiles; +import org.shedlang.compiler.testing.ProcessRunner; import org.shedlang.compiler.util.P; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Optional; -import java.util.stream.Collectors; import java.util.stream.Stream; import static org.zwobble.precisely.AssertThat.assertThat; @@ -50,21 +49,7 @@ public abstract class ExampleTests { .orElse(P.vector()) .plus(executableName(binary)); - var process = new ProcessBuilder() - .command(fullCommand) - .start(); - - var exitCode = process.waitFor(); - - try ( - var stdoutReader = process.inputReader(StandardCharsets.UTF_8); - var stderrReader = process.errorReader(StandardCharsets.UTF_8) - ) { - var stdout = stdoutReader.lines().collect(Collectors.joining()); - var stderr = stderrReader.lines().collect(Collectors.joining()); - - return new ExecutionResult(exitCode, stdout, stderr); - } + return ProcessRunner.run(fullCommand); } protected abstract Backend backend(); diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java b/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java index 1136e243..d977d70d 100644 --- a/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java @@ -1,4 +1,11 @@ package org.shedlang.compiler.backends.llvm; public record ExecutionResult(int exitCode, String stdout, String stderr) { + public ExecutionResult throwOnError() { + if (exitCode == 0) { + return this; + } else { + throw new AssertionError("exit code was " + exitCode + "\nstdout:\n" + stdout + "\nstderr:\n" + stderr); + } + } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormatModuleTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormatModuleTests.java new file mode 100644 index 00000000..5ddad366 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormatModuleTests.java @@ -0,0 +1,52 @@ +package org.shedlang.compiler.backends.wasm.structure; + +import au.com.origin.snapshots.Expect; +import au.com.origin.snapshots.junit5.SnapshotExtension; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.shedlang.compiler.backends.wasm.structure.ast.WasmModule; +import org.shedlang.compiler.testing.ProcessRunner; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +@ExtendWith({SnapshotExtension.class}) +public class WasmBinaryFormatModuleTests { + private Expect expect; + + @Test + public void canSerializeEmptyModule() throws IOException, InterruptedException { + var module = WasmModule.builder() + .build(); + + var result = serializeModule(module); + + expect.toMatchSnapshot(result); + } + + private String serializeModule(WasmModule module) throws IOException, InterruptedException { + Files.createDirectories(Path.of("tests-tmp")); + var temporaryDirectory = Files.createTempDirectory(Path.of("tests-tmp"), "WasmBinaryFormat"); + var modulePath = temporaryDirectory.resolve("module.wasm"); + + try (var outputStream = new FileOutputStream(modulePath.toFile())) { + WasmBinaryFormat.serializeModule(module, outputStream); + } + + validate(modulePath); + + return objdump(modulePath); + } + + private void validate(Path path) throws IOException, InterruptedException { + ProcessRunner.run(List.of("wasm-validate", "--enable-exceptions", path.toString())) + .throwOnError(); + } + + private String objdump(Path path) throws IOException, InterruptedException { + return ProcessRunner.run(List.of("wasm-objdump", "-dx", path.toString())).throwOnError().stdout(); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/structure/snapshots/WasmBinaryFormatModuleTests.snap b/src/test/java/org/shedlang/compiler/backends/wasm/structure/snapshots/WasmBinaryFormatModuleTests.snap new file mode 100644 index 00000000..370ab0d6 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/wasm/structure/snapshots/WasmBinaryFormatModuleTests.snap @@ -0,0 +1,3 @@ +org.shedlang.compiler.backends.wasm.structure.WasmBinaryFormatModuleTests.canSerializeEmptyModule=[ +module.wasm: file format wasm 0x1Section Details:Code Disassembly: +] \ No newline at end of file diff --git a/src/test/java/org/shedlang/compiler/testing/ProcessRunner.java b/src/test/java/org/shedlang/compiler/testing/ProcessRunner.java new file mode 100644 index 00000000..c1bfd481 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/testing/ProcessRunner.java @@ -0,0 +1,31 @@ +package org.shedlang.compiler.testing; + +import org.shedlang.compiler.backends.llvm.ExecutionResult; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.stream.Collectors; + +public class ProcessRunner { + private ProcessRunner() { + } + + public static ExecutionResult run(List command) throws IOException, InterruptedException { + var process = new ProcessBuilder() + .command(command) + .start(); + + var exitCode = process.waitFor(); + + try ( + var stdoutReader = process.inputReader(StandardCharsets.UTF_8); + var stderrReader = process.errorReader(StandardCharsets.UTF_8) + ) { + var stdout = stdoutReader.lines().collect(Collectors.joining()); + var stderr = stderrReader.lines().collect(Collectors.joining()); + + return new ExecutionResult(exitCode, stdout, stderr); + } + } +} -- cgit v1.2.3