Skip to content

Commit c5563fd

Browse files
authored
test: add Postgres MCP tests (#2158)
1 parent b4c883d commit c5563fd

File tree

3 files changed

+114
-0
lines changed

3 files changed

+114
-0
lines changed

.ci/cloudbuild.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ steps:
3232
"POSTGRES_IAM_USER",
3333
"POSTGRES_PASS",
3434
"POSTGRES_DB",
35+
"POSTGRES_MCP_CONNECTION_NAME",
36+
"POSTGRES_MCP_PASS",
3537
"POSTGRES_CAS_CONNECTION_NAME",
3638
"POSTGRES_CAS_PASS",
3739
"POSTGRES_CUSTOMER_CAS_CONNECTION_NAME",
@@ -75,6 +77,10 @@ availableSecrets:
7577
env: "POSTGRES_PASS"
7678
- versionName: "projects/$PROJECT_ID/secrets/POSTGRES_DB/versions/latest"
7779
env: "POSTGRES_DB"
80+
- versionName: "projects/$PROJECT_ID/secrets/POSTGRES_MCP_CONNECTION_NAME/versions/latest"
81+
env: "POSTGRES_MCP_CONNECTION_NAME"
82+
- versionName: "projects/$PROJECT_ID/secrets/POSTGRES_MCP_PASS/versions/latest"
83+
env: "POSTGRES_MCP_PASS"
7884
- versionName: "projects/$PROJECT_ID/secrets/POSTGRES_CAS_CONNECTION_NAME/versions/latest"
7985
env: "POSTGRES_CAS_CONNECTION_NAME"
8086
- versionName: "projects/$PROJECT_ID/secrets/POSTGRES_CAS_PASS/versions/latest"

.github/workflows/tests.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ jobs:
144144
POSTGRES_CUSTOMER_CAS_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS
145145
POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME
146146
POSTGRES_CUSTOMER_CAS_PASS_INVALID_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS_INVALID_DOMAIN_NAME
147+
POSTGRES_MCP_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_MCP_CONNECTION_NAME
148+
POSTGRES_MCP_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_MCP_PASS
147149
SQLSERVER_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_CONNECTION_NAME
148150
SQLSERVER_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_USER
149151
SQLSERVER_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_PASS
@@ -170,6 +172,8 @@ jobs:
170172
POSTGRES_CUSTOMER_CAS_PASS: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS }}"
171173
POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME }}"
172174
POSTGRES_CUSTOMER_CAS_PASS_INVALID_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS_INVALID_DOMAIN_NAME }}"
175+
POSTGRES_MCP_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_MCP_CONNECTION_NAME }}"
176+
POSTGRES_MCP_PASS: "${{ steps.secrets.outputs.POSTGRES_MCP_PASS }}"
173177
SQLSERVER_CONNECTION_NAME: "${{ steps.secrets.outputs.SQLSERVER_CONNECTION_NAME }}"
174178
SQLSERVER_USER: "${{ steps.secrets.outputs.SQLSERVER_USER }}"
175179
SQLSERVER_PASS: "${{ steps.secrets.outputs.SQLSERVER_PASS }}"
@@ -255,6 +259,8 @@ jobs:
255259
POSTGRES_CUSTOMER_CAS_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS
256260
POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME
257261
POSTGRES_CUSTOMER_CAS_PASS_INVALID_DOMAIN_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_CUSTOMER_CAS_PASS_INVALID_DOMAIN_NAME
262+
POSTGRES_MCP_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_MCP_CONNECTION_NAME
263+
POSTGRES_MCP_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/POSTGRES_MCP_PASS
258264
SQLSERVER_CONNECTION_NAME:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_CONNECTION_NAME
259265
SQLSERVER_USER:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_USER
260266
SQLSERVER_PASS:${{ vars.GOOGLE_CLOUD_PROJECT }}/SQLSERVER_PASS
@@ -282,6 +288,8 @@ jobs:
282288
POSTGRES_CUSTOMER_CAS_PASS: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS }}"
283289
POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS_VALID_DOMAIN_NAME }}"
284290
POSTGRES_CUSTOMER_CAS_PASS_INVALID_DOMAIN_NAME: "${{ steps.secrets.outputs.POSTGRES_CUSTOMER_CAS_PASS_INVALID_DOMAIN_NAME }}"
291+
POSTGRES_MCP_CONNECTION_NAME: "${{ steps.secrets.outputs.POSTGRES_MCP_CONNECTION_NAME }}"
292+
POSTGRES_MCP_PASS: "${{ steps.secrets.outputs.POSTGRES_MCP_PASS }}"
285293
SQLSERVER_CONNECTION_NAME: "${{ steps.secrets.outputs.SQLSERVER_CONNECTION_NAME }}"
286294
SQLSERVER_USER: "${{ steps.secrets.outputs.SQLSERVER_USER }}"
287295
SQLSERVER_PASS: "${{ steps.secrets.outputs.SQLSERVER_PASS }}"
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
* Copyright 2025 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.cloud.sql.postgres;
18+
19+
import static com.google.common.truth.Truth.assertThat;
20+
import static com.google.common.truth.Truth.assertWithMessage;
21+
22+
import com.google.common.collect.ImmutableList;
23+
import com.zaxxer.hikari.HikariConfig;
24+
import com.zaxxer.hikari.HikariDataSource;
25+
import java.sql.*;
26+
import java.util.ArrayList;
27+
import java.util.List;
28+
import java.util.Properties;
29+
import java.util.concurrent.TimeUnit;
30+
import org.junit.Before;
31+
import org.junit.BeforeClass;
32+
import org.junit.Rule;
33+
import org.junit.Test;
34+
import org.junit.rules.Timeout;
35+
import org.junit.runner.RunWith;
36+
import org.junit.runners.JUnit4;
37+
38+
@RunWith(JUnit4.class)
39+
public class JdbcPostgresMcpIntegrationTests {
40+
41+
private static final String CONNECTION_NAME = System.getenv("POSTGRES_MCP_CONNECTION_NAME");
42+
private static final String DB_NAME = System.getenv("POSTGRES_DB");
43+
private static final String DB_USER = System.getenv("POSTGRES_USER");
44+
private static final String DB_PASSWORD = System.getenv("POSTGRES_MCP_PASS");
45+
private static final String IP_TYPE =
46+
System.getenv("IP_TYPE") == null ? "PUBLIC" : System.getenv("IP_TYPE");
47+
private static final ImmutableList<String> requiredEnvVars =
48+
ImmutableList.of(
49+
"POSTGRES_USER", "POSTGRES_MCP_PASS", "POSTGRES_DB", "POSTGRES_MCP_CONNECTION_NAME");
50+
@Rule public Timeout globalTimeout = new Timeout(80, TimeUnit.SECONDS);
51+
52+
private HikariDataSource connectionPool;
53+
54+
@BeforeClass
55+
public static void checkEnvVars() {
56+
// Check that required env vars are set
57+
requiredEnvVars.forEach(
58+
(varName) ->
59+
assertWithMessage(
60+
String.format(
61+
"Environment variable '%s' must be set to perform these tests.", varName))
62+
.that(System.getenv(varName))
63+
.isNotEmpty());
64+
}
65+
66+
@Before
67+
public void setUpPool() throws SQLException {
68+
// Set up URL parameters
69+
String jdbcURL = String.format("jdbc:postgresql://db.example.com/%s", DB_NAME);
70+
Properties connProps = new Properties();
71+
connProps.setProperty("user", DB_USER);
72+
connProps.setProperty("password", DB_PASSWORD);
73+
connProps.setProperty("socketFactory", "com.google.cloud.sql.postgres.SocketFactory");
74+
connProps.setProperty("cloudSqlInstance", CONNECTION_NAME);
75+
connProps.setProperty("ipTypes", IP_TYPE);
76+
77+
// Initialize connection pool
78+
HikariConfig config = new HikariConfig();
79+
config.setJdbcUrl(jdbcURL);
80+
config.setDataSourceProperties(connProps);
81+
config.setConnectionTimeout(10000); // 10s
82+
83+
this.connectionPool = new HikariDataSource(config);
84+
}
85+
86+
@Test
87+
public void pooledConnectionTest() throws SQLException {
88+
89+
List<Timestamp> rows = new ArrayList<>();
90+
try (Connection conn = connectionPool.getConnection()) {
91+
try (PreparedStatement selectStmt = conn.prepareStatement("SELECT NOW() as TS")) {
92+
ResultSet rs = selectStmt.executeQuery();
93+
while (rs.next()) {
94+
rows.add(rs.getTimestamp("TS"));
95+
}
96+
}
97+
}
98+
assertThat(rows.size()).isEqualTo(1);
99+
}
100+
}

0 commit comments

Comments
 (0)