You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dw...@apache.org on 2012/03/22 21:30:18 UTC

svn commit: r1304032 - in /lucene/dev/branches/branch_3x/lucene: core/src/test/org/apache/lucene/util/junitcompat/ test-framework/src/java/org/apache/lucene/util/

Author: dweiss
Date: Thu Mar 22 20:30:18 2012
New Revision: 1304032

URL: http://svn.apache.org/viewvc?rev=1304032&view=rev
Log:
LUCENE-3847: ignore user.timezone because it is set by java logging system and this is hard to predict.

Modified:
    lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/util/junitcompat/TestSystemPropertiesInvariantRule.java
    lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
    lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesInvariantRule.java
    lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesRestoreRule.java

Modified: lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/util/junitcompat/TestSystemPropertiesInvariantRule.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/util/junitcompat/TestSystemPropertiesInvariantRule.java?rev=1304032&r1=1304031&r2=1304032&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/util/junitcompat/TestSystemPropertiesInvariantRule.java (original)
+++ lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/util/junitcompat/TestSystemPropertiesInvariantRule.java Thu Mar 22 20:30:18 2012
@@ -20,11 +20,18 @@ package org.apache.lucene.util.junitcomp
 import java.util.Properties;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.SystemPropertiesInvariantRule;
+import org.apache.lucene.util.SystemPropertiesRestoreRule;
 import org.junit.*;
+import org.junit.rules.TestRule;
 import org.junit.runner.JUnitCore;
 import org.junit.runner.Result;
 import org.junit.runner.notification.Failure;
 
+/**
+ * @see SystemPropertiesRestoreRule
+ * @see SystemPropertiesInvariantRule
+ */
 public class TestSystemPropertiesInvariantRule extends WithNestedTests {
   public static final String PROP_KEY1 = "new-property-1";
   public static final String VALUE1 = "new-value-1";
@@ -85,6 +92,16 @@ public class TestSystemPropertiesInvaria
     }
   }
 
+  public static class IgnoredProperty {
+    @Rule
+    public TestRule invariant = new SystemPropertiesInvariantRule(PROP_KEY1);
+
+    @Test
+    public void testMethod1() {
+      System.setProperty(PROP_KEY1, VALUE1);
+    }
+  }
+
   @Test
   public void testRuleInvariantBeforeClass() {
     Result runClasses = JUnitCore.runClasses(InBeforeClass.class);
@@ -120,4 +137,16 @@ public class TestSystemPropertiesInvaria
     Assert.assertTrue(runClasses.getFailures().get(0).getMessage().contains("Will pass"));
     Assert.assertEquals(3, runClasses.getRunCount());
   }
+  
+  @Test
+  public void testIgnoredProperty() {
+    System.clearProperty(PROP_KEY1);
+    try {
+      Result runClasses = JUnitCore.runClasses(IgnoredProperty.class);
+      Assert.assertEquals(0, runClasses.getFailureCount());
+      Assert.assertEquals(VALUE1, System.getProperty(PROP_KEY1));
+    } finally {
+      System.clearProperty(PROP_KEY1);
+    }
+  }
 }

Modified: lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java?rev=1304032&r1=1304031&r2=1304032&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java (original)
+++ lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java Thu Mar 22 20:30:18 2012
@@ -223,13 +223,23 @@ public abstract class LuceneTestCase ext
   private static final UncaughtExceptionsRule uncaughtExceptionsRule = new UncaughtExceptionsRule(null); 
 
   /**
+   * These property keys will be ignored in verification of altered properties.
+   * @see SystemPropertiesInvariantRule
+   * @see #ruleChain
+   * @see #classRules
+   */
+  private static final String [] ignoredInvariantProperties = {
+    "user.timezone"
+  };
+  
+  /**
    * This controls how suite-level rules are nested. It is important that _all_ rules declared
    * in {@link LuceneTestCase} are executed in proper order if they depend on each 
    * other.
    */
   @ClassRule
   public static TestRule classRules = RuleChain
-    .outerRule(new SystemPropertiesInvariantRule())
+    .outerRule(new SystemPropertiesInvariantRule(ignoredInvariantProperties))
     .around(classNameRule)
     .around(uncaughtExceptionsRule);
 
@@ -243,7 +253,7 @@ public abstract class LuceneTestCase ext
     .outerRule(new RememberThreadRule())
     .around(new UncaughtExceptionsRule(this))
     .around(new TestResultInterceptorRule())
-    .around(new SystemPropertiesInvariantRule())
+    .around(new SystemPropertiesInvariantRule(ignoredInvariantProperties))
     .around(new InternalSetupTeardownRule())
     .around(new SubclassSetupTeardownRule());
 

Modified: lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesInvariantRule.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesInvariantRule.java?rev=1304032&r1=1304031&r2=1304032&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesInvariantRule.java (original)
+++ lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesInvariantRule.java Thu Mar 22 20:30:18 2012
@@ -18,7 +18,11 @@ package org.apache.lucene.util;
  */
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
 
