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;

Reply via email to