/*
* oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.
*
* Copyright (c) 2014, Gluu
*/
package org.xdi.oxauth.load.benchmark.suite;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.xdi.util.StringHelper;
/**
* @author Yuriy Movchan
* @version 0.1, 03/17/2015
*/
public class BenchmarkTestListener implements ITestListener {
private List<String> methodNames;
private Map<String, Long> methodTakes;
private Map<String, Long> methodInvoked;
private Lock lock = new ReentrantLock();
@Override
public void onTestStart(ITestResult result) {
}
@Override
public void onTestSuccess(ITestResult result) {
final String methodName = result.getMethod().getMethodName();
final long takes = result.getEndMillis() - result.getStartMillis();
Long totalTakes;
Long totalInvoked;
lock.lock();
try {
if (methodTakes.containsKey(methodName)) {
totalTakes = methodTakes.get(methodName);
totalInvoked = methodInvoked.get(methodName);
totalTakes += takes;
totalInvoked++;
} else {
methodNames.add(methodName);
totalTakes = takes;
totalInvoked = 1L;
}
methodTakes.put(methodName, totalTakes);
methodInvoked.put(methodName, totalInvoked);
} finally {
lock.unlock();
}
}
@Override
public void onTestFailure(ITestResult result) {
}
@Override
public void onTestSkipped(ITestResult result) {
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
}
@Override
public void onStart(ITestContext context) {
Reporter.log("Test '" + context.getName() + "' started ...", true);
this.methodNames = new ArrayList<String>();
this.methodTakes = new HashMap<String, Long>();
this.methodInvoked = new HashMap<String, Long>();
}
@Override
public void onFinish(ITestContext context) {
final long takes = (context.getEndDate().getTime() - context.getStartDate().getTime()) / 1000;
Reporter.log("Test '" + context.getName() + "' finished in " + takes + " seconds", true);
Reporter.log("================================================================================", true);
for (String methodName : this.methodNames) {
final long methodTakes = this.methodTakes.get(methodName);
final long methodInvoked = this.methodInvoked.get(methodName);
final long methodThreads = getMethodThreqads(context, methodName);
long oneExecutionMethodTakes = methodTakes == 0 ? 0 : methodTakes / methodInvoked;
Reporter.log("BENCHMARK REPORT | " + " Method: '" + methodName + "' | Takes:" + methodTakes + " | Invoked: " + methodInvoked + " | Threads: " + methodThreads + " | Average method execution: " + oneExecutionMethodTakes , true);
}
Reporter.log("================================================================================", true);
}
private long getMethodThreqads(ITestContext context, String methodName) {
ITestNGMethod[] allTestMethods = context.getAllTestMethods();
for (int i = 0; i < allTestMethods.length; i++) {
if (StringHelper.equalsIgnoreCase(allTestMethods[i].getMethodName(), methodName)) {
return allTestMethods[i].getThreadPoolSize();
}
}
return 1;
}
}