/*
* Copyright 2004 The Apache Software Foundation.
*
* Licensed 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.agila.impl.dao;
import org.apache.agila.util.JDBCUtil;
import org.apache.agila.util.XMLUtil;
import org.apache.agila.engine.Instance;
import org.apache.agila.engine.InstanceID;
import org.apache.agila.engine.Token;
import org.apache.agila.engine.TokenID;
import org.apache.agila.impl.TokenImpl;
import org.apache.agila.impl.dao.AgilaDAO;
import org.apache.agila.model.BusinessProcess;
import org.apache.agila.model.BusinessProcessID;
import org.apache.agila.model.NodeID;
import org.apache.agila.services.InstanceServiceInfo;
import org.apache.agila.services.task.Task;
import org.apache.agila.services.task.TaskID;
import org.apache.agila.services.task.TaskImpl;
import org.apache.agila.services.user.GroupID;
import org.apache.agila.services.user.UserID;
import org.apache.agila.services.user.UserInfo;
import org.apache.agila.services.user.GroupID;
import junit.framework.TestCase;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public abstract class DAOTestCaseSupport extends TestCase {
protected AgilaDAO dao;
public void testAddGraph() {
BufferedReader reader = new BufferedReader( new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(
"org/apache/agila/LeaveApplication.xml" ) ) );
BusinessProcess businessProcess = XMLUtil.deserializeXML( reader );
BusinessProcessID businessProcessID = dao.addGraph(
businessProcess );
assertNotNull( "BusinessProcessID should not be null",
businessProcessID );
}
public void testGetGraphIDByName() {
// Cleanup DB before testing so that we don't have any conflicting
// results
cleanUpBusinessProcess();
BufferedReader reader = new BufferedReader( new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(
"org/apache/agila/LeaveApplication.xml" ) ) );
BusinessProcess businessProcess = XMLUtil.deserializeXML( reader );
BusinessProcessID businessProcessID = dao.addGraph(
businessProcess );
assertEquals( businessProcessID, dao.getGraphIDByName(
businessProcess.getName() ) );
}
public void testGetGraphByID() {
BufferedReader reader = new BufferedReader( new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(
"org/apache/agila/LeaveApplication.xml" ) ) );
BusinessProcess businessProcess = XMLUtil.deserializeXML( reader );
BusinessProcessID businessProcessID = dao.addGraph(
businessProcess );
BusinessProcess bpFromQuery = dao.getGraphByID( businessProcessID );
assertEquals( businessProcessID, bpFromQuery.getBusinessProcessID() );
assertEquals( businessProcess.getName(), bpFromQuery.getName() );
assertEquals( businessProcess.getGraphAsXML(), bpFromQuery.getGraphAsXML() );
}
public void testGetAllProcessGraphs() {
// Populate the bpm_businessprocess table just in case it is empty
for( int i = 0; i < 10; i++ ) {
BufferedReader reader = new BufferedReader( new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(
"org/apache/agila/LeaveApplication.xml" ) ) );
BusinessProcess businessProcess = XMLUtil.deserializeXML( reader );
BusinessProcessID businessProcessID = dao.addGraph(
businessProcess );
}
List graphs = dao.getAllProcessGraphs();
assertTrue( graphs.size() >= 10 );
}
public void testNewInstance() {
BufferedReader reader = new BufferedReader( new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(
"org/apache/agila/LeaveApplication.xml" ) ) );
BusinessProcess businessProcess = XMLUtil.deserializeXML( reader );
BusinessProcessID businessProcessID = dao.addGraph(
businessProcess );
Map appParams = new HashMap();
appParams.put( "numdays", "40" );
appParams.put( "reason", "Expedition to Mount Everest" );
Instance instance = dao.newInstance( businessProcessID, appParams );
assertNotNull( "Instance should not be null", instance );
}
public void testGetInstanceServiceInfo() {
InstanceServiceInfo instanceServiceInfo = dao.getInstanceServiceInfo();
assertNotNull( "InstanceServiceInfo should not be null", instanceServiceInfo );
}
public void testSaveInstance() {
BufferedReader reader = new BufferedReader( new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(
"org/apache/agila/LeaveApplication.xml" ) ) );
BusinessProcess businessProcess = XMLUtil.deserializeXML( reader );
BusinessProcessID businessProcessID = dao.addGraph(
businessProcess );
Map appParams = new HashMap();
appParams.put( "numdays", "40" );
appParams.put( "reason", "Expedition to Mount Everest" );
Instance instance = dao.newInstance( businessProcessID, appParams );
instance.setStatus( Instance.STATUS_SUSPENDED );
dao.saveInstance( instance );
Instance retrievedInstance = dao.getInstanceByID( instance.getInstanceID() );
assertEquals( instance.getInstanceID(), retrievedInstance.getInstanceID() );
assertEquals( instance.getBusinessProcessID(), retrievedInstance.getBusinessProcessID() );
assertEquals( instance.getGraphName(), retrievedInstance.getGraphName() );
assertEquals( Instance.STATUS_SUSPENDED, retrievedInstance.getStatus() );
assertEquals( instance.getStartDate(), retrievedInstance.getStartDate() );
assertEquals( instance.getLastStepDate(), retrievedInstance.getLastStepDate() );
}
public void testListInstanceInfo() {
List instances = dao.listInstanceInfo();
assertNotNull( "instances should not be null", instances );
}
public void testInsertTask() {
TaskImpl task = new TaskImpl();
task.setUserID( new UserID( 1 ) );
task.setTaskDescription( "Task Description" );
task.setTaskExpirationDate( new Date() );
task.setSourceTokenID( new TokenID( 1 ) );
task.setTaskStatus( Task.TASK_INCOMPLETE );
task.setInstanceID( new InstanceID( 1 ) );
TaskID taskID = dao.insertTask( task );
assertNotNull( "TaskID should not be null", taskID );
}
public void testUpdateTask() {
TaskImpl task = new TaskImpl();
task.setTaskID( new TaskID( 1 ) );
task.setUserID( new UserID( 1 ) );
task.setTaskDescription( "Task Description" );
task.setTaskExpirationDate( new Date() );
task.setSourceTokenID( new TokenID( 1 ) );
task.setTaskStatus( Task.TASK_INCOMPLETE );
task.setInstanceID( new InstanceID( 1 ) );
TaskID taskID = dao.insertTask( task );
task.setTaskID( taskID );
task.setUserID( new UserID( 2 ) );
task.setTaskDescription( "Task Description 2" );
task.setSourceTokenID( new TokenID( 2 ) );
task.setTaskStatus( Task.TASK_COMPLETE );
task.setInstanceID( new InstanceID( 2 ) );
taskID = dao.updateTask( task );
assertNotNull( "TaskID should not be null", taskID );
// TODO check for the rest of the fields
}
public void testGetTaskByID() {
TaskImpl task = new TaskImpl();
task.setUserID( new UserID( 1 ) );
task.setTaskDescription( "Task Description" );
task.setTaskExpirationDate( new Date() );
task.setSourceTokenID( new TokenID( 1 ) );
task.setTaskStatus( Task.TASK_INCOMPLETE );
task.setInstanceID( new InstanceID( 1 ) );
TaskID taskID = dao.insertTask( task );
task.setTaskID( taskID );
Task retrievedTask = dao.getTaskByID( taskID );
assertEquals( task.getTaskID(), retrievedTask.getTaskID() );
assertEquals( task.getTaskDescription(), retrievedTask.getTaskDescription() );
assertEquals( task.getSourceTokenID(), retrievedTask.getSourceTokenID() );
assertEquals( task.getTaskStatus(), retrievedTask.getTaskStatus() );
assertEquals( task.getInstanceID(), retrievedTask.getInstanceID() );
}
public void testGetTasksForUser() {
List tasks = dao.getTasksForUser( new UserID( 1 ), Task.TASK_INCOMPLETE );
assertNotNull( "Tasks should not be null", tasks );
assertTrue( tasks.size() > 0 );
}
public void testGetTasksForTeams() {
GroupID groupID = new GroupID( 1 );
TaskImpl task = new TaskImpl();
task.setTeamID( groupID );
task.setTaskDescription( "Task Description" );
task.setTaskExpirationDate( new Date() );
task.setSourceTokenID( new TokenID( 1 ) );
task.setTaskStatus( Task.TASK_INCOMPLETE );
task.setInstanceID( new InstanceID( 1 ) );
dao.insertTask( task );
List tasks = dao.getTasksForGroups(new GroupID[] { groupID, new GroupID( 2 )}, Task.TASK_INCOMPLETE );
assertNotNull( "Tasks should not be null", tasks );
assertTrue("No tasks found for team!", tasks.size() > 0);
}
public void testLockAndThenUnlockTask() {
GroupID groupID = new GroupID( 1 );
TaskImpl task = new TaskImpl();
task.setTeamID( groupID );
task.setTaskDescription( "Task Description" );
task.setTaskExpirationDate( new Date() );
task.setSourceTokenID( new TokenID( 1 ) );
task.setTaskStatus( Task.TASK_INCOMPLETE );
task.setInstanceID( new InstanceID( 1 ) );
TaskID taskID = dao.insertTask( task );
boolean answer = dao.lockTaskForUser(taskID, new UserID(1));
assertTrue("Managed to lock task", answer);
answer = dao.lockTaskForUser(taskID, new UserID(2));
assertTrue("Should not be able to lock task", !answer);
dao.unlockTaskForUser(taskID, new UserID(1));
answer = dao.lockTaskForUser(taskID, new UserID(2));
assertTrue("Managed to lock task", answer);
}
public void testNewToken() {
Token token = dao.newToken(new InstanceID(1), new NodeID(1), Token.PRE);
assertNotNull( "Token should not be null", token );
}
public void testGetTokenByID() {
Token token = dao.newToken(new InstanceID(1), new NodeID(1), Token.PRE);
Token retrievedToken = dao.getTokenByID(token.getTokenID());
assertNotNull("Token should not be null", token);
assertEquals( token.getInstanceID(), retrievedToken.getInstanceID() );
assertEquals( token.getCurrentNodeID(), retrievedToken.getCurrentNodeID() );
assertEquals( token.getCurrentState(), retrievedToken.getCurrentState() );
assertEquals( token.isActive(), retrievedToken.isActive() );
assertEquals( token.getTokenID(), retrievedToken.getTokenID() );
}
public void testSaveToken() {
TokenImpl token = (TokenImpl)dao.newToken( new InstanceID( 1 ),
new NodeID(1), Token.PRE );
token.setInstanceID( new InstanceID(2));
token.setCurrentNodeID(new NodeID(2));
token.setCurrentState(Token.MID);
token.setActive(false);
boolean result = dao.saveToken( token );
assertTrue( "Save token did not succeed", result );
// TODO could have more assertions here
}
public void testGetActiveTokensForInstance() {
cleanUpTokens();
for( int i = 0; i < 10; i++ ) {
dao.newToken( new InstanceID( 1 ), new NodeID(2), Token.PRE );
}
List activeTokens = dao.getActiveTokensForInstance( new InstanceID( 1 ) );
assertNotNull( "activeTokens should not be null", activeTokens );
assertEquals( "Active tokens should be equal to 10", 10, activeTokens.size() );
}
public void testAddUser() {
UserInfo userInfo = new UserInfo();
userInfo.setUserName( "James" );
userInfo.setUserPassword( "Gosling" );
userInfo.setUserPrincipal( "User Principal" );
userInfo.setAdmin( true );
UserID userID = dao.addUser( userInfo );
assertNotNull( "UserID should not be null", userID );
}
public void testGetUserInfo() {
UserInfo userInfo = new UserInfo();
userInfo.setUserName( "James" );
userInfo.setUserPassword( "Gosling" );
userInfo.setUserPrincipal( "User Principal" );
userInfo.setAdmin( true );
UserID userID = dao.addUser( userInfo );
userInfo = dao.getUserInfo( userID );
assertNotNull( userInfo );
}
public void testGetUserFromPrincipal() {
UserInfo userInfo = new UserInfo();
userInfo.setUserName( "James" );
userInfo.setUserPassword( "Gosling" );
userInfo.setUserPrincipal( "User Principal" );
userInfo.setAdmin( true );
UserID userID = dao.addUser( userInfo );
UserInfo userFromPrincipal = dao.getUserFromPrincipal( "User Principal" );
assertNotNull( "UserInfo should not be null", userFromPrincipal );
}
public void testListAllUserInfo() {
for( int i = 0; i < 10; i++ ) {
UserInfo userInfo = new UserInfo();
userInfo.setUserName( "James" );
userInfo.setUserPassword( "Gosling" );
userInfo.setUserPrincipal( "User Principal" );
userInfo.setAdmin( true );
UserID userID = dao.addUser( userInfo );
}
List allUsers = dao.listAllUserInfo();
assertNotNull( "List of users should not be null", allUsers );
assertTrue( "List of users should be greater or equal to 10", allUsers.size() >= 10 );
}
public void testSaveUser() {
UserInfo userInfo = new UserInfo();
userInfo.setUserName( "James" );
userInfo.setUserPassword( "Gosling" );
userInfo.setUserPrincipal( "User Principal" );
userInfo.setAdmin( true );
UserID userID = dao.addUser( userInfo );
// Modify the user info then update db
userInfo.setUserID( userID );
userInfo.setUserPassword( "Arnold" );
userInfo.setUserPrincipal( "Scott McNealy" );
userInfo.setAdmin( false );
dao.saveUser( userInfo );
// Verify that the info are indeed saved in the db
userInfo = dao.getUserInfo( userInfo.getUserID() );
assertEquals( "Arnold", userInfo.getUserPassword() );
assertEquals( "Scott McNealy", userInfo.getUserPrincipal() );
assertEquals( false, userInfo.isAdmin() );
}
public void testInstanceStatusUpdate() {
BufferedReader reader = new BufferedReader( new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(
"org/apache/agila/LeaveApplication.xml" ) ) );
BusinessProcess businessProcess = XMLUtil.deserializeXML( reader );
BusinessProcessID businessProcessID = dao.addGraph(businessProcess );
Instance inst1 = dao.newInstance(businessProcessID, new HashMap());
Instance inst2 = dao.newInstance(businessProcessID, new HashMap());
assertEquals(Instance.STATUS_RUNNING, inst1.getStatus());
assertEquals(Instance.STATUS_RUNNING, inst2.getStatus());
inst1.setStatus(Instance.STATUS_STOPPED);
dao.saveInstance(inst1);
inst1 = dao.getInstanceByID(inst1.getInstanceID());
inst2 = dao.getInstanceByID(inst2.getInstanceID());
/*
* only one changes
*/
assertEquals(Instance.STATUS_STOPPED, inst1.getStatus());
assertEquals(Instance.STATUS_RUNNING, inst2.getStatus());
}
private void cleanUpBusinessProcess() {
try {
// Clear previous data
Connection connection = JDBCUtil.getInstance().getConnection();
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
String sql = "DELETE FROM bpm_businessprocess";
statement.executeUpdate( sql );
connection.commit();
statement.close();
} catch( SQLException e ) {
fail( e.getMessage() );
}
}
private void cleanUpTokens() {
try {
// Clear previous data
Connection connection = JDBCUtil.getInstance().getConnection();
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
String sql = "DELETE FROM bpm_token";
statement.executeUpdate( sql );
connection.commit();
statement.close();
} catch( SQLException e ) {
fail( e.getMessage() );
}
}
public void tearDown() throws Exception {
dao = null;
}
}