package hk.hku.cecid.edi.sfrm.handler;
import hk.hku.cecid.piazza.commons.test.PluginTest;
import hk.hku.cecid.piazza.commons.test.utils.ResSetter;
import hk.hku.cecid.edi.sfrm.handler.IncomingMessageHandler;
import hk.hku.cecid.edi.sfrm.pkg.SFRMAcknowledgementParser;
import hk.hku.cecid.edi.sfrm.pkg.SFRMConstant;
import hk.hku.cecid.edi.sfrm.pkg.SFRMMessage;
import hk.hku.cecid.edi.sfrm.spa.SFRMProcessor;
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.piazza.commons.io.IOHandler;
import hk.hku.cecid.piazza.commons.dao.ds.DataSourceDAO;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import org.junit.Test;
import java.net.MalformedURLException;
/**
* @author Patrick Yip
*
*/
public class IncomingMessageHandlerTest extends PluginTest<SFRMProcessor> {
private IncomingMessageHandler inHandler;
private ResSetter resSetter;
private SFRMProcessor sfrmProcessor;
public void init(){
sfrmProcessor = (SFRMProcessor) processor;
isLoadDB = true;
inHandler = sfrmProcessor.getIncomingMessageHandler();
resSetter = new ResSetter(this.getClass());
}
public void postSetUp() throws Exception{
resSetter.restore();
}
public void postTearDown() throws Exception{
resSetter.clean();
}
public String getDBName(){
return "dao";
}
public DataSourceDAO getDSDAO() throws Exception{
return (DataSourceDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
}
@Test
public void testMetaReceived() throws Exception{
SFRMMessage message = new SFRMMessage();
message.setSegmentType(SFRMConstant.MSGT_META);
message.setPartnershipId("loopback");
message.setMessageID("testMetaReceivd");
message.setFilename("filename.tar");
message.setTotalSize(1024);
message.setSegmentNo(0);
inHandler.processIncomingMessage(message, null);
//Assert whether the new message was inserted
SFRMMessageDAO dao = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO dvo = (SFRMMessageDVO) dao.createDVO();
dvo.setMessageId("testMetaReceivd");
dvo.setMessageBox(SFRMConstant.MSGBOX_IN);
assertTrue("Message testMetaReceivd was not inserted", dao.retrieve(dvo));
assertEquals("Filename should be: filename.tar", "filename.tar", dvo.getFilename());
assertEquals("Partnership ID should be loopback", "loopback", dvo.getPartnershipId());
assertEquals("Payload size should be 1024", 1024, dvo.getTotalSize());
// It is not guaranteed the processing time
// assertEquals("Message status should be HS", "HS", dvo.getStatus());
//Sleep for let SFRM to created dummy payload
Thread.sleep(1000);
//After the payload was created
dvo = (SFRMMessageDVO) dao.createDVO();
dvo.setMessageId("testMetaReceivd");
dvo.setMessageBox(SFRMConstant.MSGBOX_IN);
dao.retrieve(dvo);
//Look if the message was changed to PR after the payload was created
assertEquals("Message status should be PR", "PR", dvo.getStatus());
//Assert that whether the dummy payload was created in the file system
File inRepo = sfrmProcessor.getIncomingRepository().getRepository();
File payload = new File(inRepo, "~loopback$testMetaReceivd.sfrm");
System.out.println(payload.getCanonicalPath());
assertTrue("Dummy payload wasn't created", payload.exists());
}
public void testMetaReceivedPartnershipNonExist() throws Exception{
SFRMMessage message = new SFRMMessage();
message.setSegmentType(SFRMConstant.MSGT_META);
message.setPartnershipId("non_exist_partnership");
message.setMessageID("testMetaReceivedPartnershipNonExist");
message.setFilename("filename.tar");
message.setTotalSize(1024);
message.setSegmentNo(0);
boolean thrown = false;
try{
inHandler.processIncomingMessage(message, null);
}catch(MalformedURLException e){
thrown = true;
}
assertTrue("Exception should thrown because of the partnership ID not found in the receiver side", thrown);
}
@Test
public void testProcessPRAck() throws Exception{
File requestFile = new File(new File(FIXTURE_LOADER.getResource(getName()).getFile()), "ack_request.xml");
String requestContent = IOHandler.readString(new InputStreamReader(new FileInputStream(requestFile)));
IncomingMessageHandler handler = sfrmProcessor.getIncomingMessageHandler();
SFRMAcknowledgementParser requestParser = new SFRMAcknowledgementParser(requestContent);
SFRMMessageDVO mDVO = SFRMProcessor.getInstance().getMessageHandler().retrieveMessage("testProcessPRAck", SFRMConstant.MSGBOX_IN);
String responseContent = handler.processPRAck(mDVO, requestParser);
SFRMAcknowledgementParser responseParser = new SFRMAcknowledgementParser(responseContent);
SFRMMessageSegmentDAO dao = (SFRMMessageSegmentDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageSegmentDAO.class);
//Assert whether the DF segment as deleted
SFRMMessageSegmentDVO dvo = (SFRMMessageSegmentDVO) dao.createDVO();
dvo.setMessageId("testProcessPRAck");
dvo.setMessageBox(SFRMConstant.MSGBOX_IN);
dvo.setSegmentType(SFRMConstant.MSGT_PAYLOAD);
dvo.setSegmentNo(2);
assertFalse("Message segment 2 should be deleted", dao.retrieve(dvo));
//Assert the response content
assertEquals("Status for segment 2 should be " + SFRMConstant.MSGS_DELIVERY_FAILURE, SFRMConstant.MSGS_DELIVERY_FAILURE, responseParser.getMessageSegmentStatus("testProcessPRAck", 2));
//Assert if the DL segment was updated to PS
dvo.setSegmentNo(1);
assertTrue("Message segment 1 should still exist", dao.retrieve(dvo));
assertEquals("Status of Message segment 1 should be updated to " + SFRMConstant.MSGS_PROCESSED, SFRMConstant.MSGS_PROCESSED, dvo.getStatus());
assertEquals("Status for segment 1 should be " + SFRMConstant.MSGS_PROCESSED, SFRMConstant.MSGS_PROCESSED, responseParser.getMessageSegmentStatus("testProcessPRAck", 1));
//Assert if the PR segment was not changed status
dvo.setSegmentNo(3);
dao.retrieve(dvo);
assertTrue("Message segment 3 should still exist", dao.retrieve(dvo));
assertEquals("Status of Message segment 3 should be updated to " + SFRMConstant.MSGS_PROCESSING, SFRMConstant.MSGS_PROCESSING, dvo.getStatus());
assertEquals("Status for segment 3 should be " + SFRMConstant.MSGS_PROCESSING, SFRMConstant.MSGS_PROCESSING, responseParser.getMessageSegmentStatus("testProcessPRAck", 3));
}
@Test
public void testProcessPDFAck() throws Exception{
IncomingMessageHandler handler = sfrmProcessor.getIncomingMessageHandler();
SFRMMessageDVO mDVO = SFRMProcessor.getInstance().getMessageHandler().retrieveMessage("testProcessPDFAck", SFRMConstant.MSGBOX_IN);
String responseContent = handler.processPDFAck(mDVO);
SFRMAcknowledgementParser responseParser = new SFRMAcknowledgementParser(responseContent);
SFRMMessageDAO dao = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO dvo = (SFRMMessageDVO) dao.createDVO();
dvo.setMessageId(getName());
dvo.setMessageBox(SFRMConstant.MSGBOX_IN);
//Assert if the message still exist
assertTrue("Message ID 'testProcessPDFAck' should not be deleted", dao.retrieve(dvo));
assertEquals("Message status should changed to DF", SFRMConstant.MSGS_DELIVERY_FAILURE, dvo.getStatus());
assertEquals("Message status in response ack should be DF", SFRMConstant.MSGS_DELIVERY_FAILURE, responseParser.getMessageStatus(getName()));
}
@Test
public void testProcessPPSAck() throws Exception{
IncomingMessageHandler handler = sfrmProcessor.getIncomingMessageHandler();
SFRMMessageDVO mDVO = SFRMProcessor.getInstance().getMessageHandler().retrieveMessage("testProcessPPSAck", SFRMConstant.MSGBOX_IN);
String responseContent = handler.processPPSAck(mDVO);
SFRMAcknowledgementParser responseParser = new SFRMAcknowledgementParser(responseContent);
SFRMMessageDAO dao = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO dvo = (SFRMMessageDVO) dao.createDVO();
dvo.setMessageId(getName());
dvo.setMessageBox(SFRMConstant.MSGBOX_IN);
//Assert if the message still exist
assertTrue("Message ID 'testProcessPPSAck' should not be deleted", dao.retrieve(dvo));
assertEquals("Message status should changed to PS", SFRMConstant.MSGS_PROCESSED, dvo.getStatus());
assertNotNull("Message Completed timestamp should not be null", dvo.getCompletedTimestamp());
assertEquals("Message status in response ack should be PS", SFRMConstant.MSGS_PROCESSED, responseParser.getMessageStatus(getName()));
}
@Test
public void testProcessPSDAck() throws Exception{
IncomingMessageHandler handler = sfrmProcessor.getIncomingMessageHandler();
SFRMMessageDVO mDVO = SFRMProcessor.getInstance().getMessageHandler().retrieveMessage("testProcessPSDAck", SFRMConstant.MSGBOX_IN);
String responseContent = handler.processPSDAck(mDVO);
SFRMAcknowledgementParser responseParser = new SFRMAcknowledgementParser(responseContent);
SFRMMessageDAO dao = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO dvo = (SFRMMessageDVO) dao.createDVO();
dvo.setMessageId(getName());
dvo.setMessageBox(SFRMConstant.MSGBOX_IN);
//Assert if the message still exist
assertTrue("Message ID 'testProcessPSDAck' should not be deleted", dao.retrieve(dvo));
assertEquals("Message status should changed to SD", SFRMConstant.MSGS_SUSPENDED, dvo.getStatus());
assertEquals("Message status in response ack should be SD", SFRMConstant.MSGS_SUSPENDED, responseParser.getMessageStatus(getName()));
}
@Test
public void testProcessPRSAck() throws Exception{
IncomingMessageHandler handler = sfrmProcessor.getIncomingMessageHandler();
SFRMMessageDVO mDVO = SFRMProcessor.getInstance().getMessageHandler().retrieveMessage("testProcessPRSAck", SFRMConstant.MSGBOX_IN);
String responseContent = handler.processPRSAck(mDVO);
SFRMAcknowledgementParser responseParser = new SFRMAcknowledgementParser(responseContent);
SFRMMessageDAO dao = (SFRMMessageDAO) sfrmProcessor.getDAOFactory().createDAO(SFRMMessageDAO.class);
SFRMMessageDVO dvo = (SFRMMessageDVO) dao.createDVO();
dvo.setMessageId(getName());
dvo.setMessageBox(SFRMConstant.MSGBOX_IN);
//Assert if the message still exist
assertTrue("Message ID 'testProcessPRSAck' should not be deleted", dao.retrieve(dvo));
assertEquals("Message status should changed to PR", SFRMConstant.MSGS_PROCESSING, dvo.getStatus());
assertEquals("Message status in response ack should be PR", SFRMConstant.MSGS_PROCESSING, responseParser.getMessageStatus(getName()));
}
}