/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.backend.maude; import java.io.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.Assert; import org.junit.Assume; import org.junit.BeforeClass; import org.junit.Test; import abs.ABSTest; import abs.frontend.ast.Model; /** * Note that this class doesn't have a nullary constructor and can't be run * as a JUnit test itself! */ public class MaudeTests extends ABSTest { final MaudeCompiler.SIMULATOR mode; public MaudeTests(MaudeCompiler.SIMULATOR mode) { this.mode = mode; } /* These two are direct entry-points for JUnit */ public static class MaudeEqTests extends MaudeTests { public MaudeEqTests() { super(MaudeCompiler.SIMULATOR.EQ_TIMED); } } public static class MaudeRlTests extends MaudeTests { public MaudeRlTests() { super(MaudeCompiler.SIMULATOR.RL); } } @BeforeClass public static void checkMaude() { ProcessBuilder pb = new ProcessBuilder(); pb.command("maude"); try { Process p = pb.start(); p.destroy(); } catch (IOException e) { Assume.assumeNoException(e); } } @Test public void simpeBlock() throws Exception { assertTrueMaude("module Test; { Bool testresult = True;}"); } public void assertTrueMaude(String absCode) throws Exception { assertMaudeResult(absCode, "ABS.StdLib.True"); } public void assertFalseMaude(String absCode) throws Exception { assertMaudeResult(absCode, "ABS.StdLib.False"); } void assertMaudeResult(String absCode, String expectedResult) throws Exception { String generatedMaudeCode = getMaudeCode(absCode, mode); assertMaudeCodeResult(generatedMaudeCode, expectedResult); } final static Pattern patternResult = Pattern.compile(".*'testresult \\|-> \"(.*?)\"\\[emp\\].*"); public void assertMaudeCodeResult(String generatedMaudeCode, String expectedResult) throws Exception { String maudeOutput = getMaudeOutput(generatedMaudeCode); Matcher matcher = patternResult.matcher(maudeOutput); if (matcher.find()) { String boolValue = matcher.group(1); Assert.assertEquals(expectedResult, boolValue); } else { System.err.println(maudeOutput); Assert.fail("Did not find Maude \"testresult\" variable."); } } protected String getMaudeCode(String absCode, MaudeCompiler.SIMULATOR module) throws Exception { Model model = assertParseOk(absCode, Config.WITH_STD_LIB, Config.WITHOUT_MODULE_NAME, Config.TYPE_CHECK /* XXX:CI, Config.WITH_LOC_INF */); ByteArrayOutputStream out = new ByteArrayOutputStream(); // TODO: handle delta generation / testing / flattening model.generateMaude(new PrintStream(out), module, 100, 0); String res = out.toString(); return res; } protected String getMaudeOutput(String maudeCode) throws IOException, InterruptedException { final StringBuffer result = new StringBuffer(); // Assuming `maude' is in $PATH here. ProcessBuilder pb = new ProcessBuilder(); File interpreterDir = new File("src"+File.separator+"abs"+File.separator+"backend"+File.separator+"maude"); //File interpreterDir = new File(new File(System.getProperty("user.dir")).getParentFile(), "interpreter"); File interpreter = new File(interpreterDir, "abs-interpreter.maude"); String[] cmd = { "maude", "-no-banner", "-no-ansi-color", "-no-wrap", "-batch", interpreter.getAbsolutePath() }; pb.command(cmd); pb.directory(interpreterDir); if (!interpreter.exists()) { Assert.fail(interpreter.getAbsolutePath() + " does not exist!"); } // pb.directory(workingDir); pb.redirectErrorStream(true); final Process p = pb.start(); final BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); PrintWriter out = new PrintWriter(p.getOutputStream()); Thread pin = new Thread(new Runnable() { @Override public void run() { try { String l; while ((l = in.readLine()) != null) { result.append(l + "\n"); } } catch (IOException e) {} } }); pin.start(); out.println(maudeCode); // Shouldn't block here out.println("rew start .\nquit"); out.flush(); Runnable killer = new Runnable() { @Override public void run() { try { Thread.sleep(1000*5); System.err.println("Timeout!"); p.destroy(); } catch (InterruptedException e) {} } }; Thread kT = new Thread(killer); kT.start(); p.waitFor(); kT.interrupt(); pin.join(); out.close(); in.close(); return result.toString(); } final static Pattern patternFailure = Pattern.compile("\\| failure"); public void assertFails(String absCode) throws Exception { String generatedMaudeCode = getMaudeCode(absCode, mode); String maudeOutput = getMaudeOutput(generatedMaudeCode); Matcher matcher = patternFailure.matcher(maudeOutput); if (!matcher.find()) { Assert.fail("Did not find ANY indication of failure..."); } } }