diff --git a/app/server/appsmith-plugins/mysqlPlugin/src/test/java/com/external/plugins/MySqlPluginTest.java b/app/server/appsmith-plugins/mysqlPlugin/src/test/java/com/external/plugins/MySqlPluginTest.java index cd29212ec041..5455415ec627 100755 --- a/app/server/appsmith-plugins/mysqlPlugin/src/test/java/com/external/plugins/MySqlPluginTest.java +++ b/app/server/appsmith-plugins/mysqlPlugin/src/test/java/com/external/plugins/MySqlPluginTest.java @@ -29,6 +29,7 @@ import io.r2dbc.spi.ConnectionFactories; import io.r2dbc.spi.ConnectionFactoryOptions; import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -77,6 +78,15 @@ public class MySqlPluginTest { static MySqlPlugin.MySqlPluginExecutor pluginExecutor = new MySqlPlugin.MySqlPluginExecutor(); + ConnectionContext instanceConnectionContext; + + @AfterEach + public void cleanup() { + if (instanceConnectionContext != null && instanceConnectionContext.getConnection() != null) { + instanceConnectionContext.getConnection().close(); + } + } + @SuppressWarnings("rawtypes") // The type parameter for the container type is just itself and is // pseudo-optional. @Container @@ -202,7 +212,12 @@ private static DatasourceConfiguration createDatasourceConfiguration() { @Test public void testConnectMySQLContainer() { - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); StepVerifier.create(connectionContextMono) .assertNext(connectionContext -> { @@ -222,8 +237,12 @@ public void testMySqlNoPasswordExceptionMessage() { Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); - Mono datasourceTestResultMono = - connectionContextMono.flatMap(connectionPool -> pluginExecutor.testDatasource(connectionPool)); + Mono datasourceTestResultMono = connectionContextMono + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }) + .flatMap(connectionPool -> pluginExecutor.testDatasource(connectionPool)); String gateway = mySQLContainer.getContainerInfo().getNetworkSettings().getGateway(); String expectedErrorMessage = new StringBuilder("Access denied for user 'mysql'@'") @@ -244,7 +263,12 @@ public void testConnectMySQLContainerWithInvalidTimezone() { final DatasourceConfiguration dsConfig = createDatasourceConfigForContainerWithInvalidTZ(); dsConfig.setProperties(List.of(new Property("serverTimezone", "UTC"))); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); StepVerifier.create(connectionContextMono) .assertNext(Assertions::assertNotNull) @@ -330,7 +354,12 @@ public void testDatasourceWithNullPassword() { Set output = pluginExecutor.validateDatasource(dsConfig); assertTrue(output.isEmpty()); // test connect - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); StepVerifier.create(connectionContextMono) .assertNext(Assertions::assertNotNull) @@ -356,7 +385,12 @@ public void testDatasourceWithRootUserAndNullPassword() { Set output = pluginExecutor.validateDatasource(dsConfig); assertTrue(output.isEmpty()); // test connect - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); StepVerifier.create(connectionContextMono) .assertNext(Assertions::assertNotNull) @@ -371,7 +405,12 @@ public void testDatasourceWithRootUserAndNullPassword() { @Test public void testExecute() { - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("show databases"); @@ -391,7 +430,12 @@ public void testExecute() { @Test public void testExecuteWithFormattingWithShowCmd() { dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("show\n\tdatabases"); @@ -413,7 +457,12 @@ public void testExecuteWithFormattingWithShowCmd() { @Test public void testExecuteWithFormattingWithSelectCmd() { dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("select\n\t*\nfrom\nusers where id=1"); @@ -452,7 +501,12 @@ public void testExecuteWithFormattingWithSelectCmd() { @Test public void testExecuteWithLongRunningQuery() { - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT SLEEP(20);"); @@ -475,6 +529,7 @@ public void testStaleConnectionCheck() { actionConfiguration.setBody("show databases"); ConnectionContext connectionContext = pluginExecutor.datasourceCreate(dsConfig).block(); + instanceConnectionContext = connectionContext; Flux resultFlux = Mono.from((connectionContext.getConnection()).disposeLater()) .thenMany(pluginExecutor.executeParameterized( connectionContext, new ExecuteActionDTO(), dsConfig, actionConfiguration)); @@ -487,7 +542,12 @@ public void testStaleConnectionCheck() { @Test public void testAliasColumnNames() { DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT id as user_id FROM users WHERE id = 1"); @@ -513,7 +573,12 @@ public void testAliasColumnNames() { @Test public void testPreparedStatementErrorWithIsKeyword() { DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); /** @@ -563,7 +628,12 @@ public void testPreparedStatementWithRealTypes() { .blockLast(); // wait until completion of all the queries DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); /** @@ -639,7 +709,12 @@ public void testPreparedStatementWithBooleanType() { .blockLast(); // wait until completion of all the queries DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT id FROM test_boolean_type WHERE c_boolean={{binding1}};"); @@ -679,7 +754,12 @@ public void testPreparedStatementWithBooleanType() { @Test public void testExecuteWithPreparedStatement() { DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT id FROM users WHERE id = {{binding1}} limit 1 offset {{binding2}};"); @@ -760,7 +840,12 @@ public void testExecuteWithPreparedStatement() { @Test public void testExecuteDataTypes() { DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT * FROM users WHERE id = 1"); @@ -905,7 +990,12 @@ public void testExecuteDataTypesExtensive() throws AppsmithPluginException { } private void testExecute(String query, String expectedResult) { - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody(query); Mono executeMono = connectionContextMono.flatMap(conn -> @@ -928,7 +1018,10 @@ public void testStructure() { DatasourceConfiguration dsConfig = createDatasourceConfiguration(); Mono structureMono = pluginExecutor .datasourceCreate(dsConfig) - .flatMap(connection -> pluginExecutor.getStructure(connection, dsConfig)); + .flatMap(connection -> { + instanceConnectionContext = connection; + return pluginExecutor.getStructure(connection, dsConfig); + }); StepVerifier.create(structureMono) .assertNext(structure -> { @@ -1053,8 +1146,12 @@ public void testSslDisabled() { DatasourceConfiguration datasourceConfiguration = createDatasourceConfiguration(); datasourceConfiguration.getConnection().getSsl().setAuthType(SSLDetails.AuthType.DISABLED); - Mono> connectionContextMono = - pluginExecutor.datasourceCreate(datasourceConfiguration); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(datasourceConfiguration) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); Mono executeMono = connectionContextMono.flatMap(conn -> pluginExecutor.executeParameterized(conn, new ExecuteActionDTO(), dsConfig, actionConfiguration)); StepVerifier.create(executeMono) @@ -1101,8 +1198,12 @@ public void testSslDefault() { DatasourceConfiguration datasourceConfiguration = createDatasourceConfiguration(); datasourceConfiguration.getConnection().getSsl().setAuthType(SSLDetails.AuthType.DEFAULT); - Mono> connectionContextMono = - pluginExecutor.datasourceCreate(datasourceConfiguration); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); Mono executeMono = connectionContextMono.flatMap(conn -> pluginExecutor.executeParameterized(conn, new ExecuteActionDTO(), dsConfig, actionConfiguration)); StepVerifier.create(executeMono) @@ -1120,7 +1221,12 @@ public void testSslDefault() { @Test public void testDuplicateColumnNames() { DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT id, username as id, password, email as password FROM users WHERE id = 1"); @@ -1157,7 +1263,12 @@ public void testDuplicateColumnNames() { @Test public void testExecuteDescribeTableCmd() { dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("describe users"); @@ -1180,7 +1291,12 @@ public void testExecuteDescribeTableCmd() { @Test public void testExecuteDescTableCmd() { dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("desc users"); @@ -1205,7 +1321,12 @@ public void testNullObjectWithPreparedStatement() { pluginExecutor = spy(new MySqlPlugin.MySqlPluginExecutor()); doReturn(false).when(pluginExecutor).isIsOperatorUsed(any()); DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT * from (\n" + "\tselect 'Appsmith' as company_name, true as open_source\n" @@ -1252,7 +1373,12 @@ public void testNullObjectWithPreparedStatement() { @Test public void testNullAsStringWithPreparedStatement() { DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT * from (\n" + "\tselect 'Appsmith' as company_name, true as open_source\n" @@ -1300,7 +1426,12 @@ public void testNullAsStringWithPreparedStatement() { @Test public void testNumericValuesHavingLeadingZeroWithPreparedStatement() { DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT {{binding1}} as numeric_string;"); @@ -1342,7 +1473,12 @@ public void testNumericValuesHavingLeadingZeroWithPreparedStatement() { @Test public void testLongValueWithPreparedStatement() { DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMono = pluginExecutor.datasourceCreate(dsConfig); + Mono> connectionContextMono = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }); ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("select id from users LIMIT {{binding1}}"); @@ -1383,8 +1519,13 @@ public void testLongValueWithPreparedStatement() { @Test public void testDatasourceDestroy() { dsConfig = createDatasourceConfiguration(); - Mono> connectionContextMonoCache = - pluginExecutor.datasourceCreate(dsConfig).cache(); + Mono> connectionContextMonoCache = pluginExecutor + .datasourceCreate(dsConfig) + .map(connectionPool -> { + instanceConnectionContext = connectionPool; + return connectionPool; + }) + .cache(); Mono testConnResultMono = connectionContextMonoCache.flatMap(conn -> pluginExecutor.testDatasource(conn)); Mono, DatasourceTestResult>> zipMono = @@ -1417,8 +1558,10 @@ public void testExecuteCommon_queryWithComments_callValidationCallsAfterRemoving MySqlPlugin.MySqlPluginExecutor spyPlugin = spy(pluginExecutor); DatasourceConfiguration dsConfig = createDatasourceConfiguration(); - ConnectionContext connectionContextMono = + ConnectionContext connectionContext = pluginExecutor.datasourceCreate(dsConfig).block(); + instanceConnectionContext = connectionContext; + ActionConfiguration actionConfiguration = new ActionConfiguration(); actionConfiguration.setBody("SELECT id FROM users WHERE -- IS operator\nid = 1 limit 1;"); @@ -1428,7 +1571,7 @@ public void testExecuteCommon_queryWithComments_callValidationCallsAfterRemoving HashMap requestData = new HashMap<>(); Mono resultMono = - spyPlugin.executeCommon(connectionContextMono, actionConfiguration, TRUE, null, null, requestData); + spyPlugin.executeCommon(connectionContext, actionConfiguration, TRUE, null, null, requestData); StepVerifier.create(resultMono) .assertNext(result -> { diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/connectionpoolconfig/configurations/ConnectionPoolConfigCETest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/connectionpoolconfig/configurations/ConnectionPoolConfigCETest.java index e2a7bed2a02f..6f9cbd498a99 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/connectionpoolconfig/configurations/ConnectionPoolConfigCETest.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/connectionpoolconfig/configurations/ConnectionPoolConfigCETest.java @@ -18,7 +18,7 @@ public class ConnectionPoolConfigCETest { @Test public void verifyGetMaxConnectionPoolSizeProvidesDefaultValue() { // this is same as default - Integer connectionPoolMaxSize = 20; + Integer connectionPoolMaxSize = 5; Mono connectionPoolMaxSizeMono = connectionPoolConfig.getMaxConnectionPoolSize(); StepVerifier.create(connectionPoolMaxSizeMono).assertNext(poolSize -> {