/*
* Copyright 2015, Simon Matić Langford
*
* 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
*
* 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 com.betfair.cougar.test.socket.tester.client.tests;
import com.betfair.cougar.api.ExecutionContext;
import com.betfair.cougar.core.api.ev.ExecutionResult;
import com.betfair.cougar.core.api.ev.WaitingObserver;
import com.betfair.cougar.core.api.exception.CougarClientException;
import com.betfair.cougar.core.api.exception.CougarException;
import com.betfair.cougar.netutil.nio.CougarProtocol;
import com.betfair.cougar.test.socket.tester.client.*;
import com.betfair.cougar.test.socket.tester.common.ClientAuthRequirement;
import com.betfair.cougar.test.socket.tester.common.Common;
import com.betfair.cougar.test.socket.tester.common.EchoException;
import com.betfair.cougar.test.socket.tester.common.SslRequirement;
/**
*
*/
public class EchoFailureTest implements ClientTest {
private final ServerConfiguration server;
private final SslRequirement sslRequirement;
private final ClientAuthRequirement clientAuthRequirement;
private final boolean expectSuccess;
public EchoFailureTest(ServerConfiguration server) {
this(server,SslRequirement.None,true);
}
public EchoFailureTest(ServerConfiguration server, boolean expectSuccess) {
this(server,SslRequirement.None,expectSuccess);
}
public EchoFailureTest(ServerConfiguration server, SslRequirement sslRequirement) {
this(server,sslRequirement,true);
}
public EchoFailureTest(ServerConfiguration server, SslRequirement sslRequirement, ClientAuthRequirement clientAuthRequirement) {
this(server,sslRequirement, clientAuthRequirement,true);
}
public EchoFailureTest(ServerConfiguration server, SslRequirement sslRequirement, boolean expectSuccess) {
this(server,sslRequirement, ClientAuthRequirement.None,expectSuccess);
}
public EchoFailureTest(ServerConfiguration server, SslRequirement sslRequirement, ClientAuthRequirement clientAuthRequirement, boolean expectSuccess) {
this.server = server;
this.sslRequirement = sslRequirement;
this.clientAuthRequirement = clientAuthRequirement;
this.expectSuccess = expectSuccess;
}
@Override
public void test(TestResult ret) throws Exception {
if (server.getMinProtocolVersion() > CougarProtocol.TRANSPORT_PROTOCOL_VERSION_MAX_SUPPORTED) {
ret.setOutput("My protocol version too low: "+CougarProtocol.TRANSPORT_PROTOCOL_VERSION_MAX_SUPPORTED+" < "+server.getMinProtocolVersion());
return;
}
ClientInstance clientInstance = new ClientInstance("ALL", server.getPort(), sslRequirement, clientAuthRequirement);
try {
ExecutionContext ctx = ClientMain.createExecutionContext();
WaitingObserver observer = clientInstance.execute(ctx, Common.echoFailureOperationDefinition,new Object[] { "Hello world!" });
if (!observer.await(10000)) {
ret.setError("Didn't get a response in time");
System.out.println("Didn't get a response in time: "+getName());
return;
}
if (observer.getExecutionResult().getResultType() == ExecutionResult.ResultType.Fault) {
CougarException e = observer.getExecutionResult().getFault();
if (expectSuccess) {
if (e instanceof CougarClientException) {
if (e.getCause() instanceof EchoException) {
EchoException ee = (EchoException) e.getCause();
if (ee.getInfo().equals("Hello world!")) {
ret.setOutput(ee);
return;
}
}
}
ret.setError(e);
}
else {
ret.setOutput(e);
}
if (e.getMessage().equals("Hello World!"))
if (expectSuccess) {
ret.setError(e);
}
else {
ret.setOutput("Expected exception received: "+e.getMessage());
}
}
else {
ret.setError("Expected a fault, actually got: "+observer.getExecutionResult().getResult());
}
}
finally {
clientInstance.shutdown();
}
}
@Override
public String getName() {
StringBuilder ret = new StringBuilder("Echo failure");
if (sslRequirement != SslRequirement.None) {
ret.append(" (").append(sslRequirement.toString().toLowerCase()).append(" SSL");
if (clientAuthRequirement != ClientAuthRequirement.None) {
ret.append(" with client auth");
}
ret.append(")");
}
return ret.toString();
}
public String getServerVariant() {
return server.getVariant();
}
}