/**
* 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.systest.coloc;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Holder;
import javax.xml.ws.WebServiceException;
import org.apache.cxf.message.Message;
import org.apache.headers.coloc.types.FaultDetailT;
import org.apache.headers.coloc.types.HeaderInfo;
import org.apache.headers.coloc.types.InHeaderResponseT;
import org.apache.headers.coloc.types.InHeaderT;
import org.apache.headers.coloc.types.InoutHeaderResponseT;
import org.apache.headers.coloc.types.InoutHeaderT;
import org.apache.headers.coloc.types.OutHeaderResponseT;
import org.apache.headers.coloc.types.OutHeaderT;
import org.apache.headers.coloc.types.PingMeResponseT;
import org.apache.headers.coloc.types.PingMeT;
import org.apache.headers.rpc_lit.HeaderTester;
import org.apache.headers.rpc_lit.PingMeFault;
import org.junit.Before;
//import org.junit.Ignore;
import org.junit.Test;
/**
* This class invokes the service described in /wsdl/header_rpc_lit.wsdl.
* This WSDL contains operations with in-out parameters.
* It sets up the a client in "testRouter()" to send requests to the
* router which is listening on port 9001 (SOAP/HTTP).
* The subclass defines where CXF configuration and the
* target server (transport, etc).
*
*/
public abstract class AbstractHeaderServiceRpcLitTest extends AbstractColocTest {
static final QName SERVICE_NAME = new QName("http://apache.org/headers/rpc_lit",
"SOAPHeaderService");
static final QName PORT_NAME = new QName("http://apache.org/headers/rpc_lit",
"SoapPort");
static final String WSDL_LOCATION = "/wsdl/header_rpc_lit.wsdl";
private HeaderTester port;
@Before
public void setUp() throws Exception {
super.setUp();
port = getPort(
getServiceQname(),
getPortQName(),
getWsdlLocation(),
HeaderTester.class);
}
@Test
public void testTwoWayOperation() {
for (int idx = 0; idx < 2; idx++) {
verifyTwoWay(port);
}
}
@Test
public void testInHeaderParts() {
for (int idx = 0; idx < 2; idx++) {
verifyInHeaderParts(port);
}
}
@Test
public void testInOutHeaderParts() {
for (int idx = 0; idx < 2; idx++) {
verifyInOutHeaderParts(port);
}
}
@Test
public void testOutHeaderParts() {
for (int idx = 0; idx < 2; idx++) {
verifyOutHeaderParts(port);
}
}
@Test
public void testFault() {
for (int idx = 0; idx < 2; idx++) {
verifyFaults(port);
}
}
@Test
public void testAll() {
for (int idx = 0; idx < 2; idx++) {
verifyTwoWay(port);
verifyInHeaderParts(port);
verifyInOutHeaderParts(port);
verifyOutHeaderParts(port);
verifyFaults(port);
}
}
public void verifyTwoWay(HeaderTester ht) {
getLogger().debug("Client: calling pingMe");
PingMeT in = new PingMeT();
try {
in.setFaultType("ABCD");
PingMeResponseT ret = ht.pingMe(in);
assertNotNull(ret);
} catch (Exception ex) {
fail("Should not throw any exception");
}
}
protected void verifyInHeaderParts(HeaderTester ht) {
getLogger().debug("Client: calling inHeader");
InHeaderT inHeader = new InHeaderT();
inHeader.setRequestType(HeaderTesterUtil.IN_REQUEST_TYPE);
HeaderInfo headerInfo = new HeaderInfo();
headerInfo.setMessage(HeaderTesterUtil.IN_MESSAGE);
headerInfo.setOriginator(HeaderTesterUtil.IN_ORIGINATOR);
InHeaderResponseT inHeaderResponse = ht.inHeader(inHeader, headerInfo);
assertEquals(HeaderTesterUtil.OUT_RESPONSE_TYPE, inHeaderResponse.getResponseType());
}
protected void verifyInOutHeaderParts(HeaderTester ht) {
getLogger().debug("Client: calling inoutHeader");
InoutHeaderT inoutHeader = new InoutHeaderT();
inoutHeader.setRequestType(HeaderTesterUtil.INOUT_REQUEST_TYPE_IN);
HeaderInfo headerInfo = new HeaderInfo();
headerInfo.setMessage(HeaderTesterUtil.INOUT_MESSAGE_IN);
headerInfo.setOriginator(HeaderTesterUtil.INOUT_ORIGINATOR_IN);
Holder<HeaderInfo> holder = new Holder<HeaderInfo>();
holder.value = headerInfo;
InoutHeaderResponseT inoutHeaderResponse = ht.inoutHeader(inoutHeader, holder);
assertEquals(HeaderTesterUtil.INOUT_REQUEST_TYPE_OUT,
inoutHeaderResponse.getResponseType());
assertNotSame(HeaderTesterUtil.INOUT_REQUEST_TYPE_OUT,
inoutHeader.getRequestType());
assertEquals(HeaderTesterUtil.INOUT_MESSAGE_OUT, holder.value.getMessage());
assertEquals(HeaderTesterUtil.INOUT_ORIGINATOR_OUT, holder.value.getOriginator());
}
protected void verifyOutHeaderParts(HeaderTester ht) {
getLogger().debug("Client: calling outHeader");
OutHeaderT outHeader = new OutHeaderT();
outHeader.setRequestType(HeaderTesterUtil.OUT_REQUEST_TYPE);
OutHeaderResponseT theResponse = new OutHeaderResponseT();
theResponse.setResponseType("bogus");
Holder<OutHeaderResponseT> respHolder = new Holder<OutHeaderResponseT>();
respHolder.value = theResponse;
Holder<HeaderInfo> holder = new Holder<HeaderInfo>();
HeaderInfo headerInfo = new HeaderInfo();
headerInfo.setMessage(HeaderTesterUtil.OUT_MESSAGE_IN);
headerInfo.setOriginator(HeaderTesterUtil.OUT_ORIGINATOR_IN);
holder.value = headerInfo;
ht.outHeader(outHeader, respHolder, holder);
assertEquals(HeaderTesterUtil.OUT_MESSAGE_OUT, holder.value.getMessage());
assertEquals(HeaderTesterUtil.OUT_ORIGINATOR_OUT, holder.value.getOriginator());
assertEquals(HeaderTesterUtil.OUT_RESPONSE_TYPE, respHolder.value.getResponseType());
}
public void verifyFaults(HeaderTester ht) {
getLogger().debug("Client: calling pingMe user fault");
PingMeT in = new PingMeT();
try {
in.setFaultType("USER");
ht.pingMe(in);
fail("Should throw a PingeMeFault exception");
} catch (PingMeFault pmf) {
FaultDetailT detail = pmf.getFaultInfo();
assertNotNull(detail);
assertEquals("Major Version should be 1", (short)1, detail.getMajor());
assertEquals("Minor Version should be 2", (short)2, detail.getMinor());
if (isFaultCodeCheckEnabled()) {
verifyFaultCode(port);
}
}
getLogger().debug("Client: calling pingMe Cxf System Fault");
try {
in.setFaultType("SYSTEM");
ht.pingMe(in);
fail("Should throw a CXF Fault exception");
} catch (WebServiceException fault) {
assertFalse("Wrong message: " + fault.getMessage(),
-1 == fault.getMessage().lastIndexOf(HeaderTesterUtil.EX_STRING));
if (isFaultCodeCheckEnabled()) {
verifyFaultCode(port);
}
} catch (PingMeFault pmf) {
fail("Should not receive PingMefault");
}
getLogger().debug("Client: calling pingMe java runtime exception");
try {
in.setFaultType("RUNTIME");
ht.pingMe(in);
fail("Should throw a CXF Fault exception");
} catch (WebServiceException fault) {
assertFalse(-1 == fault.getMessage().lastIndexOf(HeaderTesterUtil.EX_STRING));
if (isFaultCodeCheckEnabled()) {
verifyFaultCode(port);
}
} catch (PingMeFault pmf) {
fail("Should not receive PingMefault");
}
}
protected void verifyFaultCode(HeaderTester proxy) {
BindingProvider bp = (BindingProvider)proxy;
java.util.Map<String, Object> respCtx = bp.getResponseContext();
assertNotNull(respCtx);
Integer val = (Integer)respCtx.get(Message.RESPONSE_CODE);
assertNotNull(val);
assertEquals("Message.RESPONSE_CODE should be 500", 500, val.intValue());
}
protected String getWsdlLocation() {
return WSDL_LOCATION;
}
protected QName getServiceQname() {
return SERVICE_NAME;
}
protected QName getPortQName() {
return PORT_NAME;
}
protected boolean isFaultCodeCheckEnabled() {
return false;
}
}