1   /*
2    * Copyright 2008 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.soap.addressing.server;
18  
19  import java.net.URI;
20  import java.util.Iterator;
21  import java.util.Locale;
22  
23  import org.easymock.MockControl;
24  
25  import org.springframework.ws.context.DefaultMessageContext;
26  import org.springframework.ws.context.MessageContext;
27  import org.springframework.ws.soap.SoapHeaderElement;
28  import org.springframework.ws.soap.SoapMessage;
29  import org.springframework.ws.soap.addressing.AbstractWsAddressingTestCase;
30  import org.springframework.ws.soap.addressing.messageid.MessageIdStrategy;
31  import org.springframework.ws.soap.addressing.version.AddressingVersion;
32  import org.springframework.ws.soap.saaj.SaajSoapMessage;
33  import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
34  import org.springframework.ws.transport.WebServiceConnection;
35  import org.springframework.ws.transport.WebServiceMessageSender;
36  
37  public abstract class AbstractAddressingInterceptorTestCase extends AbstractWsAddressingTestCase {
38  
39      protected AddressingEndpointInterceptor interceptor;
40  
41      protected MockControl strategyControl;
42  
43      protected MessageIdStrategy strategyMock;
44  
45      protected final void onSetUp() throws Exception {
46          strategyControl = MockControl.createControl(MessageIdStrategy.class);
47          strategyMock = (MessageIdStrategy) strategyControl.getMock();
48          strategyControl.expectAndDefaultReturn(strategyMock.isDuplicate(null), false);
49          URI replyAction = new URI("urn:replyAction");
50          URI faultAction = new URI("urn:faultAction");
51          interceptor = new AddressingEndpointInterceptor(getVersion(), strategyMock, new WebServiceMessageSender[0],
52                  replyAction, faultAction);
53      }
54  
55      public void testUnderstands() throws Exception {
56          SaajSoapMessage validRequest = loadSaajMessage(getTestPath() + "/valid.xml");
57          Iterator iterator = validRequest.getSoapHeader().examineAllHeaderElements();
58          strategyControl.replay();
59          while (iterator.hasNext()) {
60              SoapHeaderElement headerElement = (SoapHeaderElement) iterator.next();
61              assertTrue("Header [" + headerElement.getName() + " not understood",
62                      interceptor.understands(headerElement));
63          }
64          strategyControl.verify();
65      }
66  
67      public void testValidRequest() throws Exception {
68          SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/valid.xml");
69          MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(messageFactory));
70          strategyControl.replay();
71          boolean result = interceptor.handleRequest(context, null);
72          assertTrue("Valid request not handled", result);
73          assertFalse("Message Context has response", context.hasResponse());
74          strategyControl.verify();
75      }
76  
77      public void testNoMessageId() throws Exception {
78          SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-no-message-id.xml");
79          MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(messageFactory));
80          strategyControl.replay();
81          boolean result = interceptor.handleRequest(context, null);
82          assertFalse("Request with no MessageID handled", result);
83          assertTrue("Message Context has no response", context.hasResponse());
84          SaajSoapMessage expectedResponse = loadSaajMessage(getTestPath() + "/response-no-message-id.xml");
85          assertXMLEqual("Invalid response for message with no MessageID", expectedResponse,
86                  (SaajSoapMessage) context.getResponse());
87          strategyControl.verify();
88      }
89  
90      public void testNoReplyTo() throws Exception {
91          SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-no-reply-to.xml");
92          MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(messageFactory));
93          URI messageId = new URI("uid:1234");
94          strategyControl.expectAndReturn(strategyMock.newMessageId((SoapMessage) context.getResponse()), messageId);
95          strategyControl.replay();
96          boolean result = interceptor.handleResponse(context, null);
97          assertTrue("Request with no ReplyTo not handled", result);
98          assertTrue("Message Context has no response", context.hasResponse());
99          SaajSoapMessage expectedResponse = loadSaajMessage(getTestPath() + "/response-anonymous.xml");
100         assertXMLEqual("Invalid response for message with invalid MAP", expectedResponse,
101                 (SaajSoapMessage) context.getResponse());
102         strategyControl.verify();
103     }
104 
105     public void testAnonymousReplyTo() throws Exception {
106         SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-anonymous.xml");
107         MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(messageFactory));
108         URI messageId = new URI("uid:1234");
109         strategyControl.expectAndReturn(strategyMock.newMessageId((SoapMessage) context.getResponse()), messageId);
110         strategyControl.replay();
111         boolean result = interceptor.handleResponse(context, null);
112         assertTrue("Request with anonymous ReplyTo not handled", result);
113         SaajSoapMessage expectedResponse = loadSaajMessage(getTestPath() + "/response-anonymous.xml");
114         assertXMLEqual("Invalid response for message with invalid MAP", expectedResponse,
115                 (SaajSoapMessage) context.getResponse());
116         strategyControl.verify();
117     }
118 
119     public void testNoneReplyTo() throws Exception {
120         SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-none.xml");
121         MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(messageFactory));
122         strategyControl.replay();
123         boolean result = interceptor.handleResponse(context, null);
124         assertFalse("None request handled", result);
125         assertFalse("Message context has response", context.hasResponse());
126         strategyControl.verify();
127     }
128 
129     public void testFaultTo() throws Exception {
130         SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-fault-to.xml");
131         MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(messageFactory));
132         SaajSoapMessage response = (SaajSoapMessage) context.getResponse();
133         response.getSoapBody().addServerOrReceiverFault("Error", Locale.ENGLISH);
134         URI messageId = new URI("uid:1234");
135         strategyControl.expectAndReturn(strategyMock.newMessageId((SoapMessage) context.getResponse()), messageId);
136         strategyControl.replay();
137         boolean result = interceptor.handleFault(context, null);
138         assertTrue("Request with anonymous FaultTo not handled", result);
139         SaajSoapMessage expectedResponse = loadSaajMessage(getTestPath() + "/response-fault-to.xml");
140         assertXMLEqual("Invalid response for message with invalid MAP", expectedResponse,
141                 (SaajSoapMessage) context.getResponse());
142         strategyControl.verify();
143     }
144 
145     public void testOutOfBandReplyTo() throws Exception {
146         MockControl senderControl = MockControl.createControl(WebServiceMessageSender.class);
147         WebServiceMessageSender senderMock = (WebServiceMessageSender) senderControl.getMock();
148 
149         URI replyAction = new URI("urn:replyAction");
150         URI faultAction = new URI("urn:replyAction");
151         interceptor =
152                 new AddressingEndpointInterceptor(getVersion(), strategyMock, new WebServiceMessageSender[]{senderMock},
153                         replyAction, faultAction);
154 
155         MockControl connectionControl = MockControl.createControl(WebServiceConnection.class);
156         WebServiceConnection connectionMock = (WebServiceConnection) connectionControl.getMock();
157 
158         SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/valid.xml");
159         MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(messageFactory));
160         SaajSoapMessage response = (SaajSoapMessage) context.getResponse();
161 
162         URI messageId = new URI("uid:1234");
163         strategyControl.expectAndReturn(strategyMock.newMessageId((SoapMessage) context.getResponse()), messageId);
164 
165         URI uri = new URI("http://example.com/business/client1");
166         senderControl.expectAndReturn(senderMock.supports(uri), true);
167         senderControl.expectAndReturn(senderMock.createConnection(uri), connectionMock);
168         connectionMock.send(response);
169         connectionMock.close();
170 
171         strategyControl.replay();
172         senderControl.replay();
173         connectionControl.replay();
174 
175         boolean result = interceptor.handleResponse(context, null);
176         assertFalse("Out of Band request handled", result);
177         assertFalse("Message context has response", context.hasResponse());
178 
179         strategyControl.verify();
180         senderControl.verify();
181         connectionControl.verify();
182     }
183 
184     protected abstract AddressingVersion getVersion();
185 
186     protected abstract String getTestPath();
187 
188 }