WEB-14686 Run Configurations: "CreateProcess error=87, The parameter is incorrect...
authorSergey Simonchik <Sergey.Simonchik@jetbrains.com>
Wed, 24 Dec 2014 16:33:22 +0000 (19:33 +0300)
committerSergey Simonchik <Sergey.Simonchik@jetbrains.com>
Wed, 24 Dec 2014 16:33:22 +0000 (19:33 +0300)
platform/platform-api/src/com/intellij/execution/configurations/GeneralCommandLine.java
platform/platform-tests/testSrc/com/intellij/execution/GeneralCommandLineTest.java

index cd9d1fcf49e2ed5d26d1df8787c45072a4d6ecf2..5598abe47742a1be9fd27d9dda94cf9eb5692ae1 100644 (file)
@@ -333,6 +333,11 @@ public class GeneralCommandLine implements UserDataHolder {
         environment.putAll(myEnvParams);
       }
     }
+    if (SystemInfo.isWindows) {
+      // (Windows) An environment variable with empty name is incorrect.
+      // It'll end up in "CreateProcess error=87, The parameter is incorrect".
+      environment.remove("");
+    }
   }
 
   /**
index 8fe3951dcd111466877e87ca29c329a522e2195b..095cb524d80115e4fabac2c62d3d4cd9e2924fb7 100644 (file)
@@ -17,6 +17,7 @@ package com.intellij.execution;
 
 import com.intellij.execution.configurations.GeneralCommandLine;
 import com.intellij.execution.util.ExecUtil;
+import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.SystemInfo;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.text.StringUtil;
@@ -239,6 +240,13 @@ public class GeneralCommandLineTest {
     checkEnvPassing(commandLine, testEnv, false);
   }
 
+  @Test
+  public void emptyEnvironmentPassing() throws Exception {
+    Pair<String, String> nonEmpty = Pair.create("a", "b");
+    Map<String, String> inputEnv = newHashMap(Pair.create("", "c"), nonEmpty);
+    GeneralCommandLine commandLine = makeJavaCommand(EnvPassingTest.class, null);
+    checkEnvPassing(commandLine, inputEnv, SystemInfo.isWindows ? newHashMap(nonEmpty) : inputEnv, false);
+  }
 
   private static String execAndGetOutput(GeneralCommandLine commandLine, @Nullable String encoding) throws Exception {
     Process process = commandLine.createProcess();
@@ -284,6 +292,13 @@ public class GeneralCommandLineTest {
   }
 
   private static void checkEnvPassing(GeneralCommandLine commandLine, Map<String, String> testEnv, boolean passParentEnv) throws Exception {
+    checkEnvPassing(commandLine, testEnv, testEnv, passParentEnv);
+  }
+
+  private static void checkEnvPassing(GeneralCommandLine commandLine,
+                                      Map<String, String> testEnv,
+                                      Map<String, String> expectedOutputEnv,
+                                      boolean passParentEnv) throws Exception {
     commandLine.getEnvironment().putAll(testEnv);
     commandLine.setPassParentEnvironment(passParentEnv);
     String output = execAndGetOutput(commandLine, null);
@@ -291,7 +306,7 @@ public class GeneralCommandLineTest {
     Set<String> lines = new HashSet<String>(Arrays.asList(StringUtil.convertLineSeparators(output).split("\n")));
     lines.remove("=====");
 
-    for (Map.Entry<String, String> entry : testEnv.entrySet()) {
+    for (Map.Entry<String, String> entry : expectedOutputEnv.entrySet()) {
       String str = EnvPassingTest.format(entry);
       assertTrue("\"" + str + "\" should be in " + lines,
                  lines.contains(str));