package liquibase.ext.ora.longupdate; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import liquibase.change.Change; import liquibase.change.ChangeFactory; import liquibase.change.ChangeMetaData; import liquibase.changelog.ChangeLogIterator; import liquibase.changelog.ChangeLogParameters; import liquibase.changelog.ChangeSet; import liquibase.changelog.DatabaseChangeLog; import liquibase.database.Database; import liquibase.database.core.OracleDatabase; import liquibase.exception.LiquibaseException; import liquibase.ext.ora.testing.BaseTestCase; import liquibase.parser.ChangeLogParserFactory; import liquibase.resource.ClassLoaderResourceAccessor; import liquibase.resource.ResourceAccessor; import liquibase.sql.Sql; import liquibase.sqlgenerator.SqlGeneratorFactory; import liquibase.statement.SqlStatement; import org.junit.Before; import org.junit.Test; public class LongUpdateTest extends BaseTestCase { @Before public void setUp() throws Exception { changeLogFile = "liquibase/ext/ora/longupdate/changelog.test.xml"; connectToDB(); cleanDB(); } @Test public void getChangeMetaData() { LongUpdateChange longUpdateChange = new LongUpdateChange(); assertEquals("longUpdate", ChangeFactory.getInstance().getChangeMetaData(longUpdateChange).getName()); assertEquals("Long Update", ChangeFactory.getInstance().getChangeMetaData(longUpdateChange).getDescription()); assertEquals(ChangeMetaData.PRIORITY_DEFAULT, ChangeFactory.getInstance().getChangeMetaData(longUpdateChange).getPriority()); } @Test public void getConfirmationMessage() { LongUpdateChange change = new LongUpdateChange(); assertEquals("Update has been done", change.getConfirmationMessage()); } @Test public void generateStatement() { LongUpdateChange change = new LongUpdateChange(); change.setCommitInterval(2); change.setSleepSeconds(2); change.setUpdateSql("UPDATE_SQL"); Database database = new OracleDatabase(); SqlStatement[] sqlStatements = change.generateStatements(database); assertEquals(1, sqlStatements.length); assertTrue(sqlStatements[0] instanceof LongUpdateStatement); assertEquals(Integer.valueOf(2), ((LongUpdateStatement) sqlStatements[0]).getCommitInterval()); assertEquals(Integer.valueOf(2), ((LongUpdateStatement) sqlStatements[0]).getSleepSeconds()); assertEquals("UPDATE_SQL", ((LongUpdateStatement) sqlStatements[0]).getUpdateSql()); } @Test public void parseAndGenerate() throws Exception { if (connection == null) { return; } Database database = liquiBase.getDatabase(); ResourceAccessor resourceAccessor = new ClassLoaderResourceAccessor(); ChangeLogParameters changeLogParameters = new ChangeLogParameters(); DatabaseChangeLog changeLog = ChangeLogParserFactory.getInstance().getParser(changeLogFile, resourceAccessor).parse(changeLogFile, changeLogParameters, resourceAccessor); changeLog.validate(database); List<ChangeSet> changeSets = changeLog.getChangeSets(); List<String> expectedQuery = new ArrayList<String>(); expectedQuery .add("declare commit_interval integer; sleep_seconds integer; c integer; begin commit_interval := 5; sleep_seconds := 1; c := 1; while c > 0 loop UPDATE LongUpdateTest SET name='checked' where name='test' and rownum <= 5; c := SQL%ROWCOUNT; COMMIT; dbms_lock.sleep(1); end loop; end;"); int i = 0; for (ChangeSet changeSet : changeSets) { for (Change change : changeSet.getChanges()) { Sql[] sql = SqlGeneratorFactory.getInstance().generateSql(change.generateStatements(database)[0], database); if (i == 2) { assertEquals(expectedQuery.get(0), sql[0].toSql()); } } i++; } } @Test public void test() throws Exception { if (connection == null) { return; } try { liquiBase.update((String) null); } catch (LiquibaseException e) { System.out.println("Error executing LongUpdateTest. If the error is: \"identifier 'DBMS_LOCK' must be declared\" you need to run 'GRANT exectue ON DBMS_LOCK to LBUSER' with SYS as SYSDBA"); throw e; } } }