diff --git a/build.gradle b/build.gradle index 74399064..dad3c709 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { id 'jacoco' id 'maven-publish' id 'java-gradle-plugin' - id 'org.sonarqube' version '6.1.0.5360' + id 'org.sonarqube' version '6.2.0.5505' id 'com.gradle.plugin-publish' version '1.3.1' id 'com.github.sherter.google-java-format' version '0.9' id 'io.github.gradle-nexus.publish-plugin' version '2.0.0' @@ -175,13 +175,13 @@ if (project.hasProperty('signing.keyId')) { // publish as library in maven centr dependencies { api 'com.github.spullara.mustache.java:compiler:0.9.14' - api 'com.fasterxml.jackson.core:jackson-databind:2.18.3' - api 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.3' - api 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.3' - api 'commons-io:commons-io:2.18.0' + api 'com.fasterxml.jackson.core:jackson-databind:2.19.0' + api 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.19.0' + api 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.19.0' + api 'commons-io:commons-io:2.19.0' api gradleApi() - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.18.3' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.19.0' implementation 'org.reflections:reflections:0.10.2' // swagger generators implementation('io.swagger.codegen.v3:swagger-codegen-generators:1.0.56') { @@ -193,14 +193,14 @@ dependencies { } } implementation 'com.googlecode.lambdaj:lambdaj:2.3.3' - implementation 'com.google.googlejavaformat:google-java-format:1.25.2' + implementation 'com.google.googlejavaformat:google-java-format:1.27.0' testImplementation gradleTestKit() - testImplementation 'org.mockito:mockito-junit-jupiter:5.17.0' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.12.0' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.12.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.12.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.12.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.18.0' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.12.2' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.12.2' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.12.2' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.12.2' compileOnly 'org.projectlombok:lombok:1.18.38' annotationProcessor 'org.projectlombok:lombok:1.18.38' @@ -289,7 +289,7 @@ tasks.register('installGitHooks') { } tasks.named('wrapper') { - gradleVersion = '8.13' + gradleVersion = '8.14.1' } tasks.register('ci-updater', JavaExec) { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c..1b33c55b 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f853b1..002b867c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index faf93008..23d15a93 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9b42019c..5eed7ee8 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/co/com/bancolombia/Constants.java b/src/main/java/co/com/bancolombia/Constants.java index f5534eeb..91b3ca34 100644 --- a/src/main/java/co/com/bancolombia/Constants.java +++ b/src/main/java/co/com/bancolombia/Constants.java @@ -13,29 +13,29 @@ public final class Constants { public static final String PATH_GRAPHQL = "/graphql"; // dependencies public static final String SECRETS_VERSION = "4.4.31"; - public static final String SPRING_BOOT_VERSION = "3.4.4"; + public static final String SPRING_BOOT_VERSION = "3.4.6"; public static final String LOMBOK_VERSION = "1.18.38"; public static final String REACTIVE_COMMONS_VERSION = "5.4.0"; public static final String REACTIVE_COMMONS_MAPPER_VERSION = "0.1.0"; public static final String BLOCK_HOUND_VERSION = "1.0.11.RELEASE"; - public static final String AWS_BOM_VERSION = "2.31.25"; - public static final String COMMONS_JMS_VERSION = "2.3.11"; + public static final String AWS_BOM_VERSION = "2.31.48"; + public static final String COMMONS_JMS_VERSION = "2.4.0"; public static final String GRAPHQL_KICKSTART_VERSION = "15.1.0"; public static final String ARCH_UNIT_VERSION = "1.4.0"; public static final String OKHTTP_VERSION = "4.12.0"; public static final String RESILIENCE_4J_VERSION = "2.3.0"; public static final String BIN_STASH_VERSION = "1.2.6"; - public static final String SPRING_DOC_OPENAPI_VERSION = "2.8.6"; + public static final String SPRING_DOC_OPENAPI_VERSION = "2.8.8"; public static final String CLOUD_EVENTS_VERSION = "4.0.1"; // gradle plugins public static final String JACOCO_VERSION = "0.8.13"; - public static final String SONAR_VERSION = "6.1.0.5360"; + public static final String SONAR_VERSION = "6.2.0.5505"; public static final String COBERTURA_VERSION = "4.0.0"; public static final String PLUGIN_VERSION = "3.22.4"; public static final String DEPENDENCY_CHECK_VERSION = "12.1.1"; public static final String PITEST_VERSION = "1.15.0"; // custom - public static final String GRADLE_WRAPPER_VERSION = "8.13"; + public static final String GRADLE_WRAPPER_VERSION = "8.14.1"; @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class MainFiles { diff --git a/src/main/java/co/com/bancolombia/factory/upgrades/actions/UpgradeY2025M05D10Cache.java b/src/main/java/co/com/bancolombia/factory/upgrades/actions/UpgradeY2025M05D10Cache.java new file mode 100644 index 00000000..0679400b --- /dev/null +++ b/src/main/java/co/com/bancolombia/factory/upgrades/actions/UpgradeY2025M05D10Cache.java @@ -0,0 +1,110 @@ +package co.com.bancolombia.factory.upgrades.actions; + +import static co.com.bancolombia.Constants.MainFiles.GRADLE_PROPERTIES; +import static co.com.bancolombia.Constants.MainFiles.SETTINGS_GRADLE; + +import co.com.bancolombia.factory.ModuleBuilder; +import co.com.bancolombia.factory.upgrades.UpdateUtils; +import co.com.bancolombia.factory.upgrades.UpgradeAction; +import lombok.SneakyThrows; + +public class UpgradeY2025M05D10Cache implements UpgradeAction { + private static final String BUILD_CACHE = "buildCache"; + private static final String MATCH_CACHE = "rootProject.name"; + private static final String APPEND_CACHE = + "buildCache {\n" + + " local {\n" + + " directory = new File(rootDir, 'build-cache')\n" + + " }\n" + + "}\n\n"; + + private static final String PARALLEL_CHECK = "org.gradle.parallel=true"; + private static final String CACHING = "org.gradle.caching=true"; + private static final String CACHING_REGEX = "\\borg\\.gradle\\.caching=false\\b"; + private static final String CONFIGURATION_CACHE = "org.gradle.configuration-cache=true"; + private static final String CONFIGURATION_CACHE_REGEX = + "\\borg\\.gradle\\.configuration-cache=false\\b"; + private static final String CONFIGURATION_CACHE_PARALLEL = + "org.gradle.configuration-cache.parallel=true"; + private static final String CONFIGURATION_CACHE_PARALLEL_REGEX = + "\\borg\\.gradle\\.configuration-cache.parallel=false\\b"; + private static final String CONFIGURATION_CACHE_INTEGRITY = + "org.gradle.configuration-cache.integrity-check=true"; + private static final String CONFIGURATION_CACHE_INTEGRITY_REGEX = + "\\borg\\.gradle\\.configuration-cache.integrity-check=false\\b"; + + @Override + @SneakyThrows + public boolean up(ModuleBuilder builder) { + return builder.updateFile( + SETTINGS_GRADLE, + content -> + UpdateUtils.insertBeforeMatch(content, MATCH_CACHE, BUILD_CACHE, APPEND_CACHE)) + | builder.updateFile( + GRADLE_PROPERTIES, + content -> { + String modifiedContent = content; + + modifiedContent = + updateGradleProperties( + builder, + modifiedContent, + CONFIGURATION_CACHE_INTEGRITY_REGEX, + "org.gradle.configuration-cache.integrity-check=false", + "org.gradle.configuration-cache.integrity-check=", + CONFIGURATION_CACHE_INTEGRITY); + + modifiedContent = + updateGradleProperties( + builder, + modifiedContent, + CONFIGURATION_CACHE_PARALLEL_REGEX, + "org.gradle.configuration-cache.parallel=false", + "org.gradle.configuration-cache.parallel=", + CONFIGURATION_CACHE_PARALLEL); + + modifiedContent = + updateGradleProperties( + builder, + modifiedContent, + CONFIGURATION_CACHE_REGEX, + "org.gradle.configuration-cache=false", + "org.gradle.configuration-cache=", + CONFIGURATION_CACHE); + modifiedContent = + updateGradleProperties( + builder, + modifiedContent, + CACHING_REGEX, + "org.gradle.caching=false", + "org.gradle.caching=", + CACHING); + + return modifiedContent; + }) + | UpdateUtils.appendIfNotContains(builder, "./.gitignore", "build-cache", "\nbuild-cache"); + } + + private String updateGradleProperties( + ModuleBuilder builder, + String content, + String regex, + String previous, + String containsValue, + String newValue) { + return !builder.findExpressions(GRADLE_PROPERTIES, regex).isEmpty() + ? UpdateUtils.replace(content, previous, newValue) + : UpdateUtils.insertAfterMatch( + content, PARALLEL_CHECK, containsValue, "\n".concat(newValue)); + } + + @Override + public String name() { + return "3.22.4->3.22.5"; + } + + @Override + public String description() { + return "Add block hound validations"; + } +} diff --git a/src/main/java/co/com/bancolombia/factory/validations/architecture/ArchitectureValidation.java b/src/main/java/co/com/bancolombia/factory/validations/architecture/ArchitectureValidation.java index ef4c18e9..79a6713b 100644 --- a/src/main/java/co/com/bancolombia/factory/validations/architecture/ArchitectureValidation.java +++ b/src/main/java/co/com/bancolombia/factory/validations/architecture/ArchitectureValidation.java @@ -5,13 +5,14 @@ import co.com.bancolombia.factory.ModuleBuilder; import co.com.bancolombia.utils.FileUtils; import java.io.File; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; -import org.gradle.api.Project; +import org.gradle.api.logging.Logger; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ArchitectureValidation { @@ -23,13 +24,12 @@ public final class ArchitectureValidation { private static final String FORBIDDEN_DOMAIN_NAMES = "rabbit,sqs,sns,ibm,dynamo,aws,mysql,postgres,redis,mongo,rsocket,r2dbc,http,kms,s3,graphql,kafka"; - public static void inject(Project project, ModuleBuilder builder) { + public static void inject(ModuleBuilder builder, Logger logger, Set files) { if (!FileUtils.readBooleanProperty(SKIP_PROP)) { String os = System.getProperty("os.name"); String paths = - project.getAllprojects().stream() - .map(p -> "\"" + toOSPath(os, p.getProjectDir()) + "/\"") - .collect(Collectors.joining(",")); + files.stream().map(f -> "\"" + toOSPath(os, f) + "/\"").collect(Collectors.joining(",")); + builder.addParam("reactive", builder.isReactive()); builder.addParam("modulePaths", paths); builder.addParam( @@ -40,10 +40,11 @@ public static void inject(Project project, ModuleBuilder builder) { "forbiddenDomainClassNames", loadForbiddenValuesForAsString( FORBIDDEN_DOMAIN_CLASS_NAMES_PROP, FORBIDDEN_DOMAIN_NAMES)); - project.getAllprojects().stream() - .filter(p -> p.getName().equals(Constants.APP_SERVICE)) + + files.stream() + .filter(file -> file.getName().equals(Constants.APP_SERVICE)) .findFirst() - .ifPresent(appService -> generateArchUnitFiles(project, appService, builder)); + .ifPresent(appService -> generateArchUnitFiles(logger, appService.getName(), builder)); } } @@ -109,10 +110,8 @@ private static String toOSPath(String os, File projectDir) { @SneakyThrows private static void generateArchUnitFiles( - Project project, Project appService, ModuleBuilder builder) { - project - .getLogger() - .lifecycle("Injecting ArchitectureTest in module {}", appService.getProjectDir().getName()); + Logger logger, String appService, ModuleBuilder builder) { + logger.lifecycle("Injecting ArchitectureTest in module {}", appService); builder.setupFromTemplate("structure/applications/appservice/arch-validations"); builder.appendDependencyToModule( Constants.APP_SERVICE, diff --git a/src/main/java/co/com/bancolombia/task/AbstractCleanArchitectureDefaultTask.java b/src/main/java/co/com/bancolombia/task/AbstractCleanArchitectureDefaultTask.java index e9661663..6ead5fd1 100644 --- a/src/main/java/co/com/bancolombia/task/AbstractCleanArchitectureDefaultTask.java +++ b/src/main/java/co/com/bancolombia/task/AbstractCleanArchitectureDefaultTask.java @@ -15,7 +15,6 @@ import java.util.List; import java.util.Optional; import java.util.function.Supplier; -import java.util.stream.Collectors; import javax.inject.Inject; import lombok.SneakyThrows; import org.gradle.api.DefaultTask; @@ -26,10 +25,11 @@ import org.gradle.internal.logging.text.StyledTextOutputFactory; public abstract class AbstractCleanArchitectureDefaultTask extends DefaultTask { - protected final ModuleBuilder builder = new ModuleBuilder(getProject()); + protected final transient ModuleBuilder builder = new ModuleBuilder(getProject()); protected final Logger logger = getProject().getLogger(); protected AbstractCleanArchitectureDefaultTask() { + notCompatibleWithConfigurationCache("This task performs validations that should always run"); builder.setStyledLogger( getTextOutputFactory().create(AbstractCleanArchitectureDefaultTask.class)); } @@ -116,7 +116,7 @@ protected ModuleFactory resolveFactory(String packageName, String prefix, String } private String formatTypes() { - return resolveTypes().stream().collect(Collectors.joining("\n")); + return String.join("\n", resolveTypes()); } @SneakyThrows @@ -124,7 +124,7 @@ protected List resolveTypes() { return ReflectionUtils.getModuleFactories(resolvePackage()) .map(clazz -> clazz.getSimpleName().replace(resolvePrefix(), "").toUpperCase()) .sorted() - .collect(Collectors.toList()); + .toList(); } protected String resolvePrefix() { diff --git a/src/main/java/co/com/bancolombia/task/DeleteModuleTask.java b/src/main/java/co/com/bancolombia/task/DeleteModuleTask.java index 0676f5e1..3c8a89b4 100644 --- a/src/main/java/co/com/bancolombia/task/DeleteModuleTask.java +++ b/src/main/java/co/com/bancolombia/task/DeleteModuleTask.java @@ -10,6 +10,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import org.gradle.api.provider.ListProperty; +import org.gradle.api.tasks.Input; import org.gradle.api.tasks.options.Option; import org.gradle.api.tasks.options.OptionValues; @@ -17,6 +19,13 @@ public class DeleteModuleTask extends AbstractCleanArchitectureDefaultTask { private String module; + @Input private final ListProperty availableModules; + + public DeleteModuleTask() { + this.availableModules = getProject().getObjects().listProperty(String.class); + this.availableModules.set(new ArrayList<>(getProject().getChildProjects().keySet())); + } + @Option(option = "module", description = "Set module name to delete") public void setModule(String module) { this.module = module; @@ -24,12 +33,12 @@ public void setModule(String module) { @OptionValues("module") public List getModules() { - return new ArrayList<>(getProject().getChildProjects().keySet()); + return availableModules.get(); } @Override public void execute() throws IOException, CleanException { - if (module == null || !getProject().getChildProjects().containsKey(module)) { + if (module == null || !availableModules.get().contains(module)) { printHelp(); throw new IllegalArgumentException( "No valid module name is set, usage: gradle deleteModule --module " diff --git a/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java b/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java index b35fe170..578d6cba 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateAcceptanceTestTask.java @@ -4,6 +4,11 @@ import co.com.bancolombia.task.annotations.CATask; import java.io.IOException; import java.util.ArrayList; +import lombok.Getter; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.SetProperty; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; @CATask( name = "generateAcceptanceTest", @@ -11,16 +16,26 @@ description = "Generate subproject by karate framework in deployment layer") public class GenerateAcceptanceTestTask extends AbstractResolvableTypeTask { + @Internal @Getter private final Property projectPath; + @Input @Getter private final SetProperty moduleNames; + + public GenerateAcceptanceTestTask() { + this.projectPath = getProject().getObjects().property(String.class); + this.projectPath.set(getProject().getProjectDir().getPath()); + + this.moduleNames = getProject().getObjects().setProperty(String.class); + this.moduleNames.set(getProject().getChildProjects().keySet()); + } + @Override public void execute() throws IOException, CleanException { super.execute(); - builder.runTask( - "wrapper", getProject().getProjectDir().getPath().concat("/deployment/" + name)); + builder.runTask("wrapper", projectPath.get().concat("/deployment/" + name)); } @Override protected void prepareParams() { - var modules = new ArrayList<>(getProject().getChildProjects().keySet()); + var modules = new ArrayList<>(moduleNames.get()); builder.addParam( "task-param-exist-api-rest", diff --git a/src/main/java/co/com/bancolombia/task/GenerateDrivenAdapterTask.java b/src/main/java/co/com/bancolombia/task/GenerateDrivenAdapterTask.java index 7ae2661a..10cb3ced 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateDrivenAdapterTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateDrivenAdapterTask.java @@ -95,8 +95,8 @@ protected void prepareParams() { private void appendRCommonsParams() { String[] techs = tech.split(","); - for (String tech : techs) { - builder.addParam(tech, true); + for (String t : techs) { + builder.addParam(t, true); } builder.addParam("eda", eda == BooleanOption.TRUE); } diff --git a/src/main/java/co/com/bancolombia/task/GenerateEntryPointTask.java b/src/main/java/co/com/bancolombia/task/GenerateEntryPointTask.java index 913fda81..9ddf7951 100644 --- a/src/main/java/co/com/bancolombia/task/GenerateEntryPointTask.java +++ b/src/main/java/co/com/bancolombia/task/GenerateEntryPointTask.java @@ -124,8 +124,8 @@ protected void prepareParams() { private void appendRCommonsParams() { String[] techs = tech.split(","); - for (String tech : techs) { - builder.addParam(tech, true); + for (String t : techs) { + builder.addParam(t, true); } builder.addParam("eda", eda == BooleanOption.TRUE); } diff --git a/src/main/java/co/com/bancolombia/task/GeneratePerformanceTestTask.java b/src/main/java/co/com/bancolombia/task/GeneratePerformanceTestTask.java index 2ba32c2a..9f7c5986 100644 --- a/src/main/java/co/com/bancolombia/task/GeneratePerformanceTestTask.java +++ b/src/main/java/co/com/bancolombia/task/GeneratePerformanceTestTask.java @@ -2,16 +2,25 @@ import co.com.bancolombia.task.annotations.CATask; import java.util.ArrayList; +import lombok.Getter; +import org.gradle.api.provider.SetProperty; +import org.gradle.api.tasks.Input; @CATask( name = "generatePerformanceTest", shortcut = "gpt", description = "Generate performance test") public class GeneratePerformanceTestTask extends AbstractResolvableTypeTask { + @Input @Getter private final SetProperty moduleNames; + + public GeneratePerformanceTestTask() { + this.moduleNames = getProject().getObjects().setProperty(String.class); + this.moduleNames.set(getProject().getChildProjects().keySet()); + } @Override protected void prepareParams() { - var modules = new ArrayList<>(getProject().getChildProjects().keySet()); + var modules = new ArrayList<>(moduleNames.get()); builder.addParam( "task-param-exist-api-rest", diff --git a/src/main/java/co/com/bancolombia/task/InternalTask.java b/src/main/java/co/com/bancolombia/task/InternalTask.java index 9d4f8e5b..f7c4abfe 100644 --- a/src/main/java/co/com/bancolombia/task/InternalTask.java +++ b/src/main/java/co/com/bancolombia/task/InternalTask.java @@ -4,11 +4,18 @@ import co.com.bancolombia.utils.SonarCheck; import co.com.bancolombia.utils.Utils; import co.com.bancolombia.utils.offline.UpdateProjectDependencies; +import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import lombok.Getter; +import org.gradle.api.Project; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.SetProperty; +import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.options.Option; import org.gradle.api.tasks.options.OptionValues; @@ -17,6 +24,28 @@ public class InternalTask extends AbstractCleanArchitectureDefaultTask { private Action action = Action.SONAR_CHECK; + @Internal @Getter private final Property projectPath; + @Input @Getter private final SetProperty subProjectPath; + + public InternalTask() { + projectPath = getProject().getObjects().property(String.class); + projectPath.set(getProject().getProjectDir().getPath()); + + this.subProjectPath = getProject().getObjects().setProperty(String.class); + this.subProjectPath.set(getProject().provider(this::getAllSubProjectPaths)); + } + + private Set getAllSubProjectPaths() { + Set projectPaths = + getProject().getSubprojects().stream() + .map(Project::getProjectDir) + .map(File::getPath) + .collect(Collectors.toSet()); + + projectPaths.add(projectPath.get()); + return projectPaths; + } + @Option(option = "action", description = "Set task action to run") public void setAction(Action action) { this.action = action; @@ -33,10 +62,10 @@ public List getInputOptions() { public void execute() throws IOException { switch (Objects.requireNonNull(action)) { case SONAR_CHECK: - SonarCheck.parse(getProject()); + SonarCheck.parse(subProjectPath.get()); break; case UPDATE_DEPENDENCIES: - String basePath = getProject().getProjectDir().toString(); + String basePath = projectPath.get(); List files = Utils.getAllFilesWithGradleExtension(basePath); logger.lifecycle( "Updating project dependencies from root {} in files \n {}", basePath, files); diff --git a/src/main/java/co/com/bancolombia/task/UpdateProjectTask.java b/src/main/java/co/com/bancolombia/task/UpdateProjectTask.java index bde3edc2..e6ecd1cd 100644 --- a/src/main/java/co/com/bancolombia/task/UpdateProjectTask.java +++ b/src/main/java/co/com/bancolombia/task/UpdateProjectTask.java @@ -12,6 +12,9 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import lombok.Getter; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.options.Option; import org.gradle.internal.logging.text.StyledTextOutput; @@ -23,6 +26,13 @@ public class UpdateProjectTask extends AbstractCleanArchitectureDefaultTask { private final Set dependencies = new HashSet<>(); private BooleanOption git = BooleanOption.TRUE; + @Internal @Getter private final Property projectPath; + + public UpdateProjectTask() { + this.projectPath = getProject().getObjects().property(String.class); + this.projectPath.set(getProject().getProjectDir().toString()); + } + @Option(option = "dependencies", description = "Set dependencies to update") public void setDependencies(String dependencies) { this.dependencies.addAll(Arrays.asList(dependencies.split("[ ,]+"))); @@ -44,10 +54,9 @@ public void execute() throws IOException, CleanException { + " or pass the '--git false' flag"); return; } - // Add specific parameters for UpgradeActions - String basePath = getProject().getProjectDir().toString(); + builder.addParam(DEPENDENCIES_TO_UPDATE, dependencies); - builder.addParam(FILES_TO_UPDATE, Utils.getAllFilesWithGradleExtension(basePath)); + builder.addParam(FILES_TO_UPDATE, Utils.getAllFilesWithGradleExtension(projectPath.get())); UpgradeFactory factory = new UpgradeFactory(); factory.buildModule(builder); builder.persist(); diff --git a/src/main/java/co/com/bancolombia/task/ValidateStructureTask.java b/src/main/java/co/com/bancolombia/task/ValidateStructureTask.java index ed756fdd..c3134e09 100644 --- a/src/main/java/co/com/bancolombia/task/ValidateStructureTask.java +++ b/src/main/java/co/com/bancolombia/task/ValidateStructureTask.java @@ -7,14 +7,15 @@ import co.com.bancolombia.task.annotations.CATask; import co.com.bancolombia.utils.FileUtils; import co.com.bancolombia.utils.Utils; +import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Predicate; import java.util.stream.Collectors; +import lombok.Getter; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Dependency; @@ -22,7 +23,9 @@ import org.gradle.api.artifacts.UnknownConfigurationException; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.provider.Property; +import org.gradle.api.provider.SetProperty; import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.Optional; @CATask( @@ -37,44 +40,87 @@ public abstract class ValidateStructureTask extends AbstractCleanArchitectureDef private static final String SPRING_DEPENDENCIES = "spring-boot-dependencies"; private static final String AWS_BOM = "bom"; + @Internal @Getter private final Property projectPath; + @Input @Getter private final SetProperty moduleNames; + @Input @Getter private final Property hasSpringWeb; + @Input @Getter private final SetProperty projectDirectories; + @Input @Getter private final Property isValidateModelLayer; + @Input @Getter private final Property isValidateUseCaseLayer; + @Input @Getter private final Property isValidateInfrastructureLayer; + @Input @Optional public abstract Property getWhitelistedDependencies(); + public ValidateStructureTask() { + this.projectPath = getProject().getObjects().property(String.class); + this.projectPath.set(getProject().getProjectDir().getPath()); + + this.moduleNames = getProject().getObjects().setProperty(String.class); + this.moduleNames.set(getProject().getChildProjects().keySet()); + + this.projectDirectories = getProject().getObjects().setProperty(File.class); + this.projectDirectories.set(getProject().provider(this::collectAllProjectDirectories)); + + this.hasSpringWeb = getProject().getObjects().property(Boolean.class); + this.hasSpringWeb.set(getProject().provider(this::checkForSpringWebDependency)); + + this.isValidateModelLayer = getProject().getObjects().property(Boolean.class); + this.isValidateModelLayer.set(getProject().provider(this::validateModelLayer)); + + this.isValidateUseCaseLayer = getProject().getObjects().property(Boolean.class); + this.isValidateUseCaseLayer.set(getProject().provider(this::validateUseCaseLayer)); + + this.isValidateInfrastructureLayer = getProject().getObjects().property(Boolean.class); + this.isValidateInfrastructureLayer.set( + getProject().provider(this::validateInfrastructureLayer)); + } + @Override public void execute() throws IOException, CleanException { - String packageName = - FileUtils.readProperties(getProject().getProjectDir().getPath(), "package"); - logger.lifecycle("Clean Architecture plugin version: {}", Utils.getVersionPlugin()); - getModules().forEach(d -> logger.lifecycle("Submodules: " + d.getKey())); - logger.lifecycle("Project Package: {}", packageName); - checkForSpringWebDependency(); - ArchitectureValidation.inject(getProject(), builder); + setupArchitectureValidation(); - if (!validateModelLayer()) { + if (!isValidateModelLayer.get()) { throw new CleanException("Model module is invalid"); } - if (!validateUseCaseLayer()) { + if (!isValidateUseCaseLayer.get()) { throw new CleanException("Use case module is invalid"); } - if (!validateInfrastructureLayer()) { + if (!isValidateInfrastructureLayer.get()) { throw new CleanException("Infrastructure layer is invalid"); } logger.lifecycle("The project is valid"); } - private void checkForSpringWebDependency() { - boolean hasSpringWeb = false; + private void setupArchitectureValidation() throws IOException { + String packageName = FileUtils.readProperties(projectPath.get(), "package"); + logger.lifecycle("Clean Architecture plugin version: {}", Utils.getVersionPlugin()); + moduleNames.get().forEach(name -> logger.lifecycle("Submodules: " + name)); + logger.lifecycle("Project Package: {}", packageName); + ArchitectureValidation.inject(builder, getLogger(), projectDirectories.get()); + } + + private Set collectAllProjectDirectories() { + return getProject().getAllprojects().stream() + .map(Project::getProjectDir) + .collect(Collectors.toSet()); + } + + private boolean checkForSpringWebDependency() { + boolean springWebDependencyPresent = false; try { - hasSpringWeb = + springWebDependencyPresent = getProject().getChildProjects().get(APP_SERVICE).getConfigurations() .getByName("testImplementation").getDependencies().stream() .anyMatch(d -> d.getName().equals("spring-web")); } catch (UnknownConfigurationException e) { logger.warn("configuration testImplementation not present"); } - logger.lifecycle("has spring-web dependency to run validations: {}", hasSpringWeb); - builder.addParam("hasSpringWeb", hasSpringWeb); + + logger.lifecycle( + "has spring-web dependency to run validations: {}", springWebDependencyPresent); + builder.addParam("hasSpringWeb", springWebDependencyPresent); + return springWebDependencyPresent; } private boolean validateModelLayer() { @@ -142,25 +188,23 @@ private boolean validateInfrastructureLayer() { logger.lifecycle("Validating Infrastructure Layer"); List modulesExcludes = Arrays.asList(MODEL_MODULE, APP_SERVICE, USE_CASE_MODULE); AtomicBoolean valid = new AtomicBoolean(true); - Set> modules = getModules(); - - modules.stream() - .filter(module -> !modulesExcludes.contains(module.getKey())) - .forEach(moduleFiltered -> validateModule(valid, moduleFiltered)); + moduleNames.get().stream() + .filter(moduleName -> !modulesExcludes.contains(moduleName)) + .forEach(moduleName -> validateModule(valid, moduleName)); return valid.get(); } - private void validateModule(AtomicBoolean valid, Map.Entry moduleFiltered) { - logger.lifecycle("Validating {} Module", moduleFiltered.getKey()); + private void validateModule(AtomicBoolean valid, String moduleFiltered) { + logger.lifecycle("Validating {} Module", moduleFiltered); validateDependencies(valid, moduleFiltered); if (!valid.get()) { - logger.error("--- {} is violating a rule", moduleFiltered.getKey()); + logger.error("--- {} is violating a rule", moduleFiltered); } } private boolean validateExistingModule(String module) { - return (getProject().getChildProjects().containsKey(module)); + return moduleNames.get().contains(module); } private Configuration getConfiguration(String moduleName) { @@ -183,8 +227,8 @@ private void printDependenciesByModule(String moduleName) { .forEach(dependency -> logger.lifecycle("--- Dependency: " + dependency.getName())); } - private void validateDependencies(AtomicBoolean valid, Map.Entry dependency) { - Configuration configuration = getConfiguration(dependency.getKey()); + private void validateDependencies(AtomicBoolean valid, String dependency) { + Configuration configuration = getConfiguration(dependency); if (configuration.getDependencies().stream().anyMatch(filterDependenciesInfrastructure())) { valid.set(false); } @@ -202,8 +246,4 @@ private Predicate filterDependenciesInfrastructure() { && !Arrays.asList(MODEL_MODULE, USE_CASE_MODULE).contains(dependency.getName()); }; } - - private Set> getModules() { - return getProject().getChildProjects().entrySet(); - } } diff --git a/src/main/java/co/com/bancolombia/utils/CommandUtils.java b/src/main/java/co/com/bancolombia/utils/CommandUtils.java index 2c569408..083c011d 100644 --- a/src/main/java/co/com/bancolombia/utils/CommandUtils.java +++ b/src/main/java/co/com/bancolombia/utils/CommandUtils.java @@ -9,7 +9,7 @@ @AllArgsConstructor public class CommandUtils { - private static final String GIT_STATUS = "git status"; + private static final String[] GIT_STATUS = {"git", "status"}; private final Runtime rt; public static CommandUtils getDefault() { diff --git a/src/main/java/co/com/bancolombia/utils/SonarCheck.java b/src/main/java/co/com/bancolombia/utils/SonarCheck.java index 17f2d06d..1db0cfa5 100644 --- a/src/main/java/co/com/bancolombia/utils/SonarCheck.java +++ b/src/main/java/co/com/bancolombia/utils/SonarCheck.java @@ -2,9 +2,11 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.File; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.stream.Stream; import lombok.AccessLevel; import lombok.Builder; @@ -12,7 +14,6 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.SneakyThrows; -import org.gradle.api.Project; /** This class should translate the dependency check vulnerabilities to sonar issues */ @NoArgsConstructor(access = AccessLevel.PRIVATE) @@ -22,19 +23,21 @@ public class SonarCheck { public static final String DEFAULT_LOCATION = "src/main/java/co/com/bancolombia/MainApplication.java"; - public static void parse(Project project) { + @SneakyThrows + public static void parse(Set subProjectPath) { final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - parseSingle(project, mapper); - project.getSubprojects().forEach(p -> parseSingle(p, mapper)); + + subProjectPath.forEach(p -> parseSingle(p, mapper)); } @SneakyThrows - private static void parseSingle(Project project, ObjectMapper mapper) { + private static void parseSingle(String projectPath, ObjectMapper mapper) { List issues; - if (project.file(INPUT).exists()) { + File inputFile = new File(projectPath, INPUT); + if (inputFile.exists()) { issues = - Stream.of(FileUtils.readFile(project, INPUT)) + Stream.of(Files.readString(inputFile.toPath())) .map(content -> getReport(content, mapper)) .flatMap(report -> report.dependencies.stream()) .filter( @@ -46,9 +49,13 @@ private static void parseSingle(Project project, ObjectMapper mapper) { } else { issues = new ArrayList<>(); } - Files.createDirectories(project.file("build/reports/").toPath()); - FileUtils.writeString( - project, OUTPUT, mapper.writeValueAsString(SonarReport.builder().issues(issues).build())); + + File outputDir = new File(projectPath, "build/reports/"); + outputDir.mkdirs(); + File outputFile = new File(outputDir, "dependency-check-sonar.json"); + Files.writeString( + outputFile.toPath(), + mapper.writeValueAsString(SonarReport.builder().issues(issues).build())); } private static Stream extractIssues(Dependency dependency) { diff --git a/src/main/resources/structure/root/.gitignore.mustache b/src/main/resources/structure/root/.gitignore.mustache index fc12ab87..28cba8b0 100644 --- a/src/main/resources/structure/root/.gitignore.mustache +++ b/src/main/resources/structure/root/.gitignore.mustache @@ -333,4 +333,4 @@ gradle-app.setting # HPROF # ----- *.hprof - +build-cache diff --git a/src/main/resources/structure/root/gradle.properties.mustache b/src/main/resources/structure/root/gradle.properties.mustache index 7652e017..b59c1ec0 100644 --- a/src/main/resources/structure/root/gradle.properties.mustache +++ b/src/main/resources/structure/root/gradle.properties.mustache @@ -5,6 +5,10 @@ lombok={{lombok}} metrics={{metrics}} language=java org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configuration-cache=true +org.gradle.configuration-cache.parallel=true +org.gradle.configuration-cache.integrity-check=true systemProp.sonar.gradle.skipCompile=true {{#example}} example=true diff --git a/src/main/resources/structure/root/main.gradle.mustache b/src/main/resources/structure/root/main.gradle.mustache index b394ae51..7096af97 100644 --- a/src/main/resources/structure/root/main.gradle.mustache +++ b/src/main/resources/structure/root/main.gradle.mustache @@ -70,7 +70,7 @@ subprojects { targetClasses = ['{{package}}.*'] excludedClasses = [] excludedTestClasses = [] - pitestVersion = '1.19.1' + pitestVersion = '1.19.4' verbose = false outputFormats = ['XML', 'HTML'] threads = 8 @@ -79,7 +79,7 @@ subprojects { timestampedReports = false //mutators = ['STRONGER', 'DEFAULTS'] fileExtensionsToFilter.addAll('xml', 'orbit') - junit5PluginVersion = '1.2.1' + junit5PluginVersion = '1.2.2' failWhenNoMutations = false jvmArgs = ["-XX:+AllowRedefinitionToAddDeleteMethods"] } diff --git a/src/main/resources/structure/root/settings.gradle.mustache b/src/main/resources/structure/root/settings.gradle.mustache index 2e1cef5f..97c7bdb3 100644 --- a/src/main/resources/structure/root/settings.gradle.mustache +++ b/src/main/resources/structure/root/settings.gradle.mustache @@ -6,6 +6,12 @@ pluginManagement { } } +buildCache { + local { + directory = new File(rootDir, 'build-cache') + } +} + rootProject.name = '{{projectName}}' include ':app-service' diff --git a/src/test/java/co/com/bancolombia/TestUtils.java b/src/test/java/co/com/bancolombia/TestUtils.java index e4fd0709..83ff770a 100644 --- a/src/test/java/co/com/bancolombia/TestUtils.java +++ b/src/test/java/co/com/bancolombia/TestUtils.java @@ -10,7 +10,6 @@ import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.util.Arrays; -import java.util.stream.Collectors; import org.apache.commons.io.FileUtils; import org.apache.commons.io.file.SimplePathVisitor; import org.gradle.api.Project; @@ -18,6 +17,7 @@ import org.gradle.testfixtures.ProjectBuilder; import org.junit.jupiter.api.Assertions; +@SuppressWarnings("unchecked") public class TestUtils extends Assertions { private TestUtils() {} @@ -44,11 +44,10 @@ public static void assertFileContains(String file, String... toIncludes) { public static void assertFilesExistsInDir(String dir, String... files) { final String realDir = dir.endsWith("/") ? dir : dir + "/"; - //noinspection SimplifyStreamApiCallChains assertFilesExists( Arrays.stream(files) .map(file -> realDir + file) - .collect(Collectors.toList()) + .toList() .toArray(new String[files.length])); } @@ -64,7 +63,7 @@ public static Project setupProject(Class testClassName, Class .withProjectDir(dirFile) .build(); for (Class task : tasks) { - project.getTasks().create(task.getSimpleName(), task); + project.getTasks().register(task.getSimpleName(), task); } return project; } @@ -79,7 +78,7 @@ public static T getTask(Project project, Class taskClass) { } public static T createTask(Project project, Class taskClass) { - project.getTasks().create(taskClass.getSimpleName(), taskClass); + project.getTasks().register(taskClass.getSimpleName(), taskClass); return getTask(project, taskClass); } diff --git a/src/test/java/co/com/bancolombia/factory/upgrades/actions/UpgradeY2025M05D10CacheTest.java b/src/test/java/co/com/bancolombia/factory/upgrades/actions/UpgradeY2025M05D10CacheTest.java new file mode 100644 index 00000000..ee9308bc --- /dev/null +++ b/src/test/java/co/com/bancolombia/factory/upgrades/actions/UpgradeY2025M05D10CacheTest.java @@ -0,0 +1,78 @@ +package co.com.bancolombia.factory.upgrades.actions; + +import static co.com.bancolombia.Constants.MainFiles.GRADLE_PROPERTIES; +import static co.com.bancolombia.Constants.MainFiles.SETTINGS_GRADLE; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import co.com.bancolombia.factory.ModuleBuilder; +import co.com.bancolombia.factory.upgrades.UpgradeAction; +import co.com.bancolombia.utils.FileUtils; +import com.github.mustachejava.resolver.DefaultResolver; +import java.io.IOException; +import java.nio.file.Files; +import org.gradle.api.Project; +import org.gradle.api.logging.Logger; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class UpgradeY2025M05D10CacheTest { + @Mock private Project project; + @Mock private Logger logger; + + private ModuleBuilder builder; + private UpgradeAction updater; + + @BeforeEach + void setup() throws IOException { + when(project.getName()).thenReturn("UtilsTest"); + when(project.getLogger()).thenReturn(logger); + when(project.getProjectDir()).thenReturn(Files.createTempDirectory("sample").toFile()); + + builder = spy(new ModuleBuilder(project)); + updater = new UpgradeY2025M05D10Cache(); + + assertNotNull(updater.name()); + assertNotNull(updater.description()); + } + + @Test + void shouldApplyUpdate() throws IOException { + DefaultResolver resolver = new DefaultResolver(); + // Arrange + builder.addFile( + SETTINGS_GRADLE, + FileUtils.getResourceAsString(resolver, "gradle-8.14-cache/settings-before.txt")); + builder.addFile( + GRADLE_PROPERTIES, + FileUtils.getResourceAsString(resolver, "gradle-8.14-cache/gradle.properties-before.txt")); + builder.addFile( + "./.gitignore", + FileUtils.getResourceAsString(resolver, "gradle-8.14-cache/.gitignore-before.txt")); + // Act + boolean applied = updater.up(builder); + // Assert + assertTrue(applied); + verify(builder, atLeast(1)) + .addFile( + SETTINGS_GRADLE, + FileUtils.getResourceAsString(resolver, "gradle-8.14-cache/settings-after.txt")); + verify(builder, atLeast(1)) + .addFile( + GRADLE_PROPERTIES, + FileUtils.getResourceAsString( + resolver, "gradle-8.14-cache/gradle.properties-after.txt")); + verify(builder, atLeast(1)) + .addFile( + "./.gitignore", + FileUtils.getResourceAsString(resolver, "gradle-8.14-cache/.gitignore-after.txt")); + } +} diff --git a/src/test/java/co/com/bancolombia/factory/validations/architecture/ArchitectureValidationTest.java b/src/test/java/co/com/bancolombia/factory/validations/architecture/ArchitectureValidationTest.java index 44a0511c..d3aea755 100644 --- a/src/test/java/co/com/bancolombia/factory/validations/architecture/ArchitectureValidationTest.java +++ b/src/test/java/co/com/bancolombia/factory/validations/architecture/ArchitectureValidationTest.java @@ -21,6 +21,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Set; +import java.util.stream.Collectors; import org.gradle.api.Project; import org.gradle.internal.logging.text.StyledTextOutput; import org.gradle.testfixtures.ProjectBuilder; @@ -74,8 +75,12 @@ void shouldInjectTests() throws IOException, CleanException { when(styledTextOutput.append(any())).thenReturn(styledTextOutput); ModuleBuilder builder = new ModuleBuilder(project); builder.setStyledLogger(styledTextOutput); + + var projectDirectories = + project.getAllprojects().stream().map(Project::getProjectDir).collect(Collectors.toSet()); + // Act - ArchitectureValidation.inject(project, builder); + ArchitectureValidation.inject(builder, project.getLogger(), projectDirectories); // Assert assertTrue(Files.exists(testFile)); } diff --git a/src/test/java/co/com/bancolombia/task/AbstractCleanArchitectureDefaultTaskTest.java b/src/test/java/co/com/bancolombia/task/AbstractCleanArchitectureDefaultTaskTest.java index a0f5f37b..dad3b2a1 100644 --- a/src/test/java/co/com/bancolombia/task/AbstractCleanArchitectureDefaultTaskTest.java +++ b/src/test/java/co/com/bancolombia/task/AbstractCleanArchitectureDefaultTaskTest.java @@ -34,6 +34,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +@SuppressWarnings("unchecked") class AbstractCleanArchitectureDefaultTaskTest { private static final String TEST_DIR = getTestDir(AbstractCleanArchitectureDefaultTaskTest.class); private Project project; diff --git a/src/test/java/co/com/bancolombia/task/GeneratePerformanceTestTaskTest.java b/src/test/java/co/com/bancolombia/task/GeneratePerformanceTestTaskTest.java index 73863a5b..1b1cea8f 100644 --- a/src/test/java/co/com/bancolombia/task/GeneratePerformanceTestTaskTest.java +++ b/src/test/java/co/com/bancolombia/task/GeneratePerformanceTestTaskTest.java @@ -29,14 +29,6 @@ void setup() throws IOException, CleanException { GenerateStructureTask taskStructure = getTask(project, GenerateStructureTask.class); taskStructure.setType(GenerateStructureTask.ProjectType.REACTIVE); taskStructure.execute(); - - ProjectBuilder.builder() - .withName("app-service") - .withProjectDir(new File(TEST_DIR + "/applications/app-service")) - .withParent(project) - .build(); - - task = createTask(project, GeneratePerformanceTestTask.class); } @AfterEach @@ -46,6 +38,14 @@ void tearDown() { @Test void generatePerformanceTest() throws IOException, CleanException { + ProjectBuilder.builder() + .withName("app-service") + .withProjectDir(new File(TEST_DIR + "/applications/app-service")) + .withParent(project) + .build(); + + task = createTask(project, GeneratePerformanceTestTask.class); + task.setType("JMETER"); task.execute(); assertFilesExistsInDir(TEST_DIR + "/performance-test/", "Jmeter", "README.md"); @@ -60,6 +60,8 @@ void generateApiPerformanceTest() throws IOException, CleanException { .withParent(project) .build(); + task = createTask(project, GeneratePerformanceTestTask.class); + task.setType("JMETER"); // Act diff --git a/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java b/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java index fe20e797..a1571e37 100644 --- a/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java +++ b/src/test/java/co/com/bancolombia/task/GenerateTestTaskTest.java @@ -13,8 +13,8 @@ import java.nio.file.Path; import org.gradle.api.Project; import org.gradle.testfixtures.ProjectBuilder; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; class GenerateTestTaskTest { @@ -23,32 +23,31 @@ class GenerateTestTaskTest { private static GenerateAcceptanceTestTask task; private static Project project; - @BeforeAll - static void setup() throws IOException, CleanException { + @BeforeEach + void setup() throws IOException, CleanException { deleteStructure(Path.of(TEST_DIR)); project = setupProject(GenerateTestTaskTest.class, GenerateStructureTask.class); GenerateStructureTask taskStructure = getTask(project, GenerateStructureTask.class); taskStructure.setType(GenerateStructureTask.ProjectType.REACTIVE); taskStructure.execute(); - - ProjectBuilder.builder() - .withName("app-service") - .withProjectDir(new File(TEST_DIR + "/applications/app-service")) - .withParent(project) - .build(); - - task = createTask(project, GenerateAcceptanceTestTask.class); } - @AfterAll - static void tearDown() { + @AfterEach + void tearDown() { deleteStructure(Path.of(TEST_DIR)); } @Test void generateAcceptanceTest() throws IOException, CleanException { // Arrange + ProjectBuilder.builder() + .withName("app-service") + .withProjectDir(new File(TEST_DIR + "/applications/app-service")) + .withParent(project) + .build(); + + task = createTask(project, GenerateAcceptanceTestTask.class); task.setName("acceptance-test"); // Act task.execute(); @@ -76,6 +75,7 @@ void generateEntryPointAcceptanceTest() throws IOException, CleanException { .withParent(project) .build(); + task = createTask(project, GenerateAcceptanceTestTask.class); task.setName("acceptance-test"); // Act task.execute(); diff --git a/src/test/java/co/com/bancolombia/task/ValidateStructureTaskTest.java b/src/test/java/co/com/bancolombia/task/ValidateStructureTaskTest.java index 2d933c13..b2ce2510 100644 --- a/src/test/java/co/com/bancolombia/task/ValidateStructureTaskTest.java +++ b/src/test/java/co/com/bancolombia/task/ValidateStructureTaskTest.java @@ -161,7 +161,7 @@ private void prepareImperativeProject() throws IOException, CleanException { new File(TEST_DIR + "/infrastructure/driven-adapters/mongo-repository/build.gradle") .exists()); - project.getTasks().create("validate", ValidateStructureTask.class); + project.getTasks().register("validate", ValidateStructureTask.class); task = (ValidateStructureTask) project.getTasks().getByName("validate"); } diff --git a/src/test/resources/gradle-8.14-cache/.gitignore-after.txt b/src/test/resources/gradle-8.14-cache/.gitignore-after.txt new file mode 100644 index 00000000..7e4888c7 --- /dev/null +++ b/src/test/resources/gradle-8.14-cache/.gitignore-after.txt @@ -0,0 +1,4 @@ +.idea/ +build/ +/gradle/wrapper/gradle-wrapper.jar +build-cache \ No newline at end of file diff --git a/src/test/resources/gradle-8.14-cache/.gitignore-before.txt b/src/test/resources/gradle-8.14-cache/.gitignore-before.txt new file mode 100644 index 00000000..761ee874 --- /dev/null +++ b/src/test/resources/gradle-8.14-cache/.gitignore-before.txt @@ -0,0 +1,3 @@ +.idea/ +build/ +/gradle/wrapper/gradle-wrapper.jar \ No newline at end of file diff --git a/src/test/resources/gradle-8.14-cache/gradle.properties-after.txt b/src/test/resources/gradle-8.14-cache/gradle.properties-after.txt new file mode 100644 index 00000000..e93b392c --- /dev/null +++ b/src/test/resources/gradle-8.14-cache/gradle.properties-after.txt @@ -0,0 +1,13 @@ +package=co.com.bancolombia +systemProp.version=3.22.4 +reactive=true +lombok=true +metrics=false +language=java +skipArchitectureTests=false +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configuration-cache=true +org.gradle.configuration-cache.parallel=true +org.gradle.configuration-cache.integrity-check=true +systemProp.sonar.gradle.skipCompile=true \ No newline at end of file diff --git a/src/test/resources/gradle-8.14-cache/gradle.properties-before.txt b/src/test/resources/gradle-8.14-cache/gradle.properties-before.txt new file mode 100644 index 00000000..6e1d88d5 --- /dev/null +++ b/src/test/resources/gradle-8.14-cache/gradle.properties-before.txt @@ -0,0 +1,9 @@ +package=co.com.bancolombia +systemProp.version=3.22.4 +reactive=true +lombok=true +metrics=false +language=java +skipArchitectureTests=false +org.gradle.parallel=true +systemProp.sonar.gradle.skipCompile=true \ No newline at end of file diff --git a/src/test/resources/gradle-8.14-cache/settings-after.txt b/src/test/resources/gradle-8.14-cache/settings-after.txt new file mode 100644 index 00000000..3a44d025 --- /dev/null +++ b/src/test/resources/gradle-8.14-cache/settings-after.txt @@ -0,0 +1,27 @@ +pluginManagement { + repositories { + //mavenLocal() + //maven { url = '...' } + maven { url = "https://repo.spring.io/snapshot" } + gradlePluginPortal() + } +} + +buildCache { + local { + directory = new File(rootDir, 'build-cache') + } +} + +rootProject.name = 'ms_test' + +include ':app-service' +include ':model' +include ':usecase' +project(':app-service').projectDir = file('./applications/app-service') +project(':model').projectDir = file('./domain/model') +project(':usecase').projectDir = file('./domain/usecase') +include ':r2dbc-postgresql' +project(':r2dbc-postgresql').projectDir = file('./infrastructure/driven-adapters/r2dbc-postgresql') +include ':reactive-web' +project(':reactive-web').projectDir = file('./infrastructure/entry-points/reactive-web') \ No newline at end of file diff --git a/src/test/resources/gradle-8.14-cache/settings-before.txt b/src/test/resources/gradle-8.14-cache/settings-before.txt new file mode 100644 index 00000000..07d2c97a --- /dev/null +++ b/src/test/resources/gradle-8.14-cache/settings-before.txt @@ -0,0 +1,21 @@ +pluginManagement { + repositories { + //mavenLocal() + //maven { url = '...' } + maven { url = "https://repo.spring.io/snapshot" } + gradlePluginPortal() + } +} + +rootProject.name = 'ms_test' + +include ':app-service' +include ':model' +include ':usecase' +project(':app-service').projectDir = file('./applications/app-service') +project(':model').projectDir = file('./domain/model') +project(':usecase').projectDir = file('./domain/usecase') +include ':r2dbc-postgresql' +project(':r2dbc-postgresql').projectDir = file('./infrastructure/driven-adapters/r2dbc-postgresql') +include ':reactive-web' +project(':reactive-web').projectDir = file('./infrastructure/entry-points/reactive-web') \ No newline at end of file