package jetbrains.mps.baseLanguage.unitTest.execution.client; /*Generated by MPS */ import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import java.io.File; import com.intellij.execution.process.ProcessHandler; import java.util.List; import jetbrains.mps.baseLanguage.execution.api.JavaRunParameters; import com.intellij.execution.ExecutionException; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.baseLanguage.execution.api.Java_Command; import jetbrains.mps.internal.collections.runtime.IterableUtils; import jetbrains.mps.debug.api.IDebugger; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import jetbrains.mps.smodel.ModelAccess; import java.util.ArrayList; import org.jetbrains.annotations.NotNull; import jetbrains.mps.internal.collections.runtime.ISelector; import org.apache.log4j.Level; import jetbrains.mps.util.Computable; import java.util.Set; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import java.net.URL; import jetbrains.mps.core.tool.environment.classloading.ClassloaderUtil; import com.intellij.openapi.application.PathManager; import jetbrains.mps.debug.api.run.IDebuggerConfiguration; import org.jetbrains.annotations.Nullable; import jetbrains.mps.debug.api.IDebuggerSettings; import jetbrains.mps.debugger.java.api.settings.LocalConnectionSettings; import jetbrains.mps.debug.api.Debuggers; public class JUnit_Command { private static final Logger LOG = LogManager.getLogger(JUnit_Command.class); private String myDebuggerSettings_String; private String myVirtualMachineParameter_String; private String myJrePath_String; private File myWorkingDirectory_File = new File("."); public JUnit_Command() { } public JUnit_Command setDebuggerSettings_String(String debuggerSettings) { if (debuggerSettings != null) { myDebuggerSettings_String = debuggerSettings; } return this; } public JUnit_Command setVirtualMachineParameter_String(String virtualMachineParameter) { if (virtualMachineParameter != null) { myVirtualMachineParameter_String = virtualMachineParameter; } return this; } public JUnit_Command setJrePath_String(String jrePath) { if (jrePath != null) { myJrePath_String = jrePath; } return this; } public JUnit_Command setWorkingDirectory_File(File workingDirectory) { if (workingDirectory != null) { myWorkingDirectory_File = workingDirectory; } return this; } public ProcessHandler createProcess(List<ITestNodeWrapper> tests, JavaRunParameters javaRunParameters) throws ExecutionException { return new JUnit_Command().setVirtualMachineParameter_String(check_txeh3_a1a0a0a(javaRunParameters)).setJrePath_String((check_txeh3_a0c0a0a0(javaRunParameters) ? javaRunParameters.jrePath() : null)).setWorkingDirectory_File((isEmptyString(check_txeh3_a0a3a0a0a(javaRunParameters)) ? null : new File(javaRunParameters.workingDirectory()))).setDebuggerSettings_String(myDebuggerSettings_String).createProcess(tests); } public ProcessHandler createProcess(List<ITestNodeWrapper> tests) throws ExecutionException { if (tests == null) { throw new ExecutionException("Tests to run are null."); } List<ITestNodeWrapper> testsNoNull = ListSequence.fromList(tests).where(new IWhereFilter<ITestNodeWrapper>() { public boolean accept(ITestNodeWrapper it) { return it != null; } }).toListSequence(); if (ListSequence.fromList(testsNoNull).isEmpty()) { throw new ExecutionException("No tests to run"); } TestsWithParameters testsToRun = JUnit_Command.getTestsToRunWithParameters(testsNoNull); if (ListSequence.fromList(tests).isEmpty()) { throw new ExecutionException("Could not find tests to run."); } return new Java_Command().setVirtualMachineParameter_String(IterableUtils.join(ListSequence.fromList(testsToRun.getParameters().getJvmArgs()), " ") + (((myVirtualMachineParameter_String != null && myVirtualMachineParameter_String.length() > 0) ? " " + myVirtualMachineParameter_String : ""))).setClassPath_ListString(ListSequence.fromList(testsToRun.getParameters().getClassPath()).union(ListSequence.fromList(JUnit_Command.getClasspath(testsToRun.getTests()))).toListSequence()).setJrePath_String(myJrePath_String).setWorkingDirectory_File(myWorkingDirectory_File).setProgramParameter_String(JUnit_Command.getProgramParameters(testsToRun.getTests())).setDebuggerSettings_String(myDebuggerSettings_String).createProcess(testsToRun.getParameters().getExecutorClass().getName()); } public static IDebugger getDebugger() { return getDebuggerConfiguration().getDebugger(); } private static String getProgramParameters(final List<ITestNodeWrapper> tests) { final Wrappers._T<List<String>> testsCommandLine = new Wrappers._T<List<String>>(); ModelAccess.instance().runReadAction(new Runnable() { public void run() { testsCommandLine.value = ListSequence.fromList(new ArrayList<String>(ListSequence.fromList(tests).count())); for (ITestNodeWrapper test : ListSequence.fromList(tests)) { List<String> parametersPart = ListSequence.fromListAndArray(new ArrayList<String>(), (test.isTestCase() ? "-c" : "-m"), test.getFqName()); ListSequence.fromList(testsCommandLine.value).addSequence(ListSequence.fromList(parametersPart)); } } }); return IterableUtils.join(ListSequence.fromList(testsCommandLine.value), " "); } private static TestsWithParameters getTestsToRunWithParameters(@NotNull List<ITestNodeWrapper> tests) throws ExecutionException { TestParameters runParams = JUnit_Command.getMaxParams(tests); List<ITestNodeWrapper> testsToRun = ListSequence.fromList(new ArrayList<ITestNodeWrapper>()); List<ITestNodeWrapper> testsToSkip = ListSequence.fromList(new ArrayList<ITestNodeWrapper>()); for (ITestNodeWrapper test : ListSequence.fromList(tests)) { TestParameters testRunParameters = test.getTestRunParameters(); if (runParams.comprises(testRunParameters)) { ListSequence.fromList(testsToRun).addElement(test); } else { ListSequence.fromList(testsToSkip).addElement(test); } } String skipped = IterableUtils.join(ListSequence.fromList(testsToSkip).select(new ISelector<ITestNodeWrapper, String>() { public String select(ITestNodeWrapper it) { return it.getName(); } }), " "); if ((skipped != null && skipped.length() > 0)) { if (LOG.isEnabledFor(Level.WARN)) { LOG.warn("All tests could not be executed together. Skipped: " + skipped); } } return new TestsWithParameters(testsToRun, runParams); } private static TestParameters getMaxParams(List<ITestNodeWrapper> tests) { TestParameters maxParams = ListSequence.fromList(tests).first().getTestRunParameters(); for (ITestNodeWrapper test : ListSequence.fromList(tests)) { TestParameters newRunParams = test.getTestRunParameters(); if (newRunParams.comprises(maxParams)) { maxParams = newRunParams; } } return maxParams; } private static List<String> getClasspath(final List<ITestNodeWrapper> tests) { return ModelAccess.instance().runReadAction(new Computable<List<String>>() { public List<String> compute() { Set<SModule> uniqueModules = SetSequence.fromSet(new HashSet<SModule>()); for (ITestNodeWrapper testable : tests) { SModule module = SNodeOperations.getModel(testable.getNode()).getModule(); SetSequence.fromSet(uniqueModules).addElement(module); } List<String> classpath = Java_Command.getClasspath(uniqueModules); // fixme need this to allow user to start MPS inside the BTestCase ListSequence.fromList(classpath).addSequence(ListSequence.fromList(JUnit_Command.collectFromLibFolder())).distinct(); ListSequence.fromList(classpath).addSequence(ListSequence.fromList(JUnit_Command.collectFromPreInstalledPluginsFolder())).distinct(); return classpath; } }); } private static List<String> collectFromLibFolder() { List<URL> urls = ListSequence.fromList(new ArrayList<URL>()); ClassloaderUtil.addIDEALibraries(urls); List<String> list = ListSequence.fromList(urls).select(new ISelector<URL, String>() { public String select(URL it) { return it.getPath(); } }).toListSequence(); return list; } private static List<String> collectFromPreInstalledPluginsFolder() { List<String> result = ListSequence.fromList(new ArrayList<String>()); File preinstalledFolder = new File(PathManager.getPreInstalledPluginsPath()); final File[] pluginFiles = preinstalledFolder.listFiles(); if (pluginFiles != null) { for (final File pluginFile : pluginFiles) { if (!(ClassloaderUtil.isJarOrZip(pluginFile))) { File classesDir = new File(pluginFile, "classes"); if (classesDir.exists()) { ListSequence.fromList(result).addElement(classesDir.getAbsolutePath()); } File libDir = new File(pluginFile, "lib"); if (libDir.exists()) { ListSequence.fromList(result).addSequence(ListSequence.fromList(JUnit_Command.allJarsUnderRoot(libDir))); } } } } ListSequence.fromList(result).addSequence(ListSequence.fromList(JUnit_Command.allJarsUnderRoot(preinstalledFolder))); return result; } private static List<String> allJarsUnderRoot(File root) { List<String> res = ListSequence.fromList(new ArrayList<String>()); File[] children = root.listFiles(); if (children != null) { for (final File childFile : children) { if (ClassloaderUtil.isJarOrZip(childFile)) { ListSequence.fromList(res).addElement(childFile.getAbsolutePath()); } } } return res; } public static IDebuggerConfiguration getDebuggerConfiguration() { return new IDebuggerConfiguration() { @Nullable public IDebuggerSettings createDebuggerSettings() { return new LocalConnectionSettings(true); } public IDebugger getDebugger() { return Debuggers.getInstance().getDebuggerByName("Java"); } }; } private static String check_txeh3_a1a0a0a(JavaRunParameters checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.vmOptions(); } return null; } private static boolean check_txeh3_a0c0a0a0(JavaRunParameters checkedDotOperand) { if (null != checkedDotOperand) { return (boolean) checkedDotOperand.useAlternativeJre(); } return false; } private static String check_txeh3_a0a3a0a0a(JavaRunParameters checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.workingDirectory(); } return null; } private static boolean isEmptyString(String str) { return str == null || str.length() == 0; } }