Skip to content

Commit 2f93095

Browse files
committed
fix bug where main source set code is not on compile classpath of archRulesTest
1 parent d323bc7 commit 2f93095

File tree

3 files changed

+157
-1
lines changed

3 files changed

+157
-1
lines changed

nebula-archrules-gradle-plugin/src/main/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPlugin.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,16 @@ import org.gradle.api.tasks.TaskProvider
1717
import org.gradle.api.tasks.bundling.Jar
1818
import org.gradle.api.tasks.compile.JavaCompile
1919
import org.gradle.jvm.component.internal.JvmSoftwareComponentInternal
20-
import org.gradle.kotlin.dsl.*
20+
import org.gradle.kotlin.dsl.add
21+
import org.gradle.kotlin.dsl.dependencies
22+
import org.gradle.kotlin.dsl.getByType
23+
import org.gradle.kotlin.dsl.invoke
24+
import org.gradle.kotlin.dsl.named
25+
import org.gradle.kotlin.dsl.register
2126
import org.gradle.kotlin.dsl.support.serviceOf
27+
import org.gradle.kotlin.dsl.withType
2228
import org.gradle.testing.base.TestingExtension
29+
import kotlin.collections.mapOf
2330

2431
class ArchrulesLibraryPlugin : Plugin<Project> {
2532

@@ -75,6 +82,7 @@ class ArchrulesLibraryPlugin : Plugin<Project> {
7582
register("archRulesTest", JvmTestSuite::class.java) {
7683
useJUnitJupiter()
7784
dependencies {
85+
implementation(project())
7886
implementation(archRulesSourceSet.output)
7987
implementation("com.netflix.nebula:nebula-archrules-core:$version")
8088
}

nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/ArchrulesLibraryPluginTest.kt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class ArchrulesLibraryPluginTest {
6161
}
6262

6363
val result = runner.run(
64+
"--stacktrace",
6465
"build",
6566
"archRulesJar",
6667
"generateMetadataFileForMavenPublication", // to test publication metadata without actually publishing,
@@ -280,4 +281,54 @@ class ArchrulesLibraryPluginTest {
280281
.hasNoMutableStateWarnings()
281282
.hasNoDeprecationWarnings()
282283
}
284+
285+
@Test
286+
fun `main code is included in archRulesTest`() {
287+
val runner = testProject(projectDir) {
288+
properties {
289+
gradleCache(true)
290+
}
291+
settings {
292+
name("library-with-rules")
293+
}
294+
rootProject {
295+
group("com.example")
296+
// a library that contains production code and rules to go along with it
297+
plugins {
298+
id("java-library")
299+
id("com.netflix.nebula.archrules.library")
300+
id("maven-publish")
301+
}
302+
repositories {
303+
maven("https://netflixoss.jfrog.io/artifactory/gradle-plugins")
304+
mavenCentral()
305+
}
306+
declareMavenPublication()
307+
dependencies("""implementation("com.google.guava:guava:33.5.0-jre")""")
308+
src {
309+
main {
310+
dontUseAnnotation()
311+
}
312+
313+
sourceSet("archRules") {
314+
dontUseRule()
315+
}
316+
sourceSet("archRulesTest") {
317+
testForDontUseRule()
318+
}
319+
}
320+
}
321+
}
322+
323+
val result = runner.run(
324+
"build",
325+
"archRulesJar",
326+
"generateMetadataFileForMavenPublication", // to test publication metadata without actually publishing,
327+
"-Pversion=0.0.1"
328+
)
329+
330+
assertThat(result)
331+
.hasNoMutableStateWarnings()
332+
.hasNoDeprecationWarnings()
333+
}
283334
}

nebula-archrules-gradle-plugin/src/test/kotlin/com/netflix/nebula/archrules/gradle/TestKitDslExtensions.kt

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,24 @@ public class LibraryClass {
3737
)
3838
}
3939

40+
fun SourceSetBuilder.dontUseAnnotation() {
41+
java(
42+
"com/example/library/DontUse.java",
43+
//language=java
44+
"""
45+
package com.example.library;
46+
47+
import java.lang.annotation.*;
48+
import static java.lang.annotation.ElementType.*;
49+
50+
@Retention(RetentionPolicy.RUNTIME)
51+
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
52+
public @interface DontUse {
53+
}
54+
"""
55+
)
56+
}
57+
4058
fun SourceSetBuilder.exampleHelperClass() {
4159
java(
4260
"com/example/library/HaveNoTests.java",
@@ -97,6 +115,41 @@ public class LibraryArchRules implements ArchRulesService {
97115
)
98116
}
99117

118+
fun SourceSetBuilder.dontUseRule() {
119+
java(
120+
"com/example/library/DontUseArchRules.java",
121+
//language=java
122+
"""
123+
package com.example.library;
124+
125+
import com.netflix.nebula.archrules.core.ArchRulesService;
126+
import com.tngtech.archunit.lang.ArchRule;
127+
import com.tngtech.archunit.lang.Priority;
128+
import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
129+
import java.util.Map;
130+
import static com.tngtech.archunit.core.domain.JavaAccess.Predicates.target;
131+
import static com.tngtech.archunit.core.domain.JavaAccess.Predicates.targetOwner;
132+
import static com.tngtech.archunit.core.domain.properties.CanBeAnnotated.Predicates.annotatedWith;
133+
134+
public class DontUseArchRules implements ArchRulesService {
135+
public static final ArchRule noDontUse = ArchRuleDefinition.priority(Priority.LOW)
136+
.noClasses()
137+
.should().accessTargetWhere(targetOwner(annotatedWith("com.example.library.DontUse")))
138+
.orShould().accessTargetWhere(target(annotatedWith("com.example.library.DontUse")))
139+
.orShould().dependOnClassesThat().areAnnotatedWith("com.example.library.DontUse")
140+
.allowEmptyShould(true)
141+
.as("No code should reference dontuse APIs")
142+
.because("usage of dontuse APIs introduces risk that future upgrades and migrations will be blocked");
143+
144+
@Override
145+
public Map<String, ArchRule> getRules() {
146+
return Map.of("dont use", noDontUse);
147+
}
148+
}
149+
"""
150+
)
151+
}
152+
100153
fun SourceSetBuilder.exampleNullabilityArchRule() {
101154
java(
102155
"com/example/library/NullabilityArchRules.java",
@@ -196,6 +249,50 @@ public class LibraryArchRulesTest {
196249
)
197250
}
198251

252+
fun SourceSetBuilder.testForDontUseRule() {
253+
java(
254+
"com/example/library/DontUseArchRulesTest.java",
255+
//language=java
256+
"""
257+
package com.example.library;
258+
259+
import com.netflix.nebula.archrules.core.ArchRulesService;
260+
import com.netflix.nebula.archrules.core.Runner;
261+
import com.tngtech.archunit.lang.EvaluationResult;
262+
import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
263+
import org.junit.jupiter.api.Test;
264+
import org.junit.jupiter.api.Assertions;
265+
266+
public class DontUseArchRulesTest {
267+
@DontUse
268+
static void deprecatedMethod(){
269+
}
270+
static class PassingCode {
271+
public void aMethod() {
272+
}
273+
}
274+
static class FailingCode {
275+
public void aMethod() {
276+
deprecatedMethod();
277+
}
278+
}
279+
280+
@Test
281+
public void test_pass() {
282+
EvaluationResult result = Runner.check(DontUseArchRules.noDontUse, PassingCode.class);
283+
Assertions.assertFalse(result.hasViolation());
284+
}
285+
286+
@Test
287+
public void test_fail() {
288+
EvaluationResult result = Runner.check(DontUseArchRules.noDontUse, FailingCode.class);
289+
Assertions.assertTrue(result.hasViolation());
290+
}
291+
}
292+
"""
293+
)
294+
}
295+
199296
fun SourceSetBuilder.exampleTestForNullabilityArchRule() {
200297
java("com/example/library/FailingCode.java",
201298
//language=java

0 commit comments

Comments
 (0)