package org.overture.vdm2jml.tests; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import org.apache.log4j.Logger; import org.junit.Assert; import org.junit.Assume; import org.overture.codegen.tests.exec.util.ProcessResult; import org.overture.codegen.utils.GeneralUtils; import org.overture.codegen.vdm2jml.JmlGenMain; abstract public class OpenJmlValidationBase extends JmlGenTestBase { private static final String SKIPPING_A_SPECIFICATION_CLAUSE_FILTER_MSG = "Skipping a specification clause "; public static final String VDMSL_FILE_EXT = ".vdmsl"; public static final String OPENJML_ENV_VAR = "OPENJML"; public static final String OPEN_JML = "openjml.jar"; public static final String JML_RUNTIME = "jmlruntime.jar"; public static final String TEST_EXEC_LIB_FOLDER_PATH = TEST_EXEC_FOLDER_PATH + File.separatorChar + "lib"; public static final String CODEGEN_RUNTIME = TEST_EXEC_LIB_FOLDER_PATH + File.separatorChar + "codegen-runtime.jar"; public static final String VDM_TO_JML_RUNTIME = TEST_EXEC_LIB_FOLDER_PATH + File.separatorChar + "vdm2jml-runtime.jar"; public static final String EXEC_PROPERTY = "tests.vdm2jml.openjml"; public static final int EXIT_OK = 0; protected File openJml; protected File jmlRuntime; protected File cgRuntime; protected File vdm2jmlRuntime; protected static Logger log = Logger.getLogger(OpenJmlValidationBase.class.getName()); public OpenJmlValidationBase(File inputFile) { super(inputFile); this.cgRuntime = new File(CODEGEN_RUNTIME); this.vdm2jmlRuntime = new File(VDM_TO_JML_RUNTIME); setOpenJmlTools(); } public void setOpenJmlTools() { String openJmlDir = System.getenv(OPENJML_ENV_VAR); openJml = new File(openJmlDir, OPEN_JML); jmlRuntime = new File(openJmlDir, JML_RUNTIME); } public void assumeOpenJml() { assumeFile(OPEN_JML, openJml); } public void assumeJmlRuntime() { assumeFile(JML_RUNTIME, jmlRuntime); } public static void assumeFile(String fileName, File file) { Assume.assumeTrue("Could not find " + fileName, file != null && file.exists()); } public void assertNoProcessErrors(ProcessResult processResult) { Assert.assertTrue("Expected test to exit without any errors. Got: " + processResult.getOutput(), processResult.getExitCode() == OpenJmlValidationBase.EXIT_OK); } public ProcessResult runOpenJmlProcess() { beforeRunningOpenJmlProcess(); try { return runProcess(getProcessArgs()); } catch (IOException | InterruptedException e) { e.printStackTrace(); Assume.assumeTrue("Problems launching OpenJML", false); return null; } } public static ProcessResult runProcess(String[] openJmlArgs) throws IOException, InterruptedException { String s; Process p; int exitCode = 1; StringBuilder processOutput = new StringBuilder(); ProcessBuilder pb = new ProcessBuilder(openJmlArgs); p = pb.start(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); while ((s = br.readLine()) != null) { if (!mustFilter(s)) { processOutput.append(s).append('\n'); } } br.close(); br = new BufferedReader(new InputStreamReader(p.getErrorStream())); while ((s = br.readLine()) != null) { processOutput.append(s).append('\n'); } br.close(); exitCode = p.waitFor(); if (VERBOSE) { log.info(processOutput.toString()); log.info("Exit value: " + p.exitValue()); } p.destroy(); return new ProcessResult(exitCode, processOutput); } private static boolean mustFilter(String s) { return s.startsWith(SKIPPING_A_SPECIFICATION_CLAUSE_FILTER_MSG); } public void clearCodeFolder() { // Just make sure that the folder we are using is empty GeneralUtils.deleteFolderContents(genJavaFolder, true); } protected void generateJavaJml() { JmlGenMain.main(getJmlGenMainProcessArgs(genJavaFolder)); } abstract public void beforeRunningOpenJmlProcess(); abstract public String[] getProcessArgs(); }