package hk.hku.cecid.edi.sfrm.handler;
import hk.hku.cecid.edi.sfrm.dao.SFRMMessageDAO;
import hk.hku.cecid.edi.sfrm.dao.SFRMMessageDVO;
import hk.hku.cecid.edi.sfrm.dao.SFRMMessageSegmentDAO;
import hk.hku.cecid.edi.sfrm.dao.SFRMMessageSegmentDVO;
import hk.hku.cecid.edi.sfrm.pkg.SFRMConstant;
import hk.hku.cecid.edi.sfrm.spa.SFRMProcessor;
import hk.hku.cecid.piazza.commons.dao.ds.DataSourceDAO;
import hk.hku.cecid.piazza.commons.io.IOHandler;
import hk.hku.cecid.piazza.commons.test.PluginTest;
import hk.hku.cecid.piazza.commons.test.utils.ResSetter;
import hk.hku.cecid.edi.sfrm.handler.AcknowledgementHandler;
import java.io.FileReader;
import java.io.File;
public class AcknowledgementHandlerTest extends PluginTest<SFRMProcessor> {
private SFRMProcessor sfrmProcessor;
private AcknowledgementHandler ackHandler;
private String ackFilename = "ack.xml";
private ResSetter resSetter;
@Override
public String getDBName() {
return "dao";
}
@Override
public DataSourceDAO getDSDAO() throws Exception {
return (DataSourceDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
}
@Override
public void init() {
sfrmProcessor = (SFRMProcessor) processor;
isLoadDB = true;
ackHandler = sfrmProcessor.getAcknowledgementHandler();
resSetter = new ResSetter(this.getClass());
}
@Override
public void postSetUp() throws Exception{
resSetter.restore();
}
@Override
public void postTearDown() throws Exception{
resSetter.clean();
}
/**
* Test for dealing with the SD response from receiver
* @throws Exception
*/
public void testUpdateMessageSD() throws Exception{
File ackFile = new File(FIXTURE_LOADER.getResource(getName()).getFile(),ackFilename);
String ackContent = IOHandler.readString(new FileReader(ackFile));
ackHandler.processAcknowledgementResponse(ackContent);
SFRMMessageDAO dao = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO dvo = (SFRMMessageDVO) dao.createDVO();
dvo.setMessageId("testUpdateMessageSD");
dvo.setMessageBox(SFRMConstant.MSGBOX_OUT);
dao.retrieve(dvo);
assertEquals("Message status should changed to " + SFRMConstant.MSGS_SUSPENDED, SFRMConstant.MSGS_SUSPENDED, dvo.getStatus());
}
/**
* Test for dealing with the PS response from receiver
* @throws Exception
*/
public void testUpdateMessagePS() throws Exception{
File ackFile = new File(FIXTURE_LOADER.getResource(getName()).getFile(),ackFilename);
String ackContent = IOHandler.readString(new FileReader(ackFile));
ackHandler.processAcknowledgementResponse(ackContent);
SFRMMessageDAO dao = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO dvo = (SFRMMessageDVO) dao.createDVO();
dvo.setMessageId("testUpdateMessagePS");
dvo.setMessageBox(SFRMConstant.MSGBOX_OUT);
dao.retrieve(dvo);
assertEquals("Message status should changed to " + SFRMConstant.MSGS_PROCESSED, SFRMConstant.MSGS_PROCESSED, dvo.getStatus());
assertNotNull("Message completed timestamp should be set", dvo.getCompletedTimestamp());
}
/**
* Test for dealing with the DF response from receiver
* @throws Exception
*/
public void testUpdateMessageDF() throws Exception{
File ackFile = new File(FIXTURE_LOADER.getResource(getName()).getFile(),ackFilename);
String ackContent = IOHandler.readString(new FileReader(ackFile));
ackHandler.processAcknowledgementResponse(ackContent);
SFRMMessageDAO dao = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO dvo = (SFRMMessageDVO) dao.createDVO();
dvo.setMessageId("testUpdateMessageDF");
dvo.setMessageBox(SFRMConstant.MSGBOX_OUT);
dao.retrieve(dvo);
assertEquals("Message status should changed to " + SFRMConstant.MSGS_DELIVERY_FAILURE, SFRMConstant.MSGS_DELIVERY_FAILURE, dvo.getStatus());
}
/**
* Test if the segment was updated corrspending to the message segment acknowledgement response
* @throws Exception
*/
public void testUpdateMessageSegmentForPRMessage() throws Exception{
File ackFile = new File(FIXTURE_LOADER.getResource(getName()).getFile(),ackFilename);
String ackContent = IOHandler.readString(new FileReader(ackFile));
ackHandler.processAcknowledgementResponse(ackContent);
SFRMMessageDAO mDAO = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO mDVO = (SFRMMessageDVO) mDAO.createDVO();
mDVO.setMessageId("testUpdateMessageDF");
mDVO.setMessageBox(SFRMConstant.MSGBOX_OUT);
mDAO.retrieve(mDVO);
//Assert for the message status should not be changed
assertEquals("Message status should not be changed", SFRMConstant.MSGS_PROCESSING, mDVO.getStatus());
SFRMMessageSegmentDAO msDAO = (SFRMMessageSegmentDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageSegmentDAO.class);
SFRMMessageSegmentDVO msDVO = (SFRMMessageSegmentDVO) msDAO.createDVO();
msDVO.setMessageId("testUpdateMessageSegmentForPRMessage");
msDVO.setMessageBox(SFRMConstant.MSGBOX_OUT);
msDVO.setSegmentType(SFRMConstant.MSGT_PAYLOAD);
msDVO.setSegmentNo(1);
//segment processed case
msDAO.retrieve(msDVO);
assertEquals("segment 1 status should changed to " + SFRMConstant.MSGS_PROCESSED, SFRMConstant.MSGS_PROCESSED, msDVO.getStatus());
assertNotNull("segment 1 completed timestamp should be set", msDVO.getCompletedTimestamp());
//segment recovery case
msDVO.setSegmentNo(2);
msDAO.retrieve(msDVO);
assertEquals("segment 2 status should changed to " + SFRMConstant.MSGS_PENDING, SFRMConstant.MSGS_PENDING, msDVO.getStatus());
assertNull("segment 2 completed timestamp should not be set", msDVO.getCompletedTimestamp());
//case for segment status not changed
msDVO.setSegmentNo(3);
msDAO.retrieve(msDVO);
assertEquals("segment 3 status should not be changed and remain in " + SFRMConstant.MSGS_DELIVERED, SFRMConstant.MSGS_DELIVERED, msDVO.getStatus());
assertNull("segment 3 completed timestamp should not be set", msDVO.getCompletedTimestamp());
}
/**
* Test if the message status will change to pre-processed, accordingly to the acknowledgement response
* @throws Exception
*/
public void testMarkMessagePreCompleted() throws Exception{
File ackFile = new File(FIXTURE_LOADER.getResource(getName()).getFile(),ackFilename);
String ackContent = IOHandler.readString(new FileReader(ackFile));
ackHandler.processAcknowledgementResponse(ackContent);
SFRMMessageDAO mDAO = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO mDVO = (SFRMMessageDVO) mDAO.createDVO();
mDVO.setMessageId("testMarkMessagePreCompleted");
mDVO.setMessageBox(SFRMConstant.MSGBOX_OUT);
mDAO.retrieve(mDVO);
assertEquals("Message status should marked as " + SFRMConstant.MSGS_PRE_PROCESSED, SFRMConstant.MSGS_PRE_PROCESSED, mDVO.getStatus());
assertNull("Message completed timestamp should not be set", mDVO.getCompletedTimestamp());
SFRMMessageSegmentDAO msDAO = (SFRMMessageSegmentDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageSegmentDAO.class);
SFRMMessageSegmentDVO msDVO = (SFRMMessageSegmentDVO) msDAO.createDVO();
msDVO.setMessageId("testMarkMessagePreCompleted");
msDVO.setMessageBox(SFRMConstant.MSGBOX_OUT);
msDVO.setSegmentType(SFRMConstant.MSGT_PAYLOAD);
msDVO.setSegmentNo(3);
//segment processed case
msDAO.retrieve(msDVO);
assertEquals("segment 3 status should changed to " + SFRMConstant.MSGS_PROCESSED, SFRMConstant.MSGS_PROCESSED, msDVO.getStatus());
assertNotNull("segment 3 completed timestamp should be set", msDVO.getCompletedTimestamp());
}
}