You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ex...@apache.org on 2023/05/17 15:51:59 UTC

[nifi] branch main updated: NIFI-11547 Fixed DBCPConnectionPool verification

This is an automated email from the ASF dual-hosted git repository.

exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 1a38bf003e NIFI-11547 Fixed DBCPConnectionPool verification
1a38bf003e is described below

commit 1a38bf003ea23ccca6e04efb6afe64a52d1d61f5
Author: Lehel <Le...@hotmail.com>
AuthorDate: Mon May 15 23:05:11 2023 +0200

    NIFI-11547 Fixed DBCPConnectionPool verification
    
    - Added unit test for AbstractDBCPConnectionPool
    
    This closes #7249
    
    Co-authored-by: David Handermann <ex...@apache.org>
    Signed-off-by: David Handermann <ex...@apache.org>
---
 .../nifi-extension-utils/nifi-dbcp-base/pom.xml    |   4 +
 .../nifi/dbcp/AbstractDBCPConnectionPool.java      |  42 ++++----
 .../nifi/dbcp/AbstractDBCPConnectionPoolTest.java  | 116 +++++++++++++++++++++
 3 files changed, 141 insertions(+), 21 deletions(-)

diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/pom.xml b/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/pom.xml
index 11738f9232..cc639c5b3d 100644
--- a/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/pom.xml
+++ b/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/pom.xml
@@ -53,5 +53,9 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/main/java/org/apache/nifi/dbcp/AbstractDBCPConnectionPool.java b/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/main/java/org/apache/nifi/dbcp/AbstractDBCPConnectionPool.java
index cc15e36c11..ac7caa8cf1 100644
--- a/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/main/java/org/apache/nifi/dbcp/AbstractDBCPConnectionPool.java
+++ b/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/main/java/org/apache/nifi/dbcp/AbstractDBCPConnectionPool.java
@@ -76,17 +76,17 @@ public abstract class AbstractDBCPConnectionPool extends AbstractControllerServi
                     .build());
         }
 
