@ -26,6 +26,8 @@ import java.util.LinkedHashMap;
@@ -26,6 +26,8 @@ import java.util.LinkedHashMap;
import java.util.LinkedHashSet ;
import java.util.Map ;
import java.util.Set ;
import java.util.function.UnaryOperator ;
import java.util.stream.Collectors ;
import org.gradle.api.tasks.SourceSet ;
import org.gradle.testkit.runner.BuildResult ;
@ -40,6 +42,7 @@ import org.junit.jupiter.params.ParameterizedTest;
@@ -40,6 +42,7 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource ;
import org.springframework.util.ClassUtils ;
import org.springframework.util.CollectionUtils ;
import org.springframework.util.FileSystemUtils ;
import org.springframework.util.StringUtils ;
@ -65,7 +68,7 @@ class ArchitectureCheckTests {
@@ -65,7 +68,7 @@ class ArchitectureCheckTests {
@BeforeEach
void setup ( @TempDir Path projectDir ) {
this . gradleBuild = new GradleBuild ( projectDir ) . withNullMarked ( false ) ;
this . gradleBuild = new GradleBuild ( projectDir ) . withNullMarkedEnabled ( false ) ;
}
@ParameterizedTest ( name = "{0}" )
@ -275,14 +278,23 @@ class ArchitectureCheckTests {
@@ -275,14 +278,23 @@ class ArchitectureCheckTests {
@Test
void whenPackageIsNotAnnotatedWithNullMarkedWithMainSourcesShouldFailAndWriteEmptyReport ( ) throws IOException {
prepareTask ( Task . CHECK_ARCHITECTURE_MAIN , "nullmarked/notannotated" ) ;
buildAndFail ( this . gradleBuild . withNullMarked ( true ) , Task . CHECK_ARCHITECTURE_MAIN ,
buildAndFail ( this . gradleBuild . withNullMarkedEnabled ( true ) , Task . CHECK_ARCHITECTURE_MAIN ,
"Package org.springframework.boot.build.architecture.nullmarked.notannotated is not annotated with @NullMarked" ) ;
}
@Test
void whenPackageIsIgnoredAndNotAnnotatedWithNullMarkedWithMainSourcesShouldSucceedAndWriteEmptyReport ( )
throws IOException {
prepareTask ( Task . CHECK_ARCHITECTURE_MAIN , "nullmarked/notannotated" ) ;
build ( this . gradleBuild . withNullMarkedEnabled ( true )
. withNullMarkedIgnoredPackages ( "org.springframework.boot.build.architecture.nullmarked.notannotated" ) ,
Task . CHECK_ARCHITECTURE_MAIN ) ;
}
@Test
void whenPackageIsNotAnnotatedWithNullMarkedWithTestSourcesShouldSucceedAndWriteEmptyReport ( ) throws IOException {
prepareTask ( Task . CHECK_ARCHITECTURE_TEST , "nullmarked/notannotated" ) ;
build ( this . gradleBuild . withNullMarked ( true ) , Task . CHECK_ARCHITECTURE_TEST ) ;
build ( this . gradleBuild . withNullMarkedEnabled ( true ) , Task . CHECK_ARCHITECTURE_TEST ) ;
}
@Test
@ -386,7 +398,7 @@ class ArchitectureCheckTests {
@@ -386,7 +398,7 @@ class ArchitectureCheckTests {
private final Map < Task , Boolean > prohibitObjectsRequireNonNull = new LinkedHashMap < > ( ) ;
private Boolean nullMarked ;
private NullMarkedExtension nullMarkedExtension ;
private GradleBuild ( Path projectDir ) {
this . projectDir = projectDir ;
@ -396,16 +408,29 @@ class ArchitectureCheckTests {
@@ -396,16 +408,29 @@ class ArchitectureCheckTests {
return this . projectDir ;
}
GradleBuild withNullMarked ( Boolean nullMarked ) {
this . nullMarked = nullMarked ;
GradleBuild withProhibitObjectsRequireNonNull ( Task task , boolean prohibitObjectsRequireNonNull ) {
this . prohibitObjectsRequireNonNull . put ( task , prohibitObjectsRequireNonNull ) ;
return this ;
}
GradleBuild withProhibitObjectsRequireNonNull ( Task task , boolean prohibitObjectsRequireNonNull ) {
this . prohibitObjectsRequireNonNull . put ( task , prohibitObjectsRequireNonNull ) ;
GradleBuild withNullMarkedEnabled ( Boolean enabled ) {
configureNullMarkedExtension ( ( nullMarked ) - > nullMarked . withEnabled ( enabled ) ) ;
return this ;
}
GradleBuild withNullMarkedIgnoredPackages ( String . . . ignorePackages ) {
configureNullMarkedExtension ( ( nullMarked ) - > nullMarked . withIgnoredPackages ( ignorePackages ) ) ;
return this ;
}
private void configureNullMarkedExtension ( UnaryOperator < NullMarkedExtension > configurer ) {
NullMarkedExtension nullMarkedExtension = this . nullMarkedExtension ;
if ( nullMarkedExtension = = null ) {
nullMarkedExtension = new NullMarkedExtension ( null , null ) ;
}
this . nullMarkedExtension = configurer . apply ( nullMarkedExtension ) ;
}
GradleBuild withDependencies ( String . . . dependencies ) {
this . dependencies . addAll ( Arrays . asList ( dependencies ) ) ;
return this ;
@ -444,11 +469,22 @@ class ArchitectureCheckTests {
@@ -444,11 +469,22 @@ class ArchitectureCheckTests {
. append ( " prohibitObjectsRequireNonNull = " )
. append ( prohibitObjectsRequireNonNull )
. append ( "\n}\n\n" ) ) ;
if ( this . nullMarked ! = null ) {
buildFile . append ( "architectureCheck {\n" )
. append ( " nullMarked = " )
. append ( this . nullMarked )
. append ( "\n}\n" ) ;
NullMarkedExtension nullMarkedExtension = this . nullMarkedExtension ;
if ( nullMarkedExtension ! = null ) {
buildFile . append ( "architectureCheck {" ) ;
buildFile . append ( "\n nullMarked {" ) ;
if ( nullMarkedExtension . enabled ( ) ! = null ) {
buildFile . append ( "\n enabled = " ) . append ( nullMarkedExtension . enabled ( ) ) ;
}
if ( ! CollectionUtils . isEmpty ( nullMarkedExtension . ignoredPackages ( ) ) ) {
buildFile . append ( "\n ignoredPackages = " )
. append ( nullMarkedExtension . ignoredPackages ( )
. stream ( )
. map ( StringUtils : : quote )
. collect ( Collectors . joining ( "," , "[" , "]" ) ) ) ;
}
buildFile . append ( "\n }" ) ;
buildFile . append ( "\n}\n\n" ) ;
}
Files . writeString ( this . projectDir . resolve ( "build.gradle" ) , buildFile , StandardCharsets . UTF_8 ) ;
return GradleRunner . create ( )
@ -457,6 +493,18 @@ class ArchitectureCheckTests {
@@ -457,6 +493,18 @@ class ArchitectureCheckTests {
. withPluginClasspath ( ) ;
}
private record NullMarkedExtension ( Boolean enabled , Set < String > ignoredPackages ) {
private NullMarkedExtension withEnabled ( Boolean enabled ) {
return new NullMarkedExtension ( enabled , this . ignoredPackages ) ;
}
private NullMarkedExtension withIgnoredPackages ( String . . . ignoredPackages ) {
return new NullMarkedExtension ( this . enabled , new LinkedHashSet < > ( Arrays . asList ( ignoredPackages ) ) ) ;
}
}
}
}