You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2018/03/16 22:13:49 UTC

[geode] 03/08: GEODE-4789: upgrade system-rules from 1.16.1 to 1.17.1

This is an automated email from the ASF dual-hosted git repository.

klund pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git

commit ae25c7b8f8db29f498c9c064a340d39200639209
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Wed Mar 14 14:48:01 2018 -0700

    GEODE-4789: upgrade system-rules from 1.16.1 to 1.17.1
    
    Make DistributedRestoreSystemProperties delegate to RestoreSystemProperties
---
 .../rules/DistributedRestoreSystemProperties.java  |  68 +++++-----
 ...utedRestoreSystemPropertiesDistributedTest.java | 138 +++++++++++++++++++++
 .../DistributedRestoreSystemPropertiesTest.java    |  56 +++++++++
 geode-junit/build.gradle                           |   3 +
 .../AccessibleRestoreSystemProperties.java         |  33 +++++
 .../geode/test/junit/runners/TestRunner.java       |  20 +++
 gradle/dependency-versions.properties              |   2 +-
 7 files changed, 287 insertions(+), 33 deletions(-)

diff --git a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/DistributedRestoreSystemProperties.java b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/DistributedRestoreSystemProperties.java
index 592fe05..2fcf128 100755
--- a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/DistributedRestoreSystemProperties.java
+++ b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/DistributedRestoreSystemProperties.java
@@ -14,26 +14,26 @@
  */
 package org.apache.geode.test.dunit.rules;
 
-import static java.lang.System.*;
+import static org.apache.geode.test.dunit.Host.getHost;
+import static org.assertj.core.api.Assertions.assertThat;
 
-import java.util.Properties;
-
-import org.junit.contrib.java.lang.system.RestoreSystemProperties;
-
-import org.apache.geode.test.dunit.SerializableRunnable;
+import org.apache.geode.test.junit.rules.accessible.AccessibleRestoreSystemProperties;
 import org.apache.geode.test.junit.rules.serializable.SerializableTestRule;
 
 /**
  * Distributed version of RestoreSystemProperties which affects all DUnit JVMs including the Locator
  * JVM.
  */