-        final BasicDataSource dataSource = new BasicDataSource();
+        final BasicDataSource basicDataSource = new BasicDataSource();
         try {
             final DataSourceConfiguration configuration = getDataSourceConfiguration(context);
-            configureDataSource(context, configuration);
+            configureDataSource(context, basicDataSource, configuration);
             results.add(new ConfigVerificationResult.Builder()
                     .verificationStepName("Configure Data Source")
                     .outcome(SUCCESSFUL)
                     .explanation("Successfully configured data source")
                     .build());
 
-            try (final Connection conn = getConnection(dataSource, kerberosUser)) {
+            try (final Connection conn = getConnection(basicDataSource, kerberosUser)) {
                 results.add(new ConfigVerificationResult.Builder()
                         .verificationStepName("Establish Connection")
                         .outcome(SUCCESSFUL)
@@ -114,7 +114,7 @@ public abstract class AbstractDBCPConnectionPool extends AbstractControllerServi
                     .build());
         } finally {
             try {
-                shutdown(dataSource, kerberosUser);
+                shutdown(basicDataSource, kerberosUser);
             } catch (final SQLException e) {
                 verificationLogger.error("Failed to shut down data source", e);
             }
@@ -140,7 +140,7 @@ public abstract class AbstractDBCPConnectionPool extends AbstractControllerServi
         kerberosUser = getKerberosUser(context);
         loginKerberos(kerberosUser);
         final DataSourceConfiguration configuration = getDataSourceConfiguration(context);
-        configureDataSource(context, configuration);
+        configureDataSource(context, dataSource, configuration);
     }
 
     private void loginKerberos(KerberosUser kerberosUser) throws InitializationException {
@@ -157,30 +157,30 @@ public abstract class AbstractDBCPConnectionPool extends AbstractControllerServi
 
     protected abstract DataSourceConfiguration getDataSourceConfiguration(final ConfigurationContext context);
 
-    protected void configureDataSource(final ConfigurationContext context, final DataSourceConfiguration configuration) {
+    protected void configureDataSource(final ConfigurationContext context, final BasicDataSource basicDataSource, final DataSourceConfiguration configuration) {
         final Driver driver = getDriver(configuration.getDriverName(), configuration.getUrl());
 
-        dataSource.setDriver(driver);
-        dataSource.setMaxWaitMillis(configuration.getMaxWaitMillis());
-        dataSource.setMaxTotal(configuration.getMaxTotal());
-        dataSource.setMinIdle(configuration.getMinIdle());
-        dataSource.setMaxIdle(configuration.getMaxIdle());
-        dataSource.setMaxConnLifetimeMillis(configuration.getMaxConnLifetimeMillis());
-        dataSource.setTimeBetweenEvictionRunsMillis(configuration.getTimeBetweenEvictionRunsMillis());
-        dataSource.setMinEvictableIdleTimeMillis(configuration.getMinEvictableIdleTimeMillis());
-        dataSource.setSoftMinEvictableIdleTimeMillis(configuration.getSoftMinEvictableIdleTimeMillis());
+        basicDataSource.setDriver(driver);
+        basicDataSource.setMaxWaitMillis(configuration.getMaxWaitMillis());
+        basicDataSource.setMaxTotal(configuration.getMaxTotal());
+        basicDataSource.setMinIdle(configuration.getMinIdle());
+        basicDataSource.setMaxIdle(configuration.getMaxIdle());
+        basicDataSource.setMaxConnLifetimeMillis(configuration.getMaxConnLifetimeMillis());
+        basicDataSource.setTimeBetweenEvictionRunsMillis(configuration.getTimeBetweenEvictionRunsMillis());
+        basicDataSource.setMinEvictableIdleTimeMillis(configuration.getMinEvictableIdleTimeMillis());
+        basicDataSource.setSoftMinEvictableIdleTimeMillis(configuration.getSoftMinEvictableIdleTimeMillis());
 
         final String validationQuery = configuration.getValidationQuery();
         if (StringUtils.isNotBlank(validationQuery)) {
-            dataSource.setValidationQuery(validationQuery);
-            dataSource.setTestOnBorrow(true);
+            basicDataSource.setValidationQuery(validationQuery);
+            basicDataSource.setTestOnBorrow(true);
         }
 
-        dataSource.setUrl(configuration.getUrl());
-        dataSource.setUsername(configuration.getUserName());
-        dataSource.setPassword(configuration.getPassword());
+        basicDataSource.setUrl(configuration.getUrl());
+        basicDataSource.setUsername(configuration.getUserName());
+        basicDataSource.setPassword(configuration.getPassword());
 
-        getConnectionProperties(context).forEach(dataSource::addConnectionProperty);
+        getConnectionProperties(context).forEach(basicDataSource::addConnectionProperty);
     }
 
     protected Map<String, String> getConnectionProperties(final ConfigurationContext context) {
diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/test/java/org/apache/nifi/dbcp/AbstractDBCPConnectionPoolTest.java b/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/test/java/org/apache/nifi/dbcp/AbstractDBCPConnectionPoolTest.java
new file mode 100644
index 0000000000..7c85b876b9
--- /dev/null
+++ b/nifi-nar-bundles/nifi-extension-utils/nifi-dbcp-base/src/test/java/org/apache/nifi/dbcp/AbstractDBCPConnectionPoolTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.dbcp;
+
+import org.apache.nifi.components.ConfigVerificationResult;
+import org.apache.nifi.components.PropertyValue;
+import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.dbcp.utils.DBCPProperties;
+import org.apache.nifi.dbcp.utils.DataSourceConfiguration;
+import org.apache.nifi.kerberos.KerberosUserService;
+import org.apache.nifi.logging.ComponentLog;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+class AbstractDBCPConnectionPoolTest {
+
+    private static final int MAX_TOTAL = 1;
+
+    private static final int TIMEOUT = 0;
+
+    @Mock
+    Driver driver;
+
+    @Mock
+    Connection connection;
+
+    @Mock
+    DataSourceConfiguration dataSourceConfiguration;
+
+    @Mock
+    ConfigurationContext configurationContext;
+
+    @Mock
+    ComponentLog componentLog;
+
+    @Mock
+    PropertyValue kerberosUserServiceProperty;
+
+    @Mock
+    KerberosUserService kerberosUserService;
+
+    @Test
+    void testVerifySuccessful() throws SQLException {
+        final AbstractDBCPConnectionPool connectionPool = new MockDBCPConnectionPool();
+
+        when(dataSourceConfiguration.getMaxTotal()).thenReturn(MAX_TOTAL);
+        when(configurationContext.getProperty(eq(DBCPProperties.KERBEROS_USER_SERVICE))).thenReturn(kerberosUserServiceProperty);
+        when(kerberosUserServiceProperty.asControllerService(eq(KerberosUserService.class))).thenReturn(kerberosUserService);
+        when(driver.connect(any(), any())).thenReturn(connection);
+        when(connection.isValid(eq(TIMEOUT))).thenReturn(true);
+
+        final List<ConfigVerificationResult> results = connectionPool.verify(configurationContext, componentLog, Collections.emptyMap());
+
+        assertOutcomeSuccessful(results);
+    }
+
+    private void assertOutcomeSuccessful(final List<ConfigVerificationResult> results) {
+        assertNotNull(results);
+        final Iterator<ConfigVerificationResult> resultsFound = results.iterator();
+
+        assertTrue(resultsFound.hasNext());
+        final ConfigVerificationResult firstResult = resultsFound.next();
+        assertEquals(ConfigVerificationResult.Outcome.SUCCESSFUL, firstResult.getOutcome(), firstResult.getExplanation());
+
+        assertTrue(resultsFound.hasNext());
+        final ConfigVerificationResult secondResult = resultsFound.next();
+        assertEquals(ConfigVerificationResult.Outcome.SUCCESSFUL, secondResult.getOutcome(), secondResult.getExplanation());
+
+        assertFalse(resultsFound.hasNext());
+    }
+
+    private class MockDBCPConnectionPool extends AbstractDBCPConnectionPool {
+
+        @Override
+        protected Driver getDriver(final String driverName, final String url) {
+            return driver;
+        }
+
+        @Override
+        protected DataSourceConfiguration getDataSourceConfiguration(final ConfigurationContext context) {
+            return dataSourceConfiguration;
+        }
+    }
+}