diff --git a/wrapper/src/main/java/software/amazon/jdbc/dialect/AuroraMysqlDialect.java b/wrapper/src/main/java/software/amazon/jdbc/dialect/AuroraMysqlDialect.java index fd9b85a07..b80d0f11e 100644 --- a/wrapper/src/main/java/software/amazon/jdbc/dialect/AuroraMysqlDialect.java +++ b/wrapper/src/main/java/software/amazon/jdbc/dialect/AuroraMysqlDialect.java @@ -26,7 +26,7 @@ public class AuroraMysqlDialect extends MysqlDialect { - private static final String TOPOLOGY_QUERY = + public static final String TOPOLOGY_QUERY = "SELECT SERVER_ID, CASE WHEN SESSION_ID = 'MASTER_SESSION_ID' THEN TRUE ELSE FALSE END, " + "CPU, REPLICA_LAG_IN_MILLISECONDS, LAST_UPDATE_TIMESTAMP " + "FROM information_schema.replica_host_status " diff --git a/wrapper/src/main/java/software/amazon/jdbc/dialect/AuroraPgDialect.java b/wrapper/src/main/java/software/amazon/jdbc/dialect/AuroraPgDialect.java index 098440a9f..1fa41d5ef 100644 --- a/wrapper/src/main/java/software/amazon/jdbc/dialect/AuroraPgDialect.java +++ b/wrapper/src/main/java/software/amazon/jdbc/dialect/AuroraPgDialect.java @@ -37,7 +37,7 @@ public class AuroraPgDialect extends PgDialect { private static final String topologySql = "SELECT 1 FROM aurora_replica_status() LIMIT 1"; - private static final String TOPOLOGY_QUERY = + public static final String TOPOLOGY_QUERY = "SELECT SERVER_ID, CASE WHEN SESSION_ID = 'MASTER_SESSION_ID' THEN TRUE ELSE FALSE END, " + "CPU, COALESCE(REPLICA_LAG_IN_MSEC, 0), LAST_UPDATE_TIMESTAMP " + "FROM aurora_replica_status() " diff --git a/wrapper/src/main/java/software/amazon/jdbc/dialect/RdsMultiAzDbClusterMysqlDialect.java b/wrapper/src/main/java/software/amazon/jdbc/dialect/RdsMultiAzDbClusterMysqlDialect.java index 4d3e5ca05..06338f049 100644 --- a/wrapper/src/main/java/software/amazon/jdbc/dialect/RdsMultiAzDbClusterMysqlDialect.java +++ b/wrapper/src/main/java/software/amazon/jdbc/dialect/RdsMultiAzDbClusterMysqlDialect.java @@ -29,7 +29,7 @@ public class RdsMultiAzDbClusterMysqlDialect extends MysqlDialect { - private static final String TOPOLOGY_QUERY = "SELECT id, endpoint, port FROM mysql.rds_topology"; + public static final String TOPOLOGY_QUERY = "SELECT id, endpoint, port FROM mysql.rds_topology"; private static final String TOPOLOGY_TABLE_EXIST_QUERY = "SELECT 1 AS tmp FROM information_schema.tables WHERE" diff --git a/wrapper/src/main/java/software/amazon/jdbc/dialect/RdsMultiAzDbClusterPgDialect.java b/wrapper/src/main/java/software/amazon/jdbc/dialect/RdsMultiAzDbClusterPgDialect.java index 215a07619..cba6780b3 100644 --- a/wrapper/src/main/java/software/amazon/jdbc/dialect/RdsMultiAzDbClusterPgDialect.java +++ b/wrapper/src/main/java/software/amazon/jdbc/dialect/RdsMultiAzDbClusterPgDialect.java @@ -30,7 +30,7 @@ public class RdsMultiAzDbClusterPgDialect extends PgDialect { private static MultiAzDbClusterPgExceptionHandler exceptionHandler; - private static final String TOPOLOGY_QUERY = + public static final String TOPOLOGY_QUERY = "SELECT id, endpoint, port FROM rds_tools.show_topology('aws_jdbc_driver-" + DriverInfo.DRIVER_VERSION + "')"; private static final String WRITER_NODE_FUNC_EXIST_QUERY = diff --git a/wrapper/src/test/java/integration/container/tests/TopologyQueryTests.java b/wrapper/src/test/java/integration/container/tests/TopologyQueryTests.java index 4c2debfa9..77fedb123 100644 --- a/wrapper/src/test/java/integration/container/tests/TopologyQueryTests.java +++ b/wrapper/src/test/java/integration/container/tests/TopologyQueryTests.java @@ -26,36 +26,39 @@ import integration.container.TestDriverProvider; import integration.container.TestEnvironment; import integration.container.condition.DisableOnTestFeature; -import integration.util.AuroraTestUtility; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; -import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.MethodOrderer.MethodName; import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; -import software.amazon.awssdk.regions.Region; +import software.amazon.jdbc.dialect.AuroraMysqlDialect; +import software.amazon.jdbc.dialect.AuroraPgDialect; +import software.amazon.jdbc.dialect.RdsMultiAzDbClusterMysqlDialect; +import software.amazon.jdbc.dialect.RdsMultiAzDbClusterPgDialect; -@TestMethodOrder(MethodOrderer.MethodName.class) +@TestMethodOrder(MethodName.class) @DisableOnTestFeature({ TestEnvironmentFeatures.PERFORMANCE, TestEnvironmentFeatures.RUN_HIBERNATE_TESTS_ONLY, TestEnvironmentFeatures.RUN_AUTOSCALING_TESTS_ONLY}) public class TopologyQueryTests { private static final Logger LOGGER = Logger.getLogger(BasicConnectivityTests.class.getName()); - private static final String CONNECTION_STRING = "jdbc:aws-wrapper:postgresql://atlas-postgres-2-instance-4.czygpppufgy4.us-east-2.rds.amazonaws.com:5432/test"; - protected static final AuroraTestUtility auroraUtil = - new AuroraTestUtility(TestEnvironment.getCurrent().getInfo().getAuroraRegion()); @TestTemplate @ExtendWith(TestDriverProvider.class) - public void testConnection(TestDriver testDriver) throws SQLException { + public void auroraTestTypes(TestDriver testDriver) throws SQLException { LOGGER.info(testDriver.toString()); final Properties props = ConnectionStringHelper.getDefaultPropertiesWithNoPlugins(); @@ -80,15 +83,134 @@ public void testConnection(TestDriver testDriver) throws SQLException { TestEnvironment.getCurrent().getInfo().getDatabaseInfo().getDefaultDbName()); LOGGER.finest("Connecting to " + url); + String query = null; + if (TestEnvironment.getCurrent().getCurrentDriver() == TestDriver.PG) { + query = AuroraPgDialect.TOPOLOGY_QUERY; + } else { + query = AuroraMysqlDialect.TOPOLOGY_QUERY; + } + + final Connection conn = DriverManager.getConnection(url, props); + assertTrue(conn.isValid(5)); + Statement stmt = conn.createStatement(); + stmt.executeQuery(query); + ResultSet rs = stmt.getResultSet(); + int cols = rs.getMetaData().getColumnCount(); + List columnTypes = new ArrayList<>(); + List expectedTypes = Arrays.asList( + "VARCHAR", + "BIGINT", + "DOUBLE", + "DOUBLE", + "DATETIME" + ); + for (int i = 1; i <= cols; i++) { + columnTypes.add(rs.getMetaData().getColumnTypeName(i)); + } + assertEquals(columnTypes, expectedTypes); + conn.close(); + } + + @TestTemplate + @ExtendWith(TestDriverProvider.class) + public void auroraTestTimestamp(TestDriver testDriver) throws SQLException, ParseException { + LOGGER.info(testDriver.toString()); + + final Properties props = ConnectionStringHelper.getDefaultPropertiesWithNoPlugins(); + DriverHelper.setConnectTimeout(testDriver, props, 10, TimeUnit.SECONDS); + DriverHelper.setSocketTimeout(testDriver, props, 10, TimeUnit.SECONDS); + + String url = + ConnectionStringHelper.getWrapperUrl( + testDriver, + TestEnvironment.getCurrent() + .getInfo() + .getDatabaseInfo() + .getInstances() + .get(0) + .getHost(), + TestEnvironment.getCurrent() + .getInfo() + .getDatabaseInfo() + .getInstances() + .get(0) + .getPort(), + TestEnvironment.getCurrent().getInfo().getDatabaseInfo().getDefaultDbName()); + LOGGER.finest("Connecting to " + url); + + String query = null; + if (TestEnvironment.getCurrent().getCurrentDriver() == TestDriver.PG) { + query = AuroraPgDialect.TOPOLOGY_QUERY; + } else { + query = AuroraMysqlDialect.TOPOLOGY_QUERY; + } + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS"); + final Connection conn = DriverManager.getConnection(url, props); assertTrue(conn.isValid(5)); -// List res = auroraUtil.getAuroraInstanceIds(); Statement stmt = conn.createStatement(); - stmt.executeQuery("select 1"); + stmt.executeQuery(query); ResultSet rs = stmt.getResultSet(); - rs.next(); - assertEquals(1, rs.getInt(1)); + while (rs.next()) { + format.parse(rs.getString("LAST_UPDATE_TIMESTAMP")); + } + + conn.close(); + } + + @TestTemplate + @ExtendWith(TestDriverProvider.class) + public void rdsTestTypes(TestDriver testDriver) throws SQLException { + LOGGER.info(testDriver.toString()); + + final Properties props = ConnectionStringHelper.getDefaultPropertiesWithNoPlugins(); + DriverHelper.setConnectTimeout(testDriver, props, 10, TimeUnit.SECONDS); + DriverHelper.setSocketTimeout(testDriver, props, 10, TimeUnit.SECONDS); + + String url = + ConnectionStringHelper.getWrapperUrl( + testDriver, + TestEnvironment.getCurrent() + .getInfo() + .getDatabaseInfo() + .getInstances() + .get(0) + .getHost(), + TestEnvironment.getCurrent() + .getInfo() + .getDatabaseInfo() + .getInstances() + .get(0) + .getPort(), + TestEnvironment.getCurrent().getInfo().getDatabaseInfo().getDefaultDbName()); + LOGGER.finest("Connecting to " + url); + + String query = null; + if (TestEnvironment.getCurrent().getCurrentDriver() == TestDriver.PG) { + query = RdsMultiAzDbClusterPgDialect.TOPOLOGY_QUERY; + } else { + query = RdsMultiAzDbClusterMysqlDialect.TOPOLOGY_QUERY; + } + + final Connection conn = DriverManager.getConnection(url, props); + assertTrue(conn.isValid(5)); + Statement stmt = conn.createStatement(); + stmt.executeQuery(query); + ResultSet rs = stmt.getResultSet(); + int cols = rs.getMetaData().getColumnCount(); + List columnTypes = new ArrayList<>(); + List expectedTypes = Arrays.asList( + "VARCHAR", + "VARCHAR", + "BIGINT" + ); + for (int i = 1; i <= cols; i++) { + columnTypes.add(rs.getMetaData().getColumnTypeName(i)); + LOGGER.fine(rs.getMetaData().getColumnTypeName(i)); + } + assertEquals(columnTypes, expectedTypes); conn.close(); } }