/*
* Copyright(c) 2005 Center for E-Commerce Infrastructure Development, The
* University of Hong Kong (HKU). All Rights Reserved.
*
* This software is licensed under the GNU GENERAL PUBLIC LICENSE Version 2.0 [1]
*
* [1] http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*/
package hk.hku.cecid.corvus.ws;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.Iterator;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPMessage;
import org.apache.commons.fileupload.RequestContext;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import hk.hku.cecid.corvus.ws.data.EBMSMessageHistoryRequestData;
import hk.hku.cecid.corvus.ws.EBMSMessageHistoryQuerySender;
import hk.hku.cecid.corvus.ws.data.KVPairData;
import hk.hku.cecid.piazza.commons.io.IOHandler;
import hk.hku.cecid.piazza.commons.net.SimpleHttpMonitor;
import hk.hku.cecid.piazza.commons.util.FileLogger;
import hk.hku.cecid.piazza.commons.test.utils.FixtureStore;
import junit.framework.Assert;
import junit.framework.TestCase;
@Ignore
public class EBMSMessageHistoryQuerySenderTest extends TestCase{
public static final String TEST_LOG = "test.log";
private static ClassLoader FIXTURE_LOADER =
FixtureStore.createFixtureLoader(false, EBMSMessageHistoryQuerySender.class);
// Parameters
public static final int TEST_PORT = 9000;
public static final String TEST_ENDPOINT = "http://localhost:" + TEST_PORT + "/corvus/httpd/ebms/msg_history";
public static final String USER_NAME = "corvus";
public static final String PASSWORD = "corvus";
/** The testing target which is an PartnershipSender and the associated data*/
protected EBMSMessageHistoryQuerySender target;
protected KVPairData kvData;
protected FileLogger testClassLogger;
/** The helper for capturing the HTTP data */
private SimpleHttpMonitor monitor;
// Instance logger
Logger logger = LoggerFactory.getLogger(this.getClass());
/** Setup the fixture. */
@Before
public void setUp() throws Exception {
this.initTest();
logger = LoggerFactory.getLogger(this.getName());
logger.info(this.getName() + " Start ");
this.monitor.start();
Thread.sleep(5000);
}
public void initTest()throws Exception
{
URL logURL = FIXTURE_LOADER.getResource(TEST_LOG);
if (logURL == null)
throw new NullPointerException(
"Missing fixture " + TEST_LOG + " in the fixture path");
File log = new File(logURL.getFile());
this.testClassLogger = new FileLogger(log);
this.monitor = new SimpleHttpMonitor(TEST_PORT)
{
@Override
public int onResponseLength()
{
return 532;
}
protected String onResponseContentType()
{
return "text/xml;charset=utf-8";
}
@Override
public void onResponse(OutputStream os) throws IOException
{
super.onResponse(os);
/*os.write(STATUS_200);
os.write(CRLF);
os.write(HD_SERVIER);
os.write(CRLF);
os.write(HD_CT_LEN);
os.write(String.valueOf(onResponseLength()).getBytes());
os.write(CRLF);
os.write("Content-type: text/xml;charset=utf-8".getBytes());
os.write(CRLF);
os.write(CRLF);*/
InputStream ins = FIXTURE_LOADER.getResourceAsStream("testResponse.log");
IOHandler.pipe(ins, os);
}
};
}
@After
public void tearDown()throws Exception{
this.monitor.stop();
Thread.sleep(5000);
}
@Test
public void testNormalCriteriaData ()throws Exception{
EBMSMessageHistoryRequestData expectData =
new EBMSMessageHistoryRequestData();
expectData.setEndPoint(TEST_ENDPOINT);
expectData.setMessageBox("INbox");
expectData.setStatus("dL");
expectData.setMessageId("20080402-105745-64017@127.0.0.1");
expectData.setService("cecid:cecid");
expectData.setAction("Order");
expectData.setConversationId("convId");
expectData.setCpaId("cpaid");
this.target = new EBMSMessageHistoryQuerySender(this.testClassLogger,expectData);
try{
this.target.run();
}catch(Error err){
Assert.fail("Error should Not be thrown here.");
}
EBMSMessageHistoryRequestData actualData = getHttpRequestData();
Assert.assertEquals(expectData.getMessageId(), actualData.getMessageId());
Assert.assertEquals(expectData.getService(), actualData.getService());
Assert.assertEquals(expectData.getAction(), actualData.getAction());
Assert.assertEquals(expectData.getCpaId(), actualData.getCpaId());
Assert.assertEquals(expectData.getConversationId(), actualData.getConversationId());
Assert.assertTrue("inbox".equalsIgnoreCase(actualData.getMessageBox()));
Assert.assertTrue("DL".equalsIgnoreCase(actualData.getStatus()));
}
@Test
public void testWildcardCriteriaData ()throws Exception{
EBMSMessageHistoryRequestData expectData =
new EBMSMessageHistoryRequestData();
expectData.setEndPoint(TEST_ENDPOINT);
expectData.setMessageBox("inbox");
expectData.setStatus("DL");
expectData.setMessageId("%");
expectData.setService("%%%%%%%%");
expectData.setAction("__%%%");
expectData.setConversationId("%%%\\\\");
expectData.setCpaId("%_%");
this.target = new EBMSMessageHistoryQuerySender(this.testClassLogger,expectData);
try{
this.target.run();
}catch(Error err){
Assert.fail("Error should Not be thrown here.");
}
EBMSMessageHistoryRequestData actualData = getHttpRequestData();
Assert.assertEquals(expectData.getMessageId(), actualData.getMessageId());
Assert.assertEquals(expectData.getService(), actualData.getService());
Assert.assertEquals(expectData.getAction(), actualData.getAction());
Assert.assertEquals(expectData.getCpaId(), actualData.getCpaId());
Assert.assertEquals(expectData.getConversationId(), actualData.getConversationId());
Assert.assertTrue("inbox".equals(actualData.getMessageBox()));
Assert.assertTrue("DL".equals(actualData.getStatus()));
}
@Test
public void testNullCriteriaData ()throws Exception{
EBMSMessageHistoryRequestData expectData =
new EBMSMessageHistoryRequestData();
expectData.setEndPoint(TEST_ENDPOINT);
expectData.setMessageBox("");
expectData.setStatus("");
this.target = new EBMSMessageHistoryQuerySender(this.testClassLogger,expectData);
this.target.run();
EBMSMessageHistoryRequestData actualData = getHttpRequestData();
Assert.assertEquals(null, actualData.getMessageBox());
Assert.assertEquals(null, actualData.getStatus());
Assert.assertEquals(null, actualData.getMessageId());
Assert.assertEquals(null, actualData.getConversationId());
Assert.assertEquals(null, actualData.getCpaId());
Assert.assertEquals(null, actualData.getService());
Assert.assertEquals(null, actualData.getAction());
}
@Test
public void testSpecialCharacterCriteriaData ()throws Exception{
EBMSMessageHistoryRequestData expectData =
new EBMSMessageHistoryRequestData();
expectData.setEndPoint(TEST_ENDPOINT);
expectData.setMessageBox("INbox");
expectData.setStatus("dL");
expectData.setMessageId("*msg#Id");
expectData.setService("cecid:cecid");
expectData.setAction("<>");
expectData.setConversationId("?ID%");
expectData.setCpaId("#^&--");
this.target = new EBMSMessageHistoryQuerySender(this.testClassLogger,expectData);
try{
this.target.run();
}catch(Error err){
Assert.fail("Error should Not be thrown here.");
}
EBMSMessageHistoryRequestData actualData = getHttpRequestData();
Assert.assertEquals(expectData.getMessageId(), actualData.getMessageId());
Assert.assertEquals(expectData.getService(), actualData.getService());
Assert.assertEquals(expectData.getAction(), actualData.getAction());
Assert.assertEquals(expectData.getCpaId(), actualData.getCpaId());
Assert.assertEquals(expectData.getConversationId(), actualData.getConversationId());
Assert.assertTrue("INbox".equals(actualData.getMessageBox()));
Assert.assertTrue("dL".equals(actualData.getStatus()));
}
@Test
public void testFail_NegativeQueryLimit ()throws Exception{
EBMSMessageHistoryRequestData expectData =
new EBMSMessageHistoryRequestData();
expectData.setEndPoint(TEST_ENDPOINT);
expectData.setMessageBox("");
expectData.setStatus("");
this.target = new EBMSMessageHistoryQuerySender(this.testClassLogger,expectData);
try{
this.target.run();
}catch(Error err){
Assert.fail("Query Limit should transformed to 100");
}
EBMSMessageHistoryRequestData actualData = getHttpRequestData();
}
private EBMSMessageHistoryRequestData getHttpRequestData() throws Exception
{
// Check content Type
String contentType = monitor.getContentType();
if(contentType == null){
System.out.println((monitor==null?"Null Monitor":"Monitor not null"));
System.out.println("Lengeth " + monitor.getContentLength());
Assert.fail("Null Content");
}
String mediaType = contentType.split(";")[0];
assertEquals("Invalid content type", "text/xml", mediaType);
// Check the multi-part content.
// Make a request context that bridge the content from our monitor to FileUpload library.
RequestContext rc = new RequestContext(){
public String getCharacterEncoding() { return "charset=utf-8"; }
public int getContentLength() { return monitor.getContentLength(); }
public String getContentType() { return monitor.getContentType(); }
public InputStream getInputStream() { return monitor.getInputStream(); }
};
BufferedReader bReader =
new BufferedReader(new InputStreamReader(monitor.getInputStream()));
String strLine = "";
do{
strLine = bReader.readLine();
}while(!strLine.contains("SOAP-ENV"));
MimeHeaders header = new MimeHeaders();
header.addHeader("Content-Type", "text/xml");
SOAPMessage msg = MessageFactory.newInstance().createMessage(
header, new ByteArrayInputStream(strLine.getBytes()));
EBMSMessageHistoryRequestData data = new EBMSMessageHistoryRequestData();
data.setMessageId(getElementValue(msg.getSOAPBody(), "tns:messageId"));
data.setMessageBox(getElementValue(msg.getSOAPBody(), "tns:messageBox"));
data.setStatus(getElementValue(msg.getSOAPBody(), "tns:status"));
data.setService(getElementValue(msg.getSOAPBody(), "tns:service"));
data.setAction(getElementValue(msg.getSOAPBody(), "tns:action"));
data.setConversationId(getElementValue(msg.getSOAPBody(), "tns:conversationId"));
data.setCpaId(getElementValue(msg.getSOAPBody(), "tns:cpaId"));
return data;
}
private String getElementValue(SOAPElement msgBody, String name){
Iterator iterator = msgBody.getChildElements();
while(iterator.hasNext()){
SOAPElement current = (SOAPElement) iterator.next();
if(current.getNodeName().equalsIgnoreCase(name))
return current.getValue();
}
return null;
}
}