From c72e682888eab054b5c56ad7fa2138710d82baf7 Mon Sep 17 00:00:00 2001 From: Zorglube <630192+zorglube@users.noreply.github.com> Date: Wed, 20 Jul 2022 16:44:08 +0200 Subject: [PATCH] Add Closeable/AutoCloseable on Database & interface (#2990) * Add AutoCloseable on Database interface * Adapt close() implementation into AbstractJdbcDatabase * Handle the eventuality of no connection. * Use `try with resources` into unit test Co-authored-by: Bertrand Moreau Co-authored-by: Nathan Voxland --- .../database/AbstractJdbcDatabase.java | 61 +++++++--------- .../java/liquibase/database/Database.java | 24 ++++--- .../database/DatabaseConnection.java | 8 +-- .../liquibase/database/OfflineConnection.java | 1 - .../database/core/DerbyDatabase.java | 8 ++- .../database/AbstractJdbcDatabaseTest.java | 25 ++++--- .../ConnectionServiceFactoryTest.java | 8 +-- .../core/AbstractDb2DatabaseTest.java | 18 +++-- .../database/core/DB2DatabaseTest.java | 13 ++-- .../database/core/DB2zDatabaseTest.java | 13 ++-- .../database/core/DerbyDatabaseTest.java | 13 ++-- .../database/core/MSSQLDatabaseTest.java | 59 ++++++++------- .../database/core/MySQLDatabaseTest.java | 40 ++++++----- .../database/core/OracleDatabaseTest.java | 72 +++++++++---------- .../database/core/PostgresDatabaseTest.java | 23 +++--- .../core/UnsupportedDatabaseTest.java | 20 +++--- 16 files changed, 215 insertions(+), 191 deletions(-) diff --git a/liquibase-core/src/main/java/liquibase/database/AbstractJdbcDatabase.java b/liquibase-core/src/main/java/liquibase/database/AbstractJdbcDatabase.java index e21323bf9b5..368c4946c49 100644 --- a/liquibase-core/src/main/java/liquibase/database/AbstractJdbcDatabase.java +++ b/liquibase-core/src/main/java/liquibase/database/AbstractJdbcDatabase.java @@ -1,6 +1,24 @@ package liquibase.database; +import static liquibase.util.StringUtil.join; +import java.io.IOException; +import java.io.Writer; +import java.math.BigInteger; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; import liquibase.CatalogAndSchema; +import liquibase.GlobalConfiguration; import liquibase.Scope; import liquibase.change.Change; import liquibase.change.core.DropTableChange; @@ -9,7 +27,6 @@ import liquibase.changelog.DatabaseChangeLog; import liquibase.changelog.RanChangeSet; import liquibase.changelog.StandardChangeLogHistoryService; -import liquibase.GlobalConfiguration; import liquibase.configuration.ConfiguredValue; import liquibase.database.core.OracleDatabase; import liquibase.database.core.PostgresDatabase; @@ -60,25 +77,6 @@ import liquibase.util.StreamUtil; import liquibase.util.StringUtil; -import java.io.IOException; -import java.io.Writer; -import java.math.BigInteger; -import java.sql.SQLException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; - -import static liquibase.util.StringUtil.join; - /** * AbstractJdbcDatabase is extended by all supported databases as a facade to the underlying database. @@ -1224,20 +1222,15 @@ public int hashCode() { @Override public void close() throws DatabaseException { - Scope.getCurrentScope().getSingleton(ExecutorService.class).clearExecutor("jdbc", this); - DatabaseConnection connection = getConnection(); - if (connection != null) { - if (previousAutoCommit != null) { - try { - connection.setAutoCommit(previousAutoCommit); - } catch (DatabaseException e) { - Scope.getCurrentScope().getLog(getClass()).warning("Failed to restore the auto commit to " + previousAutoCommit); - - throw e; - } - } - connection.close(); - } + Scope.getCurrentScope().getSingleton(ExecutorService.class).clearExecutor("jdbc", this); + try (final DatabaseConnection connection = getConnection();) { + if (connection != null && previousAutoCommit != null) { + connection.setAutoCommit(previousAutoCommit); + } + } catch (final DatabaseException e) { + Scope.getCurrentScope().getLog(getClass()).warning("Failed to restore the auto commit to " + previousAutoCommit); + throw e; + } } @Override diff --git a/liquibase-core/src/main/java/liquibase/database/Database.java b/liquibase-core/src/main/java/liquibase/database/Database.java index d59b811184b..1411b306919 100644 --- a/liquibase-core/src/main/java/liquibase/database/Database.java +++ b/liquibase-core/src/main/java/liquibase/database/Database.java @@ -1,25 +1,28 @@ package liquibase.database; +import java.io.IOException; +import java.io.Writer; +import java.math.BigInteger; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Locale; import liquibase.CatalogAndSchema; import liquibase.change.Change; import liquibase.changelog.ChangeSet; import liquibase.changelog.DatabaseChangeLog; import liquibase.changelog.RanChangeSet; -import liquibase.exception.*; +import liquibase.exception.DatabaseException; +import liquibase.exception.DatabaseHistoryException; +import liquibase.exception.DateParseException; +import liquibase.exception.LiquibaseException; +import liquibase.exception.ValidationErrors; import liquibase.servicelocator.PrioritizedService; import liquibase.sql.visitor.SqlVisitor; import liquibase.statement.DatabaseFunction; import liquibase.statement.SqlStatement; import liquibase.structure.DatabaseObject; -import java.io.IOException; -import java.io.Writer; -import java.math.BigInteger; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Locale; - /** * Interface that every DBMS supported by this software must implement. Most methods belong into ont of these * categories: @@ -29,7 +32,7 @@ *
  • creating strings for use in SQL statements, e.g. literals for dates, time, numerals, etc.
  • * */ -public interface Database extends PrioritizedService { +public interface Database extends PrioritizedService, AutoCloseable { String databaseChangeLogTableName = "DatabaseChangeLog".toUpperCase(Locale.US); String databaseChangeLogLockTableName = "DatabaseChangeLogLock".toUpperCase(Locale.US); @@ -290,6 +293,7 @@ public interface Database extends PrioritizedService { String escapeStringForDatabase(String string); + @Override void close() throws DatabaseException; boolean supportsRestrictForeignKeys(); diff --git a/liquibase-core/src/main/java/liquibase/database/DatabaseConnection.java b/liquibase-core/src/main/java/liquibase/database/DatabaseConnection.java index b1da23fc667..98ce7098267 100644 --- a/liquibase-core/src/main/java/liquibase/database/DatabaseConnection.java +++ b/liquibase-core/src/main/java/liquibase/database/DatabaseConnection.java @@ -1,10 +1,9 @@ package liquibase.database; -import liquibase.exception.DatabaseException; -import liquibase.servicelocator.PrioritizedService; - import java.sql.Driver; import java.util.Properties; +import liquibase.exception.DatabaseException; +import liquibase.servicelocator.PrioritizedService; /** * A liquibase abstraction over the normal Connection that is available in @@ -12,7 +11,7 @@ * connection. * */ -public interface DatabaseConnection extends PrioritizedService { +public interface DatabaseConnection extends PrioritizedService, AutoCloseable { void open(String url, Driver driverObject, Properties driverProperties) throws DatabaseException; @@ -29,6 +28,7 @@ default boolean supports(String url) { return true; } + @Override void close() throws DatabaseException; void commit() throws DatabaseException; diff --git a/liquibase-core/src/main/java/liquibase/database/OfflineConnection.java b/liquibase-core/src/main/java/liquibase/database/OfflineConnection.java index eb498390d64..442b473b3af 100644 --- a/liquibase-core/src/main/java/liquibase/database/OfflineConnection.java +++ b/liquibase-core/src/main/java/liquibase/database/OfflineConnection.java @@ -11,7 +11,6 @@ import liquibase.parser.SnapshotParserFactory; import liquibase.resource.ResourceAccessor; import liquibase.servicelocator.LiquibaseService; -import liquibase.servicelocator.PrioritizedService; import liquibase.snapshot.DatabaseSnapshot; import liquibase.snapshot.EmptyDatabaseSnapshot; import liquibase.snapshot.InvalidExampleException; diff --git a/liquibase-core/src/main/java/liquibase/database/core/DerbyDatabase.java b/liquibase-core/src/main/java/liquibase/database/core/DerbyDatabase.java index a731d5587fd..0cd79a5f946 100644 --- a/liquibase-core/src/main/java/liquibase/database/core/DerbyDatabase.java +++ b/liquibase-core/src/main/java/liquibase/database/core/DerbyDatabase.java @@ -59,7 +59,7 @@ public String getDefaultDriver(String url) { } catch (ClassNotFoundException classNotFoundException) { // Return class for newer versions anyway return derbyNewDriverClassName; - } + } } } else if (url.startsWith("jdbc:derby") || url.startsWith("java:derby")) { //Use EmbeddedDriver if using a derby URL but without the `://` in it @@ -153,12 +153,15 @@ public String getViewDefinition(CatalogAndSchema schema, String name) throws Dat @Override public void close() throws DatabaseException { + // FIXME Seems not to be a good way to handle the possibility of getting `getConnection() == null` + if (getConnection() != null) { String url = getConnection().getURL(); String driverName = getDefaultDriver(url); super.close(); - if (getShutdownEmbeddedDerby() && (driverName != null) && driverName.toLowerCase().contains("embedded")) { + if (shutdownEmbeddedDerby && (driverName != null) && driverName.toLowerCase().contains("embedded")) { shutdownDerby(url, driverName); } + } } protected void shutdownDerby(String url, String driverName) throws DatabaseException { @@ -194,7 +197,6 @@ protected void shutdownDerby(String url, String driverName) throws DatabaseExcep /** * Determine Apache Derby driver major/minor version. */ - @SuppressWarnings({"static-access", "unchecked"}) protected void determineDriverVersion() { try { // Locate the Derby sysinfo class and query its version info diff --git a/liquibase-core/src/test/java/liquibase/database/AbstractJdbcDatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/AbstractJdbcDatabaseTest.java index da4f96d13b7..bb9c5e1fb6e 100644 --- a/liquibase-core/src/test/java/liquibase/database/AbstractJdbcDatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/AbstractJdbcDatabaseTest.java @@ -1,7 +1,14 @@ package liquibase.database; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; import liquibase.Scope; import liquibase.change.core.CreateTableChange; +import liquibase.exception.DatabaseException; import liquibase.executor.ExecutorService; import liquibase.sdk.executor.MockExecutor; import liquibase.sql.visitor.AppendSqlVisitor; @@ -9,14 +16,6 @@ import liquibase.statement.SqlStatement; import liquibase.statement.core.DropTableStatement; import liquibase.structure.core.Table; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; /** * Base test class for database-specific tests @@ -88,14 +87,14 @@ public void defaultsWorkWithoutAConnection() { // } @Test - public void escapeTableName_noSchema() { - Database database = getDatabase(); + public void escapeTableName_noSchema() throws DatabaseException { + final Database database = getDatabase(); assertEquals("tableName", database.escapeTableName(null, null, "tableName")); } @Test - public void escapeTableName_withSchema() { - Database database = getDatabase(); + public void escapeTableName_withSchema() throws DatabaseException { + final Database database = getDatabase(); if (database.supportsCatalogInObjectName(Table.class)) { assertEquals("catalogName.schemaName.tableName", database.escapeTableName("catalogName", "schemaName", "tableName")); } else { @@ -283,7 +282,7 @@ public void test_escapeObjectName() { assertTrue(tableName.matches("[\\[\\\"`]?My Table [\\]\\\"`]?")); tableName = database.escapeObjectName("MyTable", Table.class); - assertTrue(tableName.equals("MyTable")); + assertEquals("MyTable", tableName); tableName = database.escapeObjectName("My Table", Table.class); assertTrue(tableName.matches("[\\[\\\"`]?My Table[\\]\\\"`]?")); diff --git a/liquibase-core/src/test/java/liquibase/database/ConnectionServiceFactoryTest.java b/liquibase-core/src/test/java/liquibase/database/ConnectionServiceFactoryTest.java index efe63fa3167..0d5ac9e2490 100644 --- a/liquibase-core/src/test/java/liquibase/database/ConnectionServiceFactoryTest.java +++ b/liquibase-core/src/test/java/liquibase/database/ConnectionServiceFactoryTest.java @@ -1,13 +1,9 @@ package liquibase.database; -import liquibase.database.jvm.JdbcConnection; +import static org.assertj.core.api.Assertions.assertThat; import org.junit.Before; import org.junit.Test; - -import java.sql.Driver; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; +import liquibase.database.jvm.JdbcConnection; public class ConnectionServiceFactoryTest { diff --git a/liquibase-core/src/test/java/liquibase/database/core/AbstractDb2DatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/core/AbstractDb2DatabaseTest.java index db99a27a6c8..7690ebb352f 100644 --- a/liquibase-core/src/test/java/liquibase/database/core/AbstractDb2DatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/core/AbstractDb2DatabaseTest.java @@ -1,15 +1,19 @@ package liquibase.database.core; import junit.framework.TestCase; -import liquibase.database.Database; +import liquibase.exception.DatabaseException; public class AbstractDb2DatabaseTest extends TestCase { - public void testGetDateLiteral() { - AbstractDb2Database database = new DB2Database(); - assertEquals("DATE('2018-12-31')", database.getDateLiteral("2018-12-31")); - assertEquals("TIME('23:58:59')", database.getDateLiteral("23:58:59")); - assertEquals("TIMESTAMP('2018-12-31 23:58:59')", database.getDateLiteral("2018-12-31 23:58:59")); - assertEquals("UNSUPPORTED:foo", database.getDateLiteral("foo")); + public void testGetDateLiteral() throws DatabaseException { + try (AbstractDb2Database database = new DB2Database()) { + assertEquals("DATE('2018-12-31')", database.getDateLiteral("2018-12-31")); + assertEquals("TIME('23:58:59')", database.getDateLiteral("23:58:59")); + assertEquals("TIMESTAMP('2018-12-31 23:58:59')", database.getDateLiteral("2018-12-31 23:58:59")); + assertEquals("UNSUPPORTED:foo", database.getDateLiteral("foo")); + } catch (final DatabaseException e) { + throw e; + } } + } diff --git a/liquibase-core/src/test/java/liquibase/database/core/DB2DatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/core/DB2DatabaseTest.java index 33a017efd7c..9546275e1a4 100644 --- a/liquibase-core/src/test/java/liquibase/database/core/DB2DatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/core/DB2DatabaseTest.java @@ -2,15 +2,18 @@ import junit.framework.TestCase; import liquibase.database.Database; +import liquibase.exception.DatabaseException; public class DB2DatabaseTest extends TestCase { - public void testGetDefaultDriver() { - Database database = new DB2Database(); - assertEquals("com.ibm.db2.jcc.DB2Driver", database.getDefaultDriver("jdbc:db2://localhost:50000/liquibas")); + public void testGetDefaultDriver() throws DatabaseException { + try (Database database = new DB2Database()) { + assertEquals("com.ibm.db2.jcc.DB2Driver", database.getDefaultDriver("jdbc:db2://localhost:50000/liquibas")); - assertNull(database.getDefaultDriver("jdbc:oracle://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:oracle://localhost;databaseName=liquibase")); + } catch (final DatabaseException e) { + throw e; + } } - } diff --git a/liquibase-core/src/test/java/liquibase/database/core/DB2zDatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/core/DB2zDatabaseTest.java index 95750b66846..9b3533f538d 100644 --- a/liquibase-core/src/test/java/liquibase/database/core/DB2zDatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/core/DB2zDatabaseTest.java @@ -2,15 +2,18 @@ import junit.framework.TestCase; import liquibase.database.Database; +import liquibase.exception.DatabaseException; public class DB2zDatabaseTest extends TestCase { - public void testGetDefaultDriver() { - Database database = new Db2zDatabase(); - assertEquals("com.ibm.db2.jcc.DB2Driver", database.getDefaultDriver("jdbc:db2://localhost:50000/liquibas")); + public void testGetDefaultDriver() throws DatabaseException { + try (Database database = new Db2zDatabase()) { + assertEquals("com.ibm.db2.jcc.DB2Driver", database.getDefaultDriver("jdbc:db2://localhost:50000/liquibas")); - assertNull(database.getDefaultDriver("jdbc:oracle://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:oracle://localhost;databaseName=liquibase")); + } catch (final DatabaseException e) { + throw e; + } } - } diff --git a/liquibase-core/src/test/java/liquibase/database/core/DerbyDatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/core/DerbyDatabaseTest.java index 5b2032eec16..68eb67178d5 100644 --- a/liquibase-core/src/test/java/liquibase/database/core/DerbyDatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/core/DerbyDatabaseTest.java @@ -1,7 +1,7 @@ package liquibase.database.core; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.RETURNS_SMART_NULLS; -import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -19,12 +19,15 @@ import liquibase.exception.DatabaseException; public class DerbyDatabaseTest extends TestCase { - public void testGetDefaultDriver() { - Database database = new DerbyDatabase(); - assertEquals("org.apache.derby.jdbc.EmbeddedDriver", database.getDefaultDriver("java:derby:liquibase;create=true")); + public void testGetDefaultDriver() throws DatabaseException { + try (Database database = new DerbyDatabase()) { + assertEquals("org.apache.derby.jdbc.EmbeddedDriver", database.getDefaultDriver("java:derby:liquibase;create=true")); - assertNull(database.getDefaultDriver("jdbc:oracle://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:oracle://localhost;databaseName=liquibase")); + } catch (final DatabaseException e) { + throw e; + } } public void testGetDateLiteral() { diff --git a/liquibase-core/src/test/java/liquibase/database/core/MSSQLDatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/core/MSSQLDatabaseTest.java index fd965be4d15..fffb58f4121 100644 --- a/liquibase-core/src/test/java/liquibase/database/core/MSSQLDatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/core/MSSQLDatabaseTest.java @@ -1,10 +1,15 @@ package liquibase.database.core; -import liquibase.database.*; -import liquibase.test.JUnitResourceAccessor; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; -import static org.junit.Assert.*; +import org.junit.Test; +import liquibase.database.AbstractJdbcDatabaseTest; +import liquibase.database.Database; +import liquibase.database.DatabaseFactory; +import liquibase.exception.DatabaseException; /** * Tests for {@link MSSQLDatabase} @@ -20,7 +25,6 @@ protected String getProductNameString() { return "Microsoft SQL Server"; } - @Override @Test public void supportsInitiallyDeferrableColumns() { @@ -34,31 +38,38 @@ public void getCurrentDateTimeFunction() { } @Test - public void getDefaultDriver() { - Database database = new MSSQLDatabase(); - - assertEquals("com.microsoft.sqlserver.jdbc.SQLServerDriver", database.getDefaultDriver("jdbc:sqlserver://localhost;databaseName=liquibase")); - - assertNull(database.getDefaultDriver("jdbc:oracle:thin://localhost;databaseName=liquibase")); + public void getDefaultDriver() throws DatabaseException { + try (Database database = new MSSQLDatabase()) { + assertEquals("com.microsoft.sqlserver.jdbc.SQLServerDriver", database.getDefaultDriver("jdbc:sqlserver://localhost;databaseName=liquibase")); + + assertNull(database.getDefaultDriver("jdbc:oracle:thin://localhost;databaseName=liquibase")); + } catch (final DatabaseException e) { + throw e; + } } @Override @Test - public void escapeTableName_noSchema() { - Database database = new MSSQLDatabase(); - assertEquals("tableName", database.escapeTableName(null, null, "tableName")); - assertEquals("[tableName€]", database.escapeTableName(null, null, "tableName€")); + public void escapeTableName_noSchema() throws DatabaseException { + try (Database database = new MSSQLDatabase()) { + assertEquals("tableName", database.escapeTableName(null, null, "tableName")); + assertEquals("[tableName€]", database.escapeTableName(null, null, "tableName€")); + } catch (final DatabaseException e) { + throw e; + } } @Override @Test - public void escapeTableName_withSchema() { - Database database = new MSSQLDatabase(); - assertEquals("catalogName.schemaName.tableName", database.escapeTableName("catalogName", "schemaName", - "tableName")); - assertEquals("[catalogName€].[schemaName€].[tableName€]", database.escapeTableName("catalogName€", - "schemaName€", "tableName€")); + public void escapeTableName_withSchema() throws DatabaseException { + try (Database database = new MSSQLDatabase()) { + assertEquals("catalogName.schemaName.tableName", database.escapeTableName("catalogName", "schemaName", "tableName")); + assertEquals("[catalogName€].[schemaName€].[tableName€]", database.escapeTableName("catalogName€", "schemaName€", "tableName€")); + } catch (final DatabaseException e) { + throw e; + } } + private Database createOfflineDatabase(String url) throws Exception { return DatabaseFactory.getInstance().openDatabase(url, null, null, null, null); } @@ -68,15 +79,15 @@ public void setDefaultSchemaName() throws Exception { // // No exception should be thrown by call to setDefaultSchemaName // - Database database = createOfflineDatabase("offline:mssql"); + final Database database = createOfflineDatabase("offline:mssql"); database.setDefaultSchemaName("MySchema"); } @Test public void isUnmodifiable() throws Exception { - Database database = createOfflineDatabase("offline:mssql"); + final Database database = createOfflineDatabase("offline:mssql"); assertTrue(database instanceof MSSQLDatabase); - MSSQLDatabase mssqlDatabase = (MSSQLDatabase)database; + final MSSQLDatabase mssqlDatabase = (MSSQLDatabase) database; assertTrue(mssqlDatabase.dataTypeIsNotModifiable("datetime")); } diff --git a/liquibase-core/src/test/java/liquibase/database/core/MySQLDatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/core/MySQLDatabaseTest.java index dc0f0c411d4..6b0aa06595a 100644 --- a/liquibase-core/src/test/java/liquibase/database/core/MySQLDatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/core/MySQLDatabaseTest.java @@ -1,13 +1,15 @@ package liquibase.database.core; -import liquibase.database.AbstractJdbcDatabase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; + +import org.junit.Assert; +import org.junit.Test; import liquibase.database.AbstractJdbcDatabaseTest; import liquibase.database.Database; +import liquibase.exception.DatabaseException; import liquibase.statement.DatabaseFunction; -import org.junit.Assert; -import org.junit.Test; - -import static org.junit.Assert.*; /** * Tests for {@link MySQLDatabase} @@ -20,7 +22,7 @@ public MySQLDatabaseTest() throws Exception { @Override protected String getProductNameString() { - return "MySQL"; + return "MySQL"; } @Override @@ -29,8 +31,6 @@ public void supportsInitiallyDeferrableColumns() { assertFalse(getDatabase().supportsInitiallyDeferrableColumns()); } - - @Override @Test public void getCurrentDateTimeFunction() { @@ -39,7 +39,7 @@ public void getCurrentDateTimeFunction() { @Test public void getCurrentDateTimeFunctionWithPrecision() { - MySQLDatabase mySQLDatabase = (MySQLDatabase) getDatabase(); + final MySQLDatabase mySQLDatabase = (MySQLDatabase) getDatabase(); Assert.assertEquals("NOW(1)", mySQLDatabase.getCurrentDateTimeFunction(1)); Assert.assertEquals("NOW(2)", mySQLDatabase.getCurrentDateTimeFunction(2)); Assert.assertEquals("NOW(5)", mySQLDatabase.getCurrentDateTimeFunction(5)); @@ -47,43 +47,45 @@ public void getCurrentDateTimeFunctionWithPrecision() { @Test public void generateDatabaseFunctionValue() { - MySQLDatabase mySQLDatabase = (MySQLDatabase) getDatabase(); + final MySQLDatabase mySQLDatabase = (MySQLDatabase) getDatabase(); assertEquals("NOW()", mySQLDatabase.generateDatabaseFunctionValue(new DatabaseFunction("CURRENT_TIMESTAMP()"))); assertNull(mySQLDatabase.generateDatabaseFunctionValue(new DatabaseFunction(null))); } @Test public void generateDatabaseFunctionValueWithPrecision() { - MySQLDatabase mySQLDatabase = (MySQLDatabase) getDatabase(); + final MySQLDatabase mySQLDatabase = (MySQLDatabase) getDatabase(); assertEquals("NOW(2)", mySQLDatabase.generateDatabaseFunctionValue(new DatabaseFunction("CURRENT_TIMESTAMP(2)"))); assertEquals("NOW(3)", mySQLDatabase.generateDatabaseFunctionValue(new DatabaseFunction("CURRENT_TIMESTAMP(3)"))); } @Test public void generateDatabaseFunctionValueWithIncorrectPrecision() { - MySQLDatabase mySQLDatabase = (MySQLDatabase) getDatabase(); + final MySQLDatabase mySQLDatabase = (MySQLDatabase) getDatabase(); assertEquals("NOW()", mySQLDatabase.generateDatabaseFunctionValue(new DatabaseFunction("CURRENT_TIMESTAMP(string)"))); } - public void testGetDefaultDriver() { - Database database = new MySQLDatabase(); - - assertEquals("com.mysql.cj.jdbc.Driver", database.getDefaultDriver("jdbc:mysql://localhost/liquibase")); + public void testGetDefaultDriver() throws DatabaseException { + try (Database database = new MySQLDatabase()) { + assertEquals("com.mysql.cj.jdbc.Driver", database.getDefaultDriver("jdbc:mysql://localhost/liquibase")); - assertNull(database.getDefaultDriver("jdbc:db2://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:db2://localhost;databaseName=liquibase")); + } catch (final DatabaseException e) { + throw e; + } } @Override @Test public void escapeTableName_noSchema() { - Database database = getDatabase(); + final Database database = getDatabase(); assertEquals("tableName", database.escapeTableName(null, null, "tableName")); } @Override @Test public void escapeTableName_withSchema() { - Database database = getDatabase(); + final Database database = getDatabase(); assertEquals("catalogName.tableName", database.escapeTableName("catalogName", "schemaName", "tableName")); } diff --git a/liquibase-core/src/test/java/liquibase/database/core/OracleDatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/core/OracleDatabaseTest.java index f75d10efb5d..a86dff84874 100644 --- a/liquibase-core/src/test/java/liquibase/database/core/OracleDatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/core/OracleDatabaseTest.java @@ -1,5 +1,17 @@ package liquibase.database.core; +import static java.util.ResourceBundle.getBundle; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.ResourceBundle; + +import org.hamcrest.CoreMatchers; +import org.junit.Assert; +import org.junit.Test; import liquibase.Scope; import liquibase.database.AbstractJdbcDatabaseTest; import liquibase.database.Database; @@ -7,6 +19,7 @@ import liquibase.database.OfflineConnection; import liquibase.datatype.DatabaseDataType; import liquibase.datatype.core.TimestampType; +import liquibase.exception.DatabaseException; import liquibase.exception.LiquibaseException; import liquibase.executor.ExecutorService; import liquibase.resource.ResourceAccessor; @@ -16,18 +29,6 @@ import liquibase.statement.SqlStatement; import liquibase.statement.core.UpdateStatement; import liquibase.test.JUnitResourceAccessor; -import org.hamcrest.CoreMatchers; -import org.junit.Assert; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.ResourceBundle; - -import static java.util.ResourceBundle.getBundle; -import static org.junit.Assert.*; - -import org.hamcrest.CoreMatchers; -import org.junit.Test; /** * Tests for {@link liquibase.database.core.OracleDatabase}. @@ -48,72 +49,67 @@ protected String getProductNameString() { @Override @Test public void escapeTableName_noSchema() { - Database database = getDatabase(); - assertEquals("table name without schema is correctly escaped as simply tableName", - "tableName", database.escapeTableName(null, null, "tableName")); + final Database database = getDatabase(); + assertEquals("table name without schema is correctly escaped as simply tableName", "tableName", database.escapeTableName(null, null, "tableName")); } @Test public void saveNlsEnvironment() throws Exception { - Database database = getDatabase(); - ResourceAccessor junitResourceAccessor = new JUnitResourceAccessor(); - OfflineConnection offlineConnection = new OfflineConnection("offline:oracle", junitResourceAccessor); + final Database database = getDatabase(); + final ResourceAccessor junitResourceAccessor = new JUnitResourceAccessor(); + final OfflineConnection offlineConnection = new OfflineConnection("offline:oracle", junitResourceAccessor); database.setConnection(offlineConnection); } @Override @Test public void escapeTableName_withSchema() { - Database database = getDatabase(); - assertEquals("table name without schema but with catalog is correctly escaped as catalogName.tableName", - "catalogName.tableName", database.escapeTableName("catalogName", "schemaName", "tableName")); + final Database database = getDatabase(); + assertEquals("table name without schema but with catalog is correctly escaped as catalogName.tableName", "catalogName.tableName", database.escapeTableName("catalogName", "schemaName", "tableName")); } @Override @Test public void supportsInitiallyDeferrableColumns() { - assertTrue("Oracle Database is correctly reported as being able to do INITIALLY DEFERRED column constraints.", - getDatabase().supportsInitiallyDeferrableColumns()); + assertTrue("Oracle Database is correctly reported as being able to do INITIALLY DEFERRED column constraints.", getDatabase().supportsInitiallyDeferrableColumns()); } - @Override @Test public void getCurrentDateTimeFunction() { - Assert.assertEquals("Oracle Database's 'give me the current timestamp' function is correctly reported.", - "SYSTIMESTAMP", getDatabase().getCurrentDateTimeFunction()); + Assert.assertEquals("Oracle Database's 'give me the current timestamp' function is correctly reported.", "SYSTIMESTAMP", getDatabase().getCurrentDateTimeFunction()); } @Test public void verifyTimestampDataTypeWhenWithoutClauseIsPresent() { - TimestampType ts = new TimestampType(); + final TimestampType ts = new TimestampType(); ts.setAdditionalInformation("WITHOUT TIME ZONE"); - DatabaseDataType oracleDataType = ts.toDatabaseDataType(getDatabase()); + final DatabaseDataType oracleDataType = ts.toDatabaseDataType(getDatabase()); assertThat(oracleDataType.getType(), CoreMatchers.is("TIMESTAMP")); } - public void testGetDefaultDriver() { - Database database = new OracleDatabase(); - - assertEquals("The correct JDBC driver class name is reported if the URL is a Oracle JDBC URL", - "oracle.jdbc.OracleDriver", database.getDefaultDriver("jdbc:oracle:thin:@localhost/XE")); + public void testGetDefaultDriver() throws DatabaseException { + try (Database database = new OracleDatabase()) { + assertEquals("The correct JDBC driver class name is reported if the URL is a Oracle JDBC URL", "oracle.jdbc.OracleDriver", database.getDefaultDriver("jdbc:oracle:thin:@localhost/XE")); - assertNull("No JDBC driver class is returned if the URL is NOT an Oracle Database JDBC URL.", - database.getDefaultDriver("jdbc:db2://localhost;databaseName=liquibase")); + assertNull("No JDBC driver class is returned if the URL is NOT an Oracle Database JDBC URL.", database.getDefaultDriver("jdbc:db2://localhost;databaseName=liquibase")); + } catch (final DatabaseException e) { + throw e; + } } @Test public void validateCore2953WrongSqlOnValueSequenceNext() throws LiquibaseException { - Database database = getDatabase(); + final Database database = getDatabase(); database.setObjectQuotingStrategy(ObjectQuotingStrategy.QUOTE_ALL_OBJECTS); database.setDefaultSchemaName("sampleschema"); - MockExecutor mockExecutor = new MockExecutor(); + final MockExecutor mockExecutor = new MockExecutor(); mockExecutor.setDatabase(database); Scope.getCurrentScope().getSingleton(ExecutorService.class).setExecutor("jdbc", database, mockExecutor); - UpdateStatement updateStatement = new UpdateStatement(null, null, "test_table"); + final UpdateStatement updateStatement = new UpdateStatement(null, null, "test_table"); updateStatement.addNewColumnValue("id", new SequenceNextValueFunction("test_table_id_seq")); database.execute(new SqlStatement[]{updateStatement}, new ArrayList()); diff --git a/liquibase-core/src/test/java/liquibase/database/core/PostgresDatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/core/PostgresDatabaseTest.java index 87bf907ddc8..7ed5ed54439 100644 --- a/liquibase-core/src/test/java/liquibase/database/core/PostgresDatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/core/PostgresDatabaseTest.java @@ -1,16 +1,19 @@ package liquibase.database.core; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Assert; +import org.junit.Test; import liquibase.GlobalConfiguration; import liquibase.changelog.column.LiquibaseColumn; import liquibase.database.AbstractJdbcDatabaseTest; import liquibase.database.Database; import liquibase.database.ObjectQuotingStrategy; +import liquibase.exception.DatabaseException; import liquibase.structure.core.Table; import liquibase.util.StringUtil; -import org.junit.Assert; -import org.junit.Test; - -import static org.junit.Assert.*; /** * Tests for {@link PostgresDatabase} @@ -49,12 +52,14 @@ public void testCheckDatabaseChangeLogTable() throws Exception { ; //TODO: test has troubles, fix later } - public void testGetDefaultDriver() { - Database database = new PostgresDatabase(); - - assertEquals("org.postgresql.Driver", database.getDefaultDriver("jdbc:postgresql://localhost/liquibase")); + public void testGetDefaultDriver() throws DatabaseException { + try (Database database = new PostgresDatabase()) { + assertEquals("org.postgresql.Driver", database.getDefaultDriver("jdbc:postgresql://localhost/liquibase")); - assertNull(database.getDefaultDriver("jdbc:db2://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:db2://localhost;databaseName=liquibase")); + } catch (final DatabaseException e) { + throw e; + } } diff --git a/liquibase-core/src/test/java/liquibase/database/core/UnsupportedDatabaseTest.java b/liquibase-core/src/test/java/liquibase/database/core/UnsupportedDatabaseTest.java index a1c23c9e4f3..eb0bb10ae39 100644 --- a/liquibase-core/src/test/java/liquibase/database/core/UnsupportedDatabaseTest.java +++ b/liquibase-core/src/test/java/liquibase/database/core/UnsupportedDatabaseTest.java @@ -2,17 +2,21 @@ import junit.framework.TestCase; import liquibase.database.Database; +import liquibase.exception.DatabaseException; public class UnsupportedDatabaseTest extends TestCase { - public void testGetDefaultDriver() { - Database database = new UnsupportedDatabase(); - assertNull(database.getDefaultDriver("jdbc:oracle://localhost;databaseName=liquibase")); - assertNull(database.getDefaultDriver("jdbc:db2://localhost;databaseName=liquibase")); - assertNull(database.getDefaultDriver("jdbc:hsqldb://localhost;databaseName=liquibase")); - assertNull(database.getDefaultDriver("jdbc:derby://localhost;databaseName=liquibase")); - assertNull(database.getDefaultDriver("jdbc:sqlserver://localhost;databaseName=liquibase")); - assertNull(database.getDefaultDriver("jdbc:postgresql://localhost;databaseName=liquibase")); + public void testGetDefaultDriver() throws DatabaseException { + try (Database database = new UnsupportedDatabase()) { + assertNull(database.getDefaultDriver("jdbc:oracle://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:db2://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:hsqldb://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:derby://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:sqlserver://localhost;databaseName=liquibase")); + assertNull(database.getDefaultDriver("jdbc:postgresql://localhost;databaseName=liquibase")); + } catch (final DatabaseException e) { + throw e; + } } }