package org.jbpm.persistence.scripts;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import org.jbpm.persistence.scripts.util.TestsUtil;
import org.junit.Assert;
import org.junit.Test;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.internal.runtime.StatefulKnowledgeSession;
/**
* Contains tests that test database upgrade scripts.
*/
public class UpgradeScriptsTest {
private static final String TEST_PROCESS_ID = "minimalProcess";
private static final Long TEST_PROCESS_INSTANCE_ID = 1L;
private static final Integer TEST_SESSION_ID = 1;
private static final String DB_UPGRADE_SCRIPTS_RESOURCE_PATH = "/db/upgrade-scripts";
/**
* Tests that DB schema is upgraded properly using database upgrade scripts.
* @throws IOException
*/
@Test
public void testExecutingScripts() throws IOException, SQLException {
testExecutingScripts("jbpm");
testExecutingScripts("bpms");
}
public void testExecutingScripts(String type) throws IOException, SQLException {
// Clear schema.
TestsUtil.clearSchema();
final TestPersistenceContext scriptRunnerContext = new TestPersistenceContext();
scriptRunnerContext.init(PersistenceUnit.SCRIPT_RUNNER);
try {
// Prepare 6.0. schema
scriptRunnerContext.executeScripts(new File(getClass().getResource("/ddl60").getFile()));
// Execute upgrade scripts.
scriptRunnerContext.executeScripts(new File(getClass().getResource(DB_UPGRADE_SCRIPTS_RESOURCE_PATH).getFile()), type);
} finally {
scriptRunnerContext.clean();
}
final TestPersistenceContext dbTestingContext = new TestPersistenceContext();
dbTestingContext.init(PersistenceUnit.DB_TESTING_VALIDATE);
try {
dbTestingContext.startAndPersistSomeProcess(TEST_PROCESS_ID);
Assert.assertTrue(dbTestingContext.getStoredProcessesCount() == 1);
} finally {
dbTestingContext.clean();
}
}
/**
* Tests that persisted process is not destroyed by upgrade scripts.
* @throws IOException
* @throws ParseException
* @throws SQLException
*/
@Test
public void testPersistedProcess() throws IOException, ParseException, SQLException {
testPersistedProcess("jbpm");
testPersistedProcess("bpms");
}
public void testPersistedProcess(String type) throws IOException, ParseException, SQLException {
// Clear schema.
TestsUtil.clearSchema();
// Prepare + upgrade schema.
final TestPersistenceContext scriptRunnerContext = new TestPersistenceContext();
scriptRunnerContext.init(PersistenceUnit.SCRIPT_RUNNER);
try {
// Prepare 6.0. schema
scriptRunnerContext.executeScripts(new File(getClass().getResource("/ddl60").getFile()));
scriptRunnerContext.persistOldProcessAndSession(TEST_SESSION_ID, TEST_PROCESS_ID, TEST_PROCESS_INSTANCE_ID);
scriptRunnerContext.createSomeTask();
// Execute upgrade scripts.
scriptRunnerContext.executeScripts(new File(getClass().getResource(DB_UPGRADE_SCRIPTS_RESOURCE_PATH).getFile()), type);
} finally {
scriptRunnerContext.clean();
}
final TestPersistenceContext dbTestingContext = new TestPersistenceContext();
dbTestingContext.init(PersistenceUnit.DB_TESTING_VALIDATE);
try {
Assert.assertTrue(dbTestingContext.getStoredProcessesCount() == 1);
Assert.assertTrue(dbTestingContext.getStoredSessionsCount() == 1);
final StatefulKnowledgeSession persistedSession = dbTestingContext.loadPersistedSession(
TEST_SESSION_ID.longValue(), TEST_PROCESS_ID);
Assert.assertNotNull(persistedSession);
// Start another process.
persistedSession.startProcess(TEST_PROCESS_ID);
Assert.assertTrue(dbTestingContext.getStoredProcessesCount() == 2);
// Load old process instance.
ProcessInstance processInstance = persistedSession.getProcessInstance(TEST_PROCESS_INSTANCE_ID);
Assert.assertNotNull(processInstance);
persistedSession.signalEvent("test", null);
processInstance = persistedSession.getProcessInstance(TEST_PROCESS_INSTANCE_ID);
Assert.assertNull(processInstance);
Assert.assertTrue(dbTestingContext.getStoredProcessesCount() == 0);
persistedSession.dispose();
persistedSession.destroy();
Assert.assertTrue(dbTestingContext.getStoredSessionsCount() == 0);
} finally {
dbTestingContext.clean();
}
}
}