From a4fe1b023c225d125a78687282dd8f286e950284 Mon Sep 17 00:00:00 2001 From: Jaeho Yoo Date: Fri, 6 Oct 2023 01:42:07 +0900 Subject: [PATCH] Check if url has https protocol scheme and add test --- gateway-ha/pom.xml | 6 ++ .../ClusterStatsJdbcMonitor.java | 2 +- .../TestClusterStatsJdbcMonitor.java | 91 +++++++++++++++++++ .../ha/router/TestHaRoutingManager.java | 2 +- 4 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 gateway-ha/src/test/java/io/trino/gateway/ha/clustermonitor/TestClusterStatsJdbcMonitor.java diff --git a/gateway-ha/pom.xml b/gateway-ha/pom.xml index 27b1fcf62..d465236f4 100644 --- a/gateway-ha/pom.xml +++ b/gateway-ha/pom.xml @@ -179,6 +179,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..5c7fbdfda --- /dev/null +++ b/gateway-ha/src/test/java/io/trino/gateway/ha/clustermonitor/TestClusterStatsJdbcMonitor.java @@ -0,0 +1,91 @@ +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.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +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; + +@Slf4j +@TestInstance(Lifecycle.PER_CLASS) +public class TestClusterStatsJdbcMonitor { + ClusterStatsJdbcMonitor clusterStatsJdbcMonitor; + @Mock + private Connection connection; + @Mock + private PreparedStatement preparedStatement; + @Mock + private ResultSet resultSet; + + 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(connection); + Mockito.reset(preparedStatement); + Mockito.reset(resultSet); + } + + @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(connection); + when(connection.prepareStatement(anyString())).thenReturn(preparedStatement); + when(preparedStatement.executeQuery()).thenReturn(resultSet); + 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 4cd43ae02..ed97f8604 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 @@ -49,7 +49,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); }