/** * This file is part of Erjang - A JVM-based Erlang VM * * Copyright (c) 2011 by Trifork * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **/ package erjang; import java.io.File; import java.io.IOException; import java.util.Arrays; /** Common definitions and function. */ public abstract class TestUtil { static final String OTP_HOME = ErjangConfig.getString("erjang.otp.root"); static final String ERTS_VSN = ErjangConfig.getString("erjang.erts.version"); static final String ERLC_PRG = OTP_HOME + File.separator + "bin" + File.separator + "erlc"; static final String ERL_PRG = OTP_HOME + File.separator + "bin" + File.separator + "erl"; static final String EJ_PRG = "./jerl"; static final String TEST_BEAM_DIR = "target/test-beam"; static final String TRIQ_HOME = ErjangConfig.getString("erjang.triq.root"); public static String get_ej() { String ej = EJ_PRG; // on Windows, we need to wrap ej into a .bat wrapper if (System.getProperty("os.name").startsWith("Windows")) { ej = "ej.bat"; } return ej; } // ./ej -noshell -noinput -eval '{ok, _} = c:c("triq/src/triq.erl", [{outdir,"triq/ebin"}]), erlang:halt(0).' public static void erl_compile0(String fileName) throws Exception { execGetOutput(new String[] {EJ_PRG, "+S2", "-noshell", "-noinput", "-root", OTP_HOME, "-pa", TRIQ_HOME + File.separator + "ebin", "-eval", "{ok,_} = c:c(\"" + fileName + "\", " + "[{outdir, \"" + TEST_BEAM_DIR + "\"}, " + "{i, \""+ TRIQ_HOME + File.separator + "include" + "\"}])," + "erlang:halt(0)." }); } public static void erl_compile(String fileName) throws Exception { execGetOutput(new String[] {ERLC_PRG, "-o", TEST_BEAM_DIR, "-pa", TRIQ_HOME + File.separator + "ebin", "-I", TRIQ_HOME + File.separator + "include", fileName}); } public static String execGetOutput(String[] cmd) throws Exception { byte[] output = execGetBinaryOutput(cmd); return output.toString(); } public static byte[] execGetBinaryOutput(String[] cmd) throws Exception { Runtime rt = Runtime.getRuntime(); Process p = rt.exec(cmd); OutputCollectorThread outThread = new OutputCollectorThread(p.getInputStream()); OutputCollectorThread errThread = new OutputCollectorThread(p.getErrorStream()); outThread.start(); errThread.start(); outThread.join(); errThread.join(); int exitCode = p.waitFor(); //TODO: implement a timeout if (exitCode != 0) { System.err.println("Exitcode="+exitCode+" for "+cmd[0]); System.err.println("Err//output="+new String(errThread.getResult())+"//"+new String(outThread.getResult())); } assert(exitCode == 0); return Arrays.copyOf(outThread.getResult(), outThread.getResult().length); } public static String trimExtension(String fileName) { int i = fileName.lastIndexOf('.'); if (i>=0) fileName = fileName.substring(0,i); return fileName; } public static Process startErlProcess(String nodeName, String hostName) throws IOException { String[] cmd = new String[] {ERL_PRG, "-noinput", nodeNameSwitch(hostName), nodeName + "@" + hostName, "-pa", TestUtil.TEST_BEAM_DIR, "-pa", TRIQ_HOME + File.separator + "ebin", "-sasl", "sasl_error_logger", "false", // Prevent SASL from polluting stdout "-noinput" }; Runtime rt = Runtime.getRuntime(); Process p = rt.exec(cmd); return p; } public static void stopProcess(Process p) { p.destroy(); } public static String nodeNameSwitch(String hostName) { // Use -name if qualified, -sname if not: return (hostName.indexOf('.') >= 0) ? "-name" : "-sname"; } }