package rtt.core.testing; import java.util.List; import rtt.core.archive.configuration.Configuration; import rtt.core.archive.output.Output; import rtt.core.archive.testsuite.Testcase; import rtt.core.archive.testsuite.VersionData; import rtt.core.exceptions.RTTException; import rtt.core.exceptions.RTTException.Type; import rtt.core.loader.ArchiveLoader; import rtt.core.manager.data.history.OutputDataManager; import rtt.core.manager.data.history.OutputDataManager.OutputDataType; import rtt.core.testing.compare.OutputCompare; import rtt.core.testing.compare.results.TestExecutionFailure; import rtt.core.testing.compare.results.TestFailure; import rtt.core.testing.compare.results.TestResult; import rtt.core.testing.compare.results.TestResult.ResultType; import rtt.core.utils.RTTLogging; public class Tester { ArchiveLoader loader; boolean matching; public Tester(ArchiveLoader loader, boolean matching) { super(); this.loader = loader; } public TestResult test(String suiteName, Testcase tcase, Configuration config) { if (tcase == null) { throw new NullPointerException("Testcase was null."); } if (config == null) { throw new NullPointerException("Configuration was null."); } String caseName = tcase.getName(); // open a reference and test manager OutputDataManager refManager = new OutputDataManager(loader, suiteName, caseName, config, OutputDataType.REFERENCE); OutputDataManager testManager = new OutputDataManager(loader, suiteName, caseName, config, OutputDataType.TEST); TestResult result = new TestResult(ResultType.SKIPPED, suiteName, caseName); // find current version of data for given configuration VersionData versionData = null; for (VersionData tempData : tcase.getVersionData()) { if (tempData.getConfig().equals(config.getName())) { versionData = tempData; } } // if no version data was found, return SKIPPED if (versionData == null) { return result; } // if version data was found, set reference and test version to result result.setRefVersion(versionData.getReferenceID()); result.setTestVersion(versionData.getTestID()); // if the input version is newer than the last used version of the reference manager // then return skipped. if (refManager.isOutDated(tcase.getInputID()) || testManager.isOutDated(tcase.getInputID())) { return result; } boolean testSuccess = true; try { Output testData = testManager.getOutputData(versionData.getTestID()); Output refData = refManager.getOutputData(versionData.getReferenceID()); List<TestFailure> failures = compareOutput(testData, refData); if (failures != null && !failures.isEmpty()) { for (TestFailure testFailure : failures) { result.addFailure(testFailure); } testSuccess = false; } } catch (RTTException e) { RTTLogging.debug(e.getMessage(), e); result.addFailure(new TestExecutionFailure(e)); testSuccess = false; } if (testSuccess) { result.setType(ResultType.SUCCESS); } else { result.setType(ResultType.FAILURE); } return result; } private List<TestFailure> compareOutput(Output testData, Output refData) throws RTTException { checkData(testData, refData); RTTLogging.info("Testing Syntactic Results"); return OutputCompare.compareOutput(refData, testData, false); } private void checkData(Object testData, Object refData) throws RTTException { if (testData != null && refData == null) { throw new IllegalStateException( "Reference data was null, but test data not!"); } if (refData == null) { throw new RTTException(Type.DATA_NOT_FOUND, "Reference data was null."); } if (testData == null) { throw new RTTException(Type.DATA_NOT_FOUND, "Test data was null."); } } }