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

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 68c07e1a1b0 Add ClasspathURLProvider implementation that reads system 
properties (#29995)
68c07e1a1b0 is described below

commit 68c07e1a1b05b450a7ce71026afc29fda73645ac
Author: Ling Hengqian <[email protected]>
AuthorDate: Mon Feb 5 12:43:52 2024 +0800

    Add ClasspathURLProvider implementation that reads system properties 
(#29995)
    
    * Add ClasspathURLProvider implementation that reads system properties
    
    * Small refactoring
---
 .../jdbc-driver/known-implementation/_index.cn.md  | 63 +++++++++++++++++++++
 .../jdbc-driver/known-implementation/_index.en.md  | 66 ++++++++++++++++++++++
 .../spi/absolutepath/AbsolutePathURLProvider.java  |  2 +-
 .../AbsolutePathWithEnvironmentURLProvider.java    |  2 +-
 .../driver/spi/classpath/ClasspathURLProvider.java |  2 +-
 .../ClasspathWithEnvironmentURLProvider.java       |  2 +-
 ...va => ClasspathWithSystemPropsURLProvider.java} | 35 ++++--------
 ...iver.jdbc.core.driver.ShardingSphereURLProvider |  3 +-
 .../ClasspathWithSystemPropsURLProviderTest.java   | 58 +++++++++++++++++++
 .../foo-driver-system-properties-fixture.yaml      | 58 +++++++++++++++++++
 .../test/natived/jdbc/databases/MySQLTest.java     | 52 ++++++++++-------
 .../test/natived/jdbc/databases/OpenGaussTest.java | 47 ++++++++++-----
 .../test-native/yaml/databases/mysql.yaml          |  6 +-
 .../test-native/yaml/databases/opengauss.yaml      |  6 +-
 14 files changed, 333 insertions(+), 69 deletions(-)

diff --git 
a/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/jdbc-driver/known-implementation/_index.cn.md
 
b/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/jdbc-driver/known-implementation/_index.cn.md
index 5e708f028e3..b104066ad03 100644
--- 
a/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/jdbc-driver/known-implementation/_index.cn.md
+++ 
b/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/jdbc-driver/known-implementation/_index.cn.md
@@ -79,5 +79,68 @@ ds_1:
 用例:
 - `jdbc:shardingsphere:absolutepath-environment:/path/to/config.yaml`
 
+### 从类路径中加载包含系统属性的配置文件
+
+加载类路径中包含系统属性的 config.yaml 配置文件的 JDBC URL,通过 
`jdbc:shardingsphere:classpath-system-props:` 前缀识别。
+配置文件为 `xxx.yaml`,配置文件格式与`jdbc:shardingsphere:classpath-environment:`一致。
+与 `jdbc:shardingsphere:classpath-environment:` 的区别仅在于读取属性值的位置。
+
+假设存在以下一组系统属性,
+
+1. 
存在系统属性`fixture.config.driver.jdbc-url`为`jdbc:h2:mem:foo_ds_1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL`。
+2. 存在系统属性`fixture.config.driver.username`为`sa`。
+
+则对于以下 YAML 文件的截取片段,
+
+```yaml
+ds_1:
+  dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+  driverClassName: $${fixture.config.driver.driver-class-name::org.h2.Driver}
+  jdbcUrl: $${fixture.config.driver.jdbc-url::jdbc:h2:mem:foo_ds_do_not_use}
+  username: $${fixture.config.driver.username::}
+  password: $${fixture.config.driver.password::}
+```
+
+此 YAML 截取片段将被解析为,
+
+```yaml
+ds_1:
+  dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+  driverClassName: org.h2.Driver
+  jdbcUrl: 
jdbc:h2:mem:foo_ds_1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL
+  username: sa
+  password:
+```
+
+在实际情况下,系统变量通常是动态定义的。
+假设如上系统变量均未定义,存在包含如上YAML截取片段的YAML文件`config.yaml`,
+可参考如下方法创建 DataSource 实例。
+
+```java
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+
+import javax.sql.DataSource;
+
+public DataSource createDataSource() {
+    HikariConfig config = new HikariConfig();
+    
config.setDriverClassName("org.apache.shardingsphere.driver.ShardingSphereDriver");
+    
config.setJdbcUrl("jdbc:shardingsphere:classpath-system-props:config.yaml");
+    try {
+        assert null == System.getProperty("fixture.config.driver.jdbc-url");
+        assert null == System.getProperty("fixture.config.driver.username");
+        System.setProperty("fixture.config.driver.jdbc-url", 
"jdbc:h2:mem:foo_ds_1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL");
+        System.setProperty("fixture.config.driver.username", "sa");
+        return new HikariDataSource(config);
+    } finally {
+        System.clearProperty("fixture.config.driver.jdbc-url");
+        System.clearProperty("fixture.config.driver.username");
+    }
+}
+```
+
+用例:
+- `jdbc:shardingsphere:classpath-system-props:config.yaml`
+
 ### 其他实现
 具体可参考 https://github.com/apache/shardingsphere-plugin 。
diff --git 
a/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/jdbc-driver/known-implementation/_index.en.md
 
b/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/jdbc-driver/known-implementation/_index.en.md
index f896c247342..37c5af9f458 100644
--- 
a/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/jdbc-driver/known-implementation/_index.en.md
+++ 
b/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/jdbc-driver/known-implementation/_index.en.md
@@ -82,5 +82,71 @@ The difference from 
`jdbc:shardingsphere:classpath-environment:` is only where t
 Example:
 - `jdbc:shardingsphere:absolutepath-environment:/path/to/config.yaml`
 
+### Load configuration file containing system properties from classpath
+
+JDBC URL to load the config.yaml configuration file containing system 
properties in the classpath, 
+identified by the `jdbc:shardingsphere:classpath-system-props:` prefix.
+The configuration file is `xxx.yaml`, 
+and the configuration file format is consistent with 
`jdbc:shardingsphere:classpath-environment:`.
+The difference from `jdbc:shardingsphere:classpath-environment:` is only where 
the property value is read.
+
+Assume the following set of system properties exists,
+
+1. The system property `fixture.config.driver.jdbc-url` exists as 
`jdbc:h2:mem:foo_ds_1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL`.
+2. The system property `fixture.config.driver.username` exists as `sa`.
+
+Then for the intercepted fragment of the following YAML file,
+
+```yaml
+ds_1:
+  dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+  driverClassName: $${fixture.config.driver.driver-class-name::org.h2.Driver}
+  jdbcUrl: $${fixture.config.driver.jdbc-url::jdbc:h2:mem:foo_ds_do_not_use}
+  username: $${fixture.config.driver.username::}
+  password: $${fixture.config.driver.password::}
+```
+
+This YAML snippet will be parsed as,
+
+```yaml
+ds_1:
+  dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+  driverClassName: org.h2.Driver
+  jdbcUrl: 
jdbc:h2:mem:foo_ds_1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL
+  username: sa
+  password:
+```
+
+In real situations, system variables are usually defined dynamically.
+Assume that none of the above system variables are defined, 
+and there is a YAML file `config.yaml` containing the above YAML interception 
fragment,
+Users can refer to the following methods to create a DataSource instance.
+
+```java
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+
+import javax.sql.DataSource;
+
+public DataSource createDataSource() {
+    HikariConfig config = new HikariConfig();
+    
config.setDriverClassName("org.apache.shardingsphere.driver.ShardingSphereDriver");
+    
config.setJdbcUrl("jdbc:shardingsphere:classpath-system-props:config.yaml");
+    try {
+        assert null == System.getProperty("fixture.config.driver.jdbc-url");
+        assert null == System.getProperty("fixture.config.driver.username");
+        System.setProperty("fixture.config.driver.jdbc-url", 
"jdbc:h2:mem:foo_ds_1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL");
+        System.setProperty("fixture.config.driver.username", "sa");
+        return new HikariDataSource(config);
+    } finally {
+        System.clearProperty("fixture.config.driver.jdbc-url");
+        System.clearProperty("fixture.config.driver.username");
+    }
+}
+```
+
+Example:
+- `jdbc:shardingsphere:classpath-system-props:config.yaml`
+
 ### Other implementations
 For details, please refer to https://github.com/apache/shardingsphere-plugin .
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/absolutepath/AbsolutePathURLProvider.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/absolutepath/AbsolutePathURLProvider.java
index 5915ac737a3..0c4c5e3be70 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/absolutepath/AbsolutePathURLProvider.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/absolutepath/AbsolutePathURLProvider.java
@@ -51,7 +51,7 @@ public final class AbsolutePathURLProvider extends 
AbstractAbsolutePathURLProvid
             String line;
             while (null != (line = reader.readLine())) {
                 if (!line.startsWith("#")) {
-                    builder.append(line).append('\n');
+                    builder.append(line).append(System.lineSeparator());
                 }
             }
             return builder.toString().getBytes(StandardCharsets.UTF_8);
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/absolutepath/AbsolutePathWithEnvironmentURLProvider.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/absolutepath/AbsolutePathWithEnvironmentURLProvider.java
index fdaa76d7a43..e6749403a54 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/absolutepath/AbsolutePathWithEnvironmentURLProvider.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/absolutepath/AbsolutePathWithEnvironmentURLProvider.java
@@ -58,7 +58,7 @@ public class AbsolutePathWithEnvironmentURLProvider extends 
AbstractAbsolutePath
             while (null != (line = reader.readLine())) {
                 if (!line.startsWith("#")) {
                     line = replaceEnvironmentVariables(line);
-                    builder.append(line).append('\n');
+                    builder.append(line).append(System.lineSeparator());
                 }
             }
             return builder.toString().getBytes(StandardCharsets.UTF_8);
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathURLProvider.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathURLProvider.java
index 9b488f6f5e5..b9fe26f8e2a 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathURLProvider.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathURLProvider.java
@@ -49,7 +49,7 @@ public final class ClasspathURLProvider extends 
AbstractClasspathURLProvider {
             String line;
             while (null != (line = reader.readLine())) {
                 if (!line.startsWith("#")) {
-                    builder.append(line).append('\n');
+                    builder.append(line).append(System.lineSeparator());
                 }
             }
             return builder.toString().getBytes(StandardCharsets.UTF_8);
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithEnvironmentURLProvider.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithEnvironmentURLProvider.java
index 43c51a8b32a..0d13564e314 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithEnvironmentURLProvider.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithEnvironmentURLProvider.java
@@ -56,7 +56,7 @@ public final class ClasspathWithEnvironmentURLProvider 
extends AbstractClasspath
             while (null != (line = reader.readLine())) {
                 if (!line.startsWith("#")) {
                     line = replaceEnvironmentVariables(line);
-                    builder.append(line).append('\n');
+                    builder.append(line).append(System.lineSeparator());
                 }
             }
             return builder.toString().getBytes(StandardCharsets.UTF_8);
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithEnvironmentURLProvider.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithSystemPropsURLProvider.java
similarity index 66%
copy from 
jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithEnvironmentURLProvider.java
copy to 
jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithSystemPropsURLProvider.java
index 43c51a8b32a..43f5f824f9e 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithEnvironmentURLProvider.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithSystemPropsURLProvider.java
@@ -29,11 +29,11 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 /**
- * Classpath with environment variables URL provider.
+ * Classpath with system properties URL provider.
  */
-public final class ClasspathWithEnvironmentURLProvider extends 
AbstractClasspathURLProvider {
+public final class ClasspathWithSystemPropsURLProvider extends 
AbstractClasspathURLProvider {
     
-    private static final String PATH_TYPE = "classpath-environment:";
+    private static final String PATH_TYPE = "classpath-system-props:";
     
     private static final String KEY_VALUE_SEPARATOR = "::";
     
@@ -55,39 +55,26 @@ public final class ClasspathWithEnvironmentURLProvider 
extends AbstractClasspath
             String line;
             while (null != (line = reader.readLine())) {
                 if (!line.startsWith("#")) {
-                    line = replaceEnvironmentVariables(line);
-                    builder.append(line).append('\n');
+                    line = replaceSystemProperties(line);
+                    builder.append(line).append(System.lineSeparator());
                 }
             }
             return builder.toString().getBytes(StandardCharsets.UTF_8);
         }
     }
     
-    private String replaceEnvironmentVariables(final String line) {
+    private String replaceSystemProperties(final String line) {
         Matcher matcher = PATTERN.matcher(line);
         if (!matcher.find()) {
             return line;
         }
-        String[] envNameAndDefaultValue = 
matcher.group(1).split(KEY_VALUE_SEPARATOR, 2);
-        String envName = envNameAndDefaultValue[0];
-        String envValue = getEnvironmentVariables(envName);
-        if (Strings.isNullOrEmpty(envValue) && 
envNameAndDefaultValue[1].isEmpty()) {
+        String[] systemPropNameAndDefaultValue = 
matcher.group(1).split(KEY_VALUE_SEPARATOR, 2);
+        String systemPropName = systemPropNameAndDefaultValue[0];
+        String systemPropValue = System.getProperty(systemPropName, 
systemPropNameAndDefaultValue[1]);
+        if (Strings.isNullOrEmpty(systemPropValue)) {
             String modifiedLineWithSpace = matcher.replaceAll("");
             return modifiedLineWithSpace.substring(0, 
modifiedLineWithSpace.length() - 1);
         }
-        if (Strings.isNullOrEmpty(envValue)) {
-            envValue = envNameAndDefaultValue[1];
-        }
-        return matcher.replaceAll(envValue);
-    }
-    
-    /**
-     * This method is only used for mocking environment variables in unit 
tests and should not be used under any circumstances.
-     *
-     * @param name the name of the environment variable
-     * @return the string value of the variable, or null if the variable is 
not defined in the system environment
-     */
-    String getEnvironmentVariables(final String name) {
-        return System.getenv(name);
+        return matcher.replaceAll(systemPropValue);
     }
 }
diff --git 
a/jdbc/core/src/main/resources/META-INF/services/org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereURLProvider
 
b/jdbc/core/src/main/resources/META-INF/services/org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereURLProvider
index 87ba2a946ab..d0b1d6a989a 100644
--- 
a/jdbc/core/src/main/resources/META-INF/services/org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereURLProvider
+++ 
b/jdbc/core/src/main/resources/META-INF/services/org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereURLProvider
@@ -16,6 +16,7 @@
 #
 
 
org.apache.shardingsphere.driver.jdbc.core.driver.spi.absolutepath.AbsolutePathURLProvider
+org.apache.shardingsphere.driver.jdbc.core.driver.spi.absolutepath.AbsolutePathWithEnvironmentURLProvider
 
org.apache.shardingsphere.driver.jdbc.core.driver.spi.classpath.ClasspathURLProvider
 
org.apache.shardingsphere.driver.jdbc.core.driver.spi.classpath.ClasspathWithEnvironmentURLProvider
-org.apache.shardingsphere.driver.jdbc.core.driver.spi.absolutepath.AbsolutePathWithEnvironmentURLProvider
+org.apache.shardingsphere.driver.jdbc.core.driver.spi.classpath.ClasspathWithSystemPropsURLProvider
diff --git 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithSystemPropsURLProviderTest.java
 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithSystemPropsURLProviderTest.java
new file mode 100644
index 00000000000..4c5a26a265a
--- /dev/null
+++ 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/driver/spi/classpath/ClasspathWithSystemPropsURLProviderTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.shardingsphere.driver.jdbc.core.driver.spi.classpath;
+
+import 
org.apache.shardingsphere.driver.jdbc.core.driver.ShardingSphereURLManager;
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.nullValue;
+
+public class ClasspathWithSystemPropsURLProviderTest {
+    
+    private static final String FIXTURE_JDBC_URL_KEY = 
"fixture.config.driver.jdbc-url";
+    
+    private static final String FIXTURE_USERNAME_KEY = 
"fixture.config.driver.username";
+    
+    @BeforeAll
+    static void beforeAll() {
+        assertThat(System.getProperty(FIXTURE_JDBC_URL_KEY), 
Matchers.is(nullValue()));
+        assertThat(System.getProperty(FIXTURE_USERNAME_KEY), 
Matchers.is(nullValue()));
+        System.setProperty(FIXTURE_JDBC_URL_KEY, 
"jdbc:h2:mem:foo_ds_1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL");
+        System.setProperty(FIXTURE_USERNAME_KEY, "sa");
+    }
+    
+    @AfterAll
+    static void afterAll() {
+        System.clearProperty(FIXTURE_JDBC_URL_KEY);
+        System.clearProperty(FIXTURE_USERNAME_KEY);
+    }
+    
+    @Test
+    void assertReplaceEnvironmentVariables() {
+        final String urlPrefix = "jdbc:shardingsphere:";
+        ClasspathWithSystemPropsURLProvider urlProvider = new 
ClasspathWithSystemPropsURLProvider();
+        byte[] actual = 
urlProvider.getContent("jdbc:shardingsphere:classpath-system-props:config/driver/foo-driver-system-properties-fixture.yaml",
 urlPrefix);
+        byte[] actualOrigin = 
ShardingSphereURLManager.getContent("jdbc:shardingsphere:classpath:config/driver/foo-driver-fixture.yaml",
 urlPrefix);
+        assertThat(actual, is(actualOrigin));
+    }
+}
diff --git 
a/jdbc/core/src/test/resources/config/driver/foo-driver-system-properties-fixture.yaml
 
b/jdbc/core/src/test/resources/config/driver/foo-driver-system-properties-fixture.yaml
new file mode 100644
index 00000000000..9668e2350d5
--- /dev/null
+++ 
b/jdbc/core/src/test/resources/config/driver/foo-driver-system-properties-fixture.yaml
@@ -0,0 +1,58 @@
+#
+# 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.
+#
+
+# After `ShardingSphereURLManager.getContent`, this file should be equivalent 
to `foo-driver-fixture.yaml` in the same folder.
+databaseName: foo_driver_fixture_db
+
+dataSources:
+  ds_0:
+    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+    driverClassName: org.h2.Driver
+    jdbcUrl: 
jdbc:h2:mem:foo_ds_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL
+    username: sa
+    password:
+  ds_1:
+    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+    driverClassName: $${fixture.config.driver.driver-class-name::org.h2.Driver}
+    jdbcUrl: $${fixture.config.driver.jdbc-url::jdbc:h2:mem:foo_ds_do_not_use}
+    username: $${fixture.config.driver.username::}
+    password: $${fixture.config.driver.password::}
+
+rules:
+  - !SHARDING
+    autoTables:
+      t_order:
+        actualDataSources: ds_0,ds_1
+        shardingStrategy:
+          standard:
+            shardingColumn: order_id
+            shardingAlgorithmName: auto_mod
+        keyGenerateStrategy:
+          column: user_id
+          keyGeneratorName: snowflake
+    shardingAlgorithms:
+      auto_mod:
+        type: HASH_MOD
+        props:
+          sharding-count: 2
+    
+    keyGenerators:
+      snowflake:
+        type: SNOWFLAKE
+
+props:
+  sql-show: true
diff --git 
a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java
 
b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java
index d80055a24e4..13b6a0f8776 100644
--- 
a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java
+++ 
b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java
@@ -17,13 +17,9 @@
 
 package org.apache.shardingsphere.test.natived.jdbc.databases;
 
-import com.github.dockerjava.api.model.ExposedPort;
-import com.github.dockerjava.api.model.HostConfig;
-import com.github.dockerjava.api.model.PortBinding;
-import com.github.dockerjava.api.model.Ports;
 import com.mysql.cj.jdbc.exceptions.CommunicationsException;
-import 
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
-import org.apache.shardingsphere.test.natived.jdbc.commons.FileTestUtils;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
 import org.apache.shardingsphere.test.natived.jdbc.commons.TestShardingService;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.Test;
@@ -32,20 +28,23 @@ import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.utility.DockerImageName;
 
 import javax.sql.DataSource;
-import java.io.IOException;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.time.Duration;
 import java.util.Properties;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+
 /**
  * Unable to use `org.testcontainers:mysql:1.19.3` under GraalVM Native Image.
  * Background comes from <a 
href="https://github.com/testcontainers/testcontainers-java/issues/7954";>testcontainers/testcontainers-java#7954</a>.
  */
 class MySQLTest {
     
-    private static final Integer MYSQL_PORT_ON_HOST = 60107;
+    private static final String SYSTEM_PROP_KEY_PREFIX = 
"fixture.test-native.yaml.database.mysql.";
     
     private static final String USERNAME = "root";
     
@@ -53,23 +52,22 @@ class MySQLTest {
     
     private static final String DATABASE = "test";
     
-    private static final String JDBC_URL = "jdbc:mysql://localhost:" + 
MYSQL_PORT_ON_HOST + "/" + DATABASE;
+    private String jdbcUrlPrefix;
     
     private TestShardingService testShardingService;
     
     @SuppressWarnings("resource")
     @Test
     @EnabledInNativeImage
-    void assertShardingInLocalTransactions() throws SQLException, IOException {
+    void assertShardingInLocalTransactions() throws SQLException {
         try (
-                GenericContainer<?> databaseContainer = new 
GenericContainer<>(DockerImageName.parse("mysql:8.2.0-oracle"))
+                GenericContainer<?> container = new 
GenericContainer<>(DockerImageName.parse("mysql:8.2.0-oracle"))
                         .withEnv("MYSQL_DATABASE", DATABASE)
                         .withEnv("MYSQL_ROOT_PASSWORD", PASSWORD)
-                        .withCreateContainerCmdModifier(
-                                cmd -> cmd.withHostConfig(new 
HostConfig().withPortBindings(new 
PortBinding(Ports.Binding.bindPort(MYSQL_PORT_ON_HOST), new 
ExposedPort(3306)))))) {
-            databaseContainer.start();
-            beforeAll();
-            DataSource dataSource = 
YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("test-native/yaml/databases/mysql.yaml"));
+                        .withExposedPorts(3306)) {
+            container.start();
+            jdbcUrlPrefix = "jdbc:mysql://localhost:" + 
container.getMappedPort(3306) + "/";
+            DataSource dataSource = createDataSource();
             testShardingService = new TestShardingService(dataSource);
             this.initEnvironment();
             testShardingService.processSuccess();
@@ -86,15 +84,15 @@ class MySQLTest {
         testShardingService.getAddressRepository().truncateTable();
     }
     
-    private static Connection openConnection() throws SQLException {
+    private Connection openConnection() throws SQLException {
         Properties props = new Properties();
         props.setProperty("user", USERNAME);
         props.setProperty("password", PASSWORD);
-        return DriverManager.getConnection(JDBC_URL, props);
+        return DriverManager.getConnection(jdbcUrlPrefix + DATABASE, props);
     }
     
     @SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"})
-    private void beforeAll() {
+    private DataSource createDataSource() {
         
Awaitility.await().atMost(Duration.ofMinutes(1)).ignoreExceptionsMatching(e -> 
e instanceof CommunicationsException)
                 .until(() -> {
                     openConnection().close();
@@ -107,5 +105,21 @@ class MySQLTest {
         } catch (SQLException e) {
             throw new RuntimeException(e);
         }
+        HikariConfig config = new HikariConfig();
+        
config.setDriverClassName("org.apache.shardingsphere.driver.ShardingSphereDriver");
+        
config.setJdbcUrl("jdbc:shardingsphere:classpath-system-props:test-native/yaml/databases/mysql.yaml");
+        try {
+            assertThat(System.getProperty(SYSTEM_PROP_KEY_PREFIX + 
"ds0.jdbc-url"), is(nullValue()));
+            assertThat(System.getProperty(SYSTEM_PROP_KEY_PREFIX + 
"ds1.jdbc-url"), is(nullValue()));
+            assertThat(System.getProperty(SYSTEM_PROP_KEY_PREFIX + 
"ds2.jdbc-url"), is(nullValue()));
+            System.setProperty(SYSTEM_PROP_KEY_PREFIX + "ds0.jdbc-url", 
jdbcUrlPrefix + "demo_ds_0");
+            System.setProperty(SYSTEM_PROP_KEY_PREFIX + "ds1.jdbc-url", 
jdbcUrlPrefix + "demo_ds_1");
+            System.setProperty(SYSTEM_PROP_KEY_PREFIX + "ds2.jdbc-url", 
jdbcUrlPrefix + "demo_ds_2");
+            return new HikariDataSource(config);
+        } finally {
+            System.clearProperty(SYSTEM_PROP_KEY_PREFIX + "ds0.jdbc-url");
+            System.clearProperty(SYSTEM_PROP_KEY_PREFIX + "ds1.jdbc-url");
+            System.clearProperty(SYSTEM_PROP_KEY_PREFIX + "ds2.jdbc-url");
+        }
     }
 }
diff --git 
a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java
 
b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java
index 41428b819cc..0259e1ee073 100644
--- 
a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java
+++ 
b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java
@@ -17,12 +17,8 @@
 
 package org.apache.shardingsphere.test.natived.jdbc.databases;
 
-import com.github.dockerjava.api.model.ExposedPort;
-import com.github.dockerjava.api.model.HostConfig;
-import com.github.dockerjava.api.model.PortBinding;
-import com.github.dockerjava.api.model.Ports;
-import 
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
-import org.apache.shardingsphere.test.natived.jdbc.commons.FileTestUtils;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
 import org.apache.shardingsphere.test.natived.jdbc.commons.TestShardingService;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.Test;
@@ -31,36 +27,41 @@ import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.utility.DockerImageName;
 
 import javax.sql.DataSource;
-import java.io.IOException;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.time.Duration;
 import java.util.Properties;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+
 class OpenGaussTest {
     
+    private static final String SYSTEM_PROP_KEY_PREFIX = 
"fixture.test-native.yaml.database.opengauss.";
+    
     private static final String USERNAME = "gaussdb";
     
     private static final String PASSWORD = "openGauss@123";
     
     private static final String DATABASE = "postgres";
     
-    private static final String JDBC_URL = "jdbc:opengauss://localhost:62390/" 
+ DATABASE;
+    private String jdbcUrlPrefix;
     
     private TestShardingService testShardingService;
     
     @SuppressWarnings("resource")
     @Test
     @EnabledInNativeImage
-    void assertShardingInLocalTransactions() throws SQLException, IOException {
+    void assertShardingInLocalTransactions() throws SQLException {
         try (
                 GenericContainer<?> openGaussContainer = new 
GenericContainer<>(DockerImageName.parse("opengauss/opengauss:5.0.0"))
                         .withEnv("GS_PASSWORD", PASSWORD)
-                        .withCreateContainerCmdModifier(cmd -> 
cmd.withHostConfig(new HostConfig().withPortBindings(new 
PortBinding(Ports.Binding.bindPort(62390), new ExposedPort(5432)))))) {
+                        .withExposedPorts(5432)) {
             openGaussContainer.start();
-            beforeAll();
-            DataSource dataSource = 
YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("test-native/yaml/databases/opengauss.yaml"));
+            jdbcUrlPrefix = "jdbc:opengauss://localhost:" + 
openGaussContainer.getMappedPort(5432) + "/";
+            DataSource dataSource = createDataSource();
             testShardingService = new TestShardingService(dataSource);
             this.initEnvironment();
             testShardingService.processSuccess();
@@ -77,15 +78,15 @@ class OpenGaussTest {
         testShardingService.getAddressRepository().truncateTable();
     }
     
-    private static Connection openConnection() throws SQLException {
+    private Connection openConnection() throws SQLException {
         Properties props = new Properties();
         props.setProperty("user", USERNAME);
         props.setProperty("password", PASSWORD);
-        return DriverManager.getConnection(JDBC_URL, props);
+        return DriverManager.getConnection(jdbcUrlPrefix + DATABASE, props);
     }
     
     @SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"})
-    private void beforeAll() {
+    private DataSource createDataSource() {
         
Awaitility.await().atMost(Duration.ofMinutes(1)).ignoreExceptions().until(() -> 
{
             openConnection().close();
             return true;
@@ -97,5 +98,21 @@ class OpenGaussTest {
         } catch (SQLException e) {
             throw new RuntimeException(e);
         }
+        HikariConfig config = new HikariConfig();
+        
config.setDriverClassName("org.apache.shardingsphere.driver.ShardingSphereDriver");
+        
config.setJdbcUrl("jdbc:shardingsphere:classpath-system-props:test-native/yaml/databases/opengauss.yaml");
+        try {
+            assertThat(System.getProperty(SYSTEM_PROP_KEY_PREFIX + 
"ds0.jdbc-url"), is(nullValue()));
+            assertThat(System.getProperty(SYSTEM_PROP_KEY_PREFIX + 
"ds1.jdbc-url"), is(nullValue()));
+            assertThat(System.getProperty(SYSTEM_PROP_KEY_PREFIX + 
"ds2.jdbc-url"), is(nullValue()));
+            System.setProperty(SYSTEM_PROP_KEY_PREFIX + "ds0.jdbc-url", 
jdbcUrlPrefix + "demo_ds_0");
+            System.setProperty(SYSTEM_PROP_KEY_PREFIX + "ds1.jdbc-url", 
jdbcUrlPrefix + "demo_ds_1");
+            System.setProperty(SYSTEM_PROP_KEY_PREFIX + "ds2.jdbc-url", 
jdbcUrlPrefix + "demo_ds_2");
+            return new HikariDataSource(config);
+        } finally {
+            System.clearProperty(SYSTEM_PROP_KEY_PREFIX + "ds0.jdbc-url");
+            System.clearProperty(SYSTEM_PROP_KEY_PREFIX + "ds1.jdbc-url");
+            System.clearProperty(SYSTEM_PROP_KEY_PREFIX + "ds2.jdbc-url");
+        }
     }
 }
diff --git 
a/test/native/src/test/resources/test-native/yaml/databases/mysql.yaml 
b/test/native/src/test/resources/test-native/yaml/databases/mysql.yaml
index 5f70ee338df..950b1fea8c6 100644
--- a/test/native/src/test/resources/test-native/yaml/databases/mysql.yaml
+++ b/test/native/src/test/resources/test-native/yaml/databases/mysql.yaml
@@ -24,19 +24,19 @@ dataSources:
   ds_0:
     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
     driverClassName: com.mysql.cj.jdbc.Driver
-    jdbcUrl: jdbc:mysql://localhost:60107/demo_ds_0
+    jdbcUrl: $${fixture.test-native.yaml.database.mysql.ds0.jdbc-url::}
     username: root
     password: 123456
   ds_1:
     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
     driverClassName: com.mysql.cj.jdbc.Driver
-    jdbcUrl: jdbc:mysql://localhost:60107/demo_ds_1
+    jdbcUrl: $${fixture.test-native.yaml.database.mysql.ds1.jdbc-url::}
     username: root
     password: 123456
   ds_2:
     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
     driverClassName: com.mysql.cj.jdbc.Driver
-    jdbcUrl: jdbc:mysql://localhost:60107/demo_ds_2
+    jdbcUrl: $${fixture.test-native.yaml.database.mysql.ds2.jdbc-url::}
     username: root
     password: 123456
 
diff --git 
a/test/native/src/test/resources/test-native/yaml/databases/opengauss.yaml 
b/test/native/src/test/resources/test-native/yaml/databases/opengauss.yaml
index d16f2e1c5d0..8b011d69fbf 100644
--- a/test/native/src/test/resources/test-native/yaml/databases/opengauss.yaml
+++ b/test/native/src/test/resources/test-native/yaml/databases/opengauss.yaml
@@ -24,19 +24,19 @@ dataSources:
   ds_0:
     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
     driverClassName: org.opengauss.Driver
-    jdbcUrl: jdbc:opengauss://localhost:62390/demo_ds_0
+    jdbcUrl: $${fixture.test-native.yaml.database.opengauss.ds0.jdbc-url::}
     username: gaussdb
     password: openGauss@123
   ds_1:
     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
     driverClassName: org.opengauss.Driver
-    jdbcUrl: jdbc:opengauss://localhost:62390/demo_ds_1
+    jdbcUrl: $${fixture.test-native.yaml.database.opengauss.ds1.jdbc-url::}
     username: gaussdb
     password: openGauss@123
   ds_2:
     dataSourceClassName: com.zaxxer.hikari.HikariDataSource
     driverClassName: org.opengauss.Driver
-    jdbcUrl: jdbc:opengauss://localhost:62390/demo_ds_2
+    jdbcUrl: $${fixture.test-native.yaml.database.opengauss.ds2.jdbc-url::}
     username: gaussdb
     password: openGauss@123
 


Reply via email to