/* * 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; import com.betfair.cougar.api.ExecutionContext; import com.betfair.cougar.api.ExecutionContextImpl; import com.betfair.cougar.api.security.Credential; import com.betfair.cougar.api.security.Identity; import com.betfair.cougar.core.impl.security.IdentityChainImpl; import com.betfair.cougar.test.socket.tester.client.tests.EchoFailureTest; import com.betfair.cougar.test.socket.tester.client.tests.EchoSuccessTest; import com.betfair.cougar.test.socket.tester.client.tests.HeapTest; import com.betfair.cougar.test.socket.tester.common.*; import com.betfair.cougar.util.RequestUUIDImpl; import com.betfair.cougar.util.UUIDGeneratorImpl; import java.io.*; import java.security.Principal; import java.util.*; import java.util.concurrent.Future; /** * */ public class ClientMain { public static void main(String[] args) throws Exception { System.setProperty("cougar.addressUtils.allowLoopBackIfNoOthers","true"); { ExecutionContext ctx = createExecutionContext(); Conversion.convert(ctx, ExecutionContext.class, ExecutionContextTO.class); } if (args.length == 1 && args[0].equalsIgnoreCase("prompt")) { System.out.print("Enter client args: "); System.out.flush(); args = new BufferedReader(new InputStreamReader(System.in)).readLine().split(" "); } Properties runProps = new Properties(); File propsFile = new File("run.properties"); if (propsFile.exists()) { runProps.load(new FileInputStream(propsFile)); } int serverCount = Integer.parseInt(args[0]); Map<String,ServerConfiguration> servers = new HashMap<>(serverCount); int argsPerServer = (args.length - 1) / serverCount; for (int i=1; i<args.length; i+=argsPerServer) { String variant = args[i]; int port = Integer.parseInt(args[i+1]); int minProtocolVersion = Integer.parseInt(args[i+2]); int maxProtocolVersion = Integer.parseInt(args[i+3]); servers.put(variant, new ServerConfiguration(port, minProtocolVersion, maxProtocolVersion, variant)); } TestRunner runner = new TestRunner(Integer.parseInt(runProps.getProperty("client.concurrency", "10"))); // 1. Echo Success - here we'll test all the combos of ssl/client auth - DONE // 2. Echo Failure (throws exception) - just the test here, once for each server - DONE // 3. Connected object - same, just the test, once for each server - DONE ServerConfiguration plainServer = servers.get(ServerConfigurations.PLAIN); runner.runTest(new EchoSuccessTest(plainServer)); runner.runTest(new EchoSuccessTest(plainServer, SslRequirement.Supports)); runner.runTest(new EchoSuccessTest(plainServer, SslRequirement.Requires, false)); // these just one test per config - one that should succeed runner.runTest(new EchoFailureTest(plainServer)); runner.runTest(new HeapTest(plainServer)); if (servers.containsKey(ServerConfigurations.SUPPORTS_SSL)) { ServerConfiguration supportsSsl = servers.get(ServerConfigurations.SUPPORTS_SSL); runner.runTest(new EchoSuccessTest(supportsSsl)); runner.runTest(new EchoSuccessTest(supportsSsl, SslRequirement.Supports)); runner.runTest(new EchoSuccessTest(supportsSsl, SslRequirement.Requires)); runner.runTest(new EchoSuccessTest(supportsSsl, SslRequirement.Supports, ClientAuthRequirement.Wants)); runner.runTest(new EchoSuccessTest(supportsSsl, SslRequirement.Requires, ClientAuthRequirement.Wants)); // these just one test per config - one that should succeed runner.runTest(new EchoFailureTest(supportsSsl)); runner.runTest(new HeapTest(supportsSsl)); ServerConfiguration requiresSsl = servers.get(ServerConfigurations.REQUIRES_SSL); runner.runTest(new EchoSuccessTest(requiresSsl, false)); runner.runTest(new EchoSuccessTest(requiresSsl, SslRequirement.Supports)); runner.runTest(new EchoSuccessTest(requiresSsl, SslRequirement.Requires)); runner.runTest(new EchoSuccessTest(requiresSsl, SslRequirement.Supports, ClientAuthRequirement.Wants)); runner.runTest(new EchoSuccessTest(requiresSsl, SslRequirement.Requires, ClientAuthRequirement.Wants)); // these just one test per config - one that should succeed runner.runTest(new EchoFailureTest(requiresSsl, SslRequirement.Supports)); runner.runTest(new HeapTest(requiresSsl, SslRequirement.Supports)); ServerConfiguration wantsClientAuth = servers.get(ServerConfigurations.WANTS_CLIENT_AUTH); runner.runTest(new EchoSuccessTest(wantsClientAuth)); runner.runTest(new EchoSuccessTest(wantsClientAuth, SslRequirement.Supports)); runner.runTest(new EchoSuccessTest(wantsClientAuth, SslRequirement.Requires)); runner.runTest(new EchoSuccessTest(wantsClientAuth, SslRequirement.Supports, ClientAuthRequirement.Wants)); runner.runTest(new EchoSuccessTest(wantsClientAuth, SslRequirement.Requires, ClientAuthRequirement.Wants)); // these just one test per config - one that should succeed runner.runTest(new EchoFailureTest(wantsClientAuth)); runner.runTest(new HeapTest(wantsClientAuth)); ServerConfiguration needsClientAuth = servers.get(ServerConfigurations.NEEDS_CLIENT_AUTH); runner.runTest(new EchoSuccessTest(needsClientAuth, false)); runner.runTest(new EchoSuccessTest(needsClientAuth, SslRequirement.Supports, false)); runner.runTest(new EchoSuccessTest(needsClientAuth, SslRequirement.Requires, false)); runner.runTest(new EchoSuccessTest(needsClientAuth, SslRequirement.Supports, ClientAuthRequirement.Wants)); runner.runTest(new EchoSuccessTest(needsClientAuth, SslRequirement.Requires, ClientAuthRequirement.Wants)); // these just one test per config - one that should succeed runner.runTest(new EchoFailureTest(needsClientAuth, SslRequirement.Supports, ClientAuthRequirement.Wants)); runner.runTest(new HeapTest(needsClientAuth, SslRequirement.Supports, ClientAuthRequirement.Wants)); } PrintWriter pw = new PrintWriter(new FileWriter("results.json")); pw.println("{\n \"results\": ["); List<Future<TestResult>> results = runner.await(Integer.MAX_VALUE); String sep = ""; for (Future<TestResult> future : results) { pw.print(sep); sep=",\n"; TestResult result = future.get(); pw.print(" { \"name\": " + jsonString(result.getName())+", \"serverVariant\": "+jsonString(result.getServerVariant())); pw.print(", \"result\": "+jsonString(result.isSuccess()?"success":"failure")); pw.print(", \"out\": "+jsonString(result.getOutput())); pw.print(", \"err\": "+jsonString(result.getError())); pw.println(" }"); } pw.println(" ]\n}"); pw.flush(); pw.close(); } private static String jsonString(String s) { if (s==null) { return "\"\""; } StringBuilder buff = new StringBuilder(); buff.append("\""); buff.append(s.replace("\"","\\\"").replace("\n"," ").replace("\t"," ")); buff.append("\""); return buff.toString(); } public static ExecutionContext createExecutionContext() { ExecutionContextImpl ctx = new ExecutionContextImpl(); GeoLocationData geoData = new GeoLocationData(); ctx.setGeoLocationDetails(geoData); List<Identity> identities = new ArrayList<>(); identities.add(new Identity() { @Override public Principal getPrincipal() { return new SimplePrincipal("fred"); // will get lost } @Override public Credential getCredential() { return new SimpleCredential("name", "P4ssw0rd!"); // will get retained } }); IdentityChainImpl chain = new IdentityChainImpl(identities); ctx.setIdentity(chain); ctx.setRequestTime(new Date()); RequestUUIDImpl.setGenerator(new UUIDGeneratorImpl()); ctx.setRequestUUID(new RequestUUIDImpl()); ctx.setTraceLoggingEnabled(false); return ctx; } }