/** * 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. */ /* * Author: Radim Kubacki (radim@kubacki.cz) */ package org.python.pydev.debug.ui.launching; import java.util.ArrayList; import java.util.HashMap; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.eclipse.core.variables.IStringVariableManager; import org.eclipse.core.variables.IValueVariable; import org.eclipse.core.variables.VariablesPlugin; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchManager; import org.python.pydev.core.IInterpreterInfo; import org.python.pydev.core.IInterpreterManager; import org.python.pydev.core.IPythonNature; import org.python.pydev.core.MisconfigurationException; import org.python.pydev.debug.core.Constants; import org.python.pydev.editor.codecompletion.revisited.javaintegration.AbstractWorkbenchTestCase; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.nature.PythonNature; import org.python.pydev.ui.pythonpathconf.InterpreterInfo; /** * Tests for {@link PythonRunnerConfig} */ public class PythonRunnerConfigTestWorkbench extends AbstractWorkbenchTestCase { private static <T> boolean arrayContains(T[] array, T value) { for (T elem : array) { if (value.equals(elem)) { return true; } } return false; } // setUp from AbstractJavaIntegrationTestWorkbench opens the file in editor // something simpler can be enough public void testResourceLocation() throws Exception { ILaunchConfiguration config = new JythonLaunchShortcut().createDefaultLaunchConfiguration(FileOrResource .createArray(new IResource[] { mod1 })); PythonRunnerConfig runnerConfig = new PythonRunnerConfig(config, ILaunchManager.RUN_MODE, PythonRunnerConfig.RUN_JYTHON); assertEquals(mod1.getLocation(), runnerConfig.resource[0]); } public void testOverridingResourceLocation() throws Exception { ILaunchConfiguration config = new JythonLaunchShortcut().createDefaultLaunchConfiguration(FileOrResource .createArray(new IResource[] { mod1 })); ILaunchConfigurationWorkingCopy configCopy = config.getWorkingCopy(); String customResourcePath = "/foo/bar/acme.py"; configCopy.setAttribute(Constants.ATTR_ALTERNATE_LOCATION, customResourcePath); PythonRunnerConfig runnerConfig = new PythonRunnerConfig(configCopy, ILaunchManager.RUN_MODE, PythonRunnerConfig.RUN_JYTHON); assertEquals(Path.fromOSString(customResourcePath), runnerConfig.resource[0]); } public void testUnittestCommandLine() throws Exception { ILaunchConfiguration config = new JythonLaunchShortcut().createDefaultLaunchConfiguration(FileOrResource .createArray(new IResource[] { mod1 })); PythonRunnerConfig runnerConfig = new PythonRunnerConfig(config, ILaunchManager.RUN_MODE, PythonRunnerConfig.RUN_JYTHON); String[] argv = runnerConfig.getCommandLine(false); assertFalse(arrayContains(argv, PythonRunnerConfig.getRunFilesScript())); assertTrue(arrayContains(argv, mod1.getLocation().toOSString())); } public void testPythonUnittestCommandLine() throws Exception { ILaunchConfiguration config = new UnitTestLaunchShortcut().createDefaultLaunchConfiguration(FileOrResource .createArray(new IResource[] { mod1 })); PythonRunnerConfig runnerConfig = new PythonRunnerConfig(config, ILaunchManager.RUN_MODE, PythonRunnerConfig.RUN_UNITTEST); String[] argv = runnerConfig.getCommandLine(false); assertTrue(arrayContains(argv, PythonRunnerConfig.getRunFilesScript())); assertTrue(arrayContains(argv, mod1.getLocation().toOSString())); } public void testPythonCommandLine() throws Exception { PythonNature nature = PythonNature.getPythonNature(mod1); // Create a temporary variable for testing IStringVariableManager variableManager = VariablesPlugin.getDefault().getStringVariableManager(); IValueVariable myCustomVariable = variableManager.newValueVariable("pydev_python_runner_config_test_var", "", true, "my_custom_value"); variableManager.addVariables(new IValueVariable[] { myCustomVariable }); try { IInterpreterManager manager = PydevPlugin.getPythonInterpreterManager(true); InterpreterInfo info = (InterpreterInfo) manager.getDefaultInterpreterInfo(false); info.setEnvVariables(new String[] { "MY_CUSTOM_VAR_FOR_TEST=FOO", "MY_CUSTOM_VAR_FOR_TEST2=FOO2", "MY_CUSTOM_VAR_WITH_VAR=${pydev_python_runner_config_test_var}" }); // Make sure variable hasn't been expanded too early assertTrue(arrayContains(info.getEnvVariables(), "MY_CUSTOM_VAR_WITH_VAR=${pydev_python_runner_config_test_var}")); PythonRunnerConfig runnerConfig = createConfig(); assertTrue(arrayContains(runnerConfig.envp, "MY_CUSTOM_VAR_FOR_TEST=FOO")); assertTrue(arrayContains(runnerConfig.envp, "MY_CUSTOM_VAR_FOR_TEST2=FOO2")); assertTrue(arrayContains(runnerConfig.envp, "MY_CUSTOM_VAR_WITH_VAR=my_custom_value")); String[] argv = runnerConfig.getCommandLine(false); assertFalse(arrayContains(argv, PythonRunnerConfig.getRunFilesScript())); assertTrue(arrayContains(argv, mod1.getLocation().toOSString())); nature.setVersion(IPythonNature.PYTHON_VERSION_LATEST, IPythonNature.DEFAULT_INTERPRETER); assertEquals(manager.getDefaultInterpreterInfo(false).getExecutableOrJar(), nature.getProjectInterpreter() .getExecutableOrJar()); runnerConfig = createConfig(); argv = runnerConfig.getCommandLine(false); assertEquals(manager.getDefaultInterpreterInfo(false).getExecutableOrJar(), argv[0]); IInterpreterManager interpreterManager = nature.getRelatedInterpreterManager(); InterpreterInfo info2 = new InterpreterInfo(IPythonNature.PYTHON_VERSION_2_6, "c:\\interpreter\\py25.exe", new ArrayList<String>()); interpreterManager.setInfos(new IInterpreterInfo[] { info, info2 }, null, null); nature.setVersion(IPythonNature.PYTHON_VERSION_LATEST, "c:\\interpreter\\py25.exe"); assertEquals("c:\\interpreter\\py25.exe", nature.getProjectInterpreter().getExecutableOrJar()); runnerConfig = createConfig(); argv = runnerConfig.getCommandLine(false); assertEquals("c:\\interpreter\\py25.exe", argv[0]); nature.setVersion(IPythonNature.PYTHON_VERSION_LATEST, IPythonNature.DEFAULT_INTERPRETER); ILaunchConfiguration config; config = new LaunchShortcut().createDefaultLaunchConfiguration(FileOrResource .createArray(new IResource[] { mod1 })); ILaunchConfigurationWorkingCopy workingCopy = config.getWorkingCopy(); HashMap<String, String> map = new HashMap<String, String>(); map.put("VAR_SPECIFIED_IN_LAUNCH", "BAR"); map.put("MY_CUSTOM_VAR_FOR_TEST2", "BAR2"); //The one in the launch configuration always has preference. workingCopy.setAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES, map); config = workingCopy.doSave(); runnerConfig = new PythonRunnerConfig(config, ILaunchManager.RUN_MODE, PythonRunnerConfig.RUN_REGULAR); assertTrue(arrayContains(runnerConfig.envp, "VAR_SPECIFIED_IN_LAUNCH=BAR")); assertTrue(arrayContains(runnerConfig.envp, "MY_CUSTOM_VAR_FOR_TEST=FOO")); assertTrue(arrayContains(runnerConfig.envp, "MY_CUSTOM_VAR_FOR_TEST2=BAR2")); assertTrue(arrayContains(runnerConfig.envp, "MY_CUSTOM_VAR_WITH_VAR=my_custom_value")); } catch (Throwable e) { e.printStackTrace(); throw new RuntimeException(e); } finally { //restore the default! nature.setVersion(IPythonNature.PYTHON_VERSION_LATEST, IPythonNature.DEFAULT_INTERPRETER); variableManager.removeVariables(new IValueVariable[] { myCustomVariable }); } } private PythonRunnerConfig createConfig() throws CoreException, InvalidRunException, MisconfigurationException { ILaunchConfiguration config = new LaunchShortcut().createDefaultLaunchConfiguration(FileOrResource .createArray(new IResource[] { mod1 })); PythonRunnerConfig runnerConfig = new PythonRunnerConfig(config, ILaunchManager.RUN_MODE, PythonRunnerConfig.RUN_REGULAR); return runnerConfig; } public static Test suite() { TestSuite suite = new TestSuite(PythonRunnerConfigTestWorkbench.class.getName()); suite.addTestSuite(PythonRunnerConfigTestWorkbench.class); return suite; } }