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