/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.cxf.binding.soap.interceptor;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.cxf.attachment.AttachmentDeserializer;
import org.apache.cxf.binding.soap.Soap11;
import org.apache.cxf.binding.soap.Soap12;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.SoapVersion;
import org.apache.cxf.message.Message;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
*
*/
public class SoapActionInInterceptorTest extends Assert {
private IMocksControl control;
@Before
public void setUp() {
control = EasyMock.createNiceControl();
}
@Test
public void testGetSoapActionForSOAP11() throws Exception {
SoapMessage message = setUpMessage("text/xml", Soap11.getInstance(), "urn:cxf");
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertEquals("urn:cxf", action);
control.verify();
}
@Test
public void testGetSoapActionForSOAP11None() throws Exception {
SoapMessage message = setUpMessage("text/xml", Soap11.getInstance(), null);
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertNull(action);
control.verify();
}
@Test
public void testGetSoapActionForSOAP12() throws Exception {
SoapMessage message = setUpMessage("application/soap+xml; action=\"urn:cxf\"", Soap12.getInstance(), null);
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertEquals("urn:cxf", action);
control.verify();
}
@Test
public void testGetSoapActionForSOAP12None() throws Exception {
SoapMessage message = setUpMessage("application/soap+xml", Soap12.getInstance(), null);
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertNull(action);
control.verify();
}
@Test
public void testGetSoapActionForSOAP11SwA() throws Exception {
SoapMessage message = setUpMessage("multipart/related", Soap11.getInstance(), "urn:cxf");
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertEquals("urn:cxf", action);
control.verify();
}
@Test
// note this combination of SOAP12 with SwA is not normative, but some systems may use it.
// here the optional start-info is used to encode action as in start-info="application/soap+xml; action=\"urn:cxf\""
public void testGetSoapActionForSOAP12SwAWithStartInfo() throws Exception {
SoapMessage message = setUpMessage(
"multipart/related; start-info=\"application/soap+xml; action=\\\"urn:cxf\\\"",
Soap12.getInstance(), null);
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertEquals("urn:cxf", action);
control.verify();
}
@Test
// note this combination of SOAP12 with SwA is not normative, but some systems use it.
// here the action property is set as in action="urn:cxf", although this usage is invalid because the action
// property is not part of the multipart/related media type.
public void testGetSoapActionForSOAP12SwAWithAction() throws Exception {
SoapMessage message = setUpMessage(
"multipart/related; start-info=\"application/soap+xml\"; action=\"urn:cxf\"",
Soap12.getInstance(), null);
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertEquals("urn:cxf", action);
control.verify();
}
@Test
// note this combination of SOAP12 with SwA is not normative, but some systems may use it.
// here the action property is only set at the part header as in action="urn:cxf"
public void testGetSoapActionForSOAP12SwAWithActionInPartHeaders() throws Exception {
SoapMessage message = setUpMessage(
"multipart/related",
Soap12.getInstance(), "urn:cxf");
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertEquals("urn:cxf", action);
control.verify();
}
@Test
// note this combination of SOAP12 with SwA is not normative, but some systems may use it.
public void testGetSoapActionForSOAP12SwANone() throws Exception {
SoapMessage message = setUpMessage(
"multipart/related",
Soap12.getInstance(), null);
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertNull(action);
control.verify();
}
@Test
public void testGetSoapActionForSOAP11MTOM() throws Exception {
SoapMessage message = setUpMessage(
"multipart/related; type=\"application/xop+xml\"; start-info=\"text/xml\"",
Soap11.getInstance(), "urn:cxf");
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertEquals("urn:cxf", action);
control.verify();
}
@Test
// some systems use this form, although this is not spec-conformant as
// the action property is not part of the multipart/related media type.
// here the action propety is set as in start-info="application/soap+xml"; action="urn:cxf"
public void testGetSoapActionForSOAP12MTOMWithAction() throws Exception {
SoapMessage message = setUpMessage(
"multipart/related; type=\"application/xop+xml\""
+ "; start-info=\"application/soap+xml\"; action=\"urn:cxf\"",
Soap11.getInstance(), "urn:cxf");
control.replay();
String action = SoapActionInInterceptor.getSoapAction(message);
assertEquals("urn:cxf", action);
control.verify();
}
private SoapMessage setUpMessage(String contentType, SoapVersion version, String prop) {
SoapMessage message = control.createMock(SoapMessage.class);
Map<String, List<String>> headers = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
Map<String, List<String>> partHeaders = new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER);
if (version instanceof Soap11 && prop != null) {
headers.put("SOAPAction", Collections.singletonList(prop));
} else if (version instanceof Soap12 && prop != null) {
partHeaders.put(Message.CONTENT_TYPE,
Collections.singletonList("application/soap+xml; action=\"" + prop + "\""));
}
EasyMock.expect(message.getVersion()).andReturn(version).anyTimes();
EasyMock.expect(message.get(Message.CONTENT_TYPE)).andReturn(contentType).anyTimes();
EasyMock.expect(message.get(Message.PROTOCOL_HEADERS)).andReturn(headers).anyTimes();
EasyMock.expect(message.get(AttachmentDeserializer.ATTACHMENT_PART_HEADERS)).andReturn(partHeaders).anyTimes();
return message;
}
}