diff --git a/gateway-ha/pom.xml b/gateway-ha/pom.xml index 25225d77e..294301317 100644 --- a/gateway-ha/pom.xml +++ b/gateway-ha/pom.xml @@ -166,6 +166,12 @@ test + + org.junit.jupiter + junit-jupiter-params + test + + com.h2database h2 diff --git a/gateway-ha/src/main/java/io/trino/gateway/ha/clustermonitor/ClusterStatsJdbcMonitor.java b/gateway-ha/src/main/java/io/trino/gateway/ha/clustermonitor/ClusterStatsJdbcMonitor.java index 93e2b3362..6bf13f6e9 100644 --- a/gateway-ha/src/main/java/io/trino/gateway/ha/clustermonitor/ClusterStatsJdbcMonitor.java +++ b/gateway-ha/src/main/java/io/trino/gateway/ha/clustermonitor/ClusterStatsJdbcMonitor.java @@ -62,7 +62,7 @@ public ClusterStats monitor(ProxyBackendConfiguration backend) { jdbcUrl = String .format("jdbc:trino://%s:%s/system", parsedUrl.getHost(), - parsedUrl.getPort() == -1 ? 80 : parsedUrl.getPort() + parsedUrl.getPort() == -1 ? parsedUrl.getDefaultPort() : parsedUrl.getPort() ); } catch (MalformedURLException e) { log.error("could not parse backend url {} ", url); diff --git a/gateway-ha/src/test/java/io/trino/gateway/ha/clustermonitor/TestClusterStatsJdbcMonitor.java b/gateway-ha/src/test/java/io/trino/gateway/ha/clustermonitor/TestClusterStatsJdbcMonitor.java new file mode 100644 index 000000000..76946952f --- /dev/null +++ b/gateway-ha/src/test/java/io/trino/gateway/ha/clustermonitor/TestClusterStatsJdbcMonitor.java @@ -0,0 +1,89 @@ +package io.trino.gateway.ha.clustermonitor; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import io.trino.gateway.ha.config.BackendStateConfiguration; +import io.trino.gateway.ha.config.ProxyBackendConfiguration; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.stream.Stream; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; + +@Slf4j +@org.junit.jupiter.api.TestInstance(org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS) +public class TestClusterStatsJdbcMonitor { + ClusterStatsJdbcMonitor clusterStatsJdbcMonitor; + @Mock + private Connection con; + @Mock + private PreparedStatement stmt; + @Mock + private ResultSet rs; + private java.util.Properties properties; + + @BeforeEach + public void initMocks() { + log.info("initializing test"); + MockitoAnnotations.openMocks(this); + } + + @AfterAll + public void resetMocks() { + log.info("resetting mocks"); + Mockito.reset(con); + Mockito.reset(stmt); + Mockito.reset(rs); + } + + @BeforeAll + public void setUp() { + BackendStateConfiguration backendStateConfiguration = new BackendStateConfiguration(); + backendStateConfiguration.setUsername("Trino"); + properties = new java.util.Properties(); + properties.setProperty("user", backendStateConfiguration.getUsername()); + properties.setProperty("password", backendStateConfiguration.getPassword()); + properties.setProperty("SSL", String.valueOf(backendStateConfiguration.getSsl())); + clusterStatsJdbcMonitor = new ClusterStatsJdbcMonitor(backendStateConfiguration); + } + + private static Stream provideSchemeAndPort(){ + return Stream.of( + Arguments.of("https", "90", "jdbc:trino://trino.example.com:90/system"), + Arguments.of("http", "90", "jdbc:trino://trino.example.com:90/system"), + Arguments.of("https", "", "jdbc:trino://trino.example.com:443/system"), + Arguments.of("http", "", "jdbc:trino://trino.example.com:80/system") + ); + } + @ParameterizedTest + @MethodSource("provideSchemeAndPort") + public void testProtocol(String scheme, String port, String expectedJdbcUrl) throws java.sql.SQLException { + try(MockedStatic m = Mockito.mockStatic(java.sql.DriverManager.class)) { + m.when(() -> DriverManager.getConnection(anyString(), any())).thenReturn(con); + when(con.prepareStatement(anyString())).thenReturn(stmt); + when(stmt.executeQuery()).thenReturn(rs); + ProxyBackendConfiguration proxyBackend = new ProxyBackendConfiguration(); + proxyBackend.setProxyTo(String.format("%s://trino.example.com:%s", scheme, port)); + proxyBackend.setName("abc"); + + clusterStatsJdbcMonitor.monitor(proxyBackend); + + m.verify(() -> DriverManager.getConnection(expectedJdbcUrl, properties)); + } + } +} + diff --git a/gateway-ha/src/test/java/io/trino/gateway/ha/router/TestHaRoutingManager.java b/gateway-ha/src/test/java/io/trino/gateway/ha/router/TestHaRoutingManager.java index 0ef8ee451..2ff523499 100644 --- a/gateway-ha/src/test/java/io/trino/gateway/ha/router/TestHaRoutingManager.java +++ b/gateway-ha/src/test/java/io/trino/gateway/ha/router/TestHaRoutingManager.java @@ -47,7 +47,7 @@ private void addMockBackends() { proxyBackend.setProxyTo(backend + ".trino.example.com"); proxyBackend.setExternalUrl("trino.example.com"); backendManager.addBackend(proxyBackend); - //set backend as healthyti start with + //set backend as healthy start with haRoutingManager.upateBackEndHealth(backend, true); } diff --git a/pom.xml b/pom.xml index cff13a652..f4d600ea3 100644 --- a/pom.xml +++ b/pom.xml @@ -123,7 +123,7 @@ org.junit.jupiter junit-jupiter-api - 5.10.0 + ${dep.junit.version} test