/** * 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.pat.internal; import java.util.*; import org.apache.cxf.BusFactory; import org.apache.cxf.bus.spring.SpringBusFactory; public abstract class TestCaseBase<T> { private boolean initialized; protected String wsdlPath; protected String serviceName; protected String portName; protected String operationName; protected String hostname; protected String hostport; protected int packetSize = 1; protected boolean usingTime; protected int amount = 1; protected String wsdlNameSpace; protected List<TestResult> results = new ArrayList<>(); protected int numberOfThreads; protected String busCfg; private String name; private String[] args; private String faultReason = "no error"; private boolean timedTestDone = false; private boolean doWarmup = true; public TestCaseBase() { this("DEFAULT TESTCASE", null); } public TestCaseBase(String cname) { this(cname, null); } public TestCaseBase(String cname, String[] arg) { this.name = cname; this.args = arg; } public TestCaseBase(String cname, String[] arg, boolean w) { this.name = cname; this.args = arg; this.doWarmup = w; } public abstract void initTestData(); public void init() throws Exception { initBus(); initTestData(); } public void processArgs() { int count = 0; int argc = args.length; while (count < argc) { if ("-WSDL".equals(args[count])) { wsdlPath = args[count + 1]; count += 2; } else if ("-Service".equals(args[count])) { serviceName = args[count + 1]; count += 2; } else if ("-Port".equals(args[count])) { portName = args[count + 1]; count += 2; } else if ("-Operation".equals(args[count])) { operationName = args[count + 1]; count += 2; } else if ("-BasedOn".equals(args[count])) { if ("Time".equals(args[count + 1])) { usingTime = true; } count += 2; } else if ("-Amount".equals(args[count])) { amount = Integer.parseInt(args[count + 1]); count += 2; } else if ("-Threads".equals(args[count])) { numberOfThreads = Integer.parseInt(args[count + 1]); count += 2; } else if ("-HostName".equals(args[count])) { hostname = args[count + 1]; count += 2; } else if ("-HostPort".equals(args[count])) { hostport = args[count + 1]; count += 2; } else if ("-PacketSize".equals(args[count])) { packetSize = Integer.parseInt(args[count + 1]); count += 2; } else if ("-BUScfg".equals(args[count])) { busCfg = args[count + 1]; count += 2; } else { count++; } } } private boolean validate() { if (wsdlNameSpace == null || wsdlNameSpace.trim().equals("")) { System.out.println("WSDL name space is not specified"); faultReason = "Missing WSDL name space"; return false; } if (serviceName == null || serviceName.trim().equals("")) { System.out.println("Service name is not specified"); faultReason = "Missing Service name"; return false; } if (portName == null || portName.trim().equals("")) { System.out.println("Port name is not specified"); faultReason = "Missing Port name"; return false; } if (wsdlPath == null || wsdlPath.trim().equals("")) { System.out.println("WSDL path is not specifed"); faultReason = "Missing WSDL path"; return false; } return true; } // for the cxf init , here do nothing public void initBus() { if (busCfg == null || "none".equals(busCfg)) { BusFactory.getDefaultBus(); } else { BusFactory.setDefaultBus(new SpringBusFactory().createBus(busCfg)); } } public void tearDown() { } protected void setUp() throws Exception { clearTestResults(); printTitle(); printSetting("Default Setting: "); processArgs(); if (!validate()) { System.out.println("Configure Exception!" + faultReason); System.exit(1); } init(); printSetting("Runtime Setting: "); } int initDone = 0; public void initialize() { try { if (!initialized) { setUp(); } initialized = true; if (!doWarmup) { return; } final int threadCount = 4; final long timeLimit = 30; final int countLimit = 1200; System.out.println("TestCase " + name + " is warming up the jit. (" + timeLimit + " sec/" + countLimit + " iterations, " + threadCount + " threads)"); final long startTime = System.currentTimeMillis(); final long endTime = startTime + (timeLimit * 1000l); final T t = getPort(); for (int x = 0; x < (threadCount - 1); x++) { new Thread() { public void run() { try { int count = 0; while (count < countLimit || System.currentTimeMillis() < endTime) { count++; doJob(t); } //System.out.println(count); //System.out.println("" + (System.currentTimeMillis() - startTime)); } catch ( Exception ex ) { ex.printStackTrace(); } ++initDone; } }.start(); } int count = 0; while (count < countLimit || System.currentTimeMillis() < endTime) { count++; doJob(t); } //System.out.println(count); //System.out.println("" + (System.currentTimeMillis() - startTime)); ++initDone; while (initDone != threadCount) { Thread.sleep(100); } } catch (Exception e) { e.printStackTrace(); } } public abstract void doJob(T t); public abstract T getPort(); protected void internalTestRun(String caseName, T t) throws Exception { int numberOfInvocations = 0; for (int x = 0; x < 25; x++) { //warmup doJob(t); } long startTime = System.currentTimeMillis(); if (usingTime) { while (!timedTestDone) { doJob(t); numberOfInvocations++; } } else { for (int i = 0; i < amount; i++) { doJob(t); numberOfInvocations++; } } long endTime = System.currentTimeMillis(); for (int x = 0; x < 25; x++) { //keep running so other threads get accurate results doJob(t); } TestResult testResult = new TestResult(caseName, this); testResult.compute(startTime, endTime, numberOfInvocations); addTestResult(testResult); } public void testRun() throws Exception { if (numberOfThreads == 0) { numberOfThreads = 1; } List<Thread> threadList = new ArrayList<>(); for (int i = 0; i < numberOfThreads; i++) { TestRunner<T> runner = new TestRunner<T>("No." + i + " TestRunner", this); Thread thread = new Thread(runner, "RunnerThread No." + i); thread.start(); threadList.add(thread); } if (usingTime) { Thread.sleep(amount * 1000); timedTestDone = true; } for (Iterator iter = threadList.iterator(); iter.hasNext();) { Thread thread = (Thread) iter.next(); try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } printResult(); } private void printResult() { double totalDuration = 0; double totalInvocations = 0; for (TestResult testResult : results) { totalDuration = totalDuration + testResult.getDuration(); totalInvocations = totalInvocations + testResult.getNumOfInvocations(); } double totalThroughput = totalInvocations/totalDuration; double totalAvgResponseTime = totalDuration/totalInvocations; System.out.println(); System.out.println("=============Overall Test Result============"); System.out.println("Overall Throughput: " + this.getOperationName() + " " + totalThroughput + TestResult.THROUGHPUT_UNIT); System.out.println("Overall AVG. response time: " + totalAvgResponseTime * 1000 + TestResult.AVG_UNIT); System.out.println(totalInvocations + " (invocations), running " + totalDuration + " (sec) "); System.out.println("============================================"); } public void run() { try { System.out.println("TestCase " + name + " is running"); testRun(); tearDown(); System.out.println("TestCase " + name + " is finished"); } catch (Exception e) { e.printStackTrace(); } } protected void clearTestResults() { results.clear(); } protected void addTestResult(TestResult result) { results.add(result); } public List getTestResults() { return results; } public abstract void printUsage(); public void printSetting(String settingType) { System.out.println(settingType + " [Service] -- > " + serviceName); System.out.println(settingType + " [Port] -- > " + portName); System.out.println(settingType + " [Operation] -- > " + operationName); System.out.println(settingType + " [Threads] -- > " + numberOfThreads); System.out.println(settingType + " [Packet Size] -- > " + packetSize + " packet(s) "); if (usingTime) { System.out.println(settingType + " [Running] --> " + amount + " (secs)"); } else { System.out.println(settingType + " [Running] --> " + amount + " (invocations)"); } } public void printTitle() { System.out.println(" ---------------------------------"); System.out.println(name + " Client (JAVA Version)"); System.out.println(" ---------------------------------"); } public void setWSDLNameSpace(String nameSpace) { this.wsdlNameSpace = nameSpace; } public void setWSDLPath(String wpath) { this.wsdlPath = wpath; } public void setServiceName(String sname) { this.serviceName = sname; } public void setPortName(String pname) { this.portName = pname; } public void setOperationName(String oname) { this.operationName = oname; } public String getServiceName() { return this.serviceName; } public String getPortName() { return this.portName; } public String getOperationName() { return this.operationName; } public String getName() { return this.name; } }