This is an automated email from the ASF dual-hosted git repository.
joewitt 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 02ea103 NIFI-8379 This closes #4949. Improved reliability and
performance of DBCPServiceTest
02ea103 is described below
commit 02ea103c6ba22c1085e43a14c2939da9702ca7c8
Author: exceptionfactory <[email protected]>
AuthorDate: Mon Mar 29 14:33:34 2021 -0500
NIFI-8379 This closes #4949. Improved reliability and performance of
DBCPServiceTest
- Removed unreliable H2 network connection test methods
- Removed duplicate and ignored test methods
- Reduced duplication of setting common service properties
Signed-off-by: Joe Witt <[email protected]>
---
.../java/org/apache/nifi/dbcp/DBCPServiceTest.java | 613 +++------------------
1 file changed, 81 insertions(+), 532 deletions(-)
diff --git
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/test/java/org/apache/nifi/dbcp/DBCPServiceTest.java
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/test/java/org/apache/nifi/dbcp/DBCPServiceTest.java
index 58f3889..a9f6ef7 100644
---
a/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/test/java/org/apache/nifi/dbcp/DBCPServiceTest.java
+++
b/nifi-nar-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/test/java/org/apache/nifi/dbcp/DBCPServiceTest.java
@@ -16,183 +16,157 @@
*/
package org.apache.nifi.dbcp;
-import org.apache.derby.drda.NetworkServerControl;
import org.apache.nifi.kerberos.KerberosCredentialsService;
import org.apache.nifi.kerberos.MockKerberosCredentialsService;
import org.apache.nifi.processor.exception.ProcessException;
import org.apache.nifi.reporting.InitializationException;
import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
-import org.h2.tools.Server;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
-import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
import java.sql.Connection;
-import java.sql.Driver;
-import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class DBCPServiceTest {
+ private static final String SERVICE_ID =
DBCPConnectionPool.class.getName();
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder(new
File("target"));
- private String dbLocation;
+ private TestRunner runner;
+
+ private DBCPConnectionPool service;
@BeforeClass
- public static void setup() {
+ public static void setDerbyLog() {
System.setProperty("derby.stream.error.file", "target/derby.log");
}
@Before
- public void before() throws IOException {
- this.dbLocation = new File(tempFolder.getRoot(), "db").getPath();
+ public void setService() throws InitializationException {
+ service = new DBCPConnectionPool();
+ runner = TestRunners.newTestRunner(TestProcessor.class);
+ runner.addControllerService(SERVICE_ID, service);
+
+ final String databasePath = new File(tempFolder.getRoot(),
"db").getPath();
+ final String databaseUrl = String.format("jdbc:derby:%s;create=true",
databasePath);
+ runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
databaseUrl);
+ runner.setProperty(service, DBCPConnectionPool.DB_USER,
String.class.getSimpleName());
+ runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD,
String.class.getName());
+ runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
}
- /**
- * Missing property values.
- */
@Test
- public void testMissingPropertyValues() throws InitializationException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- final Map<String, String> properties = new HashMap<String, String>();
- runner.addControllerService("test-bad1", service, properties);
+ public void testNotValidWithNegativeMinIdleProperty() {
+ runner.setProperty(service, DBCPConnectionPool.MIN_IDLE, "-1");
runner.assertNotValid(service);
}
@Test
- public void testDynamicProperties() throws InitializationException,
SQLException {
+ public void testGetConnectionDynamicProperty() throws SQLException {
assertConnectionNotNullDynamicProperty("create", "true");
}
@Test
- public void testExpressionLanguageDynamicProperties() throws
InitializationException, SQLException {
+ public void testGetConnectionDynamicPropertyExpressionLanguageSupported()
throws SQLException {
assertConnectionNotNullDynamicProperty("create",
"${literal(1):gt(0)}");
}
@Test
- public void testSensitiveDynamicProperties() throws
InitializationException, SQLException {
+ public void testGetConnectionDynamicPropertySensitivePrefixSupported()
throws SQLException {
assertConnectionNotNullDynamicProperty("SENSITIVE.create", "true");
}
- private void assertConnectionNotNullDynamicProperty(final String
propertyName, final String propertyValue) throws InitializationException,
SQLException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService(DBCPConnectionPool.class.getSimpleName(),
service);
-
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + dbLocation);
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
- runner.setProperty(service, propertyName, propertyValue);
-
+ @Test
+ public void testGetConnectionExecuteStatements() throws SQLException {
runner.enableControllerService(service);
runner.assertValid(service);
try (final Connection connection = service.getConnection()) {
- assertNotNull(connection);
+ Assert.assertNotNull("Connection not found", connection);
+
+ try (final Statement st = connection.createStatement()) {
+ st.executeUpdate("create table restaurants(id integer, name
varchar(20), city varchar(50))");
+
+ st.executeUpdate("insert into restaurants values (1,
'Irifunes', 'San Mateo')");
+ st.executeUpdate("insert into restaurants values (2,
'Estradas', 'Daly City')");
+ st.executeUpdate("insert into restaurants values (3, 'Prime
Rib House', 'San Francisco')");
+
+ try (final ResultSet resultSet = st.executeQuery("select
count(*) AS total_rows from restaurants")) {
+ assertTrue("Result Set Row not found", resultSet.next());
+ final int rows = resultSet.getInt(1);
+ assertEquals(3, rows);
+ }
+ }
}
}
- /**
- * Max wait set to -1
- */
@Test
- public void testMaxWait() throws InitializationException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-good1", service);
-
- // set embedded Derby database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + dbLocation + ";create=true");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
- runner.setProperty(service, DBCPConnectionPool.MAX_WAIT_TIME, "-1");
+ public void testGetConnectionKerberosLoginException() throws
InitializationException {
+ final KerberosCredentialsService kerberosCredentialsService = new
MockKerberosCredentialsService();
+ final String kerberosServiceId = "kcs";
+ runner.addControllerService(kerberosServiceId,
kerberosCredentialsService);
+ runner.setProperty(kerberosCredentialsService,
MockKerberosCredentialsService.PRINCIPAL, "[email protected]");
+ runner.setProperty(kerberosCredentialsService,
MockKerberosCredentialsService.KEYTAB, "src/test/resources/fake.keytab");
+ runner.enableControllerService(kerberosCredentialsService);
+
+ // set fake Derby database connection url
+ runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby://localhost:1527/NoDB");
+ // Use the client driver here rather than the embedded one, as it will
generate a ConnectException for the test
+ runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.ClientDriver");
+ runner.setProperty(service,
DBCPConnectionPool.KERBEROS_CREDENTIALS_SERVICE, kerberosServiceId);
+
+ try {
+ runner.enableControllerService(service);
+ } catch (AssertionError ae) {
+ // Ignore, this happens because it tries to do the initial
Kerberos login
+ }
- runner.enableControllerService(service);
runner.assertValid(service);
+ Assert.assertThrows(ProcessException.class, service::getConnection);
}
- /**
- * Checks validity of idle limit and time settings including a default
- */
@Test
- public void testIdleConnectionsSettings() throws InitializationException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-good1", service);
-
- // set embedded Derby database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + dbLocation + ";create=true");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
- runner.setProperty(service, DBCPConnectionPool.MAX_WAIT_TIME, "-1");
- runner.setProperty(service, DBCPConnectionPool.MAX_IDLE, "2");
- runner.setProperty(service, DBCPConnectionPool.MAX_CONN_LIFETIME, "1
secs");
- runner.setProperty(service, DBCPConnectionPool.EVICTION_RUN_PERIOD, "1
secs");
- runner.setProperty(service,
DBCPConnectionPool.MIN_EVICTABLE_IDLE_TIME, "1 secs");
- runner.setProperty(service,
DBCPConnectionPool.SOFT_MIN_EVICTABLE_IDLE_TIME, "1 secs");
-
+ public void testGetConnection() throws SQLException {
+ runner.setProperty(service, DBCPConnectionPool.MAX_TOTAL_CONNECTIONS,
"2");
runner.enableControllerService(service);
runner.assertValid(service);
+
+ try (final Connection connection = service.getConnection()) {
+ Assert.assertNotNull("First Connection not found", connection);
+ }
+ try (final Connection connection = service.getConnection()) {
+ Assert.assertNotNull("Second Connection not found", connection);
+ }
}
@Test
- public void testMinIdleCannotBeNegative() throws InitializationException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-good1", service);
-
- // set embedded Derby database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + dbLocation + ";create=true");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
- runner.setProperty(service, DBCPConnectionPool.MAX_WAIT_TIME, "-1");
- runner.setProperty(service, DBCPConnectionPool.MIN_IDLE, "-1");
+ public void testGetConnectionMaxTotalConnectionsExceeded() {
+ runner.setProperty(service, DBCPConnectionPool.MAX_TOTAL_CONNECTIONS,
"1");
+ runner.setProperty(service, DBCPConnectionPool.MAX_WAIT_TIME, "1 ms");
+ runner.enableControllerService(service);
+ runner.assertValid(service);
- runner.assertNotValid(service);
+ final Connection connection = service.getConnection();
+ Assert.assertNotNull(connection);
+ Assert.assertThrows(ProcessException.class, service::getConnection);
}
- /**
- * Checks to ensure that settings have been passed down into the DBCP
- */
@Test
- public void testIdleSettingsAreSet() throws InitializationException,
SQLException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-good1", service);
-
- // set embedded Derby database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + dbLocation + ";create=true");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
+ public void testGetDataSourceProperties() throws SQLException {
runner.setProperty(service, DBCPConnectionPool.MAX_WAIT_TIME, "-1");
runner.setProperty(service, DBCPConnectionPool.MAX_IDLE, "6");
runner.setProperty(service, DBCPConnectionPool.MIN_IDLE, "4");
@@ -213,20 +187,8 @@ public class DBCPServiceTest {
service.getDataSource().close();
}
- /**
- * Creates a few connections and step closes them to see what happens
- */
@Test
- public void testIdle() throws InitializationException, SQLException,
InterruptedException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-good1", service);
-
- // set embedded Derby database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + dbLocation + ";create=true");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
+ public void testGetDataSourceIdleProperties() throws SQLException {
runner.setProperty(service, DBCPConnectionPool.MAX_WAIT_TIME,
"${max.wait.time}");
runner.setProperty(service, DBCPConnectionPool.MAX_TOTAL_CONNECTIONS,
"${max.total.connections}");
runner.setProperty(service, DBCPConnectionPool.MAX_IDLE,
"${max.idle}");
@@ -277,427 +239,14 @@ public class DBCPServiceTest {
service.getDataSource().close();
}
- /**
- * Test database connection using Derby. Connect, create table, insert,
select, drop table.
- *
- */
- @Test
- public void testCreateInsertSelect() throws InitializationException,
SQLException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-good1", service);
-
- // set embedded Derby database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + dbLocation + ";create=true");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
-
- runner.enableControllerService(service);
-
- runner.assertValid(service);
- final DBCPService dbcpService = (DBCPService)
runner.getProcessContext().getControllerServiceLookup().getControllerService("test-good1");
- Assert.assertNotNull(dbcpService);
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
-
- createInsertSelectDrop(connection);
-
- connection.close(); // return to pool
- }
-
- /**
- * NB!!!! Prerequisite: file should be present in
/var/tmp/mariadb-java-client-1.1.7.jar Prerequisite: access to running MariaDb
database server
- *
- * Test database connection using external JDBC jar located by URL.
Connect, create table, insert, select, drop table.
- *
- */
- @Ignore
- @Test
- public void testExternalJDBCDriverUsage() throws InitializationException,
SQLException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-external-jar", service);
-
- // set MariaDB database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:mariadb://localhost:3306/" + "testdb");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.mariadb.jdbc.Driver");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVER_LOCATION,
"file:///var/tmp/mariadb-java-client-1.1.7.jar");
-
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
-
- runner.enableControllerService(service);
-
- runner.assertValid(service);
- final DBCPService dbcpService = (DBCPService)
runner.getProcessContext().getControllerServiceLookup().getControllerService("test-external-jar");
- Assert.assertNotNull(dbcpService);
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
-
- createInsertSelectDrop(connection);
-
- connection.close(); // return to pool
- }
-
- /**
- * Test that we relogin to Kerberos if a ConnectException occurs during
getConnection().
- */
- @Test(expected = ProcessException.class)
- public void testConnectExceptionCausesKerberosRelogin() throws
InitializationException, SQLException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-good1", service);
-
- final KerberosCredentialsService kerberosCredentialsService = new
MockKerberosCredentialsService();
- runner.addControllerService("kcs", kerberosCredentialsService);
- runner.setProperty(kerberosCredentialsService,
MockKerberosCredentialsService.PRINCIPAL, "[email protected]");
- runner.setProperty(kerberosCredentialsService,
MockKerberosCredentialsService.KEYTAB, "src/test/resources/fake.keytab");
- runner.enableControllerService(kerberosCredentialsService);
-
- // set fake Derby database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby://localhost:1527/NoDB");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
- // Use the client driver here rather than the embedded one, as it will
generate a ConnectException for the test
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.ClientDriver");
- runner.setProperty(service,
DBCPConnectionPool.KERBEROS_CREDENTIALS_SERVICE, "kcs");
-
- try {
- runner.enableControllerService(service);
- } catch (AssertionError ae) {
- // Ignore, this happens because it tries to do the initial
Kerberos login
- }
-
- runner.assertValid(service);
- final DBCPService dbcpService = (DBCPService)
runner.getProcessContext().getControllerServiceLookup().getControllerService("test-good1");
- Assert.assertNotNull(dbcpService);
-
- dbcpService.getConnection();
- }
-
- @Rule
- public ExpectedException exception = ExpectedException.none();
-
- /**
- * Test get database connection using Derby. Get many times, after a while
pool should not contain any available connection and getConnection should fail.
- */
- @Test
- public void testExhaustPool() throws InitializationException, SQLException
{
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-exhaust", service);
-
- // set embedded Derby database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + dbLocation + ";create=true");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
-
- runner.enableControllerService(service);
-
- runner.assertValid(service);
- final DBCPService dbcpService = (DBCPService)
runner.getProcessContext().getControllerServiceLookup().getControllerService("test-exhaust");
- Assert.assertNotNull(dbcpService);
-
- exception.expect(ProcessException.class);
- exception.expectMessage("Cannot get a connection, pool error Timeout
waiting for idle object");
- for (int i = 0; i < 100; i++) {
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
- }
- }
-
- /**
- * Test Drop invalid connections and create new ones.
- * Default behavior, invalid connections in pool.
- */
- @Test
- public void testDropInvalidConnectionsH2_Default() throws Exception {
-
- // start the H2 TCP Server
- String[] args = new String[0];
- Server server = Server.createTcpServer(args).start();
-
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-dropcreate", service);
-
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
- "jdbc:h2:tcp://localhost:" + server.getPort() + "/./" +
dbLocation);
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.h2.Driver");
- runner.enableControllerService(service);
-
- runner.assertValid(service);
- final DBCPService dbcpService = (DBCPService)
runner.getProcessContext().getControllerServiceLookup().getControllerService("test-dropcreate");
- Assert.assertNotNull(dbcpService);
-
- // get and verify connections
- for (int i = 0; i < 10; i++) {
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
- assertValidConnectionH2(connection, i);
- connection.close();
- }
-
- // restart server, connections in pool should became invalid
- server.stop();
- server.shutdown();
- server.start();
-
- for (int i = 0; i < 10; i++) {
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
- assertValidConnectionH2(connection, i);
- connection.close();
- }
-
- server.shutdown();
- }
-
- /**
- * Test Drop invalid connections and create new ones.
- * Better behavior, invalid connections are dropped and valid created.
- */
- @Test
- public void testDropInvalidConnectionsH2_Better() throws Exception {
-
- // start the H2 TCP Server
- String[] args = new String[0];
- Server server = Server.createTcpServer(args).start();
-
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-dropcreate", service);
-
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
- "jdbc:h2:tcp://localhost:" + server.getPort() + "/./" +
dbLocation);
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.h2.Driver");
- runner.setProperty(service, DBCPConnectionPool.VALIDATION_QUERY,
"SELECT 5");
- runner.enableControllerService(service);
-
- runner.assertValid(service);
- final DBCPService dbcpService = (DBCPService)
runner.getProcessContext().getControllerServiceLookup().getControllerService("test-dropcreate");
- Assert.assertNotNull(dbcpService);
-
- // get and verify connections
- for (int i = 0; i < 10; i++) {
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
- assertValidConnectionH2(connection, i);
- connection.close();
- }
-
- // restart server, connections in pool should became invalid
- server.stop();
- server.shutdown();
- server.start();
-
- Thread.sleep(2500L); //allow time to pass for the server to startup.
-
- // Note!! We should not get something like:
- // org.h2.jdbc.JdbcSQLException: Connection is broken: "session
closed" [90067-192]
- // Pool should remove invalid connections and create new valid
connections.
- for (int i = 0; i < 10; i++) {
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
- assertValidConnectionH2(connection, i);
- connection.close();
- }
-
- server.shutdown();
- }
-
- private void assertValidConnectionH2(Connection connection, int num)
throws SQLException {
- try (Statement statement = connection.createStatement()) {
- ResultSet rs = statement.executeQuery("SELECT " + num);
- assertTrue(rs.next());
- int value = rs.getInt(1);
- assertEquals(num, value);
- assertTrue(connection.isValid(20));
- }
- }
-
- /**
- * Note!! Derby keeps something open even after server shutdown.
- * So it's difficult to get invalid connections.
- *
- * Test Drop invalid connections and create new ones.
- */
- @Ignore
- @Test
- public void testDropInvalidConnectionsDerby() throws Exception {
-
- // Start Derby server.
- System.setProperty("derby.drda.startNetworkServer", "true");
- System.setProperty("derby.system.home", dbLocation);
- NetworkServerControl serverControl = new
NetworkServerControl(InetAddress.getLocalHost(),1527);
- serverControl.start(new PrintWriter(System.out, true));
-
- // create sample database
- Class.forName("org.apache.derby.jdbc.ClientDriver");
- Connection conn =
DriverManager.getConnection("jdbc:derby://127.0.0.1:1527/sample;create=true");
- conn.close();
-
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-dropcreate", service);
-
- // set Derby database props
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + "//127.0.0.1:1527/sample");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.ClientDriver");
-
- runner.enableControllerService(service);
-
- runner.assertValid(service);
- final DBCPService dbcpService = (DBCPService)
runner.getProcessContext().getControllerServiceLookup().getControllerService("test-dropcreate");
- Assert.assertNotNull(dbcpService);
-
- for (int i = 0; i < 10; i++) {
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
- assertValidConnectionDerby(connection, i);
- connection.close();
- }
-
- serverControl.shutdown();
-
- Thread.sleep(2000);
-
- for (int i = 0; i < 10; i++) {
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
- assertValidConnectionDerby(connection, i);
- connection.close();
- }
-
- }
-
-
- private void assertValidConnectionDerby(Connection connection, int num)
throws SQLException {
- try (Statement statement = connection.createStatement()) {
- ResultSet rs = statement.executeQuery("SELECT " + num + " FROM
SYSIBM.SYSDUMMY1");
- assertTrue(rs.next());
- int value = rs.getInt(1);
- assertEquals(num, value);
- assertTrue(connection.isValid(20));
- }
- }
-
- /**
- * Test get database connection using Derby. Get many times, release
immediately and getConnection should not fail.
- */
- @Test
- public void testGetManyNormal() throws InitializationException,
SQLException {
- final TestRunner runner =
TestRunners.newTestRunner(TestProcessor.class);
- final DBCPConnectionPool service = new DBCPConnectionPool();
- runner.addControllerService("test-exhaust", service);
-
- // set embedded Derby database connection url
- runner.setProperty(service, DBCPConnectionPool.DATABASE_URL,
"jdbc:derby:" + dbLocation + ";create=true");
- runner.setProperty(service, DBCPConnectionPool.DB_USER, "tester");
- runner.setProperty(service, DBCPConnectionPool.DB_PASSWORD, "testerp");
- runner.setProperty(service, DBCPConnectionPool.DB_DRIVERNAME,
"org.apache.derby.jdbc.EmbeddedDriver");
+ private void assertConnectionNotNullDynamicProperty(final String
propertyName, final String propertyValue) throws SQLException {
+ runner.setProperty(service, propertyName, propertyValue);
runner.enableControllerService(service);
-
runner.assertValid(service);
- final DBCPService dbcpService = (DBCPService)
runner.getProcessContext().getControllerServiceLookup().getControllerService("test-exhaust");
- Assert.assertNotNull(dbcpService);
-
- for (int i = 0; i < 1000; i++) {
- final Connection connection = dbcpService.getConnection();
- Assert.assertNotNull(connection);
- connection.close(); // will return connection to pool
- }
- }
-
- @Test
- public void testDriverLoad() throws ClassNotFoundException {
- final Class<?> clazz =
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
- assertNotNull(clazz);
- }
-
- /**
- * NB!!!! Prerequisite: file should be present in
/var/tmp/mariadb-java-client-1.1.7.jar
- */
- @Test
- @Ignore("Intended only for local testing, not automated testing")
- public void testURLClassLoader() throws ClassNotFoundException,
MalformedURLException, SQLException, InstantiationException,
IllegalAccessException {
-
- final URL url = new
URL("file:///var/tmp/mariadb-java-client-1.1.7.jar");
- final URL[] urls = new URL[] { url };
-
- final ClassLoader parent =
Thread.currentThread().getContextClassLoader();
- final URLClassLoader ucl = new URLClassLoader(urls, parent);
-
- final Class<?> clazz = Class.forName("org.mariadb.jdbc.Driver", true,
ucl);
- assertNotNull(clazz);
- final Driver driver = (Driver) clazz.newInstance();
- final Driver shim = new DriverShim(driver);
- DriverManager.registerDriver(shim);
-
- final Driver driver2 =
DriverManager.getDriver("jdbc:mariadb://localhost:3306/testdb");
- assertNotNull(driver2);
- }
-
- /**
- * NB!!!! Prerequisite: file should be present in
/var/tmp/mariadb-java-client-1.1.7.jar Prerequisite: access to running MariaDb
database server
- */
- @Test
- @Ignore("Intended only for local testing, not automated testing")
- public void testURLClassLoaderGetConnection() throws
ClassNotFoundException, MalformedURLException, SQLException,
InstantiationException, IllegalAccessException {
-
- final URL url = new
URL("file:///var/tmp/mariadb-java-client-1.1.7.jar");
- final URL[] urls = new URL[] { url };
-
- final ClassLoader parent =
Thread.currentThread().getContextClassLoader();
- final URLClassLoader ucl = new URLClassLoader(urls, parent);
-
- final Class<?> clazz = Class.forName("org.mariadb.jdbc.Driver", true,
ucl);
- assertNotNull(clazz);
-
- final Driver driver = (Driver) clazz.newInstance();
- final Driver shim = new DriverShim(driver);
- DriverManager.registerDriver(shim);
-
- final Driver driver2 =
DriverManager.getDriver("jdbc:mariadb://localhost:3306/testdb");
- assertNotNull(driver2);
-
- final Connection connection =
DriverManager.getConnection("jdbc:mariadb://localhost:3306/testdb", "tester",
"testerp");
- assertNotNull(connection);
- connection.close();
-
- DriverManager.deregisterDriver(shim);
- }
-
- String createTable = "create table restaurants(id integer, name
varchar(20), city varchar(50))";
- String dropTable = "drop table restaurants";
-
- protected void createInsertSelectDrop(Connection con) throws SQLException {
-
- final Statement st = con.createStatement();
-
- try {
- st.executeUpdate(dropTable);
- } catch (final Exception e) {
- // table may not exist, this is not serious problem.
+ try (final Connection connection = service.getConnection()) {
+ assertNotNull(connection);
}
-
- st.executeUpdate(createTable);
-
- st.executeUpdate("insert into restaurants values (1, 'Irifunes', 'San
Mateo')");
- st.executeUpdate("insert into restaurants values (2, 'Estradas', 'Daly
City')");
- st.executeUpdate("insert into restaurants values (3, 'Prime Rib
House', 'San Francisco')");
-
- int nrOfRows = 0;
- final ResultSet resultSet = st.executeQuery("select * from
restaurants");
- while (resultSet.next())
- nrOfRows++;
- assertEquals(3, nrOfRows);
-
- st.close();
}
-
}