Skip to content

Commit 1029290

Browse files
author
David Saff
committed
Merge pull request #764 from ferstl/classrule-in-public-class
Verify that all (base-) classes declaring @classrules are public
2 parents 0cc4039 + 9fbafd6 commit 1029290

File tree

5 files changed

+47
-10
lines changed

5 files changed

+47
-10
lines changed

src/main/java/org/junit/internal/runners/rules/RuleFieldValidator.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.junit.internal.runners.rules;
22

33
import java.lang.annotation.Annotation;
4+
import java.lang.reflect.Modifier;
45
import java.util.List;
56

67
import org.junit.ClassRule;
@@ -70,13 +71,19 @@ public void validate(TestClass target, List<Throwable> errors) {
7071
}
7172

7273
private void validateMember(FrameworkMember<?> member, List<Throwable> errors) {
74+
validatePublicClass(member, errors);
7375
validateStatic(member, errors);
7476
validatePublic(member, errors);
7577
validateTestRuleOrMethodRule(member, errors);
7678
}
79+
80+
private void validatePublicClass(FrameworkMember<?> member, List<Throwable> errors) {
81+
if (fStaticMembers && !isDeclaringClassPublic(member)) {
82+
addError(errors, member, " must be declared in a public class.");
83+
}
84+
}
7785

78-
private void validateStatic(FrameworkMember<?> member,
79-
List<Throwable> errors) {
86+
private void validateStatic(FrameworkMember<?> member, List<Throwable> errors) {
8087
if (fStaticMembers && !member.isStatic()) {
8188
addError(errors, member, "must be static.");
8289
}
@@ -100,11 +107,14 @@ private void validateTestRuleOrMethodRule(FrameworkMember<?> member,
100107
}
101108
}
102109

110+
private boolean isDeclaringClassPublic(FrameworkMember<?> member) {
111+
return Modifier.isPublic(member.getDeclaringClass().getModifiers());
112+
}
113+
103114
private boolean isTestRule(FrameworkMember<?> member) {
104115
return TestRule.class.isAssignableFrom(member.getType());
105116
}
106117

107-
@SuppressWarnings("deprecation")
108118
private boolean isMethodRule(FrameworkMember<?> member) {
109119
return MethodRule.class.isAssignableFrom(member.getType());
110120
}

src/main/java/org/junit/runners/model/FrameworkField.java

+5
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public Field getField() {
6161
public Class<?> getType() {
6262
return fField.getType();
6363
}
64+
65+
@Override
66+
public Class<?> getDeclaringClass() {
67+
return fField.getDeclaringClass();
68+
}
6469

6570
/**
6671
* Attempts to retrieve the value of this field on {@code target}

src/main/java/org/junit/runners/model/FrameworkMember.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*/
1111
public abstract class FrameworkMember<T extends FrameworkMember<T>> {
1212
/**
13-
* Returns the annotations on this method
13+
* Returns the annotations on this member
1414
*/
1515
abstract Annotation[] getAnnotations();
1616

@@ -32,4 +32,6 @@ boolean isShadowedBy(List<T> members) {
3232
public abstract String getName();
3333

3434
public abstract Class<?> getType();
35+
36+
public abstract Class<?> getDeclaringClass();
3537
}

src/main/java/org/junit/runners/model/FrameworkMethod.java

+13-5
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,14 @@ public void validatePublicVoidNoArg(boolean isStatic, List<Throwable> errors) {
8484
* <li>is not static (given {@code isStatic is true}).
8585
*/
8686
public void validatePublicVoid(boolean isStatic, List<Throwable> errors) {
87-
if (Modifier.isStatic(fMethod.getModifiers()) != isStatic) {
87+
if (isStatic() != isStatic) {
8888
String state = isStatic ? "should" : "should not";
8989
errors.add(new Exception("Method " + fMethod.getName() + "() " + state + " be static"));
9090
}
91-
if (!Modifier.isPublic(fMethod.getDeclaringClass().getModifiers())) {
92-
errors.add(new Exception("Class " + fMethod.getDeclaringClass().getName() + " should be public"));
91+
if (!Modifier.isPublic(getDeclaringClass().getModifiers())) {
92+
errors.add(new Exception("Class " + getDeclaringClass().getName() + " should be public"));
9393
}
94-
if (!Modifier.isPublic(fMethod.getModifiers())) {
94+
if (!isPublic()) {
9595
errors.add(new Exception("Method " + fMethod.getName() + "() should be public"));
9696
}
9797
if (fMethod.getReturnType() != Void.TYPE) {
@@ -130,6 +130,14 @@ public Class<?> getType() {
130130
return getReturnType();
131131
}
132132

133+
/**
134+
* Returns the class where the method is actually declared
135+
*/
136+
@Override
137+
public Class<?> getDeclaringClass() {
138+
return fMethod.getDeclaringClass();
139+
}
140+
133141
public void validateNoTypeParametersOnArgs(List<Throwable> errors) {
134142
new NoGenericTypeParametersValidator(fMethod).validate(errors);
135143
}
@@ -197,7 +205,7 @@ public Annotation[] getAnnotations() {
197205
public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
198206
return fMethod.getAnnotation(annotationType);
199207
}
200-
208+
201209
public List<ParameterSignature> getParameterSignatures() {
202210
return ParameterSignature.signatures(fMethod);
203211
}

src/test/java/org/junit/tests/experimental/rules/RuleFieldValidatorTest.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@ public static class TestWithNonStaticClassRule {
4747
public TestRule temporaryFolder = new TemporaryFolder();
4848
}
4949

50+
@Test
51+
public void rejectClassRuleInNonPublicClass() {
52+
TestClass target = new TestClass(NonPublicTestWithClassRule.class);
53+
CLASS_RULE_VALIDATOR.validate(target, errors);
54+
assertOneErrorWithMessage("The @ClassRule 'temporaryFolder' must be declared in a public class.");
55+
}
56+
57+
static class NonPublicTestWithClassRule {
58+
@ClassRule
59+
public static TestRule temporaryFolder = new TemporaryFolder();
60+
}
61+
5062
@Test
5163
public void acceptNonStaticTestRule() {
5264
TestClass target = new TestClass(TestWithNonStaticTestRule.class);
@@ -70,7 +82,7 @@ public static class TestWithStaticTestRule {
7082
@Rule
7183
public static TestRule temporaryFolder = new TemporaryFolder();
7284
}
73-
85+
7486
@Test
7587
public void acceptMethodRule() throws Exception {
7688
TestClass target = new TestClass(TestWithMethodRule.class);

0 commit comments

Comments
 (0)