/* * JacORB - a free Java ORB * * Copyright (C) 1999-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.jacorb.test.idl; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import java.util.logging.StreamHandler; import junit.framework.AssertionFailedError; import org.jacorb.idl.parser; import org.jacorb.test.harness.ORBTestCase; import org.jacorb.test.harness.TestUtils; import org.junit.Assume; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @RunWith(value = Parameterized.class) public abstract class AbstractIDLTestcase extends ORBTestCase { protected final File idlFile; @Rule public TemporaryFolder folder = new TemporaryFolder(); /** * dir where the idl compiler places generated * java source files. */ protected final File dirGeneration; /** * dir where .class are compiled to. */ protected final File dirCompilation; /** * Logger content of running the IDL compiler. */ protected static ByteArrayOutputStream loggerContent; @BeforeClass public static void beforeClassSetUp() throws Exception { Assume.assumeFalse(TestUtils.isSSLEnabled); initLogging(); } protected static void initLogging () { parser.logger = Logger.getLogger("org.jacorb.idl"); parser.logger.setLevel(Level.SEVERE); Formatter formatter = new Formatter() { @Override public String format(LogRecord arg0) { StringBuilder b = new StringBuilder(); b.append(arg0.getLevel()); b.append(" "); b.append(arg0.getSourceClassName()); b.append(" "); b.append(arg0.getSourceMethodName()); b.append(" "); b.append(arg0.getMessage()); b.append(System.getProperty("line.separator")); Throwable t = arg0.getThrown(); return t == null ? b.toString() : b.toString () + getStackTrace (t); } private String getStackTrace (Throwable t) { StringWriter sw = new StringWriter(); t.printStackTrace(new PrintWriter (sw)); return sw.toString(); } }; loggerContent = new ByteArrayOutputStream(); PrintStream prStr = new PrintStream(loggerContent); parser.handler = new StreamHandler(prStr, formatter); parser.handler.setFormatter (formatter); parser.handler.setLevel (Level.SEVERE); parser.logger.addHandler(parser.handler); } public AbstractIDLTestcase(File file) throws IOException { assertTrue(file + " should exist", file.exists()); assertTrue(file.isFile()); idlFile = file; folder.create(); dirGeneration = folder.newFolder(); dirCompilation = folder.newFolder(); } /** * run JacORBs IDL compiler on the current idlFile */ protected void runJacIDL(boolean failureExpected) throws Exception { final String details; details = runJacIDLInProcess(failureExpected); TestUtils.getLogger().debug("[" + idlFile.getName() + " output]:\n" + details); } private String runJacIDLInProcess(boolean failureExpected) throws AssertionFailedError { String[] file = createJacIDLArgs(); String details = ""; try { boolean success; try { success = org.jacorb.idl.parser.compile(file); } finally { parser.handler.flush (); details = loggerContent.toString (); loggerContent.reset(); } assertTrue("parser didn't succeed", success); if (failureExpected) { fail("parsing of " + idlFile.getName() + " should fail."); } } catch (Exception e) { handleJacIDLFailed(failureExpected, details, e); } return details; } private void handleJacIDLFailed(boolean failureExpected, final String details, Exception e) throws AssertionFailedError { if (!failureExpected) { AssertionFailedError error = new AssertionFailedError("parsing of " + idlFile.getName() + " failed: " + details); error.initCause(e); throw error; } } /** * compile all .java files that were * generated by a previous IDL run. * this method depends on a properly configured * environment that has javac available. * @return a ClassLoader that can be used to access the compiled classes */ protected ClassLoader compileGeneratedSources(boolean failureExpected) throws IOException { File[] files = getJavaFiles(); return TestUtils.compileJavaFiles(this.dirCompilation, files, failureExpected); } /** * get a list of all .java files that were * generated by a previous IDL run. */ protected File[] getJavaFiles() { return TestUtils.getJavaFilesRecursively(dirGeneration).toArray(new File[0]); } /** * build the argument list that will be used to invoke the * IDL compiler. */ protected String[] createJacIDLArgs() { String file[] = new String[] { "-forceOverwrite", "-d", dirGeneration.getAbsolutePath(), idlFile.getAbsolutePath() }; return file; } /** * search for a method with the signature * public void verify_<FILENAME>(ClassLoader cl) {...} * (dots in filename will be converted to _) and invoke * it with the specified classloader. */ protected void invokeVerifyMethod(ClassLoader cl) throws IllegalAccessException, InvocationTargetException { try { // test if a verify_ method is available and invoke it String file = idlFile.getName().replaceAll("\\.", "_"); TestUtils.getLogger().debug("look for verify_" + file); Method method = getClass().getMethod("verify_" + file, new Class[] {ClassLoader.class}); method.invoke(this, new Object[] {cl}); } catch (NoSuchMethodException e) { // ignored } } }