From 76eb6ec8f01f2d806e0056ec2606a2acf9dd1038 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 9 Mar 2025 22:27:20 +0000 Subject: Add valgrind tests --- .../backends/llvm/Amd64ValgrindExampleTests.java | 54 ++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/java/org/shedlang/compiler/backends/llvm/Amd64ValgrindExampleTests.java (limited to 'src/test/java/org') diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/Amd64ValgrindExampleTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/Amd64ValgrindExampleTests.java new file mode 100644 index 00000000..7fa56575 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/Amd64ValgrindExampleTests.java @@ -0,0 +1,54 @@ +package org.shedlang.compiler.backends.llvm; + +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; +import org.shedlang.compiler.ShedCompiler; +import org.shedlang.compiler.backends.ExampleSet; +import org.shedlang.compiler.testing.TestProcessRunner; + +import java.io.IOException; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +public class Amd64ValgrindExampleTests { + @TestFactory + public Stream tests() { + return ExampleSet.exampleSets() + .map(exampleSet -> DynamicTest.dynamicTest( + exampleSet.name(), + () -> runTest(exampleSet) + )); + } + + private void runTest(ExampleSet exampleSet) throws IOException, InterruptedException { + var config = exampleSet.readConfig(); + + for (var example : config.examples()) { + if (example.expectedError().isEmpty()) { + var compiler = new ShedCompiler(); + var targetDir = compiler.compile( + example.projectPath(), + LlvmBackend.AMD64, + Optional.empty() + ); + var binPath = targetDir.topLevel(example.bin()) + .toString(); + + var leakExitCode = 127; + + var result = TestProcessRunner.runCaptureOutput(List.of( + "valgrind", + "--leak-check=full", + "--error-exitcode=" + leakExitCode, + binPath + )); + + if (result.exitCode() == leakExitCode) { + Assumptions.abort("Example had leaks:\n" + result.stderr()); + } + } + } + } +} -- cgit v1.2.3