package com.finance.iso.iso8583.mediator; import java.util.HashMap; import java.util.Map; import java.util.UUID; import javax.xml.stream.XMLStreamException; import junit.framework.TestCase; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.util.AXIOMUtil; import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.engine.AxisConfiguration; import org.apache.synapse.MessageContext; import org.apache.synapse.config.Entry; import org.apache.synapse.config.SynapseConfiguration; import org.apache.synapse.core.SynapseEnvironment; import org.apache.synapse.core.axis2.Axis2MessageContext; import org.apache.synapse.core.axis2.Axis2SynapseEnvironment; public class XLinkISO8583MediatorTest extends TestCase { private final Map<String, Entry> entries = new HashMap<String, Entry>(); public void testXLinkSignOn() { XLinkISO8583Mediator linkISO8583Mediator = new XLinkISO8583Mediator(); linkISO8583Mediator.init(null); linkISO8583Mediator.setHost("localhost"); linkISO8583Mediator.setPort("8000"); MessageContext msgCtx = null; try { msgCtx = this.generateMessage(msgCtx,null,null); // message # 1 ISO setupAccountInfo(msgCtx); linkISO8583Mediator.mediate(msgCtx); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (Exception e) { fail("failed to perform sign-on for XLink"); } } /* { "APIRequest": { "InquiryType": "30", "UserData": "Enc(PAN|CARDNO|PIN)", "TrxId": "xx", "Currency": "IDR|VND" } } XML... <APIRequest> <OperationType>30</OperationType> <UserData>Enc(PAN|CARDNO|PIN)</UserData> <TrxId>xx</TrxId> <Currency>IDR|VND</Currency> </APIRequest> */ public void testDoTransaction() { String payload = "<APIRequest> " + "<OperationType>30</OperationType>" + "<TrxId>123456789</TrxId>" + "<Currency>IDR</Currency>" + "</APIRequest>"; XLinkISO8583Mediator linkISO8583Mediator = new XLinkISO8583Mediator(); linkISO8583Mediator.init(null); linkISO8583Mediator.setHost("localhost"); linkISO8583Mediator.setPort("8000"); MessageContext msgCtx = null; try { OMElement payloadOM = AXIOMUtil.stringToOM(payload); msgCtx = this.generateMessage(msgCtx, payloadOM,null); // message # 1 ISO setupAccountInfo(msgCtx); linkISO8583Mediator.mediate(msgCtx); org.apache.axis2.context.MessageContext axis2msgCtx = ((Axis2MessageContext) msgCtx) .getAxis2MessageContext(); System.out.println(axis2msgCtx.getEnvelope()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (Exception e) { fail("failed to perform sign-on for XLink"); } } /*if JSON, once converting it <jsonObject> <APIRequest> <OperationType>30</OperationType> <UserData>Enc(PAN|CARDNO|PIN)</UserData> <TrxId>xx</TrxId><Currency>IDR|VND</Currency> </APIRequest> </jsonObject>*/ public void testTransactionMultiple() { String payload = "<jsonObject><APIRequest> " + "<OperationType>30</OperationType>" + "<TrxId>xx</TrxId>" + "<Currency>IDR</Currency>" + "</APIRequest></jsonObject>"; XLinkISO8583Mediator linkISO8583Mediator = new XLinkISO8583Mediator(); linkISO8583Mediator.init(null); linkISO8583Mediator.setHost("localhost"); linkISO8583Mediator.setPort("8000"); MessageContext msgCtx = null; String msisdn = UUID.randomUUID().toString(); try { OMElement payloadOM = AXIOMUtil.stringToOM(payload); msgCtx = this.generateMessage(msgCtx, payloadOM,msisdn); // message # 1 ISO setupAccountInfo(msgCtx); linkISO8583Mediator.mediate(msgCtx); org.apache.axis2.context.MessageContext axis2msgCtx = ((Axis2MessageContext) msgCtx) .getAxis2MessageContext(); System.out.println(axis2msgCtx.getEnvelope()); try { Thread.sleep(20000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (int i = 0; i < 3; i++) { System.out.println("iterating ####"+i); echoMesg(payload, linkISO8583Mediator, msgCtx, msisdn); } } catch (Exception e) { fail("failed to perform sign-on for XLink"); } } private void echoMesg(String payload, XLinkISO8583Mediator linkISO8583Mediator, MessageContext msgCtx, String msisdn) throws XMLStreamException { OMElement payloadOM; org.apache.axis2.context.MessageContext axis2msgCtx; payloadOM = AXIOMUtil.stringToOM(payload); msgCtx = this.generateMessage(msgCtx, payloadOM,msisdn); // message # 1 ISO setupAccountInfo(msgCtx); linkISO8583Mediator.mediate(msgCtx); axis2msgCtx = ((Axis2MessageContext) msgCtx) .getAxis2MessageContext(); System.out.println(axis2msgCtx.getEnvelope()); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /*if JSON, once converting it <jsonObject> <APIRequest> <OperationType>50</OperationType> <UserData>MTIzOjQ1Njo3ODk=</UserData> <TrxId>12345678</TrxId> <Currency>IDR</Currency> <Amount>999999</Amount> </APIRequest> </jsonObject>*/ public void testPaymentJSON() { String payload = "<jsonObject><APIRequest> " + "<OperationType>50</OperationType>" + "<UserData>MTIzNDU2OjEyMzQ1NjoxMjM0NTYxMjM0NTYxMjM0</UserData>" //base 64encode + "<TrxId>123213999</TrxId>" + "<Currency>LKR</Currency>" + "<Amount>20000</Amount>" + "</APIRequest></jsonObject>"; XLinkISO8583Mediator linkISO8583Mediator = new XLinkISO8583Mediator(); linkISO8583Mediator.init(null); linkISO8583Mediator.setHost("localhost"); linkISO8583Mediator.setPort("8000"); MessageContext msgCtx = null; try { OMElement payloadOM = AXIOMUtil.stringToOM(payload); msgCtx = this.generateMessage(msgCtx, payloadOM,null); // message # 1 ISO setupAccountInfo(msgCtx); linkISO8583Mediator.mediate(msgCtx); org.apache.axis2.context.MessageContext axis2msgCtx = ((Axis2MessageContext) msgCtx) .getAxis2MessageContext(); System.out.println(axis2msgCtx.getEnvelope()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (Exception e) { fail("failed to perform sign-on for XLink"); } } private void setupAccountInfo(MessageContext msgCtx) { msgCtx.setProperty("cardno", "card123"); msgCtx.setProperty("accountno", "accountno123"); msgCtx.setProperty("pinno", "1234567890123456"); } /*if JSON, once converting it <jsonObject> <APIRequest> <OperationType>50</OperationType> <UserData>MTIzOjQ1Njo3ODk=</UserData> <TrxId>12345678</TrxId> <Currency>IDR</Currency> <Amount>999999</Amount> </APIRequest> </jsonObject>*/ public void testPaymentJSONThenSignOff() { String payload = "<jsonObject><APIRequest> " + "<OperationType>50</OperationType>" + "<UserData>MTIzNDU2OjEyMzQ1NjoxMjM0NTYxMjM0NTYxMjM0</UserData>" //base 64encode + "<TrxId>123213999</TrxId>" + "<Currency>LKR</Currency>" + "<Amount>20000</Amount>" + "</APIRequest></jsonObject>"; XLinkISO8583Mediator linkISO8583Mediator = new XLinkISO8583Mediator(); linkISO8583Mediator.init(null); linkISO8583Mediator.setHost("localhost"); linkISO8583Mediator.setPort("8000"); MessageContext msgCtx = null; String msisdn = UUID.randomUUID().toString(); try { OMElement payloadOM = AXIOMUtil.stringToOM(payload); msgCtx = this.generateMessage(msgCtx, payloadOM,msisdn); // message # 1 ISO setupAccountInfo(msgCtx); linkISO8583Mediator.mediate(msgCtx); org.apache.axis2.context.MessageContext axis2msgCtx = ((Axis2MessageContext) msgCtx) .getAxis2MessageContext(); System.out.println(axis2msgCtx.getEnvelope()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //signOff Request. payload = "<jsonObject><APIRequest> " + "<OperationType>02</OperationType>" + "</APIRequest></jsonObject>"; payloadOM = AXIOMUtil.stringToOM(payload); msgCtx = this.generateMessage(msgCtx, payloadOM,msisdn); linkISO8583Mediator.mediate(msgCtx); Thread.sleep(10000); } catch (Exception e) { fail("failed to perform sign-on for XLink"); } } // msgCtx = this.generateMessage(msgCtx); // message # 2 ISO // linkISO8583Mediator.mediate(msgCtx); // // Map<String, XLinkSessionWrapper> map = XLinkConnnector.getInstance() // .getMap(); // assertEquals(2, map.size()); // // try { // Thread.sleep(60000); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // // for (Map.Entry<String, XLinkSessionWrapper> entry : map.entrySet()) { // msgCtx.setProperty(XLinkISO8583Constant.MOBILE_CONNECTION_KEY, // entry.getKey()); // linkISO8583Mediator.mediate(msgCtx); // } // assertEquals(2, map.size()); private MessageContext generateMessage(MessageContext msgCtx,OMElement payload,String msisdn) { try { msgCtx = build(); org.apache.axis2.context.MessageContext axis2MsgCtx = ((Axis2MessageContext) msgCtx) .getAxis2MessageContext(); OMElement payloadOM = AXIOMUtil.stringToOM(XML_PAYLOAD_A); axis2MsgCtx.getEnvelope().getBody().addChild(payload !=null?payload:payloadOM); msgCtx.setProperty(XLinkISO8583Constant.MOBILE_CONNECTION_KEY, msisdn ==null ?(UUID .randomUUID().toString()):msisdn); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return msgCtx; } /** * Build the test message context. This method returns a new (and * independent) instance on every invocation. * * @return * @throws Exception */ public MessageContext build() throws Exception { SynapseConfiguration testConfig = new SynapseConfiguration(); // TODO: check whether we need a SynapseEnvironment in all cases SynapseEnvironment synEnv = new Axis2SynapseEnvironment( new ConfigurationContext(new AxisConfiguration()), testConfig); MessageContext synCtx = new Axis2MessageContext( new org.apache.axis2.context.MessageContext(), testConfig, synEnv); for (Map.Entry<String, Entry> mapEntry : entries.entrySet()) { testConfig.addEntry(mapEntry.getKey(), mapEntry.getValue()); } ; SOAPEnvelope envelope = OMAbstractFactory.getSOAP11Factory() .getDefaultEnvelope(); org.apache.axis2.context.MessageContext axis2MsgCtx = ((Axis2MessageContext) synCtx) .getAxis2MessageContext(); axis2MsgCtx.setEnvelope(envelope); return synCtx; } private static String XML_PAYLOAD_A = "<iso8583message>" + "<config>" + "<mti>1800</mti>" + "</config>" + "<data>" + "<field id=\"3\">110</field>" + "<field id=\"5\">4200.00</field>" + "<field id=\"48\">Simple Credit Transaction</field>" + "<field id=\"6\">645.23</field>" + "<field id=\"88\">66377125</field>" + "</data>" + "</iso8583message>"; }