Skip to content

Commit 9a72ecd

Browse files
committed
Ensure packages are added in runner checker
1 parent 81481f5 commit 9a72ecd

File tree

4 files changed

+54
-3
lines changed

4 files changed

+54
-3
lines changed

nebula-archrules-core/src/main/java/com/netflix/nebula/archrules/core/Runner.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@
22

33
import com.tngtech.archunit.core.domain.JavaClasses;
44
import com.tngtech.archunit.core.importer.ClassFileImporter;
5+
import com.tngtech.archunit.core.importer.Location;
6+
import com.tngtech.archunit.core.importer.Locations;
57
import com.tngtech.archunit.lang.ArchRule;
68
import com.tngtech.archunit.lang.ConditionEvents;
79
import com.tngtech.archunit.lang.EvaluationResult;
810

11+
import java.util.Arrays;
12+
import java.util.Collection;
13+
import java.util.HashSet;
14+
import java.util.Set;
15+
import java.util.stream.Collectors;
16+
917
public class Runner {
1018
public static EvaluationResult check(ArchRule rule, JavaClasses classesToCheck) {
1119
try {
@@ -32,8 +40,18 @@ public static EvaluationResult check(ArchRule rule, JavaClasses classesToCheck)
3240
* @return the result, which contains information about failure
3341
*/
3442
public static EvaluationResult check(ArchRule rule, Class<?>... classesToCheck) {
43+
Set<Location> locs = new HashSet<>();
44+
locs.addAll(Arrays.stream(classesToCheck)
45+
.map(Locations::ofClass)
46+
.flatMap(Collection::stream)
47+
.collect(Collectors.toList()));
48+
locs.addAll(Arrays.stream(classesToCheck)
49+
.map(clazz -> clazz.getPackage().getName())
50+
.map(Locations::ofPackage)
51+
.flatMap(Collection::stream)
52+
.collect(Collectors.toList()));
3553
final JavaClasses classes = new ClassFileImporter()
36-
.importClasses(classesToCheck);
54+
.importLocations(locs);
3755
return check(rule, classes);
3856
}
3957
}

nebula-archrules-core/src/test/java/com/netflix/nebula/archrules/core/RunnerTest.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
package com.netflix.nebula.archrules.core;
22

3+
import com.netflix.nebula.archrules.testpackage.TestDeprecated;
4+
import com.tngtech.archunit.core.domain.JavaClass;
5+
import com.tngtech.archunit.lang.ArchCondition;
36
import com.tngtech.archunit.lang.ArchRule;
7+
import com.tngtech.archunit.lang.ConditionEvents;
48
import com.tngtech.archunit.lang.EvaluationResult;
59
import com.tngtech.archunit.lang.Priority;
10+
import com.tngtech.archunit.lang.SimpleConditionEvent;
611
import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
712
import org.junit.jupiter.api.Test;
813

914
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.simpleName;
1015
import static org.assertj.core.api.Assertions.assertThat;
1116

1217
public class RunnerTest {
18+
private final ArchRule noDeprecatedRule = ArchRuleDefinition.classes().should()
19+
.notBeAnnotatedWith(Deprecated.class);
20+
1321
@Test
1422
public void test_pass() {
1523
final EvaluationResult result = Runner.check(noDeprecatedRule, PassingClass.class);
@@ -36,8 +44,6 @@ static class PassingClass {
3644
static class FailingClass {
3745
}
3846

39-
private final ArchRule noDeprecatedRule = ArchRuleDefinition.classes().should()
40-
.notBeAnnotatedWith(Deprecated.class);
4147
private final ArchRule smokeTestRule = ArchRuleDefinition.priority(Priority.MEDIUM)
4248
.classes().that(simpleName("SmokeTest"))
4349
.should().beAnnotatedWith(Deprecated.class)
@@ -63,4 +69,25 @@ public void test_smoke_fail() {
6369
assertThat(result.getFailureReport().getDetails())
6470
.contains(NoClassesMatchedEvent.NO_MATCH_MESSAGE);
6571
}
72+
73+
private final ArchCondition<JavaClass> notBeInDeprecatedPackage =
74+
new ArchCondition<JavaClass>("not be in a package marked with @Deprecated") {
75+
@Override
76+
public void check(JavaClass javaClass, ConditionEvents events) {
77+
boolean isInDeprecatedPackage = javaClass.getPackage().getPackageInfo().isAnnotatedWith(Deprecated.class);
78+
if (isInDeprecatedPackage) {
79+
String message = String.format("Class %s is in a package marked with @Deprecated", javaClass.getName());
80+
events.add(SimpleConditionEvent.violated(javaClass, message));
81+
}
82+
}
83+
};
84+
private final ArchRule noDeprecatedPackageRule = ArchRuleDefinition
85+
.classes().should(notBeInDeprecatedPackage);
86+
87+
@Test
88+
public void test_package_deprecated_rule() {
89+
final EvaluationResult result = Runner.check(noDeprecatedPackageRule, TestDeprecated.class);
90+
assertThat(result.hasViolation()).isTrue();
91+
}
92+
6693
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.netflix.nebula.archrules.testpackage;
2+
3+
public class TestDeprecated {
4+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
@Deprecated
2+
package com.netflix.nebula.archrules.testpackage;

0 commit comments

Comments
 (0)