This is an automated email from the ASF dual-hosted git repository. korlov pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new 3de57be81e IGNITE-18723 Check all classpath in ClientArchTest (#1695) 3de57be81e is described below commit 3de57be81e1d32b51ba6df903870d3da751e7940 Author: Aleksandr Pakhomov <apk...@gmail.com> AuthorDate: Fri Mar 3 11:13:24 2023 +0400 IGNITE-18723 Check all classpath in ClientArchTest (#1695) --- gradle/libs.versions.toml | 2 +- .../ignite/lang/IgniteExceptionArchTest.java | 2 +- modules/client/build.gradle | 13 ++++ .../org/apache/ignite/client/ClientArchTest.java | 80 +++++++++++++++------- .../ignite/internal/lang/ErrorGroupsArchTest.java | 2 +- 5 files changed, 71 insertions(+), 28 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 96a73f7daf..67b931d4f8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -67,7 +67,7 @@ fastutil = "8.5.6" kryo = "4.0.1" bytebuddy = "1.12.8" mockServer = "5.13.2" -archunit = "0.23.1" +archunit = "1.0.1" testkit = "1.8.2" openapi = "3.2.0" autoService = "1.0.1" diff --git a/modules/api/src/test/java/org/apache/ignite/lang/IgniteExceptionArchTest.java b/modules/api/src/test/java/org/apache/ignite/lang/IgniteExceptionArchTest.java index 83d5ff1c54..02c430b7cd 100644 --- a/modules/api/src/test/java/org/apache/ignite/lang/IgniteExceptionArchTest.java +++ b/modules/api/src/test/java/org/apache/ignite/lang/IgniteExceptionArchTest.java @@ -17,7 +17,6 @@ package org.apache.ignite.lang; -import com.tngtech.archunit.base.Optional; import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.domain.JavaConstructor; import com.tngtech.archunit.core.importer.Location; @@ -31,6 +30,7 @@ import com.tngtech.archunit.lang.ConditionEvents; import com.tngtech.archunit.lang.SimpleConditionEvent; import com.tngtech.archunit.lang.syntax.ArchRuleDefinition; import java.nio.file.Path; +import java.util.Optional; import java.util.Set; import java.util.UUID; diff --git a/modules/client/build.gradle b/modules/client/build.gradle index e2b8ca1cc8..8d026d33a3 100644 --- a/modules/client/build.gradle +++ b/modules/client/build.gradle @@ -56,4 +56,17 @@ dependencies { testImplementation libs.archunit.junit5 } +def archTestDir = "$buildDir/archtest" + +task copyMainClassPathToArchTestDir(type: Copy) { + from sourceSets.main.runtimeClasspath + into archTestDir +} + +test { + systemProperty "archtest.dir", archTestDir +} + +test.dependsOn copyMainClassPathToArchTestDir + description = 'ignite-client' diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientArchTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientArchTest.java index e0c303d20a..7deda280b8 100644 --- a/modules/client/src/test/java/org/apache/ignite/client/ClientArchTest.java +++ b/modules/client/src/test/java/org/apache/ignite/client/ClientArchTest.java @@ -17,18 +17,30 @@ package org.apache.ignite.client; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +import com.tngtech.archunit.core.domain.JavaClasses; import com.tngtech.archunit.core.domain.JavaModifier; +import com.tngtech.archunit.core.importer.ClassFileImporter; import com.tngtech.archunit.core.importer.Location; import com.tngtech.archunit.junit.AnalyzeClasses; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.junit.LocationProvider; -import com.tngtech.archunit.lang.ArchRule; import com.tngtech.archunit.lang.syntax.ArchRuleDefinition; +import com.tngtech.archunit.lang.syntax.elements.FieldsShouldConjunction; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; +import java.util.HashSet; +import java.util.Objects; import java.util.Set; -import org.apache.ignite.client.ClientArchTest.ClassesWithLibsLocationProvider; +import java.util.jar.JarFile; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.ignite.client.ClientArchTest.ModuleAndDependenciesClassPathProvider; import org.apache.ignite.internal.logger.IgniteLogger; +import org.jetbrains.annotations.Nullable; +import org.junit.jupiter.api.Assertions; /** * This test ensures static logger is not used in the modules the client module relies on. @@ -36,33 +48,51 @@ import org.apache.ignite.internal.logger.IgniteLogger; * <p>It's possible to specify a custom logger for an Ignite client, and that configured logger should be used everywhere throughout * a client, that's why we shouldn't use a static logger. */ -@AnalyzeClasses( - locations = ClassesWithLibsLocationProvider.class -) +@AnalyzeClasses(locations = ModuleAndDependenciesClassPathProvider.class) public class ClientArchTest { - static class ClassesWithLibsLocationProvider implements LocationProvider { - @Override - public Set<Location> get(Class<?> testClass) { - // ignite-3/modules/client - Path modulesRoot = Path.of("").toAbsolutePath(); - return Set.of(Location.of(modulesRoot)); + private static final String CLASS_PATH_DIR = System.getProperty("archtest.dir"); + + @ArchTest + FieldsShouldConjunction noStaticIgniteLogger = ArchRuleDefinition.noFields() + .that().haveRawType(IgniteLogger.class) + .should().haveModifier(JavaModifier.STATIC); + + private static JavaClasses clientModuleClasses() { + return new ClassFileImporter().importPath(CLASS_PATH_DIR); + } + + @Nullable + private static JarFile toJarFile(Path path) { + try { + return new JarFile(path.toFile()); + } catch (IOException e) { + return null; } + } - private static Path directoryFromBuildDir(String folder) { - Path path = Paths.get("target", folder); - if (!path.toFile().exists()) { - path = Paths.get("build", folder); - } - if (!path.toFile().exists()) { - throw new AssertionError("Expect " + folder + " directory to exist."); + static class ModuleAndDependenciesClassPathProvider implements LocationProvider { + + @Override + public Set<Location> get(Class<?> clazz) { + // Running this test in IDE is not supported. + // The cpFile is not set up properly, and the test skips. + assumeTrue(CLASS_PATH_DIR != null); + + Path cp = Path.of(CLASS_PATH_DIR); + + Set<Location> result = new HashSet<>(); + result.add(Location.of(cp)); + + try (Stream<Path> walk = Files.walk(cp)) { + walk.map(ClientArchTest::toJarFile) + .filter(Objects::nonNull) + .map(Location::of) + .collect(Collectors.toCollection(() -> result)); + } catch (IOException e) { + Assertions.fail("Failed " + e); } - return path; + return result; } } - - @ArchTest - public static final ArchRule NO_STATIC_LOGGER_FIELD = ArchRuleDefinition.noFields() - .that().haveRawType(IgniteLogger.class) - .should().haveModifier(JavaModifier.STATIC); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/lang/ErrorGroupsArchTest.java b/modules/core/src/test/java/org/apache/ignite/internal/lang/ErrorGroupsArchTest.java index 2b275835a4..1abbd11641 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/lang/ErrorGroupsArchTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/lang/ErrorGroupsArchTest.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.lang; -import com.tngtech.archunit.base.Optional; import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.domain.JavaField; import com.tngtech.archunit.core.importer.Location; @@ -30,6 +29,7 @@ import com.tngtech.archunit.lang.ConditionEvents; import com.tngtech.archunit.lang.SimpleConditionEvent; import com.tngtech.archunit.lang.syntax.ArchRuleDefinition; import java.nio.file.Path; +import java.util.Optional; import java.util.Set; import org.apache.ignite.internal.lang.ErrorGroupsArchTest.CoreLocationProvider; import org.apache.ignite.lang.ErrorGroups;