@@ -28,6 +32,32 @@ import org.junit.runners.model.MultipleF
 import org.junit.runners.model.Statement;
 
 public class SystemPropertiesInvariantRule implements TestRule {
+  /**
+   * Ignored property keys.
+   */
+  private final HashSet<String> ignoredProperties;
+
+  /**
+   * Cares about all properties. 
+   */
+  public SystemPropertiesInvariantRule() {
+    this(Collections.<String>emptySet());
+  }
+
+  /**
+   * Don't care about the given set of properties. 
+   */
+  public SystemPropertiesInvariantRule(String... ignoredProperties) {
+    this.ignoredProperties = new HashSet<String>(Arrays.asList(ignoredProperties));
+  }
+
+  /**
+   * Don't care about the given set of properties. 
+   */
+  public SystemPropertiesInvariantRule(Set<String> ignoredProperties) {
+    this.ignoredProperties = new HashSet<String>(ignoredProperties);
+  }
+
   public Statement apply(final Statement s, Description d) {
     return new Statement() {
       public void evaluate() throws Throwable {
@@ -38,7 +68,12 @@ public class SystemPropertiesInvariantRu
         } catch (Throwable t) {
           errors.add(t);
         } finally {
-          TreeMap<String,String> after = SystemPropertiesRestoreRule.cloneAsMap(System.getProperties());
+          final TreeMap<String,String> after = SystemPropertiesRestoreRule.cloneAsMap(System.getProperties());
+
+          // Remove ignored if they exist.
+          before.keySet().removeAll(ignoredProperties);
+          after.keySet().removeAll(ignoredProperties);
+
           if (!after.equals(before)) {
             errors.add(
                 new AssertionError("System properties invariant violated.\n" + 
@@ -46,7 +81,7 @@ public class SystemPropertiesInvariantRu
           }
 
           // Restore original properties.
-          SystemPropertiesRestoreRule.restore(before, after);
+          SystemPropertiesRestoreRule.restore(before, after, ignoredProperties);
         }
 
         MultipleFailureException.assertEmpty(errors);

Modified: lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesRestoreRule.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesRestoreRule.java?rev=1304032&r1=1304031&r2=1304032&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesRestoreRule.java (original)
+++ lucene/dev/branches/branch_3x/lucene/test-framework/src/java/org/apache/lucene/util/SystemPropertiesRestoreRule.java Thu Mar 22 20:30:18 2012
@@ -27,6 +27,32 @@ import org.junit.runners.model.Statement
  * Restore system properties from before the nested {@link Statement}.
  */
 public class SystemPropertiesRestoreRule implements TestRule {
+  /**
+   * Ignored property keys.
+   */
+  private final HashSet<String> ignoredProperties;
+
+  /**
+   * Restores all properties.
+   */
+  public SystemPropertiesRestoreRule() {
+    this(Collections.<String>emptySet());
+  }
+
+  /**
+   * @param ignoredProperties Properties that will be ignored (and will not be restored).
+   */
+  public SystemPropertiesRestoreRule(Set<String> ignoredProperties) {
+    this.ignoredProperties = new HashSet<String>(ignoredProperties);
+  }
+
+  /**
+   * @param ignoredProperties Properties that will be ignored (and will not be restored).
+   */
+  public SystemPropertiesRestoreRule(String... ignoredProperties) {
+    this.ignoredProperties = new HashSet<String>(Arrays.asList(ignoredProperties));
+  }
+
   public Statement apply(final Statement s, Description d) {
     return new Statement() {
       public void evaluate() throws Throwable {
@@ -37,7 +63,7 @@ public class SystemPropertiesRestoreRule
           TreeMap<String,String> after = cloneAsMap(System.getProperties());
           if (!after.equals(before)) {
             // Restore original properties.
-            restore(before, after);
+            restore(before, after, ignoredProperties);
           }
         }
       }
@@ -67,16 +93,25 @@ public class SystemPropertiesRestoreRule
 
   static void restore(
       TreeMap<String,String> before,
-      TreeMap<String,String> after) {
+      TreeMap<String,String> after,
+      Set<String> ignoredKeys) {
+
+    // Clear anything that is present after but wasn't before.
     after.keySet().removeAll(before.keySet());
     for (String key : after.keySet()) {
-      System.clearProperty(key);
+      if (!ignoredKeys.contains(key))
+        System.clearProperty(key);
     }
+
+    // Restore original property values unless they are ignored (then leave).
     for (Map.Entry<String,String> e : before.entrySet()) {
-      if (e.getValue() == null) {
-        System.clearProperty(e.getKey()); // Can this happen?
-      } else {
-        System.setProperty(e.getKey(), e.getValue());
+      String key = e.getValue();
+      if (!ignoredKeys.contains(key)) {
+        if (key == null) {
+          System.clearProperty(e.getKey()); // Can this happen?
+        } else {
+          System.setProperty(e.getKey(), key);
+        }
       }
     }
   }