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

github-merge-queue[bot] pushed a commit to branch 
gh-readonly-queue/dev/pr-12148-af5c3f3101e0bf0b83108ec7420c84c29ccaa936
in repository https://gitbox.apache.org/repos/asf/seatunnel.git

commit b59152ffadbc1a100e5caf37987878786fb5d42b
Author: Yiğitcan Öztürk <[email protected]>
AuthorDate: Mon Sep 7 05:40:27 2026 +0000

    [Improve][Connector-V2] Validate nonblank Sentry DSN (#12148)
---
 .../seatunnel/sentry/sink/SentrySinkFactory.java   |  3 +-
 .../seatunnel/sentry/SentryFactoryTest.java        | 41 +++++++++++++++++++++-
 2 files changed, 42 insertions(+), 2 deletions(-)

diff --git 
a/seatunnel-connectors-v2/connector-sentry/src/main/java/org/apache/seatunnel/connectors/seatunnel/sentry/sink/SentrySinkFactory.java
 
b/seatunnel-connectors-v2/connector-sentry/src/main/java/org/apache/seatunnel/connectors/seatunnel/sentry/sink/SentrySinkFactory.java
index 4b288d34f1..d142fa2375 100644
--- 
a/seatunnel-connectors-v2/connector-sentry/src/main/java/org/apache/seatunnel/connectors/seatunnel/sentry/sink/SentrySinkFactory.java
+++ 
b/seatunnel-connectors-v2/connector-sentry/src/main/java/org/apache/seatunnel/connectors/seatunnel/sentry/sink/SentrySinkFactory.java
@@ -17,6 +17,7 @@
 
 package org.apache.seatunnel.connectors.seatunnel.sentry.sink;
 
+import org.apache.seatunnel.api.configuration.util.Conditions;
 import org.apache.seatunnel.api.configuration.util.OptionRule;
 import org.apache.seatunnel.api.table.connector.TableSink;
 import org.apache.seatunnel.api.table.factory.Factory;
@@ -36,7 +37,7 @@ public class SentrySinkFactory implements TableSinkFactory {
     @Override
     public OptionRule optionRule() {
         return OptionRule.builder()
-                .required(SentrySinkOptions.DSN)
+                .required(SentrySinkOptions.DSN, 
Conditions.notBlank(SentrySinkOptions.DSN))
                 .optional(
                         SentrySinkOptions.ENV,
                         SentrySinkOptions.CACHE_DIRPATH,
diff --git 
a/seatunnel-connectors-v2/connector-sentry/src/test/java/org/apache/seatunnel/connectors/seatunnel/sentry/SentryFactoryTest.java
 
b/seatunnel-connectors-v2/connector-sentry/src/test/java/org/apache/seatunnel/connectors/seatunnel/sentry/SentryFactoryTest.java
index 8f7f0cb12d..3bb59eb44c 100644
--- 
a/seatunnel-connectors-v2/connector-sentry/src/test/java/org/apache/seatunnel/connectors/seatunnel/sentry/SentryFactoryTest.java
+++ 
b/seatunnel-connectors-v2/connector-sentry/src/test/java/org/apache/seatunnel/connectors/seatunnel/sentry/SentryFactoryTest.java
@@ -17,15 +17,54 @@
 
 package org.apache.seatunnel.connectors.seatunnel.sentry;
 
+import org.apache.seatunnel.api.configuration.ReadonlyConfig;
+import org.apache.seatunnel.api.configuration.util.ConfigValidator;
+import org.apache.seatunnel.api.configuration.util.OptionRule;
+import org.apache.seatunnel.api.configuration.util.OptionValidationException;
+import 
org.apache.seatunnel.connectors.seatunnel.sentry.config.SentrySinkOptions;
 import org.apache.seatunnel.connectors.seatunnel.sentry.sink.SentrySinkFactory;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.util.HashMap;
+import java.util.Map;
+
 class SentryFactoryTest {
 
+    private final OptionRule optionRule = new SentrySinkFactory().optionRule();
+
     @Test
     void optionRule() {
-        Assertions.assertNotNull((new SentrySinkFactory()).optionRule());
+        Assertions.assertNotNull(optionRule);
+    }
+
+    @Test
+    void testValidDsn() {
+        Assertions.assertDoesNotThrow(
+                () -> validate(configWithDsn("https://[email protected]/1";)));
+    }
+
+    @Test
+    void testEmptyDsnRejected() {
+        Assertions.assertThrows(OptionValidationException.class, () -> 
validate(configWithDsn("")));
+    }
+
+    @Test
+    void testWhitespaceOnlyDsnRejected() {
+        Assertions.assertThrows(
+                OptionValidationException.class, () -> 
validate(configWithDsn("   \t")));
+    }
+
+    private void validate(Map<String, Object> config) {
+        ReadonlyConfig readonlyConfig = ReadonlyConfig.fromMap(config);
+        ConfigValidator.validateUnknownKeys(readonlyConfig, optionRule, 
"SentrySink");
+        ConfigValidator.of(readonlyConfig).validate(optionRule);
+    }
+
+    private Map<String, Object> configWithDsn(String dsn) {
+        Map<String, Object> config = new HashMap<>();
+        config.put(SentrySinkOptions.DSN.key(), dsn);
+        return config;
     }
 }

Reply via email to