-public class DistributedRestoreSystemProperties extends RestoreSystemProperties
+public class DistributedRestoreSystemProperties extends AccessibleRestoreSystemProperties
     implements SerializableTestRule {
 
-  private static volatile Properties originalProperties;
+  private static final AccessibleRestoreSystemProperties restoreSystemProperties =
+      new AccessibleRestoreSystemProperties();
 
   private final RemoteInvoker invoker;
 
+  private volatile int beforeVmCount;
+
   public DistributedRestoreSystemProperties() {
     this(new RemoteInvoker());
   }
@@ -45,35 +45,39 @@ public class DistributedRestoreSystemProperties extends RestoreSystemProperties
 
   @Override
   public void before() throws Throwable {
-    super.before();
-    this.invoker.invokeInEveryVMAndController(new SerializableRunnable() {
-      @Override
-      public void run() {
-        if (originalProperties == null) {
-          originalProperties = getProperties();
-          setProperties(copyOf(originalProperties));
-        }
-      }
-    });
-  }
+    beforeVmCount = getVMCount();
 
-  private Properties copyOf(Properties source) {
-    Properties copy = new Properties();
-    copy.putAll(source);
-    return copy;
+    invoker.invokeInEveryVMAndController(() -> invokeBefore());
   }
 
   @Override
   public void after() {
-    super.after();
-    this.invoker.invokeInEveryVMAndController(new SerializableRunnable() {
-      @Override
-      public void run() {
-        if (originalProperties != null) {
-          setProperties(originalProperties);
-          originalProperties = null;
-        }
+    int afterVmCount = getVMCount();
+    assertThat(afterVmCount).isEqualTo(beforeVmCount);
+
+    invoker.invokeInEveryVMAndController(() -> invokeAfter());
+  }
+
+  private void invokeBefore() throws Exception {
+    try {
+      restoreSystemProperties.before();
+    } catch (Throwable throwable) {
+      if (throwable instanceof Exception) {
+        throw (Exception) throwable;
       }
-    });
+      throw new RuntimeException(throwable);
+    }
+  }
+
+  private void invokeAfter() {
+    restoreSystemProperties.after();
+  }
+
+  private int getVMCount() {
+    try {
+      return getHost(0).getVMCount();
+    } catch (IllegalArgumentException e) {
+      throw new IllegalStateException("DUnit VMs have not been launched");
+    }
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/tests/DistributedRestoreSystemPropertiesDistributedTest.java b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/tests/DistributedRestoreSystemPropertiesDistributedTest.java
new file mode 100644
index 0000000..5179644
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/tests/DistributedRestoreSystemPropertiesDistributedTest.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.test.dunit.rules.tests;
+
+import static org.apache.geode.test.dunit.Host.getHost;
+import static org.apache.geode.test.junit.runners.TestRunner.runTestWithValidation;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.Serializable;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.test.dunit.rules.DistributedRestoreSystemProperties;
+import org.apache.geode.test.dunit.rules.DistributedTestRule;
+import org.apache.geode.test.junit.categories.DistributedTest;
+
+@Category(DistributedTest.class)
+public class DistributedRestoreSystemPropertiesDistributedTest {
+
+  private static final String NULL_PROPERTY = "NULL_PROPERTY";
+  private static final String PREEXISTING_PROPERTY = "PREEXISTING_PROPERTY";
+  private static final String PREEXISTING_VALUE = "PREEXISTING_VALUE";
+
+  @ClassRule
+  public static DistributedTestRule distributedTestRule = new DistributedTestRule();
+
+  @BeforeClass
+  public static void assertPreconditions() {
+    assertThat(System.getProperty(NULL_PROPERTY)).isNull();
+    assertThat(System.getProperty(PREEXISTING_PROPERTY)).isNull();
+    for (int i = 0; i < 4; i++) {
+      getHost(0).getVM(i).invoke(() -> {
+        assertThat(System.getProperty(NULL_PROPERTY)).isNull();
+        assertThat(System.getProperty(PREEXISTING_PROPERTY)).isNull();
+      });
+    }
+  }
+
+  @Before
+  public void setUp() {
+    System.setProperty(PREEXISTING_PROPERTY, PREEXISTING_VALUE);
+    for (int i = 0; i < 4; i++) {
+      getHost(0).getVM(i).invoke(() -> {
+        System.setProperty(PREEXISTING_PROPERTY, PREEXISTING_VALUE);
+      });
+    }
+  }
+
+  @After
+  public void tearDown() {
+    System.clearProperty(PREEXISTING_PROPERTY);
+    for (int i = 0; i < 4; i++) {
+      getHost(0).getVM(i).invoke(() -> {
+        System.clearProperty(PREEXISTING_PROPERTY);
+      });
+    }
+  }
+
+  @Test
+  public void nullPropertyWithDifferentValues() throws Exception {
+    runTestWithValidation(NullPropertyWithDifferentValues.class);
+
+    assertThat(System.getProperty(NULL_PROPERTY)).isNull();
+    for (int i = 0; i < 4; i++) {
+      getHost(0).getVM(i).invoke(() -> {
+        assertThat(System.getProperty(NULL_PROPERTY)).isNull();
+      });
+    }
+  }
+
+  @Test
+  public void preexistingPropertyWithDifferentValues() throws Exception {
+    runTestWithValidation(NullPropertyWithDifferentValues.class);
+
+    assertThat(System.getProperty(PREEXISTING_PROPERTY)).isEqualTo(PREEXISTING_VALUE);
+    for (int i = 0; i < 4; i++) {
+      getHost(0).getVM(i).invoke(() -> {
+        assertThat(System.getProperty(PREEXISTING_PROPERTY)).isEqualTo(PREEXISTING_VALUE);
+      });
+    }
+  }
+
+  /**
+   * Used by test {@link #nullPropertyWithDifferentValues()}.
+   */
+  public static class NullPropertyWithDifferentValues implements Serializable {
+
+    @Rule
+    public DistributedRestoreSystemProperties restoreSystemProperties =
+        new DistributedRestoreSystemProperties();
+
+    @Test
+    public void nullPropertyWithDifferentValues() throws Exception {
+      System.setProperty(NULL_PROPERTY, "controller");
+      getHost(0).getVM(0).invoke(() -> System.setProperty(NULL_PROPERTY, "vm0"));
+      getHost(0).getVM(1).invoke(() -> System.setProperty(NULL_PROPERTY, "vm1"));
+      getHost(0).getVM(2).invoke(() -> System.setProperty(NULL_PROPERTY, "vm2"));
+      getHost(0).getVM(3).invoke(() -> System.setProperty(NULL_PROPERTY, "vm3"));
+    }
+  }
+
+  /**
+   * Used by test {@link #preexistingPropertyWithDifferentValues()}.
+   */
+  public static class PreexistingPropertyWithDifferentValues implements Serializable {
+
+    @Rule
+    public DistributedRestoreSystemProperties restoreSystemProperties =
+        new DistributedRestoreSystemProperties();
+
+    @Test
+    public void preexistingPropertyWithDifferentValues() throws Exception {
+      System.setProperty(PREEXISTING_PROPERTY, "controller");
+      getHost(0).getVM(0).invoke(() -> System.setProperty(PREEXISTING_PROPERTY, "vm0"));
+      getHost(0).getVM(1).invoke(() -> System.setProperty(PREEXISTING_PROPERTY, "vm1"));
+      getHost(0).getVM(2).invoke(() -> System.setProperty(PREEXISTING_PROPERTY, "vm2"));
+      getHost(0).getVM(3).invoke(() -> System.setProperty(PREEXISTING_PROPERTY, "vm3"));
+    }
+  }
+}
diff --git a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/tests/DistributedRestoreSystemPropertiesTest.java b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/tests/DistributedRestoreSystemPropertiesTest.java
new file mode 100644
index 0000000..01793e9
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/tests/DistributedRestoreSystemPropertiesTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.test.dunit.rules.tests;
+
+import static org.apache.geode.test.junit.runners.TestRunner.runTestWithExpectedFailure;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.notification.Failure;
+
+import org.apache.geode.test.dunit.rules.DistributedRestoreSystemProperties;
+import org.apache.geode.test.junit.categories.UnitTest;
+
+@Category(UnitTest.class)
+public class DistributedRestoreSystemPropertiesTest {
+
+  @Test
+  public void withoutDUnitThrowsIllegalStateException() {
+    Failure failure = runTestWithExpectedFailure(WithoutDUnit.class);
+    assertThat(failure.getException()).isInstanceOf(IllegalStateException.class);
+    assertThat(failure.getMessage()).isEqualTo("DUnit VMs have not been launched");
+  }
+
+  @Test
+  public void isaRestoreSystemProperties() {
+    assertThat(new DistributedRestoreSystemProperties())
+        .isInstanceOf(RestoreSystemProperties.class);
+  }
+
+  public static class WithoutDUnit {
+
+    @Rule
+    public DistributedRestoreSystemProperties restoreSystemProperties =
+        new DistributedRestoreSystemProperties();
+
+    @Test
+    public void doTest() {
+      // nothing
+    }
+  }
+}
diff --git a/geode-junit/build.gradle b/geode-junit/build.gradle
index 7a7cb5e..9b7ba68 100755
--- a/geode-junit/build.gradle
+++ b/geode-junit/build.gradle
@@ -16,6 +16,9 @@
  */
 
 dependencies {
+  compile ('com.github.stefanbirkner:system-rules:' + project.'system-rules.version') {
+    exclude module: 'junit-dep'
+  }
   compile 'com.jayway.jsonpath:json-path:' + project.'json-path.version'
   testCompile 'commons-lang:commons-lang:' + project.'commons-lang.version'
   testCompile 'com.google.guava:guava:' + project.'guava.version'
diff --git a/geode-junit/src/main/java/org/apache/geode/test/junit/rules/accessible/AccessibleRestoreSystemProperties.java b/geode-junit/src/main/java/org/apache/geode/test/junit/rules/accessible/AccessibleRestoreSystemProperties.java
new file mode 100644
index 0000000..50f91f0
--- /dev/null
+++ b/geode-junit/src/main/java/org/apache/geode/test/junit/rules/accessible/AccessibleRestoreSystemProperties.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.test.junit.rules.accessible;
+
+import org.junit.contrib.java.lang.system.RestoreSystemProperties;
+
+/**
+ * Subclass RestoreSystemProperties in order to invoke protected methods from different package.
+ */
+public class AccessibleRestoreSystemProperties extends RestoreSystemProperties {
+
+  @Override
+  public void before() throws Throwable {
+    super.before();
+  }
+
+  @Override
+  public void after() {
+    super.after();
+  }
+}
diff --git a/geode-junit/src/main/java/org/apache/geode/test/junit/runners/TestRunner.java b/geode-junit/src/main/java/org/apache/geode/test/junit/runners/TestRunner.java
index 6d31f78..ca8a23f 100755
--- a/geode-junit/src/main/java/org/apache/geode/test/junit/runners/TestRunner.java
+++ b/geode-junit/src/main/java/org/apache/geode/test/junit/runners/TestRunner.java
@@ -49,4 +49,24 @@ public class TestRunner {
 
     return result;
   }
+
+  public static Failure runTestWithExpectedFailure(final Class<?> test) {
+    JUnitCore junitCore = new JUnitCore();
+    Result result = junitCore.run(Request.aClass(test).getRunner());
+
+    List<Failure> failures = result.getFailures();
+    assertThat(failures).hasSize(1);
+
+    return failures.get(0);
+  }
+
+  public static List<Failure> runTestWithExpectedFailures(final Class<?> test) {
+    JUnitCore junitCore = new JUnitCore();
+    Result result = junitCore.run(Request.aClass(test).getRunner());
+
+    List<Failure> failures = result.getFailures();
+    assertThat(failures).isNotEmpty();
+
+    return failures;
+  }
 }
diff --git a/gradle/dependency-versions.properties b/gradle/dependency-versions.properties
index e65d709..40cda59 100644
--- a/gradle/dependency-versions.properties
+++ b/gradle/dependency-versions.properties
@@ -94,7 +94,7 @@ springframework.version = 4.3.14.RELEASE
 spymemcached.version = 2.12.2
 springfox.version=2.8.0
 stephenc-findbugs.version = 1.3.9-1
-system-rules.version = 1.16.1
+system-rules.version = 1.17.1
 tempus-fugit.version = 1.1
 tomcat6.version = 6.0.37
 tomcat7.version = 7.0.73

-- 
To stop receiving notification emails like this one, please contact
klund@apache.org.