package com.oracle.truffle.llvm.tests;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Assert;
import org.junit.Test;
import com.oracle.truffle.llvm.tests.pipe.CaptureNativeOutput;
import com.oracle.truffle.llvm.tests.util.ProcessUtil;
import com.oracle.truffle.llvm.tests.util.ProcessUtil.ProcessResult;
public abstract class BaseSingleTestHarness extends BaseTestHarness {
@Override
@Test
public void test() throws IOException {
Path referenceFile;
try (Stream<Path> files = Files.walk(getTestDirectory())) {
List<Path> executables = files.filter(isExecutable).collect(Collectors.toList());
assert executables.size() == 1;
referenceFile = executables.get(0);
}
try (Stream<Path> files = Files.walk(getTestDirectory())) {
List<Path> testCandidates = files.filter(isFile).filter(isSulong).collect(Collectors.toList());
String command = referenceFile.toAbsolutePath().toString() + " " + Arrays.stream(getArguments(referenceFile.getParent())).map(String::valueOf).collect(Collectors.joining(" "));
ProcessResult processResult = ProcessUtil.executeNativeCommand(command);
String referenceStdOut = processResult.getStdOutput();
final int referenceReturnValue = processResult.getReturnValue();
for (Path candidate : testCandidates) {
if (!filterFileName().test(candidate.getFileName().toString())) {
continue;
}
if (!candidate.toAbsolutePath().toFile().exists()) {
throw new AssertionError("File " + candidate.toAbsolutePath().toFile() + " does not exist.");
}
ProcessResult out = ProcessUtil.executeSulongTestMain(candidate.toAbsolutePath().toFile(), getArguments(candidate.getParent()), getContextOptions(), c -> new CaptureNativeOutput());
int sulongResult = out.getReturnValue();
String sulongStdOut = out.getStdOutput();
if (sulongResult != (sulongResult & 0xFF)) {
Assert.fail("Broken unittest " + getTestDirectory() + ". Test exits with invalid value.");
}
String testName = candidate.getFileName().toString() + " in " + getTestDirectory().toAbsolutePath().toString();
Assert.assertEquals(testName + " failed. Posix return value missmatch.", referenceReturnValue,
sulongResult);
Assert.assertEquals(testName + " failed. Output (stdout) missmatch.", referenceStdOut,
sulongStdOut);
}
}
}
protected abstract String[] getArguments(Path testCandidate);
}