package test.RPCDispatch; import junit.framework.TestCase; import org.apache.axis.AxisFault; import org.apache.axis.Constants; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.configuration.SimpleProvider; import org.apache.axis.handlers.soap.SOAPService; import org.apache.axis.message.RPCElement; import org.apache.axis.message.RPCParam; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.providers.java.RPCProvider; import org.apache.axis.server.AxisServer; import org.xml.sax.SAXException; import javax.xml.namespace.QName; import java.util.Vector; /** * Test org.apache.axis.handlers.RPCDispatcher * * @author Sam Ruby */ public class TestRPC extends TestCase { private final String header = "\n" + "\n" + "\n"; private final String footer = "\n" + "\n"; private SimpleProvider provider = new SimpleProvider(); private AxisServer engine = new AxisServer(provider); private String SOAPAction = "urn:reverse"; public TestRPC(String name) { super(name); engine.init(); } /** * Invoke a given RPC method, and return the result * @return Deserialized result */ private final Object rpc(String method, Object[] parms) throws AxisFault, SAXException { // Create the message context MessageContext msgContext = new MessageContext(engine); // Set the dispatch either by SOAPAction or methodNS String methodNS = null; msgContext.setTargetService(SOAPAction); // Construct the soap request SOAPEnvelope envelope = new SOAPEnvelope(); msgContext.setRequestMessage(new Message(envelope)); RPCElement body = new RPCElement(methodNS, method, parms); envelope.addBodyElement(body); // Invoke the Axis engine engine.invoke(msgContext); // Extract the response Envelope Message message = msgContext.getResponseMessage(); envelope = (SOAPEnvelope)message.getSOAPEnvelope(); assertNotNull("SOAP envelope was null", envelope); // Extract the body from the envelope body = (RPCElement)envelope.getFirstBody(); assertNotNull("SOAP body was null", body); // Extract the list of parameters from the body Vector arglist = body.getParams(); assertNotNull("SOAP argument list was null", arglist); if (arglist.size()==0) return null; // Return the first parameter RPCParam param = (RPCParam) arglist.get(0); return param.getObjectValue(); } /** * Test a simple method that reverses a string */ public void testReverseString() throws Exception { // Register the reverseString service SOAPService reverse = new SOAPService(new RPCProvider()); reverse.setOption("className", "test.RPCDispatch.Service"); reverse.setOption("allowedMethods", "reverseString"); provider.deployService(new QName(null,SOAPAction), reverse); // invoke the service and verify the result assertEquals("Did not reverse the string correctly.", "cba", rpc("reverseString", new Object[] {"abc"})); } /** * Test a simple method that reverses a string (but fails) */ public void testReverseStringThatShouldFail() throws Exception { try { // Register the reverseString service SOAPService reverse = new SOAPService(new RPCProvider()); reverse.setOption("className", "test.RPCDispatch.Service"); reverse.setOption("allowedMethods", "reverseString2"); provider.deployService(new QName(null,SOAPAction), reverse); // invoke the service and verify the result rpc("reverseString", new Object[] {"abc"}); throw new junit.framework.AssertionFailedError("Should not reach here"); } catch (AxisFault af){ //This test should cause an exception. return; } } /** * Test a simple method that reverses a string (with a comma delimiter */ public void testReverseStringWithCommaDelimiter() throws Exception { // Register the reverseString service SOAPService reverse = new SOAPService(new RPCProvider()); reverse.setOption("className", "test.RPCDispatch.Service"); reverse.setOption("allowedMethods", "reverseString2,reverseString"); provider.deployService(new QName(null,SOAPAction), reverse); // invoke the service and verify the result assertEquals("Did not reverse the string correctly.", "cba", rpc("reverseString", new Object[] {"abc"})); } /** * Test a simple method that reverses a string (with a space delimiter */ public void testReverseStringWithSpaceDelimiter() throws Exception { // Register the reverseString service SOAPService reverse = new SOAPService(new RPCProvider()); reverse.setOption("className", "test.RPCDispatch.Service"); reverse.setOption("allowedMethods", "reverseString2 reverseString"); provider.deployService(new QName(null,SOAPAction), reverse); // invoke the service and verify the result assertEquals("Did not reverse the string correctly.", "cba", rpc("reverseString", new Object[] {"abc"})); } /** * Test a simple method that reverses a string (with a '*' */ public void testReverseStringWithStar() throws Exception { // Register the reverseString service SOAPService reverse = new SOAPService(new RPCProvider()); reverse.setOption("className", "test.RPCDispatch.Service"); reverse.setOption("allowedMethods", "*"); provider.deployService(new QName(null,SOAPAction), reverse); // invoke the service and verify the result assertEquals("Did not reverse the string correctly.", "cba", rpc("reverseString", new Object[] {"abc"})); } /** * Test a method that reverses a data structure */ public void testReverseData() throws Exception { // Register the reverseData service SOAPService reverse = new SOAPService(new RPCProvider()); reverse.setOption("className", "test.RPCDispatch.Service"); reverse.setOption("allowedMethods", "reverseData"); provider.deployService(new QName(null, SOAPAction), reverse); // invoke the service and verify the result Data input = new Data(5, "abc", 3); Data expected = new Data(3, "cba", 5); assertEquals("Did not reverse the data as expected.", expected, rpc("reverseData", new Object[] {input})); } /** * Test a simple method that returns a field from the message context */ public void testMessageContextImplicit() throws Exception { // Register the targetService service SOAPService tgtSvc = new SOAPService(new RPCProvider()); tgtSvc.setOption("className", "test.RPCDispatch.Service"); tgtSvc.setOption("allowedMethods", "targetServiceImplicit"); provider.deployService(new QName(null, SOAPAction), tgtSvc); // invoke the service and verify the result assertEquals("SOAP Action did not equal the targetService.", SOAPAction, rpc("targetServiceImplicit", new Object[] {})); } /** * Test a simple method that accepts and returns a null */ public void testNull() throws Exception { // Register the echoInt service SOAPService echoInt = new SOAPService(new RPCProvider()); echoInt.setOption("className", "test.RPCDispatch.Service"); echoInt.setOption("allowedMethods", "echoInt"); provider.deployService(new QName(null, SOAPAction), echoInt); // invoke the service and verify the result assertNull("The result was not null as expected.", rpc("echoInt", new Object[] {null})); } /** * Test faults */ public void testSimpleFault() throws Exception { // Register the reverseData service SOAPService simpleFault = new SOAPService(new RPCProvider()); simpleFault.setOption("className", "test.RPCDispatch.Service"); simpleFault.setOption("allowedMethods", "simpleFault"); provider.deployService(new QName(null, SOAPAction), simpleFault); try { rpc("simpleFault", new Object[] {"foobar"}); } catch (AxisFault result) { assertEquals("faultString was not set correctly.", "test.RPCDispatch.Service$TestFault: foobar", result.getFaultString()); return; } fail("Did not get an expected fault!"); } public static void main(String args[]) { try { TestRPC tester = new TestRPC("RPC test"); tester.testReverseString(); tester.testReverseData(); tester.testSimpleFault(); tester.testReverseStringThatShouldFail(); tester.testReverseStringWithCommaDelimiter(); tester.testReverseStringWithSpaceDelimiter(); tester.testReverseStringWithStar(); } catch (Exception e) { e.printStackTrace(); } } }