/*
* 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.runners;
import org.apache.geode.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;
@Category(UnitTest.class)
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();
}
}
}