1   /*
2    * Copyright 2005-2012 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.ws.transport.http;
18  
19  import java.io.ByteArrayInputStream;
20  import java.io.InputStream;
21  import java.net.URI;
22  import javax.servlet.http.HttpServletResponse;
23  import javax.xml.parsers.DocumentBuilder;
24  import javax.xml.parsers.DocumentBuilderFactory;
25  
26  import org.springframework.core.io.ClassPathResource;
27  import org.springframework.mock.web.MockHttpServletRequest;
28  import org.springframework.mock.web.MockHttpServletResponse;
29  import org.springframework.ws.wsdl.WsdlDefinition;
30  import org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition;
31  import org.springframework.xml.transform.StringSource;
32  
33  import org.junit.Assert;
34  import org.junit.Before;
35  import org.junit.Test;
36  import org.w3c.dom.Document;
37  
38  import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
39  import static org.easymock.EasyMock.*;
40  
41  public class WsdlDefinitionHandlerAdapterTest {
42  
43      private WsdlDefinitionHandlerAdapter adapter;
44  
45      private WsdlDefinition definitionMock;
46  
47      private MockHttpServletRequest request;
48  
49      private MockHttpServletResponse response;
50  
51      @Before
52      public void setUp() throws Exception {
53          adapter = new WsdlDefinitionHandlerAdapter();
54          definitionMock = createMock(WsdlDefinition.class);
55          adapter.afterPropertiesSet();
56          request = new MockHttpServletRequest();
57          response = new MockHttpServletResponse();
58      }
59  
60      @Test
61      public void handleGet() throws Exception {
62          request.setMethod(HttpTransportConstants.METHOD_GET);
63          String definition = "<definition xmlns='http://schemas.xmlsoap.org/wsdl/'/>";
64          expect(definitionMock.getSource()).andReturn(new StringSource(definition));
65  
66          replay(definitionMock);
67  
68          adapter.handle(request, response, definitionMock);
69          assertXMLEqual(definition, response.getContentAsString());
70  
71          verify(definitionMock);
72      }
73  
74      @Test
75      public void handleNonGet() throws Exception {
76          request.setMethod(HttpTransportConstants.METHOD_POST);
77  
78          replay(definitionMock);
79  
80          adapter.handle(request, response, definitionMock);
81          Assert.assertEquals("METHOD_NOT_ALLOWED expected", HttpServletResponse.SC_METHOD_NOT_ALLOWED,
82                  response.getStatus());
83  
84          verify(definitionMock);
85      }
86  
87      @Test
88      public void transformLocations() throws Exception {
89          adapter.setTransformLocations(true);
90          request.setMethod(HttpTransportConstants.METHOD_GET);
91          request.setScheme("http");
92          request.setServerName("example.com");
93          request.setServerPort(8080);
94          request.setContextPath("/context");
95          request.setServletPath("/service.wsdl");
96          request.setPathInfo(null);
97          request.setRequestURI("/context/service.wsdl");
98  
99          replay(definitionMock);
100 
101         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
102         documentBuilderFactory.setNamespaceAware(true);
103         DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
104         Document result = documentBuilder.parse(getClass().getResourceAsStream("wsdl11-input.wsdl"));
105         adapter.transformLocations(result, request);
106         Document expectedDocument = documentBuilder.parse(getClass().getResourceAsStream("wsdl11-expected.wsdl"));
107         assertXMLEqual("Invalid result", expectedDocument, result);
108 
109         verify(definitionMock);
110     }
111 
112     @Test
113     public void transformLocationFullUrl() throws Exception {
114         request.setScheme("http");
115         request.setServerName("example.com");
116         request.setServerPort(8080);
117         request.setContextPath("/context");
118         request.setPathInfo("/service.wsdl");
119         request.setRequestURI("/context/service.wsdl");
120         String oldLocation = "http://localhost:8080/context/service";
121 
122         String result = adapter.transformLocation(oldLocation, request);
123         Assert.assertNotNull("No result", result);
124         Assert.assertEquals("Invalid result", new URI("http://example.com:8080/context/service"), new URI(result));
125     }
126 
127     @Test
128     public void transformLocationEmptyContextFullUrl() throws Exception {
129         request.setScheme("http");
130         request.setServerName("example.com");
131         request.setServerPort(8080);
132         request.setContextPath("");
133         request.setRequestURI("/service.wsdl");
134         String oldLocation = "http://localhost:8080/service";
135 
136         String result = adapter.transformLocation(oldLocation, request);
137         Assert.assertNotNull("No result", result);
138         Assert.assertEquals("Invalid result", new URI("http://example.com:8080/service"), new URI(result));
139     }
140 
141     @Test
142     public void transformLocationRelativeUrl() throws Exception {
143         request.setScheme("http");
144         request.setServerName("example.com");
145         request.setServerPort(8080);
146         request.setContextPath("/context");
147         request.setPathInfo("/service.wsdl");
148         request.setRequestURI("/context/service.wsdl");
149         String oldLocation = "/service";
150 
151         String result = adapter.transformLocation(oldLocation, request);
152         Assert.assertNotNull("No result", result);
153         Assert.assertEquals("Invalid result", new URI("http://example.com:8080/context/service"), new URI(result));
154     }
155 
156     @Test
157     public void transformLocationEmptyContextRelativeUrl() throws Exception {
158         request.setScheme("http");
159         request.setServerName("example.com");
160         request.setServerPort(8080);
161         request.setContextPath("");
162         request.setRequestURI("/service.wsdl");
163         String oldLocation = "/service";
164 
165         String result = adapter.transformLocation(oldLocation, request);
166         Assert.assertNotNull("No result", result);
167         Assert.assertEquals("Invalid result", new URI("http://example.com:8080/service"), new URI(result));
168     }
169 
170     @Test
171     public void handleSimpleWsdl11DefinitionWithoutTransformLocations() throws Exception {
172         adapter.setTransformLocations(false);
173         request.setMethod(HttpTransportConstants.METHOD_GET);
174         request.setScheme("http");
175         request.setServerName("example.com");
176         request.setServerPort(8080);
177         request.setContextPath("/context");
178         request.setServletPath("/service.wsdl");
179         request.setPathInfo(null);
180         request.setRequestURI("/context/service.wsdl");
181 
182         SimpleWsdl11Definition definition =
183                 new SimpleWsdl11Definition(new ClassPathResource("echo-input.wsdl", getClass()));
184 
185         adapter.handle(request, response, definition);
186 
187         InputStream inputStream = new ByteArrayInputStream(response.getContentAsByteArray());
188         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
189         documentBuilderFactory.setNamespaceAware(true);
190         DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
191         Document resultingDocument = documentBuilder.parse(inputStream);
192 
193         documentBuilder = documentBuilderFactory.newDocumentBuilder();
194         Document expectedDocument = documentBuilder.parse(getClass().getResourceAsStream("echo-input.wsdl"));
195         assertXMLEqual("Invalid WSDL returned", expectedDocument, resultingDocument);
196     }
197 
198     @Test
199     public void handleSimpleWsdl11DefinitionWithTransformLocation() throws Exception {
200         adapter.setTransformLocations(true);
201         adapter.setTransformSchemaLocations(true);
202 
203         request.setMethod(HttpTransportConstants.METHOD_GET);
204         request.setScheme("http");
205         request.setServerName("example.com");
206         request.setServerPort(80);
207         request.setContextPath("/context");
208         request.setServletPath("/service.wsdl");
209         request.setPathInfo(null);
210         request.setRequestURI("/context/service.wsdl");
211 
212         SimpleWsdl11Definition definition =
213                 new SimpleWsdl11Definition(new ClassPathResource("echo-input.wsdl", getClass()));
214 
215         adapter.handle(request, response, definition);
216 
217         InputStream inputStream = new ByteArrayInputStream(response.getContentAsByteArray());
218         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
219         documentBuilderFactory.setNamespaceAware(true);
220         DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
221         Document resultingDocument = documentBuilder.parse(inputStream);
222 
223         documentBuilder = documentBuilderFactory.newDocumentBuilder();
224         Document expectedDocument = documentBuilder.parse(getClass().getResourceAsStream("echo-expected.wsdl"));
225         assertXMLEqual("Invalid WSDL returned", expectedDocument, resultingDocument);
226     }
227 
228 }