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 eac5d5716e3 KAFKA-20553 Remove storage dependency on core test output 
(#22854)
eac5d5716e3 is described below

commit eac5d5716e3a901d5607d5fbe18d64c098918e7c
Author: YANG-SYUAN CHOU <[email protected]>
AuthorDate: Tue Jul 21 14:06:29 2026 +0800

    KAFKA-20553 Remove storage dependency on core test output (#22854)
    
    This PR removes the `storage` module's dependency on the `core` test
    output.
    
    The remaining usages of `kafka.utils.TestUtils` are replaced by:
    
    - Using empty `Properties` instances in `RemoteLagCopyTest` and
    `RemoteLogManagerTest`, since the required remote log manager properties
    are added by `appendRLMConfig`.
    - Using `org.apache.kafka.test.TestUtils.tempDirectory()` in
    `TieredStorageTestUtils`.
    
    With these usages removed, the following dependency is no longer
    required:
    
    ```gradle
    testImplementation project(':core').sourceSets.test.output
    ```
    
    The dependency on the `core` main output is retained because the storage
    tests still use broker classes from that module.
    
    ### Testing
    
    ```bash
    ./gradlew :core:clean :storage:clean :storage:test --rerun-tasks
    --no-build-cache
    ```
    
    All storage tests passed.
    
    Reviewers: Ken Huang <[email protected]>, Chia-Ping Tsai
     <[email protected]>
---
 build.gradle                                       |  1 -
 .../log/remote/storage/RemoteLagCopyTest.java      | 39 ++++++++--------------
 .../log/remote/storage/RemoteLogManagerTest.java   | 34 +++++++------------
 .../storage/utils/TieredStorageTestUtils.java      |  5 ++-
 4 files changed, 27 insertions(+), 52 deletions(-)

diff --git a/build.gradle b/build.gradle
index d982af0a8e9..6ce62a932be 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2487,7 +2487,6 @@ project(':storage') {
     testImplementation project(':clients')
     testImplementation testFixtures(project(':clients'))
     testImplementation project(':core')
-    testImplementation project(':core').sourceSets.test.output
     testImplementation testFixtures(project(':storage:storage-api'))
     testImplementation project(':metadata')
     testImplementation project(':test-common:test-common-internal-api')
diff --git 
a/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLagCopyTest.java
 
b/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLagCopyTest.java
index f0941f894d8..e4e24ab96b1 100644
--- 
a/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLagCopyTest.java
+++ 
b/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLagCopyTest.java
@@ -44,7 +44,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.Properties;
 import java.util.concurrent.atomic.AtomicLong;
 
 import static 
org.apache.kafka.server.log.remote.storage.RemoteLogManagerConfig.DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX;
@@ -85,7 +84,6 @@ public class RemoteLagCopyTest {
     private final UnifiedLog mockLog = mock(UnifiedLog.class);
 
     private final Metrics metrics = new Metrics(time);
-    private final Properties brokerConfig = 
kafka.utils.TestUtils.createDummyBrokerConfig();
     private final TopicIdPartition leaderTopicIdPartition =
             new TopicIdPartition(Uuid.randomUuid(), new 
TopicPartition("Leader", 0));
     private final Optional<Endpoint> endPoint =
@@ -97,11 +95,19 @@ public class RemoteLagCopyTest {
 
     @BeforeEach
     void setUp() throws Exception {
-        Properties props = brokerConfig;
-        
props.setProperty(RemoteLogManagerConfig.REMOTE_LOG_STORAGE_SYSTEM_ENABLE_PROP, 
"true");
-        
props.setProperty(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_TASK_INTERVAL_MS_PROP,
 "100");
-        appendRLMConfig(props);
-        config = new RemoteLogManagerConfig(new 
AbstractConfig(RemoteLogManagerConfig.configDef(), props));
+        Map<String, Object> configs = Map.of(
+            RemoteLogManagerConfig.REMOTE_LOG_STORAGE_SYSTEM_ENABLE_PROP, true,
+            RemoteLogManagerConfig.REMOTE_LOG_MANAGER_TASK_INTERVAL_MS_PROP, 
100,
+            RemoteLogManagerConfig.REMOTE_STORAGE_MANAGER_CLASS_NAME_PROP, 
NoOpRemoteStorageManager.class.getName(),
+            
RemoteLogManagerConfig.REMOTE_LOG_METADATA_MANAGER_CLASS_NAME_PROP, 
NoOpRemoteLogMetadataManager.class.getName(),
+            DEFAULT_REMOTE_STORAGE_MANAGER_CONFIG_PREFIX + 
remoteLogStorageTestProp, remoteLogStorageTestVal,
+            DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
TopicBasedRemoteLogMetadataManagerConfig.REMOTE_LOG_METADATA_TOPIC_PARTITIONS_PROP,
 remoteLogMetadataTopicPartitionsNum,
+            DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataTestProp, remoteLogMetadataTestVal,
+            DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataCommonClientTestProp, remoteLogMetadataCommonClientTestVal,
+            DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataConsumerTestProp, remoteLogMetadataConsumerTestVal,
+            DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataProducerTestProp, remoteLogMetadataProducerTestVal
+        );
+        config = new RemoteLogManagerConfig(new 
AbstractConfig(RemoteLogManagerConfig.configDef(), configs));
         brokerTopicStats = new 
BrokerTopicStats(config.isRemoteStorageSystemEnabled());
 
         remoteLogManager = new RemoteLogManager(config, brokerId, logDir, 
clusterId, time,
@@ -804,23 +810,4 @@ public class RemoteLagCopyTest {
         List<RemoteLogManager.EnrichedLogSegment> actual = 
task.candidateLogSegments(log, 5L, 20L);
         assertEquals(expected, actual);
     }
-
-    private void appendRLMConfig(Properties props) {
-        
props.put(RemoteLogManagerConfig.REMOTE_LOG_STORAGE_SYSTEM_ENABLE_PROP, true);
-        
props.put(RemoteLogManagerConfig.REMOTE_STORAGE_MANAGER_CLASS_NAME_PROP,
-                NoOpRemoteStorageManager.class.getName());
-        
props.put(RemoteLogManagerConfig.REMOTE_LOG_METADATA_MANAGER_CLASS_NAME_PROP,
-                NoOpRemoteLogMetadataManager.class.getName());
-        props.put(DEFAULT_REMOTE_STORAGE_MANAGER_CONFIG_PREFIX + 
remoteLogStorageTestProp, remoteLogStorageTestVal);
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX
-                        + 
TopicBasedRemoteLogMetadataManagerConfig.REMOTE_LOG_METADATA_TOPIC_PARTITIONS_PROP,
-                remoteLogMetadataTopicPartitionsNum);
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataTestProp, remoteLogMetadataTestVal);
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataCommonClientTestProp,
-                remoteLogMetadataCommonClientTestVal);
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataConsumerTestProp,
-                remoteLogMetadataConsumerTestVal);
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataProducerTestProp,
-                remoteLogMetadataProducerTestVal);
-    }
 }
diff --git 
a/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerTest.java
 
b/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerTest.java
index 983ac727f52..b6d5ae7aefb 100644
--- 
a/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerTest.java
+++ 
b/storage/src/test/java/org/apache/kafka/server/log/remote/storage/RemoteLogManagerTest.java
@@ -216,7 +216,6 @@ public class RemoteLogManagerTest {
     private UnifiedLog mockLog = mock(UnifiedLog.class);
 
     private final MockScheduler scheduler = new MockScheduler(time);
-    private final Properties brokerConfig = 
kafka.utils.TestUtils.createDummyBrokerConfig();
 
     private final String host = "localhost";
     private final int port = 1234;
@@ -228,9 +227,7 @@ public class RemoteLogManagerTest {
         checkpoint = new LeaderEpochCheckpointFile(TestUtils.tempFile(), new 
LogDirFailureChannel(1));
         topicIds.put(leaderTopicIdPartition.topicPartition().topic(), 
leaderTopicIdPartition.topicId());
         topicIds.put(followerTopicIdPartition.topicPartition().topic(), 
followerTopicIdPartition.topicId());
-        Properties props = brokerConfig;
-        
props.setProperty(RemoteLogManagerConfig.REMOTE_LOG_STORAGE_SYSTEM_ENABLE_PROP, 
"true");
-        
props.setProperty(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_TASK_INTERVAL_MS_PROP,
 "100");
+        Properties props = new Properties();
         appendRLMConfig(props);
         config = configs(props);
         brokerTopicStats = new 
BrokerTopicStats(config.isRemoteStorageSystemEnabled());
@@ -353,7 +350,6 @@ public class RemoteLogManagerTest {
         String key = "key";
         String configPrefix = "config.prefix";
         Properties props = new Properties();
-        props.putAll(brokerConfig);
         
props.put(RemoteLogManagerConfig.REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX_PROP,
 configPrefix);
         props.put(configPrefix + key, "world");
         props.put("remote.log.metadata.y", "z");
@@ -370,7 +366,6 @@ public class RemoteLogManagerTest {
         String key = "key";
         String configPrefix = "config.prefix";
         Properties props = new Properties();
-        props.putAll(brokerConfig);
         
props.put(RemoteLogManagerConfig.REMOTE_STORAGE_MANAGER_CONFIG_PREFIX_PROP, 
configPrefix);
         props.put(configPrefix + key, "world");
         props.put("remote.storage.manager.y", "z");
@@ -397,7 +392,6 @@ public class RemoteLogManagerTest {
     @Test
     void testRemoteLogMetadataManagerWithEndpointConfigOverridden() throws 
IOException {
         Properties props = new Properties();
-        props.putAll(brokerConfig);
         // override common security.protocol by adding "RLMM prefix" and 
"remote log metadata common client prefix"
         props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
REMOTE_LOG_METADATA_COMMON_CLIENT_PREFIX + "security.protocol", "SSL");
         appendRLMConfig(props);
@@ -3789,7 +3783,6 @@ public class RemoteLogManagerTest {
     @Test
     public void testCopyQuotaManagerConfig() {
         Properties defaultProps = new Properties();
-        defaultProps.putAll(brokerConfig);
         appendRLMConfig(defaultProps);
         RemoteLogManagerConfig defaultRlmConfig = configs(defaultProps);
         RLMQuotaManagerConfig defaultConfig = 
RemoteLogManager.copyQuotaManagerConfig(defaultRlmConfig);
@@ -3798,7 +3791,6 @@ public class RemoteLogManagerTest {
         
assertEquals(DEFAULT_REMOTE_LOG_MANAGER_COPY_QUOTA_WINDOW_SIZE_SECONDS, 
defaultConfig.quotaWindowSizeSeconds());
 
         Properties customProps = new Properties();
-        customProps.putAll(brokerConfig);
         
customProps.put(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_COPY_MAX_BYTES_PER_SECOND_PROP,
 100);
         
customProps.put(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_COPY_QUOTA_WINDOW_NUM_PROP,
 31);
         
customProps.put(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_COPY_QUOTA_WINDOW_SIZE_SECONDS_PROP,
 1);
@@ -3814,7 +3806,6 @@ public class RemoteLogManagerTest {
     @Test
     public void testFetchQuotaManagerConfig() {
         Properties defaultProps = new Properties();
-        defaultProps.putAll(brokerConfig);
         appendRLMConfig(defaultProps);
         RemoteLogManagerConfig defaultRlmConfig = configs(defaultProps);
 
@@ -3824,7 +3815,6 @@ public class RemoteLogManagerTest {
         
assertEquals(DEFAULT_REMOTE_LOG_MANAGER_FETCH_QUOTA_WINDOW_SIZE_SECONDS, 
defaultConfig.quotaWindowSizeSeconds());
 
         Properties customProps = new Properties();
-        customProps.putAll(brokerConfig);
         
customProps.put(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_FETCH_MAX_BYTES_PER_SECOND_PROP,
 100);
         
customProps.put(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_FETCH_QUOTA_WINDOW_NUM_PROP,
 31);
         
customProps.put(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_FETCH_QUOTA_WINDOW_SIZE_SECONDS_PROP,
 1);
@@ -4207,7 +4197,7 @@ public class RemoteLogManagerTest {
         // 100ms, the test will fail.
         remoteLogManager.close();
         clearInvocations(remoteLogMetadataManager, remoteStorageManager);
-        Properties props = brokerConfig;
+        Properties props = new Properties();
         
props.setProperty(RemoteLogManagerConfig.REMOTE_LOG_STORAGE_SYSTEM_ENABLE_PROP, 
"true");
         
props.setProperty(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_TASK_INTERVAL_MS_PROP,
 "30000");
         appendRLMConfig(props);
@@ -4281,7 +4271,6 @@ public class RemoteLogManagerTest {
     @Test
     public void testMonitorableRemoteLogStorageManager() throws IOException {
         Properties props = new Properties();
-        props.putAll(brokerConfig);
         appendRLMConfig(props);
         
props.put(RemoteLogManagerConfig.REMOTE_STORAGE_MANAGER_CLASS_NAME_PROP, 
MonitorableNoOpRemoteStorageManager.class.getName());
         
props.put(RemoteLogManagerConfig.REMOTE_LOG_METADATA_MANAGER_CLASS_NAME_PROP, 
MonitorableNoOpRemoteLogMetadataManager.class.getName());
@@ -4355,16 +4344,17 @@ public class RemoteLogManagerTest {
     }
 
     private void appendRLMConfig(Properties props) {
-        
props.put(RemoteLogManagerConfig.REMOTE_LOG_STORAGE_SYSTEM_ENABLE_PROP, true);
-        
props.put(RemoteLogManagerConfig.REMOTE_STORAGE_MANAGER_CLASS_NAME_PROP, 
NoOpRemoteStorageManager.class.getName());
-        
props.put(RemoteLogManagerConfig.REMOTE_LOG_METADATA_MANAGER_CLASS_NAME_PROP, 
NoOpRemoteLogMetadataManager.class.getName());
-        props.put(DEFAULT_REMOTE_STORAGE_MANAGER_CONFIG_PREFIX + 
remoteLogStorageTestProp, remoteLogStorageTestVal);
+        
props.putIfAbsent(RemoteLogManagerConfig.REMOTE_LOG_STORAGE_SYSTEM_ENABLE_PROP, 
true);
+        
props.putIfAbsent(RemoteLogManagerConfig.REMOTE_STORAGE_MANAGER_CLASS_NAME_PROP,
 NoOpRemoteStorageManager.class.getName());
+        
props.putIfAbsent(RemoteLogManagerConfig.REMOTE_LOG_METADATA_MANAGER_CLASS_NAME_PROP,
 NoOpRemoteLogMetadataManager.class.getName());
+        props.putIfAbsent(DEFAULT_REMOTE_STORAGE_MANAGER_CONFIG_PREFIX + 
remoteLogStorageTestProp, remoteLogStorageTestVal);
         // adding configs with "remote log metadata manager config prefix"
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
REMOTE_LOG_METADATA_TOPIC_PARTITIONS_PROP, remoteLogMetadataTopicPartitionsNum);
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataTestProp, remoteLogMetadataTestVal);
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataCommonClientTestProp, remoteLogMetadataCommonClientTestVal);
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataConsumerTestProp, remoteLogMetadataConsumerTestVal);
-        props.put(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataProducerTestProp, remoteLogMetadataProducerTestVal);
+        props.putIfAbsent(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
REMOTE_LOG_METADATA_TOPIC_PARTITIONS_PROP, remoteLogMetadataTopicPartitionsNum);
+        props.putIfAbsent(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataTestProp, remoteLogMetadataTestVal);
+        props.putIfAbsent(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataCommonClientTestProp, remoteLogMetadataCommonClientTestVal);
+        props.putIfAbsent(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataConsumerTestProp, remoteLogMetadataConsumerTestVal);
+        props.putIfAbsent(DEFAULT_REMOTE_LOG_METADATA_MANAGER_CONFIG_PREFIX + 
remoteLogMetadataProducerTestProp, remoteLogMetadataProducerTestVal);
+        
props.putIfAbsent(RemoteLogManagerConfig.REMOTE_LOG_MANAGER_TASK_INTERVAL_MS_PROP,
 "100");
     }
 
     public static class MonitorableNoOpRemoteStorageManager extends 
NoOpRemoteStorageManager implements Monitorable {
diff --git 
a/storage/src/test/java/org/apache/kafka/tiered/storage/utils/TieredStorageTestUtils.java
 
b/storage/src/test/java/org/apache/kafka/tiered/storage/utils/TieredStorageTestUtils.java
index cd0d243da04..f99774496ad 100644
--- 
a/storage/src/test/java/org/apache/kafka/tiered/storage/utils/TieredStorageTestUtils.java
+++ 
b/storage/src/test/java/org/apache/kafka/tiered/storage/utils/TieredStorageTestUtils.java
@@ -16,8 +16,6 @@
  */
 package org.apache.kafka.tiered.storage.utils;
 
-import kafka.utils.TestUtils;
-
 import org.apache.kafka.clients.admin.TopicDescription;
 import org.apache.kafka.common.TopicPartition;
 import org.apache.kafka.common.config.TopicConfig;
@@ -29,6 +27,7 @@ import 
org.apache.kafka.server.log.remote.metadata.storage.TopicBasedRemoteLogMe
 import 
org.apache.kafka.server.log.remote.metadata.storage.TopicBasedRemoteLogMetadataManagerConfig;
 import org.apache.kafka.server.log.remote.storage.LocalTieredStorage;
 import org.apache.kafka.storage.internals.log.CleanerConfig;
+import org.apache.kafka.test.TestUtils;
 import org.apache.kafka.tiered.storage.TieredStorageTestContext;
 
 import org.junit.jupiter.api.Assertions;
@@ -158,7 +157,7 @@ public class TieredStorageTestUtils {
         // Set a small number of retry interval for retrying 
RemoteLogMetadataManager resources initialization to speed up the test
         overridingProps.setProperty(metadataConfigPrefix(testClassName, 
REMOTE_LOG_METADATA_INITIALIZATION_RETRY_INTERVAL_MS_PROP), 
RLMM_INIT_RETRY_INTERVAL_MS.toString());
         // Set 2 log dirs to make sure JBOD feature is working correctly
-        overridingProps.setProperty(ServerLogConfigs.LOG_DIRS_CONFIG, 
TestUtils.tempDir().getAbsolutePath() + "," + 
TestUtils.tempDir().getAbsolutePath());
+        overridingProps.setProperty(ServerLogConfigs.LOG_DIRS_CONFIG, 
TestUtils.tempDirectory().getAbsolutePath() + "," + 
TestUtils.tempDirectory().getAbsolutePath());
         // Disable unnecessary log cleaner
         overridingProps.setProperty(CleanerConfig.LOG_CLEANER_ENABLE_PROP, 
"false");
 

Reply via email to