1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.soap.server.endpoint;
18
19 import java.io.IOException;
20 import java.util.Locale;
21 import java.util.Properties;
22 import javax.xml.soap.MessageFactory;
23 import javax.xml.soap.SOAPConstants;
24 import javax.xml.soap.SOAPMessage;
25
26 import org.springframework.ws.context.DefaultMessageContext;
27 import org.springframework.ws.context.MessageContext;
28 import org.springframework.ws.soap.SoapMessage;
29 import org.springframework.ws.soap.SoapMessageException;
30 import org.springframework.ws.soap.SoapMessageFactory;
31 import org.springframework.ws.soap.SoapVersion;
32 import org.springframework.ws.soap.saaj.SaajSoapMessage;
33 import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
34 import org.springframework.ws.soap.soap11.Soap11Fault;
35 import org.springframework.ws.soap.soap12.Soap12Fault;
36
37 import org.junit.Assert;
38 import org.junit.Before;
39 import org.junit.Test;
40
41 public class SoapFaultMappingExceptionResolverTest {
42
43 private SoapFaultMappingExceptionResolver resolver;
44
45 @Before
46 public void setUp() throws Exception {
47 resolver = new SoapFaultMappingExceptionResolver();
48 }
49
50 @Test
51 public void testGetDepth() throws Exception {
52 Assert.assertEquals("Invalid depth for Exception", 0, resolver.getDepth("java.lang.Exception", new Exception()));
53 Assert.assertEquals("Invalid depth for IllegalArgumentException", 2,
54 resolver.getDepth("java.lang.Exception", new IllegalArgumentException()));
55 Assert.assertEquals("Invalid depth for IllegalStateException", -1,
56 resolver.getDepth("IllegalArgumentException", new IllegalStateException()));
57 }
58
59 @Test
60 public void testResolveExceptionClientSoap11() throws Exception {
61 Properties mappings = new Properties();
62 mappings.setProperty(Exception.class.getName(), "SERVER, Server error");
63 mappings.setProperty(RuntimeException.class.getName(), "CLIENT, Client error");
64 resolver.setExceptionMappings(mappings);
65
66 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
67 SOAPMessage message = messageFactory.createMessage();
68 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
69 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
70
71 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
72 Assert.assertTrue("resolveException returns false", result);
73 Assert.assertTrue("Context has no response", context.hasResponse());
74 SoapMessage response = (SoapMessage) context.getResponse();
75 Assert.assertTrue("Response has no fault", response.getSoapBody().hasFault());
76 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
77 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
78 fault.getFaultCode());
79 Assert.assertEquals("Invalid fault string on fault", "Client error", fault.getFaultStringOrReason());
80 Assert.assertNull("Detail on fault", fault.getFaultDetail());
81 }
82
83 @Test
84 public void testResolveExceptionSenderSoap12() throws Exception {
85 Properties mappings = new Properties();
86 mappings.setProperty(Exception.class.getName(), "RECEIVER, Receiver error, en");
87 mappings.setProperty(RuntimeException.class.getName(), "SENDER, Sender error, en");
88 resolver.setExceptionMappings(mappings);
89
90 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
91 SOAPMessage message = messageFactory.createMessage();
92 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
93 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
94
95 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
96 Assert.assertTrue("resolveException returns false", result);
97 Assert.assertTrue("Context has no response", context.hasResponse());
98 SoapMessage response = (SoapMessage) context.getResponse();
99 Assert.assertTrue("Response has no fault", response.getSoapBody().hasFault());
100 Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault();
101 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getClientOrSenderFaultName(),
102 fault.getFaultCode());
103 Assert.assertEquals("Invalid fault string on fault", "Sender error", fault.getFaultReasonText(Locale.ENGLISH));
104 Assert.assertNull("Detail on fault", fault.getFaultDetail());
105 }
106
107 @Test
108 public void testResolveExceptionServerSoap11() throws Exception {
109 Properties mappings = new Properties();
110 mappings.setProperty(Exception.class.getName(), "CLIENT, Client error");
111 mappings.setProperty(RuntimeException.class.getName(), "SERVER, Server error");
112 resolver.setExceptionMappings(mappings);
113
114 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
115 SOAPMessage message = messageFactory.createMessage();
116 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
117 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
118
119 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
120 Assert.assertTrue("resolveException returns false", result);
121 Assert.assertTrue("Context has no response", context.hasResponse());
122 SoapMessage response = (SoapMessage) context.getResponse();
123 Assert.assertTrue("Response has no fault", response.getSoapBody().hasFault());
124 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
125 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getServerOrReceiverFaultName(),
126 fault.getFaultCode());
127 Assert.assertEquals("Invalid fault string on fault", "Server error", fault.getFaultStringOrReason());
128 Assert.assertNull("Detail on fault", fault.getFaultDetail());
129 }
130
131 @Test
132 public void testResolveExceptionReceiverSoap12() throws Exception {
133 Properties mappings = new Properties();
134 mappings.setProperty(Exception.class.getName(), "SENDER, Sender error");
135 mappings.setProperty(RuntimeException.class.getName(), "RECEIVER, Receiver error");
136 resolver.setExceptionMappings(mappings);
137
138 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
139 SOAPMessage message = messageFactory.createMessage();
140 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
141 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
142
143 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
144 Assert.assertTrue("resolveException returns false", result);
145 Assert.assertTrue("Context has no response", context.hasResponse());
146 SoapMessage response = (SoapMessage) context.getResponse();
147 Assert.assertTrue("Response has no fault", response.getSoapBody().hasFault());
148 Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault();
149 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getServerOrReceiverFaultName(),
150 fault.getFaultCode());
151 Assert.assertEquals("Invalid fault string on fault", "Receiver error", fault.getFaultReasonText(Locale.ENGLISH));
152 Assert.assertNull("Detail on fault", fault.getFaultDetail());
153 }
154
155 @Test
156 public void testResolveExceptionDefault() throws Exception {
157 Properties mappings = new Properties();
158 mappings.setProperty(SoapMessageException.class.getName(), "SERVER,Server error");
159 resolver.setExceptionMappings(mappings);
160 SoapFaultDefinition defaultFault = new SoapFaultDefinition();
161 defaultFault.setFaultCode(SoapFaultDefinition.CLIENT);
162 resolver.setDefaultFault(defaultFault);
163 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
164 SOAPMessage message = messageFactory.createMessage();
165 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
166 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
167
168 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
169 Assert.assertTrue("resolveException returns false", result);
170 Assert.assertTrue("Context has no response", context.hasResponse());
171 SoapMessage response = (SoapMessage) context.getResponse();
172 Assert.assertTrue("Response has no fault", response.getSoapBody().hasFault());
173 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
174 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
175 fault.getFaultCode());
176 Assert.assertEquals("Invalid fault string on fault", "bla", fault.getFaultStringOrReason());
177 Assert.assertNull("Detail on fault", fault.getFaultDetail());
178
179
180 result = resolver.resolveException(context, null, new IllegalArgumentException());
181 Assert.assertTrue("resolveException returns false", result);
182 Assert.assertTrue("Context has no response", context.hasResponse());
183 response = (SoapMessage) context.getResponse();
184 Assert.assertTrue("Response has no fault", response.getSoapBody().hasFault());
185 fault = (Soap11Fault) response.getSoapBody().getFault();
186 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
187 fault.getFaultCode());
188 Assert.assertEquals("Invalid fault string on fault", "java.lang.IllegalArgumentException",
189 fault.getFaultStringOrReason());
190 Assert.assertNull("Detail on fault", fault.getFaultDetail());
191 }
192
193 @Test
194 public void testResolveNoMessageException() throws Exception {
195 Properties mappings = new Properties();
196 mappings.setProperty(IOException.class.getName(), "SERVER");
197 resolver.setExceptionMappings(mappings);
198
199 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
200 SOAPMessage message = messageFactory.createMessage();
201 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
202 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
203
204 boolean result = resolver.resolveException(context, null, new IOException());
205 Assert.assertTrue("resolveException returns false", result);
206 Assert.assertTrue("Context has no response", context.hasResponse());
207 SoapMessage response = (SoapMessage) context.getResponse();
208 Assert.assertTrue("Response has no fault", response.getSoapBody().hasFault());
209 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
210 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getServerOrReceiverFaultName(),
211 fault.getFaultCode());
212 Assert.assertEquals("Invalid fault string on fault", "java.io.IOException", fault.getFaultStringOrReason());
213 Assert.assertNull("Detail on fault", fault.getFaultDetail());
214 }
215
216
217 }