[test-utils] cleanup and improve method to set the environment

- introduced parameter to update or overwrite the environment
- make Windows-specific code explicit
- avoid duplicate update of environment map


Project: http://git-wip-us.apache.org/repos/asf/flink/repo
Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/8d7c3ff0
Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/8d7c3ff0
Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/8d7c3ff0

Branch: refs/heads/master
Commit: 8d7c3ff087ac1390e6da0054ec55974258b6b78c
Parents: 230bf17
Author: Maximilian Michels <[email protected]>
Authored: Mon Dec 5 19:23:32 2016 +0100
Committer: Maximilian Michels <[email protected]>
Committed: Tue Dec 6 00:29:57 2016 +0100

----------------------------------------------------------------------
 .../flink/core/testutils/CommonTestUtils.java   | 52 ++++++++++----------
 1 file changed, 26 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flink/blob/8d7c3ff0/flink-test-utils-parent/flink-test-utils-junit/src/main/java/org/apache/flink/core/testutils/CommonTestUtils.java
----------------------------------------------------------------------
diff --git 
a/flink-test-utils-parent/flink-test-utils-junit/src/main/java/org/apache/flink/core/testutils/CommonTestUtils.java
 
b/flink-test-utils-parent/flink-test-utils-junit/src/main/java/org/apache/flink/core/testutils/CommonTestUtils.java
index 45c5a77..2eb18c1 100644
--- 
a/flink-test-utils-parent/flink-test-utils-junit/src/main/java/org/apache/flink/core/testutils/CommonTestUtils.java
+++ 
b/flink-test-utils-parent/flink-test-utils-junit/src/main/java/org/apache/flink/core/testutils/CommonTestUtils.java
@@ -30,7 +30,6 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.lang.reflect.Field;
-import java.util.Collections;
 import java.util.Map;
 
 import static org.junit.Assert.fail;
@@ -118,37 +117,38 @@ public class CommonTestUtils {
                }
        }
 
-       // This code is taken from: http://stackoverflow.com/a/7201825/568695
+       public static void setEnv(Map<String, String> newenv) {
+               setEnv(newenv, true);
+       }
+
+       // This code is taken slightly modified from: 
http://stackoverflow.com/a/7201825/568695
        // it changes the environment variables of this JVM. Use only for 
testing purposes!
        @SuppressWarnings("unchecked")
-       public static void setEnv(Map<String, String> newenv) {
+       public static void setEnv(Map<String, String> newenv, boolean 
clearExisting) {
                try {
+                       Map<String, String> env = System.getenv();
+                       Class<?> clazz = env.getClass();
+                       Field field = clazz.getDeclaredField("m");
+                       field.setAccessible(true);
+                       Map<String, String> map = (Map<String, String>) 
field.get(env);
+                       if (clearExisting) {
+                               map.clear();
+                       }
+                       map.putAll(newenv);
+
+                       // only for Windows
                        Class<?> processEnvironmentClass = 
Class.forName("java.lang.ProcessEnvironment");
-                       Field theEnvironmentField = 
processEnvironmentClass.getDeclaredField("theEnvironment");
-                       theEnvironmentField.setAccessible(true);
-                       Map<String, String> env = (Map<String, String>) 
theEnvironmentField.get(null);
-                       env.putAll(newenv);
-                       Field theCaseInsensitiveEnvironmentField = 
processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment");
-                       theCaseInsensitiveEnvironmentField.setAccessible(true);
-                       Map<String, String> cienv = (Map<String, String>) 
theCaseInsensitiveEnvironmentField.get(null);
-                       cienv.putAll(newenv);
-               } catch (NoSuchFieldException e) {
                        try {
-                               Class<?>[] classes = 
Collections.class.getDeclaredClasses();
-                               Map<String, String> env = System.getenv();
-                               for (Class<?> cl : classes) {
-                                       if 
("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
-                                               Field field = 
cl.getDeclaredField("m");
-                                               field.setAccessible(true);
-                                               Object obj = field.get(env);
-                                               Map<String, String> map = 
(Map<String, String>) obj;
-                                               map.clear();
-                                               map.putAll(newenv);
-                                       }
+                               Field theCaseInsensitiveEnvironmentField =
+                                       
processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment");
+                               
theCaseInsensitiveEnvironmentField.setAccessible(true);
+                               Map<String, String> cienv = (Map<String, 
String>) theCaseInsensitiveEnvironmentField.get(null);
+                               if (clearExisting) {
+                                       cienv.clear();
                                }
-                       } catch (Exception e2) {
-                               throw new RuntimeException(e2);
-                       }
+                               cienv.putAll(newenv);
+                       } catch (NoSuchFieldException ignored) {}
+
                } catch (Exception e1) {
                        throw new RuntimeException(e1);
                }

Reply via email to