diff --git a/runner/android_junit_runner/CHANGELOG.md b/runner/android_junit_runner/CHANGELOG.md index 23a5de372..a4d2d2007 100644 --- a/runner/android_junit_runner/CHANGELOG.md +++ b/runner/android_junit_runner/CHANGELOG.md @@ -11,6 +11,8 @@ **New Features** +* Evaluate annotation with @CustomFilter on test class + **Breaking Changes** **API Changes** diff --git a/runner/android_junit_runner/java/androidx/test/internal/runner/TestRequestBuilder.java b/runner/android_junit_runner/java/androidx/test/internal/runner/TestRequestBuilder.java index f837e2946..1c13bf814 100644 --- a/runner/android_junit_runner/java/androidx/test/internal/runner/TestRequestBuilder.java +++ b/runner/android_junit_runner/java/androidx/test/internal/runner/TestRequestBuilder.java @@ -243,6 +243,15 @@ static Suite createSuite(List runners) { } private static class CustomFilters extends AbstractFilter { + + @Override + public boolean shouldRun(Description description) { + if (description.isSuite() && !evaluateTest(description)) { + return false; + } + return super.shouldRun(description); + } + @Override protected boolean evaluateTest(Description description) { Collection allAnnotations = description.getAnnotations(); diff --git a/runner/android_junit_runner/javatests/androidx/test/internal/runner/TestRequestBuilderTest.java b/runner/android_junit_runner/javatests/androidx/test/internal/runner/TestRequestBuilderTest.java index 61b13ba40..62d61b04b 100644 --- a/runner/android_junit_runner/javatests/androidx/test/internal/runner/TestRequestBuilderTest.java +++ b/runner/android_junit_runner/javatests/androidx/test/internal/runner/TestRequestBuilderTest.java @@ -227,6 +227,50 @@ public String describe() { } } + @SampleCustomAnnotationOnClass(runTests = true) + public static class SampleCustomFilterOnClassRunTestsTestClass { + @Test + public void testOneRun() {} + + @Test + public void testTwoRun() {} + } + + @SampleCustomAnnotationOnClass(runTests = false) + public static class SampleCustomFilterOnClassSkipTestsTestClass { + @Test + public void testOneSkip() {} + + @Test + public void testTwoSkip() {} + } + + public static class SampleCustomFilterOnClass extends AbstractFilter { + public SampleCustomFilterOnClass() {} + + @Override + public boolean shouldRun(Description description) { + return evaluateTest(description); + } + + @Override + protected boolean evaluateTest(Description description) { + return description.getAnnotation(SampleCustomAnnotationOnClass.class).runTests(); + } + + @Override + public String describe() { + return "skip all tests in class if runTests is false"; + } + } + + @Retention(RetentionPolicy.RUNTIME) + @Target({ElementType.TYPE}) + @CustomFilter(filterClass = SampleCustomFilterOnClass.class) + public @interface SampleCustomAnnotationOnClass { + boolean runTests() default true; + } + @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @CustomFilter(filterClass = SampleCustomFilter.class) @@ -971,6 +1015,24 @@ public void testCustomFilter() { Assert.assertEquals(1, result.getRunCount()); } + /** Test that {@link CustomFilter} filters the class as appropriate */ + @Test + public void testCustomFilterAnnotation_onClass_runTests() { + Request request = builder.addTestClass(SampleCustomFilterOnClassRunTestsTestClass.class.getName()).build(); + JUnitCore testRunner = new JUnitCore(); + Result result = testRunner.run(request); + Assert.assertEquals(2, result.getRunCount()); + } + + /** Test that {@link CustomFilter} filters the class as appropriate */ + @Test + public void testCustomFilterAnnotation_onClass_skipTests() { + Request request = builder.addTestClass(SampleCustomFilterOnClassSkipTestsTestClass.class.getName()).build(); + JUnitCore testRunner = new JUnitCore(); + Result result = testRunner.run(request); + Assert.assertEquals(0, result.getRunCount()); + } + /** Test that a custom RunnerBuilder is used. */ @Test public void testCustomRunnerBuilder() {