You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ag...@apache.org on 2016/05/17 00:38:45 UTC

[36/50] [abbrv] incubator-geode git commit: GEODE-1350: Provide local fix for Category and Parameterized test issue

GEODE-1350: Provide local fix for Category and Parameterized test issue


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/3124c29a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/3124c29a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/3124c29a

Branch: refs/heads/feature/GEODE-1209
Commit: 3124c29a7b5025cfb953bf3a8ec1e442cb7838b6
Parents: e394294
Author: Jens Deppe <jd...@pivotal.io>
Authored: Wed May 11 08:05:33 2016 -0700
Committer: Anil <ag...@pivotal.io>
Committed: Mon May 16 17:31:56 2016 -0700

----------------------------------------------------------------------
 .../CategoryWithParameterizedRunner.java        |  44 +++++
 .../CategoryWithParameterizedRunnerFactory.java |  42 +++++
 .../junit/runners/ExposedGetAnnotations.java    |  23 +++
 ...egoryWithParameterizedRunnerFactoryTest.java | 161 +++++++++++++++++++
 4 files changed, 270 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/3124c29a/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunner.java
----------------------------------------------------------------------
diff --git a/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunner.java b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunner.java
new file mode 100644
index 0000000..c96951b
--- /dev/null
+++ b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunner.java
@@ -0,0 +1,44 @@
+/*
+ * 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 com.gemstone.gemfire.test.junit.runners;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters;
+import org.junit.runners.parameterized.TestWithParameters;
+
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CategoryWithParameterizedRunner extends BlockJUnit4ClassRunnerWithParameters implements ExposedGetAnnotations {
+  public CategoryWithParameterizedRunner(TestWithParameters test) throws InitializationError {
+    super(test);
+  }
+
+  @Override
+  public Annotation[] getRunnerAnnotations() {
+    Annotation[] allAnnotations = getTestClass().getAnnotations();
+    List<Annotation> annotationsWithoutRunWith = new ArrayList<>();
+    for (Annotation annotation: allAnnotations) {
+      if (!annotation.annotationType().equals(RunWith.class)) {
+        annotationsWithoutRunWith.add(annotation);
+      }
+    }
+    return annotationsWithoutRunWith.toArray(new Annotation[0]);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/3124c29a/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunnerFactory.java
----------------------------------------------------------------------
diff --git a/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunnerFactory.java b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunnerFactory.java
new file mode 100644
index 0000000..84882f0
--- /dev/null
+++ b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunnerFactory.java
@@ -0,0 +1,42 @@
+/*
+ * 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 com.gemstone.gemfire.test.junit.runners;
+
+import org.junit.runner.RunWith;
+import org.junit.runner.Runner;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters;
+import org.junit.runners.parameterized.ParametersRunnerFactory;
+import org.junit.runners.parameterized.TestWithParameters;
+
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class provides an early fix for JUnit issue <a href="https://github.com/junit-team/junit4/issues/751>751</a>.
+ *
+ * Once JUnit 4.13 is released, this class can be removed.
+ *
+ * See also <a href="https://issues.apache.org/jira/browse/GEODE-1350">GEODE-1350</a>
+ */
+public class CategoryWithParameterizedRunnerFactory implements ParametersRunnerFactory {
+  @Override
+  public Runner createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError {
+    return new CategoryWithParameterizedRunner(test);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/3124c29a/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/ExposedGetAnnotations.java
----------------------------------------------------------------------
diff --git a/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/ExposedGetAnnotations.java b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/ExposedGetAnnotations.java
new file mode 100644
index 0000000..f5906f2
--- /dev/null
+++ b/geode-junit/src/main/java/com/gemstone/gemfire/test/junit/runners/ExposedGetAnnotations.java
@@ -0,0 +1,23 @@
+/*
+ * 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 com.gemstone.gemfire.test.junit.runners;
+
+import java.lang.annotation.Annotation;
+
+public interface ExposedGetAnnotations {
+  Annotation[] getRunnerAnnotations();
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/3124c29a/geode-junit/src/test/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunnerFactoryTest.java
----------------------------------------------------------------------
diff --git a/geode-junit/src/test/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunnerFactoryTest.java b/geode-junit/src/test/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunnerFactoryTest.java
new file mode 100644
index 0000000..63a579b
--- /dev/null
+++ b/geode-junit/src/test/java/com/gemstone/gemfire/test/junit/runners/CategoryWithParameterizedRunnerFactoryTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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 com.gemstone.gemfire.test.junit.runners;
+
+import com.gemstone.gemfire.test.junit.categories.UnitTest;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.Description;
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Request;
+import org.junit.runner.Result;
+import org.junit.runner.RunWith;
+import org.junit.runner.Runner;
+import org.junit.runner.manipulation.Filter;
+import org.junit.runners.Parameterized;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters;
+import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParametersFactory;
+import org.junit.runners.parameterized.TestWithParameters;
+
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class CategoryWithParameterizedRunnerFactoryTest {
+
+  /**
+   * So much hacking in order to expose JUnit internals. I have no words...
+   */
+  public static class ExposedBlockJUnit4ClassRunnerWithParameters extends BlockJUnit4ClassRunnerWithParameters implements ExposedGetAnnotations {
+    public ExposedBlockJUnit4ClassRunnerWithParameters(TestWithParameters test) throws InitializationError {
+      super(test);
+    }
+
+    @Override
+    public Annotation[] getRunnerAnnotations() {
+      return super.getRunnerAnnotations();
+    }
+  }
+
+  public static class ExposedBlockJUnit4ClassRunnerWithParametersFactory extends
+      BlockJUnit4ClassRunnerWithParametersFactory {
+    public Runner createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError {
+      return new ExposedBlockJUnit4ClassRunnerWithParameters(test);
+    }
+  }
+
+  public static class ExposedParameterized extends Parameterized {
+    public ExposedParameterized(Class<?> klass) throws Throwable {
+      super(klass);
+    }
+
+    @Override
+    protected List<Runner> getChildren() {
+      return super.getChildren();
+    }
+  }
+
+  @Category(UnitTest.class)
+  @RunWith(ExposedParameterized.class)
+  @Parameterized.UseParametersRunnerFactory(ExposedBlockJUnit4ClassRunnerWithParametersFactory.class)
+  public static class BrokenCategoryClass {
+    @Parameterized.Parameters
+    public static Iterable<String> getParams() {
+      return Arrays.asList("one", "two");
+    }
+
+    @Parameterized.Parameter
+    public String value;
+
+    @Test
+    public void insanity() {
+      assertTrue(true);
+    }
+  }
+
+  @Category(UnitTest.class)
+  @RunWith(ExposedParameterized.class)
+  @Parameterized.UseParametersRunnerFactory(CategoryWithParameterizedRunnerFactory.class)
+  public static class WorkingCategoryClass {
+    @Parameterized.Parameters
+    public static Iterable<String> getParams() {
+      return Arrays.asList("one", "two");
+    }
+
+    @Parameterized.Parameter
+    public String value;
+
+    @Test
+    public void insanity() {
+      assertTrue(true);
+    }
+  }
+
+  @Test
+  public void testBrokenCategoryAndParameterized() {
+    Request request = Request.aClass(BrokenCategoryClass.class);
+    ExposedParameterized runner = (ExposedParameterized) request.getRunner();
+    request = request.filterWith(new CategoryFilter((ExposedBlockJUnit4ClassRunnerWithParameters) runner.getChildren().get(0)));
+    Result result = new JUnitCore().run(request);
+    assertEquals("Yeah!! This might actually mean we've upgraded to JUnit 4.13. Hurry up already and delete this hack.", 1, result.getRunCount());
+  }
+
+  @Test
+  public void testWorkingCategoryAndParameterized() {
+    Request request = Request.aClass(WorkingCategoryClass.class);
+    ExposedParameterized runner = (ExposedParameterized) request.getRunner();
+    request = request.filterWith(new CategoryFilter((ExposedGetAnnotations) runner.getChildren().get(0)));
+    Result result = new JUnitCore().run(request);
+    assertEquals(2, result.getRunCount());
+  }
+
+  public static class CategoryFilter extends Filter {
+
+    private ExposedGetAnnotations runner;
+
+    public CategoryFilter(ExposedGetAnnotations runner) {
+      this.runner = runner;
+    }
+
+    @Override
+    public boolean shouldRun(Description description) {
+      if (description.getChildren().size() == 0) {
+        return true;
+      }
+
+      List<Annotation> runnerAnnotations = new ArrayList<>();
+      Collections.addAll(runnerAnnotations, runner.getRunnerAnnotations());
+      for (Annotation a : description.getAnnotations()) {
+        if (runnerAnnotations.contains(a)) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    @Override
+    public String describe() {
+      return CategoryFilter.class.getSimpleName();
+    }
+  }
+}