/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ package org.ebayopensource.turmeric.runtime.tests.spf; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.util.List; import java.util.Map; import org.ebayopensource.turmeric.runtime.binding.objectnode.ObjectNodeType; import org.ebayopensource.turmeric.runtime.common.exceptions.ServiceException; import org.ebayopensource.turmeric.runtime.common.pipeline.Message; import org.ebayopensource.turmeric.runtime.common.types.SOAHeaders; import org.ebayopensource.turmeric.runtime.spf.impl.internal.pipeline.ServerMessageProcessor; import org.ebayopensource.turmeric.runtime.spf.pipeline.ServerMessageContext; import org.ebayopensource.turmeric.runtime.tests.common.jetty.AbstractWithServerTest; import org.ebayopensource.turmeric.runtime.tests.common.junit.NeedsConfig; import org.ebayopensource.turmeric.runtime.tests.common.util.ServerMessageContextTestBuilder; import org.ebayopensource.turmeric.runtime.tests.common.util.TestUtils; import org.ebayopensource.turmeric.runtime.tests.service1.sample.handlers.ClientReadHeaderHandler; import org.ebayopensource.turmeric.runtime.tests.service1.sample.handlers.ExceptionTestHandler; import org.ebayopensource.turmeric.runtime.tests.service1.sample.handlers.RequestObjectNodeAccessHandler; import org.ebayopensource.turmeric.runtime.tests.service1.sample.handlers.ResponseObjectNodeAccessHandler; import org.ebayopensource.turmeric.runtime.tests.service1.sample.handlers.SetResponseHeaderHandler; import org.ebayopensource.turmeric.runtime.tests.service1.sample.types1.Address; import org.ebayopensource.turmeric.runtime.tests.service1.sample.types1.MyMessage; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; /** * @author wdeng */ public class ServerPipelineTest extends AbstractWithServerTest { @Rule public NeedsConfig needsconfig = new NeedsConfig("testconfig"); @Test public void testXMLPositiveRoundtrip() throws Throwable { ServerMessageContextTestBuilder msgtest = new ServerMessageContextTestBuilder(); msgtest.setTestServer(jetty); msgtest.setBindingName("XML"); ServerMessageContext serverCtx = msgtest.createServerMessageContext(); serverCtx.setProperty(ExceptionTestHandler.KEY_HANDLER_NAME, ExceptionTestHandler.NAME_CONTINUE_ON_ERROR_HANDLER); runAndTest(serverCtx, "XML"); } @Test public void testOrderedNVPositiveRoundtrip() throws Throwable { ServerMessageContextTestBuilder msgtest = new ServerMessageContextTestBuilder(); msgtest.setTestServer(jetty); msgtest.setBindingName("NV"); ServerMessageContext serverCtx = msgtest.createServerMessageContext(); serverCtx.setProperty(ExceptionTestHandler.KEY_HANDLER_NAME, ExceptionTestHandler.NAME_CONTINUE_ON_ERROR_HANDLER); runAndTest(serverCtx, "NV"); } @Test public void testUnorderedNVPositiveRoundtrip() throws Throwable { ServerMessageContextTestBuilder msgtest = new ServerMessageContextTestBuilder(); msgtest.setTestServer(jetty); msgtest.setBindingName("NV"); ServerMessageContext serverCtx = msgtest.createServerMessageContext(); serverCtx.setProperty(ExceptionTestHandler.KEY_HANDLER_NAME, ExceptionTestHandler.NAME_CONTINUE_ON_ERROR_HANDLER); Message request = serverCtx.getRequestMessage(); request.setTransportHeader(SOAHeaders.ELEMENT_ORDERING_PRESERVE, "false"); runAndTest(serverCtx, "NV"); } @Test public void testJSONPositiveRoundtrip() throws Throwable { ServerMessageContextTestBuilder msgtest = new ServerMessageContextTestBuilder(); msgtest.setTestServer(jetty); msgtest.setBindingName("JSON"); ServerMessageContext serverCtx = msgtest.createServerMessageContext(); serverCtx.setProperty(ExceptionTestHandler.KEY_HANDLER_NAME, ExceptionTestHandler.NAME_CONTINUE_ON_ERROR_HANDLER); runAndTest(serverCtx, "JSON"); } @Test public void testSMPTurnAroundTime() throws Throwable { ServerMessageContextTestBuilder msgtest = new ServerMessageContextTestBuilder(); msgtest.setTestServer(jetty); msgtest.setBindingName("XML"); ServerMessageContext serverCtx = msgtest.createServerMessageContext(); serverCtx.setProperty(ExceptionTestHandler.KEY_HANDLER_NAME, ExceptionTestHandler.NAME_CONTINUE_ON_ERROR_HANDLER); runAndTest(serverCtx, "XML"); System.out.println("**** Run it again"); serverCtx = msgtest.createServerMessageContext(); serverCtx.setProperty(ExceptionTestHandler.KEY_HANDLER_NAME, ExceptionTestHandler.NAME_CONTINUE_ON_ERROR_HANDLER); runAndTest(serverCtx, "XML"); } @Test(expected=ServiceException.class) public void testHandlerExceptionWithContinueOnErrorFalse() throws Throwable { ServerMessageContextTestBuilder msgtest = new ServerMessageContextTestBuilder(); msgtest.setTestServer(jetty); msgtest.setBindingName("XML"); ServerMessageContext serverCtx = msgtest.createServerMessageContext(); serverCtx.setProperty(ExceptionTestHandler.KEY_THROW_EXCEPTION, Boolean.TRUE); serverCtx.setProperty(ExceptionTestHandler.KEY_HANDLER_NAME, ExceptionTestHandler.NAME_STOP_AT_ERROR_HANDLER); ServerMessageProcessor processor = ServerMessageProcessor.getInstance(); processor.processMessage(serverCtx); List<Throwable> errors = serverCtx.getErrorList(); assertTrue(errors != null && !errors.isEmpty()); // Use junit4's expected annotation to test for expected ServiceException throw errors.get(0); } @Test public void testXMLPositiveRoundtripWithoutNSURI() throws Throwable { // TODO: plug in a message without nsURI ServerMessageContextTestBuilder msgtest = new ServerMessageContextTestBuilder(); msgtest.setTestServer(jetty); msgtest.setBindingName("XML"); ServerMessageContext serverCtx = msgtest.createServerMessageContext(); serverCtx.setProperty(ExceptionTestHandler.KEY_HANDLER_NAME, ExceptionTestHandler.NAME_CONTINUE_ON_ERROR_HANDLER); runAndTest(serverCtx, "XML"); } private void runAndTest(ServerMessageContext serverCtx, String payloadType) throws Throwable { Message request = serverCtx.getRequestMessage(); long start = System.nanoTime(); ServerMessageProcessor.getInstance(); System.out.println("SMP initialization time(" + payloadType + "): " + (System.nanoTime() - start)/1000000.0); start = System.nanoTime(); ServerMessageProcessor processor = ServerMessageProcessor.getInstance(); // Enable Object Node Test request.setTransportHeader(RequestObjectNodeAccessHandler.H_REQUEST_TEST_OBJECT_NODE, "doit"); processor.processMessage(serverCtx); System.out.println("SMP turnaround time for payload: " + payloadType + ": " + (System.nanoTime() - start)/1000000.0); List<Throwable> errors = serverCtx.getErrorList(); for(Throwable t: errors) { throw t; } AssertableMessage treq = new AssertableMessage("request", request); treq.assertTransportHeader(SOAHeaders.REQUEST_DATA_FORMAT, payloadType); treq.assertTransportHeader(SOAHeaders.RESPONSE_DATA_FORMAT, payloadType); Message response = serverCtx.getResponseMessage(); AssertableMessage tresp = new AssertableMessage("response", response); tresp.assertTransportHeader(ClientReadHeaderHandler.COPIED_REQUEST_HEADER_PREFIX + SOAHeaders.REQUEST_DATA_FORMAT, payloadType); tresp.assertTransportHeader(ClientReadHeaderHandler.COPIED_REQUEST_HEADER_PREFIX + SOAHeaders.RESPONSE_DATA_FORMAT, payloadType); // Test for SetResponseHeaderHandler tresp.assertTransportHeader(SetResponseHeaderHandler.KEY, SetResponseHeaderHandler.VALUE); // Tests for RequestObjectNodeAccessHandler tresp.assertTransportHeader(RequestObjectNodeAccessHandler.H_BODY_1, "SOA SOA, SOS."); tresp.assertTransportHeader(RequestObjectNodeAccessHandler.H_REQUEST_BODY_NODE_CLASS_TYPE, MyMessage.class.getSimpleName()); tresp.assertTransportHeader(RequestObjectNodeAccessHandler.H_REQUEST_BODY_NODE_TYPE_PRE_DESER, ObjectNodeType.XML.name()); tresp.assertTransportHeader(RequestObjectNodeAccessHandler.H_REQUEST_BODY_NODE_TYPE_POST_DESER, ObjectNodeType.JAVA.name()); // Tests for ResponseObjectNodeAccessHandler tresp.assertTransportHeader(RequestObjectNodeAccessHandler.H_REQUEST_BODY_NODE_TYPE_POST_DESER, ObjectNodeType.JAVA.name()); tresp.assertTransportHeader(ResponseObjectNodeAccessHandler.H_RESPONSE_BODY_NODE_CLASS_TYPE, MyMessage.class.getSimpleName()); tresp.assertTransportHeader(ResponseObjectNodeAccessHandler.H_RESPONSE_BODY_NODE_TYPE, ObjectNodeType.JAVA.name()); tresp.dumpParams(); MyMessage msgOut = tresp.getParamMessage(0); String prefix = "response.param(0).MyMessage"; Assert.assertThat(prefix + ".subject", msgOut.getSubject(), is(ServerMessageContextTestBuilder.TEST1_SUBJECT)); Map<String,Address> recipients = msgOut.getRecipients(); Assert.assertThat(prefix + ".recipients", recipients, notNullValue()); Address address0 = recipients.get(ServerMessageContextTestBuilder.TEST1_EMAIL_ADDRESS); Assert.assertThat(prefix + ".recipients[" + ServerMessageContextTestBuilder.TEST1_EMAIL_ADDRESS + "]", address0, notNullValue()); Assert.assertThat(prefix + ".recipients[" + ServerMessageContextTestBuilder.TEST1_EMAIL_ADDRESS + "].city", address0.getCity(), is(TestUtils.CITY_NAME)); tresp.assertTransportHeader(RequestObjectNodeAccessHandler.H_REQUEST_MSG_STRING, msgOut.toString()); } class AssertableMessage { private String type; private Message message; public AssertableMessage(String type, Message message) { this.type = type; this.message = message; } public MyMessage getParamMessage(int index) throws ServiceException { // Make sure we actually have the parameter. Assert.assertThat(type + ".paramcount", message.getParamCount(), greaterThanOrEqualTo(index+1)); Object obj = message.getParam(index); String prefix = type + ".param(" + index + ")"; // Make sure it has a value Assert.assertThat(prefix, obj, notNullValue()); Assert.assertTrue(prefix + " is of type MyMessage", (obj instanceof MyMessage)); return (MyMessage) obj; } public void dumpParams() throws ServiceException { int count = message.getParamCount(); System.out.printf("%s.paramcount=%d%n",type,count); for(int i=0; i<count; i++) { Object obj = message.getParam(i); if(obj == null) { System.out.printf(" [%d] <null>%n", i); continue; } if(obj instanceof MyMessage) { MyMessage msg = (MyMessage) obj; System.out.printf(" [%d] (MyMessage)%n", i); System.out.printf(" .subject=%s%n", msg.getSubject()); System.out.printf(" .body=%s%n", msg.getBody()); System.out.printf(" .recipients=%s%n", msg.getRecipients()); System.out.printf(" .toString=%s%n", msg.toString()); continue; } System.out.printf(" [%d] (%s) %s%n", i, obj.getClass().getName(), obj.toString()); } } public void assertTransportHeader(String headerName, String expectedValue) throws ServiceException { Assert.assertThat(type + ".transportHeader[" + headerName + "]", message.getTransportHeader(headerName), is(expectedValue)); } } }