diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a9740bffef8f..3726168bb347 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -49,6 +49,11 @@ jobs: uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1 with: token: ${{ secrets.CODECOV_TOKEN }} + - name: rewriteDryRun + uses: ./.github/actions/main-build + with: + encryptionKey: ${{ secrets.GRADLE_ENCRYPTION_KEY }} + arguments: rewriteDryRun Windows: runs-on: windows-latest diff --git a/build.gradle.kts b/build.gradle.kts index ac2b1c43ec54..27551e44be12 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,6 +7,7 @@ plugins { id("junitbuild.jacoco-aggregation-conventions") id("junitbuild.maven-central-publishing") id("junitbuild.temp-maven-repo") + id("org.openrewrite.rewrite") version "7.17.0" apply false } description = "JUnit" @@ -54,3 +55,5 @@ dependencies { jacocoAggregation(projects.jupiterTests) jacocoAggregation(projects.platformTests) } + +apply(from = "$rootDir/gradle/rewrite.gradle") diff --git a/gradle/rewrite.gradle b/gradle/rewrite.gradle new file mode 100644 index 000000000000..76d37fc460e7 --- /dev/null +++ b/gradle/rewrite.gradle @@ -0,0 +1,16 @@ +apply plugin: "org.openrewrite.rewrite" + +rewrite { + activeRecipe("org.junit.jupiter.openrewrite.SanityCheck") + exportDatatables = true + failOnDryRunResults = true +} + +dependencies { + rewrite(platform("org.openrewrite.recipe:rewrite-recipe-bom:3.15.0")) + rewrite("org.openrewrite.recipe:rewrite-java-security:3.19.0") + rewrite("org.openrewrite.recipe:rewrite-migrate-java:3.18.0") + rewrite("org.openrewrite.recipe:rewrite-rewrite:0.13.0") + rewrite("org.openrewrite.recipe:rewrite-static-analysis:2.18.0") + rewrite("org.openrewrite.recipe:rewrite-third-party:0.28.0") +} diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java index e735b61f9e8e..b3a01cbf8ad9 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java @@ -110,7 +110,7 @@ private UniqueId(UniqueIdFormat uniqueIdFormat, Segment segment) { } Optional getRoot() { - return this.segments.isEmpty() ? Optional.empty() : Optional.of(this.segments.get(0)); + return this.segments.stream().findFirst(); } /** diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/DefaultParallelExecutionConfigurationStrategy.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/DefaultParallelExecutionConfigurationStrategy.java index 47e88a603deb..6aa948b0050d 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/DefaultParallelExecutionConfigurationStrategy.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/DefaultParallelExecutionConfigurationStrategy.java @@ -66,7 +66,7 @@ public ParallelExecutionConfiguration createConfiguration(ConfigurationParameter BigDecimal factor = configurationParameters.get(CONFIG_DYNAMIC_FACTOR_PROPERTY_NAME, BigDecimal::new).orElse(BigDecimal.ONE); - Preconditions.condition(factor.compareTo(BigDecimal.ZERO) > 0, + Preconditions.condition(factor.signum() == 1, () -> "Factor '%s' specified via configuration parameter '%s' must be greater than 0".formatted(factor, CONFIG_DYNAMIC_FACTOR_PROPERTY_NAME)); diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/EngineFilter.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/EngineFilter.java index 90d7144ef2dd..9c07756a0c4c 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/EngineFilter.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/EngineFilter.java @@ -126,7 +126,7 @@ public FilterResult apply(TestEngine testEngine) { Preconditions.notBlank(engineId, "TestEngine ID must not be null or blank"); if (this.type == Type.INCLUDE) { - return includedIf(this.engineIds.stream().anyMatch(engineId::equals), // + return includedIf(this.engineIds.contains(engineId), // () -> "Engine ID [%s] is in included list [%s]".formatted(engineId, this.engineIds), // () -> "Engine ID [%s] is not in included list [%s]".formatted(engineId, this.engineIds)); } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/OutputDir.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/OutputDir.java index 925c437d5f1a..7c3ee5a78ef1 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/OutputDir.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/OutputDir.java @@ -140,7 +140,7 @@ private static boolean containsFilesWithExtensions(Path dir, String... extension return false; }; try (Stream pathStream = Files.find(dir, 1, matcher)) { - return pathStream.findFirst().isPresent(); + return pathStream.findAny().isPresent(); } } } diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/engine/discovery/predicates/IsTestFactoryMethodTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/engine/discovery/predicates/IsTestFactoryMethodTests.java index 22c295d74864..ca521ce586b8 100644 --- a/jupiter-tests/src/test/java/org/junit/jupiter/engine/discovery/predicates/IsTestFactoryMethodTests.java +++ b/jupiter-tests/src/test/java/org/junit/jupiter/engine/discovery/predicates/IsTestFactoryMethodTests.java @@ -174,7 +174,7 @@ Collection rawCollectionFactory() { @TestFactory Stream unboundStreamFactory() { - return Stream.of(); + return Stream.empty(); } } diff --git a/platform-tests/src/test/java/org/junit/platform/commons/support/conversion/ConversionSupportTests.java b/platform-tests/src/test/java/org/junit/platform/commons/support/conversion/ConversionSupportTests.java index 4dc0fefb85e0..8f164ad633ed 100644 --- a/platform-tests/src/test/java/org/junit/platform/commons/support/conversion/ConversionSupportTests.java +++ b/platform-tests/src/test/java/org/junit/platform/commons/support/conversion/ConversionSupportTests.java @@ -268,7 +268,7 @@ void convertsStringToURL() throws Exception { @Test void convertsStringsToJavaTimeInstances() { assertConverts("PT1234.5678S", Duration.class, Duration.ofSeconds(1234, 567800000)); - assertConverts("1970-01-01T00:00:00Z", Instant.class, Instant.ofEpochMilli(0)); + assertConverts("1970-01-01T00:00:00Z", Instant.class, Instant.EPOCH); assertConverts("2017-03-14", LocalDate.class, LocalDate.of(2017, 3, 14)); assertConverts("2017-03-14T12:34:56.789", LocalDateTime.class, LocalDateTime.of(2017, 3, 14, 12, 34, 56, 789_000_000)); diff --git a/platform-tests/src/test/java/org/junit/platform/engine/support/descriptor/AbstractTestSourceTests.java b/platform-tests/src/test/java/org/junit/platform/engine/support/descriptor/AbstractTestSourceTests.java index 6154598e5264..cf7544df8476 100644 --- a/platform-tests/src/test/java/org/junit/platform/engine/support/descriptor/AbstractTestSourceTests.java +++ b/platform-tests/src/test/java/org/junit/platform/engine/support/descriptor/AbstractTestSourceTests.java @@ -60,7 +60,7 @@ private void assertSerializable(T instance) { var serialized = serialize(instance); var deserialized = deserialize(serialized); - assertTrue(type.isAssignableFrom(deserialized.getClass())); + assertTrue(type.isInstance(deserialized)); assertEquals(instance, deserialized); } catch (Exception e) { diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java index 50d1f3aac0ad..452a8872f9fa 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/LocalMavenRepo.java @@ -69,7 +69,7 @@ public String toCliArgument() { @Override public void close() throws IOException { try (var files = Files.walk(tempDir)) { - files.sorted(Comparator. naturalOrder().reversed()) // + files.sorted(Comparator.reverseOrder()) // .forEach(path -> { try { Files.delete(path); diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ModularUserGuideTests.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ModularUserGuideTests.java index f74c3f9118c0..772d719d0687 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ModularUserGuideTests.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ModularUserGuideTests.java @@ -181,7 +181,7 @@ private static void treeWalk(Path root, Consumer out) { try (var stream = Files.walk(root)) { stream.map(root::relativize) // .map(path -> path.toString().replace('\\', '/')) // - .sorted().filter(Predicate.not(String::isEmpty)) // + .filter(Predicate.not(String::isEmpty)).sorted() // .forEach(out); } catch (Exception e) { diff --git a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/OutputAttachingExtension.java b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/OutputAttachingExtension.java index 9f78a2c5c7e6..3ae1c3792e88 100644 --- a/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/OutputAttachingExtension.java +++ b/platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/OutputAttachingExtension.java @@ -82,7 +82,7 @@ record OutputDir(Path root) implements AutoCloseable { @Override public void close() throws Exception { - try (var stream = Files.walk(root).sorted(Comparator. naturalOrder().reversed())) { + try (var stream = Files.walk(root).sorted(Comparator.reverseOrder())) { stream.forEach(path -> { try { Files.delete(path); diff --git a/rewrite.yml b/rewrite.yml new file mode 100644 index 000000000000..2580be6fe27c --- /dev/null +++ b/rewrite.yml @@ -0,0 +1,50 @@ +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.junit.jupiter.openrewrite.SanityCheck +displayName: Apply all Java & Gradle best practices +description: Comprehensive code quality recipe combining modernization, security, and best practices. +tags: + - java + - gradle + - static-analysis + - cleanup +recipeList: + - org.openrewrite.java.security.JavaSecurityBestPractices + - org.openrewrite.staticanalysis.NoFinalizer + - org.openrewrite.staticanalysis.RemoveUnusedPrivateMethods + - tech.picnic.errorprone.refasterrules.BigDecimalRulesRecipes + - tech.picnic.errorprone.refasterrules.CharSequenceRulesRecipes + - tech.picnic.errorprone.refasterrules.ClassRulesRecipes + - tech.picnic.errorprone.refasterrules.CollectionRulesRecipes + - tech.picnic.errorprone.refasterrules.ComparatorRulesRecipes + - tech.picnic.errorprone.refasterrules.FileRulesRecipes + - tech.picnic.errorprone.refasterrules.MicrometerRulesRecipes + - tech.picnic.errorprone.refasterrules.PatternRulesRecipes + - tech.picnic.errorprone.refasterrules.PreconditionsRulesRecipes + - tech.picnic.errorprone.refasterrules.PrimitiveRulesRecipes + - tech.picnic.errorprone.refasterrules.StreamRulesRecipes + - tech.picnic.errorprone.refasterrules.TimeRulesRecipes + # - org.openrewrite.staticanalysis.EqualsAvoidsNull + # - org.openrewrite.staticanalysis.ModifierOrder + # - org.checkstyle.CheckstyleAutoFix # await release + # - org.openrewrite.gradle.GradleBestPractices + # - org.openrewrite.java.RemoveUnusedImports + # - org.openrewrite.java.format.RemoveTrailingWhitespace + # - org.openrewrite.java.migrate.UpgradeToJava17 + # - org.openrewrite.java.recipes.JavaRecipeBestPractices + # - org.openrewrite.java.recipes.RecipeTestingBestPractices + # - org.openrewrite.staticanalysis.CodeCleanup # bug + # - org.openrewrite.staticanalysis.CommonStaticAnalysis + # - org.openrewrite.staticanalysis.JavaApiBestPractices + # - org.openrewrite.staticanalysis.LowercasePackage + # - org.openrewrite.staticanalysis.MissingOverrideAnnotation + # - org.openrewrite.staticanalysis.NoToStringOnStringType + # - org.openrewrite.staticanalysis.NoValueOfOnStringType + # - org.openrewrite.staticanalysis.RemoveUnusedLocalVariables + # - org.openrewrite.staticanalysis.RemoveUnusedPrivateFields + # - org.openrewrite.staticanalysis.UnnecessaryCloseInTryWithResources + # - org.openrewrite.staticanalysis.UnnecessaryExplicitTypeArguments + # - org.openrewrite.staticanalysis.UnnecessaryParentheses + # - org.openrewrite.staticanalysis.UnnecessaryReturnAsLastStatement + # - org.openrewrite.staticanalysis.UnnecessaryThrows # bug +---