/*
* Copyright (c) 2016, Oracle and/or its affiliates.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.oracle.truffle.llvm.test.alpha;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Assert;
import org.junit.Test;
import com.oracle.truffle.llvm.Sulong;
import com.oracle.truffle.llvm.pipe.CaptureOutput;
import com.oracle.truffle.llvm.test.util.ProcessUtil;
import com.oracle.truffle.llvm.test.util.ProcessUtil.ProcessResult;
public abstract class BaseSingleTestHarness extends BaseTestHarness {
@Override
@Test
public void test() throws Exception {
assert Files.walk(getTestDirectory()).filter(isExecutable).count() == 1;
Path referenceFile = Files.walk(getTestDirectory()).filter(isExecutable).findFirst().get();
List<Path> testCandidates = Files.walk(getTestDirectory()).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.");
}
int sulongResult = -1;
String sulongStdOut;
try (CaptureOutput out = new CaptureOutput()) {
sulongResult = Sulong.executeMain(candidate.toAbsolutePath().toFile(), getArguments(candidate.getParent()));
System.out.flush();
sulongStdOut = out.getResult();
}
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 Object[] getArguments(Path testCandidate);
}