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 <[email protected]>
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;