/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on Apr 21, 2006 */ package org.python.pydev.jythontests; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import junit.framework.TestCase; import org.eclipse.core.runtime.IStatus; import org.python.pydev.core.TestDependent; import org.python.pydev.core.log.Log; import org.python.pydev.jython.IPythonInterpreter; import org.python.pydev.jython.JythonPlugin; import org.python.pydev.runners.SimpleJythonRunner; import org.python.pydev.runners.SimpleRunner; import com.aptana.shared_core.structure.Tuple; public class JythonTest extends TestCase { final File[] foldersWithTestContentsOnSameProcess = new File[] { new File(TestDependent.TEST_PYDEV_JYTHON_PLUGIN_LOC + "jysrc/tests"), new File(TestDependent.TEST_PYDEV_PLUGIN_LOC + "tests/jysrc/tests"), new File(TestDependent.TEST_PYDEV_PLUGIN_LOC + "pysrc/tests_runfiles"), }; final File[] additionalPythonpathFolders = new File[] { new File(TestDependent.TEST_PYDEV_JYTHON_PLUGIN_LOC + "jysrc/"), new File(TestDependent.TEST_PYDEV_PLUGIN_LOC + "pysrc/"), new File(TestDependent.JYTHON_ANT_JAR_LOCATION), new File(TestDependent.JYTHON_JUNIT_JAR_LOCATION), new File(TestDependent.JYTHON_LIB_LOCATION), }; private static final boolean RUN_TESTS_ON_SEPARATE_PROCESS = true; private static final boolean RUN_TESTS_ON_SAME_PROCESS = true; public static void main(String[] args) { try { JythonTest builtins = new JythonTest(); builtins.setUp(); builtins.testJythonTests(); builtins.testJythonTestsOnSeparateProcess(); builtins.tearDown(); junit.textui.TestRunner.run(JythonTest.class); System.out.println("Finished"); } catch (Exception e) { e.printStackTrace(); } } protected void setUp() throws Exception { super.setUp(); JythonPlugin.setDebugReload(false); JythonPlugin.IN_TESTS = true; } protected void tearDown() throws Exception { super.tearDown(); JythonPlugin.setDebugReload(true); } public void testJythonTests() throws Exception { if (RUN_TESTS_ON_SAME_PROCESS) { //unittest.TestCase format: the __main__ is required in the global namespace HashMap<String, Object> locals = new HashMap<String, Object>(); locals.put("__name__", "__main__"); IPythonInterpreter interpreter = JythonPlugin.newPythonInterpreter(false, false); ByteArrayOutputStream stdErr = new ByteArrayOutputStream(); ByteArrayOutputStream stdOut = new ByteArrayOutputStream(); interpreter.setErr(stdErr); interpreter.setOut(stdOut); List<Throwable> errors = JythonPlugin.execAll(locals, "test", interpreter, foldersWithTestContentsOnSameProcess, additionalPythonpathFolders); System.out.println(stdOut); System.out.println(stdErr); failIfErrorsRaised(errors, stdErr); } } public void testJythonTestsOnSeparateProcess() throws Exception { if (RUN_TESTS_ON_SEPARATE_PROCESS) { //has to be run on a separate process because it'll call exit() List<Throwable> errors = JythonTest.execAll("test", new File[] { new File( TestDependent.TEST_PYDEV_PLUGIN_LOC + "pysrc/tests"), }); if (errors.size() > 0) { ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write("There have been errors while executing the test scripts in jython.\n\n".getBytes()); for (Throwable throwable : errors) { throwable.printStackTrace(new PrintStream(out)); } fail(new String(out.toByteArray())); } } } private void failIfErrorsRaised(List<Throwable> errors, ByteArrayOutputStream stdErr) throws IOException { if (errors.size() > 0) { ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write("There have been errors while executing the test scripts in jython.\n\n".getBytes()); for (Throwable throwable : errors) { throwable.printStackTrace(new PrintStream(out)); } fail(new String(out.toByteArray())); } if (stdErr != null) { String errStr = new String(stdErr.toByteArray()); if (errStr.length() > 0) { if (errStr.indexOf("FAILED") != -1) { fail(errStr); } } } } public static List<Throwable> execAll(final String startingWith, File[] beneathFolders) { List<Throwable> errors = new ArrayList<Throwable>(); for (File file : beneathFolders) { if (file != null) { if (!file.exists()) { String msg = "The folder:" + file + " does not exist and therefore cannot be used to " + "find scripts to run starting with:" + startingWith; Log.log(IStatus.ERROR, msg, null); errors.add(new RuntimeException(msg)); } File[] files = JythonPlugin.getFilesBeneathFolder(startingWith, file); for (File f : files) { Throwable throwable = exec(f); if (throwable != null) { errors.add(throwable); } } } } return errors; } private static Throwable exec(File f) { System.out.println(com.aptana.shared_core.string.StringUtils.format("Running: %s", f)); String sep = SimpleRunner.getPythonPathSeparator(); assertTrue(new File(TestDependent.JYTHON_ANT_JAR_LOCATION).exists()); assertTrue(new File(TestDependent.JYTHON_JUNIT_JAR_LOCATION).exists()); String pythonpath = TestDependent.TEST_PYDEV_PLUGIN_LOC + "pysrc/" + sep + TestDependent.JYTHON_ANT_JAR_LOCATION + sep + TestDependent.JYTHON_JUNIT_JAR_LOCATION; Tuple<String, String> output = new SimpleJythonRunner().runAndGetOutputWithJar(new File( TestDependent.JAVA_LOCATION), f.toString(), TestDependent.JYTHON_JAR_LOCATION, null, f.getParentFile(), null, null, pythonpath, "utf-8"); System.out.println(com.aptana.shared_core.string.StringUtils.format("stdout:%s\nstderr:%s", output.o1, output.o2)); if (output.o2.toLowerCase().indexOf("failed") != -1 || output.o2.toLowerCase().indexOf("traceback") != -1) { throw new AssertionError(output.toString()); } return null; } }