/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* Licensed 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
*******************************************************************************/
package org.ebayopensource.turmeric.runtime.tests.common.sif;
import static org.hamcrest.Matchers.*;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Response;
import javax.xml.ws.WebServiceException;
import org.ebayopensource.turmeric.runtime.binding.BindingConstants;
import org.ebayopensource.turmeric.runtime.binding.objectnode.ObjectNode;
import org.ebayopensource.turmeric.runtime.binding.objectnode.impl.JavaObjectNodeImpl;
import org.ebayopensource.turmeric.runtime.common.exceptions.ServiceException;
import org.ebayopensource.turmeric.runtime.common.exceptions.ServiceExceptionInterface;
import org.ebayopensource.turmeric.runtime.common.exceptions.ServiceInvocationException;
import org.ebayopensource.turmeric.runtime.common.impl.protocolprocessor.soap.SOAP11Fault;
import org.ebayopensource.turmeric.runtime.common.impl.protocolprocessor.soap.SOAP12Fault;
import org.ebayopensource.turmeric.runtime.common.types.Cookie;
import org.ebayopensource.turmeric.runtime.common.types.G11nOptions;
import org.ebayopensource.turmeric.runtime.common.types.SOAConstants;
import org.ebayopensource.turmeric.runtime.sif.impl.internal.config.ClientConfigManager;
import org.ebayopensource.turmeric.runtime.sif.service.RequestContext;
import org.ebayopensource.turmeric.runtime.sif.service.Service;
import org.ebayopensource.turmeric.runtime.sif.service.ServiceFactory;
import org.ebayopensource.turmeric.runtime.sif.service.ServiceInvokerOptions;
import org.ebayopensource.turmeric.runtime.spf.impl.internal.config.ServiceConfigManager;
import org.ebayopensource.turmeric.runtime.tests.common.sif.error.MarkdownTestHelper;
import org.ebayopensource.turmeric.runtime.tests.common.util.TestUtils;
import org.ebayopensource.turmeric.runtime.tests.service1.sample.Test1Constants;
import org.ebayopensource.turmeric.runtime.tests.service1.sample.errors.ErrorType;
import org.ebayopensource.turmeric.runtime.tests.service1.sample.services.message.Test1Service;
import org.ebayopensource.turmeric.runtime.tests.service1.sample.types1.CustomErrorMessage;
import org.ebayopensource.turmeric.runtime.tests.service1.sample.types1.MyMessage;
import org.ebayopensource.turmeric.common.v1.types.ErrorData;
import org.ebayopensource.turmeric.common.v1.types.CommonErrorData;
import org.ebayopensource.turmeric.common.v1.types.ErrorMessage;
import org.junit.Assert;
/**
* @author ichernyshev
*/
public class Test1Driver {
public static final String TEST1_ADMIN_NAME = "test1";
private static URL s_serviceURLOverriden = null;
private static final String[] ALL_FORMATS = { BindingConstants.PAYLOAD_XML,
BindingConstants.PAYLOAD_FAST_INFOSET,
BindingConstants.PAYLOAD_JSON, BindingConstants.PAYLOAD_NV };
public static final String OP_NAME_myTestOperation = "myTestOperation";
public static final String OP_NAME_myNonArgOperation = "myNonArgOperation";
public static final String OP_NAME_myVoidReturnOperation = "myVoidReturnOperation";
public static final String OP_NAME_serviceChainingOperation = "serviceChainingOperation";
public static final String OP_NAME_customError1 = "customError1";
public static final String OP_NAME_customError2 = "customError2";
private String m_configRoot;
private URL m_serviceURL;
private String[] m_reqDataFormats;
private String[] m_resDataFormats;
private long m_expectedError;
private long m_expectedErrorAsync;
private int m_repeatCount;
private String m_protocolName;
private Map<String, String> m_transportHeaders = new HashMap<String, String>();
private Map<String, String> m_outTransportHeaders = new HashMap<String, String>();
private Collection<ObjectNode> m_reqMessageHeaders = new ArrayList<ObjectNode>();
private Collection<ObjectNode> m_sessionMessageHeaders = new ArrayList<ObjectNode>();
private Class m_diiException;
private Class m_proxyException;
private String m_errorSubText;
protected MyMessage m_message;
private String m_operationName;
private G11nOptions m_g11nOptions = new G11nOptions();
private SuccessVerifier m_verifier;
private String m_clientName;
private String m_serviceName;
private String m_serviceVersion;
private boolean m_expectingSameMessage = true;
private List<Cookie> m_cookies;
private boolean m_isSkipSerialization;
private boolean m_isNoPayloadData;
private String m_transportName;
private boolean m_useRest;
private boolean m_useDefaultBinding;
private boolean m_isExpectResponseMsgHeader;
private boolean m_isDetachedLocalBinding;
private Integer m_requestTimeoutMs;
private String m_urlPathInfo = "";
private boolean m_isUrlPathTest = false;
public static enum TestMode {
SYNC, ASYNC_SYNC, ASYNC_PULL, ASYNC_PUSH
};
private boolean m_skipAsyncTest = false;
private boolean m_isLocalVoidReturnTest;
public static void setServiceURL(URL serviceLocation) {
s_serviceURLOverriden = serviceLocation;
}
public Test1Driver(String configRoot, URL serviceURL) {
this(TEST1_ADMIN_NAME, null, configRoot, serviceURL, null, null);
}
public Test1Driver(String serviceName, String clientName,
String configRoot, URL serviceURL) {
this(serviceName, clientName, configRoot, serviceURL, null, null);
}
public Test1Driver(String serviceName, String clientName,
String configRoot, URL serviceURL, String reqDataFormat,
String resDataFormat) {
this(serviceName, clientName, configRoot, serviceURL, reqDataFormat,
resDataFormat, "myTestOperation");
}
public Test1Driver(String serviceName, String clientName,
String configRoot, URL serviceURL, String reqDataFormat,
String resDataFormat, String operationName) {
this(
serviceName,
clientName,
configRoot,
serviceURL,
(reqDataFormat != null ? new String[] { reqDataFormat } : null),
(resDataFormat != null ? new String[] { resDataFormat } : null),
operationName, TestUtils.createTestMessage());
}
public Test1Driver(String serviceName, String clientName,
String configRoot, URL serviceURL, String[] reqDataFormats,
String[] resDataFormats, String operationName, MyMessage msg) {
Assert.assertThat("serviceName", serviceName, notNullValue());
if (configRoot == null) {
configRoot = "config";
}
m_clientName = clientName;
m_serviceName = serviceName;
m_configRoot = configRoot;
m_serviceURL = serviceURL;
m_repeatCount = 1;
m_reqDataFormats = (reqDataFormats != null ? reqDataFormats
: ALL_FORMATS);
m_resDataFormats = (resDataFormats != null ? resDataFormats
: ALL_FORMATS);
if (null != msg)
msg.setSubject("</div></div></div>");
m_message = msg;
m_operationName = operationName;
// always add some custom header, just ot make sure it does not break
// anything
setTransportHeader("TEST_CALL_HEADER", "MyValue");
}
public void setExpectedError(long id, Class<?> exception, String subText) {
setExpectedError(id, exception, exception, subText);
}
public void setExpectedError(long id, Class<?> diiException,
Class<?> proxyException, String subText) {
Assert.assertThat("id", id, notNullValue());
Assert.assertThat("proxyException", proxyException, notNullValue());
Assert.assertThat("subText", subText, notNullValue());
m_expectedError = id;
m_proxyException = proxyException;
m_errorSubText = subText;
if (proxyException != null && diiException == null) {
m_diiException = ErrorMessage.class;
} else {
m_diiException = diiException;
}
}
public void setUseSoap11(boolean value) {
if (value) {
m_protocolName = SOAConstants.MSG_PROTOCOL_SOAP_11;
} else {
m_protocolName = null;
}
}
public void setUseSoap12(boolean value) {
if (value) {
m_protocolName = SOAConstants.MSG_PROTOCOL_SOAP_12;
} else {
m_protocolName = null;
}
}
public void setRepeatCount(int value) {
if (value > 0) {
m_repeatCount = value;
} else {
m_repeatCount = 1;
}
}
public void setG11nOptions(G11nOptions options) {
m_g11nOptions = options;
}
public void setUseRest(boolean value) {
m_useRest = value;
}
public void setUseDefaultBinding(boolean value) {
m_useDefaultBinding = value;
}
public void setExpectingSameMessage(boolean value) {
m_expectingSameMessage = value;
}
public void setExpectResponseMsgHeader(boolean value) {
m_isExpectResponseMsgHeader = value;
}
public void setTransportHeader(String name, String value) {
m_transportHeaders.put(name, value);
}
public void removeTransportHeader(String name) {
m_transportHeaders.remove(name);
}
public void setTransportHeader(String name, boolean value) {
if (value) {
setTransportHeader(name, "true");
} else {
removeTransportHeader(name);
}
}
public void addMessageHeaderAsJavaObject(Object headerJavaObject) {
setExpectResponseMsgHeader(true);
m_reqMessageHeaders.add(new JavaObjectNodeImpl(null, headerJavaObject));
}
public void addSessionMessageHeaderAsJavaObject(Object headerJavaObject) {
setExpectResponseMsgHeader(true);
m_sessionMessageHeaders.add(new JavaObjectNodeImpl(null,
headerJavaObject));
}
public void addMessageHeader(ObjectNode header) {
m_reqMessageHeaders.add(header);
}
public void addSessionMessageHeader(ObjectNode header) {
m_sessionMessageHeaders.add(header);
}
public void removeMessageHeader(ObjectNode header) {
m_reqMessageHeaders.remove(header);
}
public void removeSessionMessageHeader(ObjectNode header) {
m_sessionMessageHeaders.remove(header);
}
public void setOutboundTransportHeader(String name, String value) {
m_outTransportHeaders.put(name, value);
}
public void setHeader_Test1Cookie(String cookieString) {
setTransportHeader(Test1Constants.TR_HDR_TEST1_COOKIE, cookieString);
}
public void setHeader_Test1Exception(boolean enable) {
setTransportHeader(Test1Constants.TR_HDR_TEST1_EXCEPTION, enable);
}
public void setHeader_Test1ServiceException(boolean enable) {
setTransportHeader(Test1Constants.TR_HDR_TEST1_SERVICE_EXCEPTION,
enable);
}
public void setCookies(Cookie[] cookies) {
for (int i = 0; i < cookies.length; i++) {
addCookie(cookies[i]);
}
}
public void addCookie(String name, String value) {
addCookie(new Cookie(name, value));
}
public void addCookie(Cookie cookie) {
if (m_cookies == null) {
m_cookies = new ArrayList<Cookie>();
}
m_cookies.add(cookie);
}
/**
* @param m_verifier
* the m_verifier to set
*/
public void setVerifier(SuccessVerifier m_verifier) {
this.m_verifier = m_verifier;
}
public void setServiceVersion(String version) {
m_serviceVersion = version;
}
public void setSkipSerialization(boolean skipSerialization) {
m_isSkipSerialization = skipSerialization;
}
public void setDetachedLocalBinding(boolean useDetachedLocalBinding) {
m_isDetachedLocalBinding = useDetachedLocalBinding;
}
public void setNoPayloadData(boolean value) {
m_isNoPayloadData = value;
}
public void setTransportName(String name) {
m_transportName = name;
}
public void setRequestTimeout(Integer timeout) {
m_requestTimeoutMs = timeout;
}
private void checkSuccess(Service service, MyMessage msg,
MyMessage outParam, Response response, TestMode mode)
throws Exception {
if (getExceptedError(mode) != 0) {
Assert.fail("Expected error " + getExceptedError(mode)
+ ", but execution was successful");
}
if (m_expectingSameMessage) {
Assert.assertEquals(msg, outParam);
}
byte[] payloadData = verifyPayload(service);
if (m_verifier != null) {
m_verifier.checkSuccess(service, m_operationName, msg, outParam,
payloadData);
}
// check msg header
Collection c = service.getResponseContext().getMessageHeaders();
if (m_isExpectResponseMsgHeader) {
// assert that response msg header presents!
Assert.assertTrue(c != null);
Assert.assertTrue(c.size() > 0);
} else {
// assert that response msg header is not there
Assert.assertTrue(c != null);
Assert.assertTrue(c.size() == 0);
}
}
/*
* private void checkSuccess(Service service, MyMessage msg, List<Object>
* outParams) throws Exception { // todo: make sure to reuse the
* checkSuccess method from interface and // here.
* checkSuccessInternal(service, null, null, msg, outParams, TestMode.SYNC); }
*/
@SuppressWarnings("rawtypes")
private void checkSuccess(Service service, Dispatch dispatch,
Response response, MyMessage msg, List<Object> outParams,
TestMode mode) throws Exception {
checkSuccessInternal(service, dispatch, response, msg, outParams, mode);
}
/**
* this method is supposed to return error code specific to the invocation
* mode. For eg: Async methods return ExecutionExcetion which wraps
* ServiceException Sync methods of Async functionality returns
* WebServiceException which wraps ServiceException Old Sync methods return
* ServiceInvocaitonException.
*
* @param mode
* @return
*/
/*
* private long getExceptedError(TestMode mode) { if
* (mode.equals(TestMode.ASYNC_SYNC)) return m_expectedErrorAsync; return
* m_expectedError; }
*/
@SuppressWarnings("rawtypes")
private void checkSuccessInternal(Service service, Dispatch dispatch,
Response response, MyMessage msg, List<Object> outParams,
TestMode mode) throws Exception {
if (getExceptedError(mode)!= 0) {
Assert.fail("Expected error " + getExceptedError(mode)
+ ", but execution was successful");
}
MyMessage resultMsg;
if (OP_NAME_myVoidReturnOperation.equals(m_operationName)) {
Assert.assertThat(OP_NAME_myVoidReturnOperation
+ " should have no outParams", outParams.size(), is(0));
resultMsg = null;
} else {
Assert.assertThat(m_operationName + " should have 1 outParam",
outParams.size(), is(1));
resultMsg = (MyMessage) outParams.get(0);
if (m_expectingSameMessage) {
Assert.assertNotNull(m_operationName + " should have resultMsg", resultMsg);
Assert.assertNotNull(m_operationName + " should have msg", msg);
Assert.assertThat(m_operationName + " should have same message",
resultMsg.getBody(), is(msg.getBody()));
}
}
byte[] payloadData = verifyPayload(service, dispatch, response, mode);
if (m_verifier != null) {
if (mode.equals(TestMode.SYNC)) {
m_verifier.checkSuccess(service, m_operationName, msg,
resultMsg, payloadData);
} else {
m_verifier.checkSuccess(service, dispatch, response, msg,
resultMsg, payloadData, mode);
}
}
}
protected byte[] verifyPayload(Service service) throws Exception {
byte[] payloadData = service.getResponseContext().getPayloadData();
if (m_isSkipSerialization || m_isNoPayloadData) {
Assert.assertNull("Expecting no payload data", payloadData);
} else {
Assert.assertNotNull("Expecting some payload data", payloadData);
}
return payloadData;
}
protected byte[] verifyPayload(Service service, Dispatch dispatch,
Response response, TestMode mode) throws Exception {
byte[] payloadData = null;
if (mode.equals(TestMode.SYNC))
payloadData = (byte[]) service.getResponseContext()
.getPayloadData();
else if (mode.equals(TestMode.ASYNC_SYNC))
payloadData = (byte[]) dispatch.getResponseContext().get("PAYLOAD");
else
payloadData = (byte[]) response.getContext().get("PAYLOAD");
if (m_isSkipSerialization || m_isNoPayloadData) {
Assert.assertNull("Expecting no payload data", payloadData);
} else {
Assert.assertNotNull("Expecting some payload data", payloadData);
}
return payloadData;
}
protected void checkError(Service service, Object e, boolean isProxy)
throws Exception {
checkError(service, e, isProxy, TestMode.SYNC, false);
}
protected void checkError(Service service, Object e, boolean isProxy,
TestMode mode, boolean isResponseGet) throws Exception {
long local_expected_error;
local_expected_error = getExceptedError(mode);
if (local_expected_error == 0) {
String cause = printErrorInfo(e);
Assert.fail("Expected successful execution, but got error "
+ cause);
}
ErrorData errorData;
if (e instanceof WebServiceException) {
Object response = null;
if (mode.equals(TestMode.ASYNC_SYNC)) {
ServiceInvocationException sie = (ServiceInvocationException) ((Throwable) e)
.getCause();
response = sie.getErrorResponse();
if (response != null && sie.isAppOnlyException()) {
e = response;
}
} else {
ServiceException sie = (ServiceException) ((Throwable) e)
.getCause();
response = sie.getMessage();
}
}
if (e instanceof ServiceInvocationException) {
ServiceInvocationException sie = (ServiceInvocationException) e;
Object response = sie.getErrorResponse();
if (response != null && sie.isAppOnlyException()) {
e = response;
}
}
if (e instanceof Exception) {
if (e instanceof ServiceExceptionInterface) {
ServiceExceptionInterface e2 = (ServiceExceptionInterface) e;
ErrorMessage errorMessage = e2.getErrorMessage();
if (errorMessage != null) {
errorData = e2.getErrorMessage().getError().get(0);
} else {
errorData = null;
}
} else if (e instanceof ExecutionException) {
ServiceException se = (ServiceException) ((Throwable) e)
.getCause();
ErrorMessage errorMessage = se.getErrorMessage();
if (errorMessage != null) {
errorData = errorMessage.getError().get(0);
} else {
errorData = null;
}
} else {
// Exception e.g. Test1Exception was able to be instantiated by
// the proxy, but
// does not implement ServiceExceptionInterface.
errorData = null;
}
} else if (e instanceof CustomErrorMessage) {
CustomErrorMessage e2 = (CustomErrorMessage) e;
ErrorType errorType = e2.getError().get(0);
errorData = TestUtils.errorTypeToErrorData(errorType);
} else if (e instanceof MyMessage) {
// customError2 operation - use the result to include the error
MyMessage e2 = (MyMessage) e;
ErrorType errorType = e2.getError().get(0);
errorData = TestUtils.errorTypeToErrorData(errorType);
} else if (e instanceof ErrorMessage) {
ErrorMessage e2 = (ErrorMessage) e;
errorData = e2.getError().get(0);
} else if (e instanceof SOAP11Fault) {
SOAP11Fault e2 = (SOAP11Fault) e;
errorData = ((ErrorMessage) e2.getDetail()).getError().get(0);
e = (ErrorMessage) e2.getDetail();
} else if (e instanceof SOAP12Fault) {
SOAP12Fault e2 = (SOAP12Fault) e;
errorData = ((ErrorMessage) e2.getDetail()).getError().get(0);
e = (ErrorMessage) e2.getDetail();
} else if (e == null) {
Assert.fail("Unexpected NULL error message");
return;
} else {
Assert.fail("Unknown error message " + e.getClass().getName()
+ ": " + e.toString());
return;
}
if (errorData != null) {
if (unexpectedError(errorData.getErrorId(), local_expected_error)) {
String cause = printErrorInfo(e);
Assert.fail("Unexpected error id " + errorData.getErrorId()
+ ", expected " + local_expected_error + ". Error "
+ e.getClass().getName() + ": " + cause);
}
}
if (isProxy) {
checkException(e, getProxyException(mode), mode);
} else {
checkException(e, getDiiException(mode,isResponseGet), mode);
}
// verifyPayload(service);
if (m_repeatCount == 1) {
System.out.println("Received expected error: " + e.toString());
}
}
private Class getProxyException(TestMode mode) {
if (m_isLocalVoidReturnTest
&& (mode.equals(TestMode.ASYNC_PULL) || mode
.equals(TestMode.ASYNC_PUSH))) {
return ExecutionException.class;
} else {
if (mode.equals(TestMode.SYNC))
return m_proxyException;
else if (mode.equals(TestMode.ASYNC_SYNC))
return WebServiceException.class;
else
return ExecutionException.class;
}
}
private Class getDiiException(TestMode mode, boolean isResponseGet) {
if(isResponseGet)
{
return ExecutionException.class;
}
else if (mode.equals(TestMode.ASYNC_PULL) || mode.equals(TestMode.ASYNC_PUSH)) {
return WebServiceException.class;
} else {
return m_diiException;
}
}
public boolean unexpectedError(long errorId, long expectedErrorId) {
// Exists to allow LocalCallFallbackOperationTest to override.
return (errorId != expectedErrorId);
}
private void checkException(Object e, Class<?> clazz, TestMode mode)
throws Exception {
String local_error_subtext = getErrorSubText(mode);
if (!(e instanceof Throwable)) {
if (clazz != null && clazz != e.getClass()) {
String cause = printErrorInfo(e);
Assert.fail("Expected " + clazz.getName()
+ ", but got another error response: " + cause);
}
ErrorMessage msg = null;
if (e instanceof CustomErrorMessage) {
CustomErrorMessage e2 = (CustomErrorMessage) e;
msg = TestUtils.errorTypeListToErrorMessage(e2.getError());
} else if (e instanceof MyMessage) {
MyMessage e2 = (MyMessage) e;
msg = TestUtils.errorTypeListToErrorMessage(e2.getError());
} else {
msg = (ErrorMessage) e;
}
String text = msg.getError().get(0).getMessage();
if (text.indexOf(local_error_subtext) == -1) {
String cause = printErrorInfo(e);
Assert.fail("ErrorMessage does not contain expected subtext '"
+ local_error_subtext + "' : " + cause);
}
return;
}
if (clazz == null) {
String cause = printErrorInfo(e);
Assert.fail("Expected no exception, but got exception: " + cause);
}
Throwable e2 = (Throwable) e;
if (e2.getClass() != clazz) {
String cause = printErrorInfo(e);
Assert.fail("Unexpected error class " + e2.getClass().getName()
+ ", expected " + clazz.getName() + ": " + cause);
}
String text = e2.toString();
if (text.indexOf(local_error_subtext) == -1) {
String cause = printErrorInfo(e);
Assert.fail("Exception does not contain expected subtext '"
+ local_error_subtext + "' : " + cause);
}
}
private String printErrorInfo(Object e) {
// TODO: print more ErrorDataList info here
String causeText;
if (e instanceof Throwable) {
((Throwable) e).printStackTrace();
causeText = e.toString();
} else if (e instanceof ErrorMessage) {
ErrorMessage msg = (ErrorMessage) e;
causeText = getCauseText(msg);
} else if (e instanceof CustomErrorMessage) {
CustomErrorMessage e2 = (CustomErrorMessage) e;
ErrorMessage msg = TestUtils.errorTypeListToErrorMessage(e2
.getError());
causeText = getCauseText(msg);
} else {
causeText = e.toString();
}
System.err.println("ErrorInfo: " + causeText);
return causeText;
}
private String getCauseText(ErrorMessage msg) {
List<CommonErrorData> errorList = msg.getError();
if (errorList != null && !errorList.isEmpty()) {
ErrorData err = errorList.get(0);
return err.getErrorId() + " : " + err.getMessage();
} else {
return msg.toString();
}
}
public void doCall() throws Exception {
ClientConfigManager.getInstance().setConfigTestCase(m_configRoot);
ServiceConfigManager.getInstance().setConfigTestCase(m_configRoot);
for (int i = 0; i < m_reqDataFormats.length; i++) {
String reqDataFormat = m_reqDataFormats[i];
for (int j = 0; j < m_resDataFormats.length; j++) {
String resDataFormat = m_resDataFormats[j];
doCall(reqDataFormat, resDataFormat, TestMode.SYNC);
if (!m_skipAsyncTest)
doCall(reqDataFormat, resDataFormat, TestMode.ASYNC_PULL);
if (!m_skipAsyncTest)
doCall(reqDataFormat, resDataFormat, TestMode.ASYNC_PUSH);
//break;
}
// break;
}
// doCall(SOAConstants.PAYLOAD_XML, SOAConstants.PAYLOAD_FAST_INFOSET);
}
private Service createServiceInstance(String reqDataFormat,
String resDataFormat) throws Exception {
URL serviceURL = getServiceURL();
Service test1 = ServiceFactory.create(m_serviceName, m_clientName,
serviceURL, m_serviceVersion);
ServiceInvokerOptions options = test1.getInvokerOptions();
if (m_g11nOptions != null) {
test1.setG11nOptions(m_g11nOptions);
}
if (serviceURL == null) {
options.setTransportName(SOAConstants.TRANSPORT_LOCAL);
} else {
if (m_transportName != null) {
options.setTransportName(m_transportName);
}
}
if (m_protocolName != null) {
options.setMessageProtocolName(m_protocolName);
}
if (m_cookies != null) {
for (int i = 0; i < m_cookies.size(); i++) {
test1.setCookie(m_cookies.get(i));
}
}
if (m_outTransportHeaders != null) {
for (Map.Entry<String, String> e : m_outTransportHeaders.entrySet()) {
test1.setSessionTransportHeader(e.getKey(), e.getValue());
}
}
if (m_sessionMessageHeaders != null) {
for (ObjectNode node : m_sessionMessageHeaders) {
test1.addSessionMessageHeader(node);
}
}
if (!m_useDefaultBinding) {
options.setRequestBinding(reqDataFormat);
options.setResponseBinding(resDataFormat);
}
if (m_isSkipSerialization) {
options.getTransportOptions().setSkipSerialization(Boolean.TRUE);
}
if (m_isDetachedLocalBinding) {
options.getTransportOptions().setUseDetachedLocalBinding(
Boolean.TRUE);
}
if (m_requestTimeoutMs != null) {
options.getTransportOptions().setInvocationTimeout(
m_requestTimeoutMs);
}
options.setRecordResponsePayload(true);
RequestContext reqCtx = test1.getRequestContext();
for (Map.Entry<String, String> e : m_transportHeaders.entrySet()) {
reqCtx.setTransportHeader(e.getKey(), e.getValue());
}
for (ObjectNode headerObj : m_reqMessageHeaders) {
reqCtx.addMessageHeader(headerObj);
}
if (m_useRest) {
options.setREST(Boolean.TRUE);
}
return test1;
}
private URL getServiceURL() {
if (s_serviceURLOverriden != null) {
return s_serviceURLOverriden;
}
return m_serviceURL;
}
private int getRepeatCount(TestMode mode) {
if (mode.equals(TestMode.SYNC))
return m_repeatCount;
else if (mode.equals(TestMode.ASYNC_SYNC))
return m_repeatCount;
else
return 1;
}
@SuppressWarnings("unchecked")
private void doCall(String reqDataFormat, String resDataFormat,
TestMode mode) throws Exception {
System.out.println("Start " + getClass().getSimpleName() + " with "
+ reqDataFormat + " request and " + resDataFormat
+ " response :: " + mode);
long diiResponseTime = 0;
long proxyResponseTime = 0;
boolean isResponseGet = false;
Charset charset = m_g11nOptions.getCharset();
MyMessage encodedMsg = reqDataFormat
.equals(BindingConstants.PAYLOAD_FAST_INFOSET)
&& resDataFormat.equals(BindingConstants.PAYLOAD_FAST_INFOSET) ? m_message
: TestUtils.encodeMessage(m_message, charset);
int local_repeatCount = getRepeatCount(mode);
for (int i = 0; i < local_repeatCount; i++) {
Object[] inParams;
if (m_operationName.equals(OP_NAME_myNonArgOperation)
|| m_operationName.equals(OP_NAME_customError1)) {
inParams = null;
} else {
inParams = new Object[] { m_message };
}
List<Object> outParams = new ArrayList<Object>();
Service test1 = createServiceInstance(reqDataFormat, resDataFormat);
if (m_isUrlPathTest)
test1.getInvokerOptions().setUrlPathInfo(m_urlPathInfo);
Dispatch dispatch = null;
Response response = null;
Future future = null;
Object obj = null;
try {
long startTime = System.nanoTime();
try {
if (mode.equals(TestMode.SYNC))
test1.invoke(m_operationName, inParams, outParams);
else if (mode.equals(TestMode.ASYNC_SYNC)) {
dispatch = test1.createDispatch(m_operationName);
obj = dispatch.invoke(inParams);
outParams.add(obj);
} else if (mode.equals(TestMode.ASYNC_PULL)) {
dispatch = test1.createDispatch(m_operationName);
/*if (m_isLocalVoidReturnTest)
setExpectedError(2013, ExecutionException.class,
"Unable to access parameter values on void message");*/
if (m_operationName.equals(OP_NAME_myNonArgOperation)
|| m_operationName.equals(OP_NAME_customError1)) {
response = dispatch.invokeAsync(null);
} else {
response = dispatch.invokeAsync(m_message);
}
isResponseGet = true;
while (!response.isDone()) {
Thread.sleep(100);
}
obj = response.get();
outParams.add(obj);
} else if (mode.equals(TestMode.ASYNC_PUSH)) {
dispatch = test1.createDispatch(m_operationName);
TestHander handler = new TestHander<MyMessage>();
/*if (m_isLocalVoidReturnTest)
setExpectedError(2013, ExecutionException.class,
"Unable to access parameter values on void message");*/
if (m_operationName.equals(OP_NAME_myNonArgOperation)
|| m_operationName.equals(OP_NAME_customError1)) {
future = dispatch.invokeAsync(null, handler);
} else {
future = dispatch.invokeAsync(m_message, handler);
}
while (!handler.isDone()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
isResponseGet = true;
if (handler.hasError())
throw (ExecutionException) handler.getError();
else {
outParams.add(handler.get());
response = handler.getResponse();
}
}
} finally {
diiResponseTime += System.nanoTime() - startTime;
}
checkSuccess(test1, dispatch, response, encodedMsg, outParams,
mode);
} catch (Exception e) {
checkError(test1, e, false, mode,isResponseGet);
}
}
if (mode.equals(TestMode.SYNC)) {
for (int i = 0; i < local_repeatCount; i++) {
MyMessage msg = m_message;
Service test1 = createServiceInstance(reqDataFormat,
resDataFormat);
try {
Test1Service proxy = test1.getProxy();
MyMessage msgResult = null;
if (m_operationName.equals(OP_NAME_myNonArgOperation)) {
long startTime = System.nanoTime();
try {
msgResult = proxy.myNonArgOperation();
} finally {
proxyResponseTime += System.nanoTime() - startTime;
}
checkSuccess(test1, null, msgResult, null, null);
} else if (m_operationName
.equals(OP_NAME_myVoidReturnOperation)) {
long startTime = System.nanoTime();
try {
proxy.myVoidReturnOperation(msg);
} finally {
proxyResponseTime += System.nanoTime() - startTime;
}
} else if (m_operationName.equals(OP_NAME_customError1)) {
long startTime = System.nanoTime();
try {
proxy.customError1();
} finally {
proxyResponseTime += System.nanoTime() - startTime;
}
} else if (m_operationName.equals(OP_NAME_customError2)) {
long startTime = System.nanoTime();
try {
msgResult = proxy.customError2(msg);
} finally {
proxyResponseTime += System.nanoTime() - startTime;
}
} else {
Response response = null;
long startTime = System.nanoTime();
try {
if (mode.equals(TestMode.SYNC))
msgResult = proxy.myTestOperation(msg);
/*
* else if (mode.equals(TestMode.ASYNC_PULL)) {
* response = proxy.myTestOperationAsync(msg); while
* (!response.isDone()) { try { Thread.sleep(100); }
* catch (InterruptedException e) {
* e.printStackTrace(); } } msgResult = (MyMessage)
* response.get(); } else
* if(mode.equals(TestMode.ASYNC_PUSH)) { TestHander
* handler = new TestHander<MyMessage>(); Future<?>
* future = proxy.myTestOperationAsync(msg,
* handler); while (!handler.isDone()) { try {
* Thread.sleep(100); } catch (InterruptedException
* e) { e.printStackTrace(); } } if
* (handler.hasError()) throw (ExecutionException)
* handler.getError(); else { msgResult =
* (MyMessage) handler.get(); response =
* handler.getResponse(); } }
*/
} finally {
proxyResponseTime += System.nanoTime() - startTime;
}
checkSuccess(test1, encodedMsg, msgResult, response,
mode);
}
} catch (Exception e) {
checkError(test1, e, true, mode, isResponseGet);
}
}
}
MarkdownTestHelper.markupClientManually(m_serviceName, null, null);
if (getExceptedError(mode) == 0) {
System.out.println("End " + getClass().getSimpleName()
+ " using data format " + reqDataFormat + " - "
+ resDataFormat + " takes: \n" + proxyResponseTime
/ m_repeatCount / 2000000.0 + " for proxy, and\n"
+ diiResponseTime / m_repeatCount / 2000000.0
+ " for DII :: " + mode + ", and\n");
} else {
System.out.println("End " + getClass().getSimpleName()
+ " using data format " + reqDataFormat + " - "
+ resDataFormat + " :: " + mode);
}
}
public void skipAyncTest(boolean skipAsyncTest) {
m_skipAsyncTest = skipAsyncTest;
;
}
private long getExceptedError(TestMode mode)
{
if (m_isLocalVoidReturnTest
&& (mode.equals(TestMode.ASYNC_PULL) || mode
.equals(TestMode.ASYNC_PUSH))) {
return 2013;
}
else
return m_expectedError;
}
private String getErrorSubText(TestMode mode)
{
if (m_isLocalVoidReturnTest
&& (mode.equals(TestMode.ASYNC_PULL) || mode
.equals(TestMode.ASYNC_PUSH))) {
return "Unable to access parameter values on void message";
}
else
{
return m_errorSubText;
}
}
public interface SuccessVerifier {
public void checkSuccess(Service service, String opName,
MyMessage request, MyMessage response, byte[] payloadData)
throws Exception;
public void checkSuccess(Service service, Dispatch dispatch,
Response futureResp, MyMessage request, MyMessage response,
byte[] payloadData, TestMode mode) throws Exception;
}
public interface ErrorVerifier {
public void checkError(Service service, Object e, boolean isProxy)
throws Exception;
}
private static class TestHander<T> implements AsyncHandler<T> {
private volatile Response<T> m_resp;
private volatile Throwable m_error;
private volatile T m_message;
private volatile boolean m_done = false;
public void handleResponse(Response<T> resp) {
try {
m_resp = resp;
m_message = m_resp.get();
} catch (Throwable e) {
m_error = e;
} finally {
m_done = true;
}
}
public T get() {
return m_message;
}
public Throwable getError() {
return m_error;
}
public boolean isDone() {
return m_done;
}
public boolean hasError() {
return m_error != null;
}
public Response<T> getResponse() {
return m_resp;
}
}
public void setUrlPathInfo(String urlPath) {
m_urlPathInfo = urlPath;
}
public void isUrlPathTest(boolean b) {
m_isUrlPathTest = b;
}
public void setLocalVoidReturnTest(boolean b) {
m_isLocalVoidReturnTest = b;
}
}