From 2db14498b2815e082b74674bb6452327f143061c Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Thu, 14 May 2026 11:54:26 -0700 Subject: [PATCH 01/10] Added check if database created/dropped by other tests to avoid long wait on operation --- .../client/ClickHouseServerForTest.java | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java index d3a32515e..33469d45e 100644 --- a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java +++ b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java @@ -8,6 +8,7 @@ import org.testcontainers.containers.Network; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.images.builder.ImageFromDockerfile; +import org.testcontainers.shaded.org.checkerframework.checker.units.qual.A; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; @@ -22,6 +23,7 @@ import java.util.Map; import java.util.Properties; import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; import static java.time.temporal.ChronoUnit.SECONDS; @@ -62,6 +64,8 @@ public class ClickHouseServerForTest { private static boolean isCloud = false; private static final String database; + private static final AtomicBoolean databaseCreatedCloud = new AtomicBoolean(false); + private static final AtomicBoolean databaseDroppedCloud = new AtomicBoolean(false); static { properties = new Properties(System.getProperties()); @@ -320,10 +324,15 @@ public static boolean isCloud() { @BeforeSuite(groups = {"integration"}) public static void beforeSuite() { if (isCloud) { - if (!runQuery("CREATE DATABASE IF NOT EXISTS " + database)) { - throw new RuntimeException("Failed to create database for testing."); - } + synchronized (databaseCreatedCloud) { + if (!databaseCreatedCloud.get()) { + if (!runQuery("CREATE DATABASE IF NOT EXISTS " + database)) { + throw new RuntimeException("Failed to create database for testing."); + } + databaseCreatedCloud.set(true); + } + } return; } @@ -358,8 +367,14 @@ public static void afterSuite() { } if (isCloud) { - if (!runQuery("DROP DATABASE IF EXISTS `" + database + "`")) { - LOGGER.warn("Failed to drop database for testing."); + synchronized (databaseDroppedCloud) { + if (!databaseDroppedCloud.get()) { + if (!runQuery("DROP DATABASE IF EXISTS `" + database + "`")) { + LOGGER.warn("Failed to drop database for testing."); + } + + databaseDroppedCloud.set(true); + } } } } @@ -391,16 +406,18 @@ public static boolean runQuery(String sql) { try { URL serverURL = new URL(uri); LOGGER.info("sending request to {} (uri={})", serverURL, uri); - + sql = "SELECT 1"; + byte[] postData = sql.getBytes(StandardCharsets.UTF_8); for (int attempts = 0; attempts < 10; attempts++) { HttpURLConnection httpConn = (HttpURLConnection) serverURL.openConnection(); try { httpConn.setRequestMethod("POST"); httpConn.setDoOutput(true); httpConn.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString(("default:" + getPassword()).getBytes())); + httpConn.setFixedLengthStreamingMode(postData.length); try (OutputStream out = httpConn.getOutputStream()) { - out.write(sql.getBytes(StandardCharsets.UTF_8)); + out.write(postData, 0, postData.length); out.flush(); } From 931eb9ecb3dbec0379780aae0bdca8811d3d2cd9 Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Thu, 14 May 2026 11:56:23 -0700 Subject: [PATCH 02/10] fix --- .../test/java/com/clickhouse/client/ClickHouseServerForTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java index 33469d45e..fadd717a9 100644 --- a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java +++ b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java @@ -406,7 +406,6 @@ public static boolean runQuery(String sql) { try { URL serverURL = new URL(uri); LOGGER.info("sending request to {} (uri={})", serverURL, uri); - sql = "SELECT 1"; byte[] postData = sql.getBytes(StandardCharsets.UTF_8); for (int attempts = 0; attempts < 10; attempts++) { HttpURLConnection httpConn = (HttpURLConnection) serverURL.openConnection(); From f5c7f03d4f523f33e2c0c6f38cf5a14d0ebc0aa9 Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Thu, 14 May 2026 13:54:05 -0700 Subject: [PATCH 03/10] Added option for external database for cloud tests --- .github/workflows/build.yml | 33 ++++++++++++++++- .../client/ClickHouseServerForTest.java | 36 +++++++++---------- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index adfdd54fb..8012cd0ad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -256,6 +256,23 @@ jobs: EOF - name: Install Java client run: mvn --also-make --batch-mode --no-transfer-progress -DskipTests=true -Dmaven.javadoc.skip=true install + - name: Generate Database Name + run: | + # Combine the GitHub Run ID and a random number to guarantee uniqueness + RANDOM_DB="clickhouse_java_test_${GITHUB_RUN_ID}_${RANDOM}" + + # Write it to GITHUB_ENV so future steps can access it as $DB_NAME + echo "TEST_DB_NAME=$RANDOM_DB" >> $GITHUB_ENV + echo "Generated database name: $RANDOM_DB" + + - name: Create Temporary Database + env: + CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT }} + CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT }} + run: | + echo "::add-mask::$CLICKHOUSE_CLOUD_HOST" + echo "Creating database: $TEST_DB_NAME" + curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "CREATE DATABASE IF NOT EXISTS $TEST_DB_NAME" - name: Test http client env: CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT }} @@ -271,7 +288,21 @@ jobs: path: | **/target/failsafe-reports **/target/surefire-reports - + - name: Cleanup Database Unconditionally + if: always() # CRITICAL: This ensures the step runs regardless of previous success/failure + env: + CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT }} + CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT }} + run: | + echo "::add-mask::$CLICKHOUSE_CLOUD_HOST" + # Verify we actually generated a DB name to avoid dropping something accidentally + if [ -n "$TEST_DB_NAME" ]; then + echo "Cleaning up database: $TEST_DB_NAME" +# curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "DROP DATABASE IF EXISTS $TEST_DB_NAME" + curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "SELECT '$TEST_DB_NAME'" + else + echo "No database name was generated; skipping cleanup." + fi test-jdbc-driver: runs-on: ubuntu-latest needs: test-java-client diff --git a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java index fadd717a9..c322950ad 100644 --- a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java +++ b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java @@ -8,7 +8,6 @@ import org.testcontainers.containers.Network; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.images.builder.ImageFromDockerfile; -import org.testcontainers.shaded.org.checkerframework.checker.units.qual.A; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; @@ -23,7 +22,6 @@ import java.util.Map; import java.util.Properties; import java.util.UUID; -import java.util.concurrent.atomic.AtomicBoolean; import static java.time.temporal.ChronoUnit.SECONDS; @@ -64,12 +62,20 @@ public class ClickHouseServerForTest { private static boolean isCloud = false; private static final String database; - private static final AtomicBoolean databaseCreatedCloud = new AtomicBoolean(false); - private static final AtomicBoolean databaseDroppedCloud = new AtomicBoolean(false); + private static final boolean localDatabase; static { properties = new Properties(System.getProperties()); - database = "clickhouse_java_" + UUID.randomUUID().toString().substring(0, 8) + "_test_" + System.currentTimeMillis(); + String externalDatabase = System.getenv("TEST_DB_NAME"); // see build.yaml workflow + if (externalDatabase != null && !externalDatabase.trim().isEmpty()) { + localDatabase = false; + database = externalDatabase; + } else { + localDatabase = true; + database = "clickhouse_java_" + UUID.randomUUID().toString().substring(0, 8) + "_test_" + System.currentTimeMillis(); + } + + LOGGER.info("Local database: {}", localDatabase); String proxy = properties.getProperty("proxyAddress"); if (proxy != null && !proxy.isEmpty()) { // use external proxy @@ -324,13 +330,9 @@ public static boolean isCloud() { @BeforeSuite(groups = {"integration"}) public static void beforeSuite() { if (isCloud) { - synchronized (databaseCreatedCloud) { - if (!databaseCreatedCloud.get()) { - if (!runQuery("CREATE DATABASE IF NOT EXISTS " + database)) { - throw new RuntimeException("Failed to create database for testing."); - } - - databaseCreatedCloud.set(true); + if (localDatabase) { + if (!runQuery("CREATE DATABASE IF NOT EXISTS " + database)) { + throw new RuntimeException("Failed to create database for testing."); } } return; @@ -367,13 +369,9 @@ public static void afterSuite() { } if (isCloud) { - synchronized (databaseDroppedCloud) { - if (!databaseDroppedCloud.get()) { - if (!runQuery("DROP DATABASE IF EXISTS `" + database + "`")) { - LOGGER.warn("Failed to drop database for testing."); - } - - databaseDroppedCloud.set(true); + if (localDatabase) { + if (!runQuery("DROP DATABASE IF EXISTS `" + database + "`")) { + LOGGER.warn("Failed to drop database for testing."); } } } From 43a1edf6c9052d652849b1587ab34e28183562b5 Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Thu, 14 May 2026 13:58:55 -0700 Subject: [PATCH 04/10] fix mysterious error in yaml --- .github/workflows/build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8012cd0ad..319268375 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -297,12 +297,12 @@ jobs: echo "::add-mask::$CLICKHOUSE_CLOUD_HOST" # Verify we actually generated a DB name to avoid dropping something accidentally if [ -n "$TEST_DB_NAME" ]; then - echo "Cleaning up database: $TEST_DB_NAME" -# curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "DROP DATABASE IF EXISTS $TEST_DB_NAME" - curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "SELECT '$TEST_DB_NAME'" + echo "Cleaning up database: $TEST_DB_NAME"; + curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "SELECT '$TEST_DB_NAME'"; else - echo "No database name was generated; skipping cleanup." - fi + echo "No database name was generated; skipping cleanup."; + fi; + test-jdbc-driver: runs-on: ubuntu-latest needs: test-java-client From cc22178c81c0d63c1a540b2951561696d58a9542 Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Thu, 14 May 2026 20:19:24 -0700 Subject: [PATCH 05/10] migrated to prod instance for cloud tests --- .github/workflows/build.yml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 319268375..843388c15 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -267,16 +267,16 @@ jobs: - name: Create Temporary Database env: - CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT }} - CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT }} + CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT_PROD }} + CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT_PROD }} run: | echo "::add-mask::$CLICKHOUSE_CLOUD_HOST" echo "Creating database: $TEST_DB_NAME" curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "CREATE DATABASE IF NOT EXISTS $TEST_DB_NAME" - name: Test http client env: - CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT }} - CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT }} + CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT_PROD }} + CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT_PROD }} CLIENT_JWT: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_JWT_DESERT_VM_43 }} run: | mvn --batch-mode --no-transfer-progress --projects ${{ matrix.project }} -DclickhouseVersion=${{ matrix.clickhouse }} -Dprotocol=http -Dmaven.javadoc.skip=true verify @@ -291,8 +291,8 @@ jobs: - name: Cleanup Database Unconditionally if: always() # CRITICAL: This ensures the step runs regardless of previous success/failure env: - CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT }} - CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT }} + CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT_PROD }} + CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT_PROD }} run: | echo "::add-mask::$CLICKHOUSE_CLOUD_HOST" # Verify we actually generated a DB name to avoid dropping something accidentally @@ -352,9 +352,6 @@ jobs: - name: Install Java client run: mvn --also-make --batch-mode --no-transfer-progress --projects clickhouse-http-client,client-v2 -DskipTests=true -Dmaven.javadoc.skip=true install - name: Test JDBC driver - env: - CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT }} - CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT }} run: | mvn --batch-mode --no-transfer-progress --projects clickhouse-jdbc,jdbc-v2 -DclickhouseVersion=${{ matrix.clickhouse }} -Dprotocol=${{ matrix.protocol }} -Dmaven.javadoc.skip=true verify - name: Upload test results From 466022ede94e055a89d7828951b97b56052efbf9 Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Fri, 15 May 2026 09:34:14 -0700 Subject: [PATCH 06/10] fixing JWT tests --- .github/workflows/build.yml | 1 + .../com/clickhouse/client/HttpTransportTests.java | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 843388c15..6705ac92d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -278,6 +278,7 @@ jobs: CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT_PROD }} CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT_PROD }} CLIENT_JWT: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_JWT_DESERT_VM_43 }} + JWT_TEST_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT }} run: | mvn --batch-mode --no-transfer-progress --projects ${{ matrix.project }} -DclickhouseVersion=${{ matrix.clickhouse }} -Dprotocol=http -Dmaven.javadoc.skip=true verify - name: Upload test results diff --git a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java index a909afbc0..67e2b201d 100644 --- a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java @@ -1218,10 +1218,17 @@ public void testJWTWithCloud() throws Exception { if (!isCloud()) { return; // only for cloud } - String jwt = System.getenv("CLIENT_JWT"); + final String jwt = System.getenv("CLIENT_JWT"); + final String host = System.getenv("JWT_TEST_HOST"); Assert.assertTrue(jwt != null && !jwt.trim().isEmpty(), "JWT is missing"); Assert.assertFalse(jwt.contains("\n") || jwt.contains("-----"), "JWT should be single string ready for HTTP header"); - try (Client client = newClient().useBearerTokenAuth(jwt).build()) { + try (Client client = new Client.Builder() + .addEndpoint(Protocol.HTTP, host, 8443, true) + .setUsername("default") + .compressClientRequest(false) + .setDefaultDatabase("default") + .serverSetting(ServerSettings.WAIT_END_OF_QUERY, "1") + .useBearerTokenAuth(jwt).build()) { try { List response = client.queryAll("SELECT user(), now()"); System.out.println("response: " + response.get(0).getString(1) + " time: " + response.get(0).getString(2)); From 51630d5b0c966e3379b1df31c03ad6b103966856 Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Fri, 15 May 2026 10:01:27 -0700 Subject: [PATCH 07/10] added droping database as final impl step after checking that DB name is pickedup correctly in CI --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6705ac92d..099aa8ea4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -295,11 +295,10 @@ jobs: CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT_PROD }} CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT_PROD }} run: | - echo "::add-mask::$CLICKHOUSE_CLOUD_HOST" # Verify we actually generated a DB name to avoid dropping something accidentally if [ -n "$TEST_DB_NAME" ]; then echo "Cleaning up database: $TEST_DB_NAME"; - curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "SELECT '$TEST_DB_NAME'"; + curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "DROP DATABASE IF EXISTS '$TEST_DB_NAME'"; else echo "No database name was generated; skipping cleanup."; fi; From 1256ee0f5fc78f23a9c88669f3d8b2340b6e8586 Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Fri, 15 May 2026 10:29:12 -0700 Subject: [PATCH 08/10] fixed drop statement --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 099aa8ea4..8222ae257 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -298,7 +298,7 @@ jobs: # Verify we actually generated a DB name to avoid dropping something accidentally if [ -n "$TEST_DB_NAME" ]; then echo "Cleaning up database: $TEST_DB_NAME"; - curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "DROP DATABASE IF EXISTS '$TEST_DB_NAME'"; + curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "DROP DATABASE `$TEST_DB_NAME`"; else echo "No database name was generated; skipping cleanup."; fi; From ac0c79a815cc211f9cc26513bcf930f05406ecde Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Fri, 15 May 2026 11:04:58 -0700 Subject: [PATCH 09/10] fixing drop statement --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8222ae257..363bf1cb2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -270,8 +270,7 @@ jobs: CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT_PROD }} CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT_PROD }} run: | - echo "::add-mask::$CLICKHOUSE_CLOUD_HOST" - echo "Creating database: $TEST_DB_NAME" + echo "Creating database: \`$TEST_DB_NAME\`" curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "CREATE DATABASE IF NOT EXISTS $TEST_DB_NAME" - name: Test http client env: @@ -297,8 +296,9 @@ jobs: run: | # Verify we actually generated a DB name to avoid dropping something accidentally if [ -n "$TEST_DB_NAME" ]; then - echo "Cleaning up database: $TEST_DB_NAME"; - curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "DROP DATABASE `$TEST_DB_NAME`"; + DROP_STMT="DROP DATABASE IF EXISTS \`$TEST_DB_NAME\`" + echo "Cleaning up database: \`$TEST_DB_NAME\` with statement '$DROP_STMT'"; + curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "$DROP_STMT"; else echo "No database name was generated; skipping cleanup."; fi; From 6486bd9d911c101ad012371a38773bdfd4352ec4 Mon Sep 17 00:00:00 2001 From: Sergey Chernov Date: Fri, 15 May 2026 15:39:31 -0700 Subject: [PATCH 10/10] Added some protective code here and there --- .github/workflows/build.yml | 8 ++------ .../com/clickhouse/client/ClickHouseServerForTest.java | 3 +++ .../java/com/clickhouse/client/HttpTransportTests.java | 3 ++- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 363bf1cb2..e58261fcd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -258,20 +258,16 @@ jobs: run: mvn --also-make --batch-mode --no-transfer-progress -DskipTests=true -Dmaven.javadoc.skip=true install - name: Generate Database Name run: | - # Combine the GitHub Run ID and a random number to guarantee uniqueness RANDOM_DB="clickhouse_java_test_${GITHUB_RUN_ID}_${RANDOM}" - - # Write it to GITHUB_ENV so future steps can access it as $DB_NAME echo "TEST_DB_NAME=$RANDOM_DB" >> $GITHUB_ENV echo "Generated database name: $RANDOM_DB" - - name: Create Temporary Database env: CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT_PROD }} CLICKHOUSE_CLOUD_PASSWORD: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_PASSWORD_SMT_PROD }} run: | echo "Creating database: \`$TEST_DB_NAME\`" - curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "CREATE DATABASE IF NOT EXISTS $TEST_DB_NAME" + curl --fail-with-body -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "CREATE DATABASE IF NOT EXISTS $TEST_DB_NAME" - name: Test http client env: CLICKHOUSE_CLOUD_HOST: ${{ secrets.INTEGRATIONS_TEAM_TESTS_CLOUD_HOST_SMT_PROD }} @@ -298,7 +294,7 @@ jobs: if [ -n "$TEST_DB_NAME" ]; then DROP_STMT="DROP DATABASE IF EXISTS \`$TEST_DB_NAME\`" echo "Cleaning up database: \`$TEST_DB_NAME\` with statement '$DROP_STMT'"; - curl -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "$DROP_STMT"; + curl --fail-with-body -s -u "default:$CLICKHOUSE_CLOUD_PASSWORD" "https://$CLICKHOUSE_CLOUD_HOST:8443" --data-binary "$DROP_STMT"; else echo "No database name was generated; skipping cleanup."; fi; diff --git a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java index c322950ad..fc4f5f26c 100644 --- a/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java +++ b/clickhouse-client/src/test/java/com/clickhouse/client/ClickHouseServerForTest.java @@ -68,6 +68,9 @@ public class ClickHouseServerForTest { properties = new Properties(System.getProperties()); String externalDatabase = System.getenv("TEST_DB_NAME"); // see build.yaml workflow if (externalDatabase != null && !externalDatabase.trim().isEmpty()) { + if (!externalDatabase.startsWith("clickhouse_java_test_")) { + throw new RuntimeException("external database for tests should start with 'clickhouse_java_test_'"); + } localDatabase = false; database = externalDatabase; } else { diff --git a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java index 67e2b201d..4c67ae3af 100644 --- a/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java +++ b/client-v2/src/test/java/com/clickhouse/client/HttpTransportTests.java @@ -1220,7 +1220,8 @@ public void testJWTWithCloud() throws Exception { } final String jwt = System.getenv("CLIENT_JWT"); final String host = System.getenv("JWT_TEST_HOST"); - Assert.assertTrue(jwt != null && !jwt.trim().isEmpty(), "JWT is missing"); + Assert.assertTrue(jwt != null && !jwt.trim().isEmpty(), "CLIENT_JWT is not set."); + Assert.assertTrue(host != null && !host.trim().isEmpty(), "JWT_TEST_HOST is not set"); Assert.assertFalse(jwt.contains("\n") || jwt.contains("-----"), "JWT should be single string ready for HTTP header"); try (Client client = new Client.Builder() .addEndpoint(Protocol.HTTP, host, 8443, true)