/* * Copyright 2005-2014 the original author or authors. * * 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 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.ws.transport.http; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.http.HttpServletResponse; import static org.easymock.EasyMock.*; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.ws.FaultAwareWebServiceMessage; import org.springframework.ws.InvalidXmlException; import org.springframework.ws.NoEndpointFoundException; import org.springframework.ws.WebServiceMessageFactory; import org.springframework.ws.context.MessageContext; import org.springframework.ws.soap.SoapVersion; import org.springframework.ws.transport.WebServiceMessageReceiver; public class WebServiceMessageReceiverHandlerAdapterTest { private static final String REQUEST = " <SOAP-ENV:Envelope\n" + " xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" + " SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" + " <SOAP-ENV:Body>\n" + " <m:GetLastTradePrice xmlns:m=\"Some-URI\">\n" + " <symbol>DIS</symbol>\n" + " </m:GetLastTradePrice>\n" + " </SOAP-ENV:Body>\n" + "</SOAP-ENV:Envelope>"; private WebServiceMessageReceiverHandlerAdapter adapter; private MockHttpServletRequest httpRequest; private MockHttpServletResponse httpResponse; private WebServiceMessageFactory factoryMock; private FaultAwareWebServiceMessage responseMock; private FaultAwareWebServiceMessage requestMock; @Before public void setUp() throws Exception { adapter = new WebServiceMessageReceiverHandlerAdapter(); httpRequest = new MockHttpServletRequest(); httpResponse = new MockHttpServletResponse(); factoryMock = createMock(WebServiceMessageFactory.class); adapter.setMessageFactory(factoryMock); requestMock = createMock("request", FaultAwareWebServiceMessage.class); responseMock = createMock("response", FaultAwareWebServiceMessage.class); } @Test public void testHandleNonPost() throws Exception { httpRequest.setMethod(HttpTransportConstants.METHOD_GET); replayMockControls(); WebServiceMessageReceiver endpoint = new WebServiceMessageReceiver() { @Override public void receive(MessageContext messageContext) throws Exception { } }; adapter.handle(httpRequest, httpResponse, endpoint); Assert.assertEquals("METHOD_NOT_ALLOWED expected", HttpServletResponse.SC_METHOD_NOT_ALLOWED, httpResponse.getStatus()); verifyMockControls(); } @Test public void testHandlePostNoResponse() throws Exception { httpRequest.setMethod(HttpTransportConstants.METHOD_POST); httpRequest.setContent(REQUEST.getBytes("UTF-8")); httpRequest.setContentType("text/xml; charset=\"utf-8\""); httpRequest.setCharacterEncoding("UTF-8"); expect(factoryMock.createWebServiceMessage(isA(InputStream.class))).andReturn(responseMock); replayMockControls(); WebServiceMessageReceiver endpoint = new WebServiceMessageReceiver() { @Override public void receive(MessageContext messageContext) throws Exception { } }; adapter.handle(httpRequest, httpResponse, endpoint); Assert.assertEquals("Invalid status code on response", HttpServletResponse.SC_ACCEPTED, httpResponse.getStatus()); Assert.assertEquals("Response written", 0, httpResponse.getContentAsString().length()); verifyMockControls(); } @Test public void testHandlePostResponse() throws Exception { httpRequest.setMethod(HttpTransportConstants.METHOD_POST); httpRequest.setContent(REQUEST.getBytes("UTF-8")); httpRequest.setContentType("text/xml; charset=\"utf-8\""); httpRequest.setCharacterEncoding("UTF-8"); expect(factoryMock.createWebServiceMessage(isA(InputStream.class))).andReturn(requestMock); expect(factoryMock.createWebServiceMessage()).andReturn(responseMock); expect(responseMock.getFaultCode()).andReturn(null); responseMock.writeTo(isA(OutputStream.class)); replayMockControls(); WebServiceMessageReceiver endpoint = new WebServiceMessageReceiver() { @Override public void receive(MessageContext messageContext) throws Exception { messageContext.getResponse(); } }; adapter.handle(httpRequest, httpResponse, endpoint); Assert.assertEquals("Invalid status code on response", HttpServletResponse.SC_OK, httpResponse.getStatus()); verifyMockControls(); } @Test public void testHandlePostFault() throws Exception { httpRequest.setMethod(HttpTransportConstants.METHOD_POST); httpRequest.setContent(REQUEST.getBytes("UTF-8")); httpRequest.setContentType("text/xml; charset=\"utf-8\""); httpRequest.setCharacterEncoding("UTF-8"); expect(factoryMock.createWebServiceMessage(isA(InputStream.class))).andReturn(requestMock); expect(factoryMock.createWebServiceMessage()).andReturn(responseMock); expect(responseMock.getFaultCode()).andReturn(SoapVersion.SOAP_11.getServerOrReceiverFaultName()); responseMock.writeTo(isA(OutputStream.class)); replayMockControls(); WebServiceMessageReceiver endpoint = new WebServiceMessageReceiver() { @Override public void receive(MessageContext messageContext) throws Exception { messageContext.getResponse(); } }; adapter.handle(httpRequest, httpResponse, endpoint); Assert.assertEquals("Invalid status code on response", HttpServletResponse.SC_INTERNAL_SERVER_ERROR, httpResponse.getStatus()); verifyMockControls(); } @Test public void testHandleNotFound() throws Exception { httpRequest.setMethod(HttpTransportConstants.METHOD_POST); httpRequest.setContent(REQUEST.getBytes("UTF-8")); httpRequest.setContentType("text/xml; charset=\"utf-8\""); httpRequest.setCharacterEncoding("UTF-8"); expect(factoryMock.createWebServiceMessage(isA(InputStream.class))).andReturn(requestMock); replayMockControls(); WebServiceMessageReceiver endpoint = new WebServiceMessageReceiver() { @Override public void receive(MessageContext messageContext) throws Exception { throw new NoEndpointFoundException(messageContext.getRequest()); } }; adapter.handle(httpRequest, httpResponse, endpoint); Assert.assertEquals("No 404 returned", HttpServletResponse.SC_NOT_FOUND, httpResponse.getStatus()); verifyMockControls(); } @Test public void testHandleInvalidXml() throws Exception { httpRequest.setMethod(HttpTransportConstants.METHOD_POST); httpRequest.setContent(REQUEST.getBytes("UTF-8")); httpRequest.setContentType("text/xml; charset=\"utf-8\""); httpRequest.setCharacterEncoding("UTF-8"); expect(factoryMock.createWebServiceMessage(isA(InputStream.class))).andThrow(new InvalidXmlException(null, null)); replayMockControls(); WebServiceMessageReceiver endpoint = new WebServiceMessageReceiver() { @Override public void receive(MessageContext messageContext) throws Exception { } }; adapter.handle(httpRequest, httpResponse, endpoint); Assert.assertEquals("No 400 returned", HttpServletResponse.SC_BAD_REQUEST, httpResponse.getStatus()); verifyMockControls(); } private void replayMockControls() { replay(factoryMock, requestMock, responseMock); } private void verifyMockControls() { verify(factoryMock, requestMock, responseMock); } }