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; } }
