This is an automated email from the ASF dual-hosted git repository.

chia7712 pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 90703da7125 KAFKA-20553 Eliminate the dependencies on 
"sourceSets.test.output" (raft) (#22274)
90703da7125 is described below

commit 90703da71258ebf22737862775066eae031431af
Author: Eric Chang <[email protected]>
AuthorDate: Thu May 14 03:18:00 2026 +0800

    KAFKA-20553 Eliminate the dependencies on "sourceSets.test.output" (raft) 
(#22274)
    
    Gradle test fixtures to the raft module and removes all dependencies on
    sourceSets.test.output. We should revisit other usages in this JIRA.
    This will simplify the dependency graph and unblock the upgrade to
    Gradle 9.5+
    
    This patch is working on raft module
    
    Ref: https://issues.apache.org/jira/browse/KAFKA-20553 Similar to
    https://github.com/apache/kafka/pull/22229 (server-common) and
    https://github.com/apache/kafka/pull/22244 (storage:storage-api)
    
    - Apply `java-test-fixtures` plugin to `:raft`
    - Move test helper classes (MockLog, RaftClientTestContext,
    MockNetworkChannel,
      etc.) from `src/test/` to `src/testFixtures/`
    - Introduce `VoterSetTestUtil` in testFixtures to hold the static
    helpers
      previously in `VoterSetTest`. This is necessary because
    `MockNetworkChannel`
      (now in testFixtures) referenced `VoterSetTest.DEFAULT_LISTENER_NAME`,
    but
      testFixtures cannot depend on the test source set. `VoterSetTest` is
    updated
      to delegate to `VoterSetTestUtil`, so existing call sites are
    unchanged.
    - Update `:core` and `:metadata` to use `testFixtures(project(':raft'))`
      instead of `project(':raft').sourceSets.test.output`
    - Add `:raft` to `protectedModules` to prevent future regressions
    
    Reviewers: Chia-Ping Tsai <[email protected]>
---
 build.gradle                                       | 15 +++-
 .../java/org/apache/kafka/raft/VoterSetTest.java   | 47 ++---------
 .../record/internal/ArbitraryMemoryRecords.java    |  0
 .../apache/kafka/raft/MockExpirationService.java   |  0
 .../java/org/apache/kafka/raft/MockLog.java        |  0
 .../org/apache/kafka/raft/MockMessageQueue.java    |  0
 .../org/apache/kafka/raft/MockNetworkChannel.java  |  2 +-
 .../apache/kafka/raft/MockQuorumStateStore.java    |  0
 .../java/org/apache/kafka/raft/MockableRandom.java |  2 +-
 .../apache/kafka/raft/RaftClientTestContext.java   |  0
 .../org/apache/kafka/raft/ReplicatedCounter.java   |  0
 .../org/apache/kafka/raft/VoterSetTestUtil.java    | 94 ++++++++++++++++++++++
 .../kafka/snapshot/MockRawSnapshotReader.java      |  0
 .../kafka/snapshot/MockRawSnapshotWriter.java      |  0
 14 files changed, 117 insertions(+), 43 deletions(-)

diff --git a/build.gradle b/build.gradle
index aaf5bf9d6f6..b45ca7d12c9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1149,7 +1149,7 @@ project(':core') {
     testImplementation testFixtures(project(':group-coordinator'))
     testImplementation testFixtures(project(':share-coordinator'))
     testImplementation testFixtures(project(':metadata'))
-    testImplementation project(':raft').sourceSets.test.output
+    testImplementation testFixtures(project(':raft'))
     testImplementation testFixtures(project(':server-common'))
     testImplementation testFixtures(project(':storage:storage-api'))
     testImplementation project(':server').sourceSets.test.output
@@ -1429,7 +1429,7 @@ project(':metadata') {
     testImplementation libs.jqwik
     testImplementation libs.mockitoCore
     testImplementation testFixtures(project(':clients'))
-    testImplementation project(':raft').sourceSets.test.output
+    testImplementation testFixtures(project(':raft'))
     testImplementation testFixtures(project(':server-common'))
     testImplementation project(':test-common:test-common-util')
 
@@ -2178,6 +2178,8 @@ project(':raft') {
     archivesName = "kafka-raft"
   }
 
+  apply plugin: 'java-test-fixtures'
+
   configurations {
     generator
   }
@@ -2189,6 +2191,14 @@ project(':raft') {
     implementation libs.jacksonDatabind
     implementation libs.slf4jApi
 
+    testFixturesImplementation project(':clients')
+    testFixturesImplementation testFixtures(project(':clients'))
+    testFixturesImplementation project(':server-common')
+    testFixturesImplementation libs.jqwik
+    testFixturesImplementation libs.junitJupiter
+    testFixturesImplementation libs.mockitoCore
+    testFixturesImplementation libs.slf4jApi
+
     testImplementation project(':server-common')
     testImplementation testFixtures(project(':server-common'))
     testImplementation project(':clients')
@@ -4104,6 +4114,7 @@ gradle.projectsEvaluated {
     'group-coordinator': ':group-coordinator',
     'share-coordinator': ':share-coordinator',
     'metadata': ':metadata',
+    'raft': ':raft',
   ]
   allprojects { proj ->
     proj.configurations.all { config ->
diff --git a/raft/src/test/java/org/apache/kafka/raft/VoterSetTest.java 
b/raft/src/test/java/org/apache/kafka/raft/VoterSetTest.java
index bd303933103..336e101f333 100644
--- a/raft/src/test/java/org/apache/kafka/raft/VoterSetTest.java
+++ b/raft/src/test/java/org/apache/kafka/raft/VoterSetTest.java
@@ -20,7 +20,6 @@ import org.apache.kafka.common.Node;
 import org.apache.kafka.common.Uuid;
 import org.apache.kafka.common.feature.SupportedVersionRange;
 import org.apache.kafka.common.network.ListenerName;
-import org.apache.kafka.server.common.Feature;
 import org.apache.kafka.server.common.KRaftVersion;
 
 import org.junit.jupiter.api.Test;
@@ -32,8 +31,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
@@ -365,64 +362,36 @@ public final class VoterSetTest {
         );
     }
 
-    public static final ListenerName DEFAULT_LISTENER_NAME = 
ListenerName.normalised("LISTENER");
+    public static final ListenerName DEFAULT_LISTENER_NAME = 
VoterSetTestUtil.DEFAULT_LISTENER_NAME;
 
     public static Map<Integer, VoterSet.VoterNode> voterMap(
         IntStream replicas,
         boolean withDirectoryId
     ) {
-        return replicas
-            .boxed()
-            .collect(
-                Collectors.toMap(
-                    Function.identity(),
-                    id -> voterNode(id, withDirectoryId)
-                )
-            );
+        return VoterSetTestUtil.voterMap(replicas, withDirectoryId);
     }
 
     public static Map<Integer, VoterSet.VoterNode> voterMap(Stream<ReplicaKey> 
replicas) {
-        return replicas
-            .collect(Collectors.toMap(ReplicaKey::id, 
VoterSetTest::voterNode));
+        return VoterSetTestUtil.voterMap(replicas);
     }
 
     public static VoterSet.VoterNode voterNode(int id, boolean 
withDirectoryId) {
-        return voterNode(
-            ReplicaKey.of(
-                id,
-                withDirectoryId ? Uuid.randomUuid() : 
ReplicaKey.NO_DIRECTORY_ID
-            )
-        );
+        return VoterSetTestUtil.voterNode(id, withDirectoryId);
     }
 
     public static VoterSet.VoterNode voterNode(ReplicaKey replicaKey) {
-        return voterNode(
-            replicaKey,
-            Endpoints.fromInetSocketAddresses(
-                Map.of(
-                    DEFAULT_LISTENER_NAME,
-                    InetSocketAddress.createUnresolved(
-                        "localhost",
-                        9990 + replicaKey.id()
-                    )
-                )
-            )
-        );
+        return VoterSetTestUtil.voterNode(replicaKey);
     }
 
     public static VoterSet.VoterNode voterNode(ReplicaKey replicaKey, 
Endpoints endpoints) {
-        var supportedVersionRange = replicaKey.directoryId().isEmpty() ?
-            new SupportedVersionRange((short) 0) :
-            Feature.KRAFT_VERSION.supportedVersionRange();
-
-        return new VoterSet.VoterNode(replicaKey, endpoints, 
supportedVersionRange);
+        return VoterSetTestUtil.voterNode(replicaKey, endpoints);
     }
 
     public static VoterSet voterSet(Map<Integer, VoterSet.VoterNode> voters) {
-        return VoterSet.fromMap(voters);
+        return VoterSetTestUtil.voterSet(voters);
     }
 
     public static VoterSet voterSet(Stream<ReplicaKey> voterKeys) {
-        return voterSet(voterMap(voterKeys));
+        return VoterSetTestUtil.voterSet(voterKeys);
     }
 }
diff --git 
a/raft/src/test/java/org/apache/kafka/common/record/internal/ArbitraryMemoryRecords.java
 
b/raft/src/testFixtures/java/org/apache/kafka/common/record/internal/ArbitraryMemoryRecords.java
similarity index 100%
rename from 
raft/src/test/java/org/apache/kafka/common/record/internal/ArbitraryMemoryRecords.java
rename to 
raft/src/testFixtures/java/org/apache/kafka/common/record/internal/ArbitraryMemoryRecords.java
diff --git 
a/raft/src/test/java/org/apache/kafka/raft/MockExpirationService.java 
b/raft/src/testFixtures/java/org/apache/kafka/raft/MockExpirationService.java
similarity index 100%
rename from raft/src/test/java/org/apache/kafka/raft/MockExpirationService.java
rename to 
raft/src/testFixtures/java/org/apache/kafka/raft/MockExpirationService.java
diff --git a/raft/src/test/java/org/apache/kafka/raft/MockLog.java 
b/raft/src/testFixtures/java/org/apache/kafka/raft/MockLog.java
similarity index 100%
rename from raft/src/test/java/org/apache/kafka/raft/MockLog.java
rename to raft/src/testFixtures/java/org/apache/kafka/raft/MockLog.java
diff --git a/raft/src/test/java/org/apache/kafka/raft/MockMessageQueue.java 
b/raft/src/testFixtures/java/org/apache/kafka/raft/MockMessageQueue.java
similarity index 100%
rename from raft/src/test/java/org/apache/kafka/raft/MockMessageQueue.java
rename to raft/src/testFixtures/java/org/apache/kafka/raft/MockMessageQueue.java
diff --git a/raft/src/test/java/org/apache/kafka/raft/MockNetworkChannel.java 
b/raft/src/testFixtures/java/org/apache/kafka/raft/MockNetworkChannel.java
similarity index 99%
rename from raft/src/test/java/org/apache/kafka/raft/MockNetworkChannel.java
rename to 
raft/src/testFixtures/java/org/apache/kafka/raft/MockNetworkChannel.java
index 47785fab4be..f85445126a1 100644
--- a/raft/src/test/java/org/apache/kafka/raft/MockNetworkChannel.java
+++ b/raft/src/testFixtures/java/org/apache/kafka/raft/MockNetworkChannel.java
@@ -28,7 +28,7 @@ import java.util.Optional;
 import java.util.concurrent.atomic.AtomicInteger;
 
 public class MockNetworkChannel implements NetworkChannel {
-    public static final ListenerName LISTENER_NAME = 
VoterSetTest.DEFAULT_LISTENER_NAME;
+    public static final ListenerName LISTENER_NAME = 
VoterSetTestUtil.DEFAULT_LISTENER_NAME;
 
     private final AtomicInteger correlationIdCounter;
     private final List<RaftRequest.Outbound> sendQueue = new ArrayList<>();
diff --git a/raft/src/test/java/org/apache/kafka/raft/MockQuorumStateStore.java 
b/raft/src/testFixtures/java/org/apache/kafka/raft/MockQuorumStateStore.java
similarity index 100%
rename from raft/src/test/java/org/apache/kafka/raft/MockQuorumStateStore.java
rename to 
raft/src/testFixtures/java/org/apache/kafka/raft/MockQuorumStateStore.java
diff --git a/raft/src/test/java/org/apache/kafka/raft/MockableRandom.java 
b/raft/src/testFixtures/java/org/apache/kafka/raft/MockableRandom.java
similarity index 97%
rename from raft/src/test/java/org/apache/kafka/raft/MockableRandom.java
rename to raft/src/testFixtures/java/org/apache/kafka/raft/MockableRandom.java
index b487b160678..75912f18f7a 100644
--- a/raft/src/test/java/org/apache/kafka/raft/MockableRandom.java
+++ b/raft/src/testFixtures/java/org/apache/kafka/raft/MockableRandom.java
@@ -23,7 +23,7 @@ import java.util.function.IntFunction;
 /**
  * A Random instance that makes it easy to modify the behavior of certain 
methods for test purposes.
  */
-class MockableRandom extends Random {
+public class MockableRandom extends Random {
 
     private IntFunction<OptionalInt> nextIntFunction = __ -> 
OptionalInt.empty();
 
diff --git 
a/raft/src/test/java/org/apache/kafka/raft/RaftClientTestContext.java 
b/raft/src/testFixtures/java/org/apache/kafka/raft/RaftClientTestContext.java
similarity index 100%
rename from raft/src/test/java/org/apache/kafka/raft/RaftClientTestContext.java
rename to 
raft/src/testFixtures/java/org/apache/kafka/raft/RaftClientTestContext.java
diff --git a/raft/src/test/java/org/apache/kafka/raft/ReplicatedCounter.java 
b/raft/src/testFixtures/java/org/apache/kafka/raft/ReplicatedCounter.java
similarity index 100%
rename from raft/src/test/java/org/apache/kafka/raft/ReplicatedCounter.java
rename to 
raft/src/testFixtures/java/org/apache/kafka/raft/ReplicatedCounter.java
diff --git 
a/raft/src/testFixtures/java/org/apache/kafka/raft/VoterSetTestUtil.java 
b/raft/src/testFixtures/java/org/apache/kafka/raft/VoterSetTestUtil.java
new file mode 100644
index 00000000000..1324bb19738
--- /dev/null
+++ b/raft/src/testFixtures/java/org/apache/kafka/raft/VoterSetTestUtil.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.kafka.raft;
+
+import org.apache.kafka.common.Uuid;
+import org.apache.kafka.common.feature.SupportedVersionRange;
+import org.apache.kafka.common.network.ListenerName;
+import org.apache.kafka.server.common.Feature;
+
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public final class VoterSetTestUtil {
+    public static final ListenerName DEFAULT_LISTENER_NAME = 
ListenerName.normalised("LISTENER");
+
+    public static Map<Integer, VoterSet.VoterNode> voterMap(
+        IntStream replicas,
+        boolean withDirectoryId
+    ) {
+        return replicas
+            .boxed()
+            .collect(
+                Collectors.toMap(
+                    Function.identity(),
+                    id -> voterNode(id, withDirectoryId)
+                )
+            );
+    }
+
+    public static Map<Integer, VoterSet.VoterNode> voterMap(Stream<ReplicaKey> 
replicas) {
+        return replicas
+            .collect(Collectors.toMap(ReplicaKey::id, 
VoterSetTestUtil::voterNode));
+    }
+
+    public static VoterSet.VoterNode voterNode(int id, boolean 
withDirectoryId) {
+        return voterNode(
+            ReplicaKey.of(
+                id,
+                withDirectoryId ? Uuid.randomUuid() : 
ReplicaKey.NO_DIRECTORY_ID
+            )
+        );
+    }
+
+    public static VoterSet.VoterNode voterNode(ReplicaKey replicaKey) {
+        return voterNode(
+            replicaKey,
+            Endpoints.fromInetSocketAddresses(
+                Map.of(
+                    DEFAULT_LISTENER_NAME,
+                    InetSocketAddress.createUnresolved(
+                        "localhost",
+                        9990 + replicaKey.id()
+                    )
+                )
+            )
+        );
+    }
+
+    public static VoterSet.VoterNode voterNode(ReplicaKey replicaKey, 
Endpoints endpoints) {
+        var supportedVersionRange = replicaKey.directoryId().isEmpty() ?
+            new SupportedVersionRange((short) 0) :
+            Feature.KRAFT_VERSION.supportedVersionRange();
+
+        return new VoterSet.VoterNode(replicaKey, endpoints, 
supportedVersionRange);
+    }
+
+    public static VoterSet voterSet(Map<Integer, VoterSet.VoterNode> voters) {
+        return VoterSet.fromMap(voters);
+    }
+
+    public static VoterSet voterSet(Stream<ReplicaKey> voterKeys) {
+        return voterSet(voterMap(voterKeys));
+    }
+
+    private VoterSetTestUtil() {}
+}
diff --git 
a/raft/src/test/java/org/apache/kafka/snapshot/MockRawSnapshotReader.java 
b/raft/src/testFixtures/java/org/apache/kafka/snapshot/MockRawSnapshotReader.java
similarity index 100%
rename from 
raft/src/test/java/org/apache/kafka/snapshot/MockRawSnapshotReader.java
rename to 
raft/src/testFixtures/java/org/apache/kafka/snapshot/MockRawSnapshotReader.java
diff --git 
a/raft/src/test/java/org/apache/kafka/snapshot/MockRawSnapshotWriter.java 
b/raft/src/testFixtures/java/org/apache/kafka/snapshot/MockRawSnapshotWriter.java
similarity index 100%
rename from 
raft/src/test/java/org/apache/kafka/snapshot/MockRawSnapshotWriter.java
rename to 
raft/src/testFixtures/java/org/apache/kafka/snapshot/MockRawSnapshotWriter.java

Reply via email to