blob: 0ae44b743b82ffac54b5df58db54a3debaed2d29 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.tests.harness;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import junit.framework.Test;
import junit.framework.TestFailure;
import junit.framework.TestResult;
/**
* Test result for a performance test. Keeps track of all timers that
* have been created within the test.
*/
public class PerformanceTestResult extends TestResult {
protected PrintWriter output;
protected ArrayList<PerformanceTimer> timerList = new ArrayList<>();
protected HashMap<String, PerformanceTimer> timers = new HashMap<>();
public PerformanceTestResult() {
this(new PrintWriter(System.out));
}
public PerformanceTestResult(PrintWriter outputStream) {
this.output = outputStream;
}
/**
* Informs the result that a test was completed.
*/
@Override
public synchronized void endTest(Test test) {
print();
}
/**
* Prints the test result
*/
public synchronized void print() {
stopTimers();
printHeader(output);
printErrors(output);
printFailures(output);
printTimings(output);
}
/**
* Prints the errors to the output
*/
protected void printErrors(PrintWriter out) {
int count = errorCount();
if (count != 0) {
if (count == 1) {
out.println("There was " + count + " error:");
} else {
out.println("There were " + count + " errors:");
}
int i = 1;
for (Enumeration<TestFailure> e = errors(); e.hasMoreElements(); i++) {
TestFailure failure = e.nextElement();
out.println(i + ") " + failure.failedTest());
failure.thrownException().printStackTrace(out);
}
}
}
/**
* Prints the failures to the output
*/
protected void printFailures(PrintWriter out) {
int count = failureCount();
if (count != 0) {
if (count == 1) {
out.println("There was " + count + " failure:");
} else {
out.println("There were " + count + " failures:");
}
int i = 1;
for (Enumeration<TestFailure> e = failures(); e.hasMoreElements(); i++) {
TestFailure failure = e.nextElement();
out.println(i + ") " + failure.failedTest());
failure.thrownException().printStackTrace(out);
}
}
}
/**
* Prints the header of the report
*/
protected void printHeader(PrintWriter out) {
if (wasSuccessful()) {
out.println();
out.print("OK");
out.println(" (" + runCount() + " tests)");
} else {
out.println();
out.println("!!!FAILURES!!!");
out.println("Test Results:");
out.println("Run: " + runCount() + " Failures: " + failureCount() + " Errors: " + errorCount());
}
}
/**
* Prints the timings of the result.
*/
protected void printTimings(PrintWriter out) {
// print out all timing results to the console
for (PerformanceTimer timer : timerList) {
out.println("Timing " + timer.getName() + " : " + timer.getElapsedTime() + " ms ");
}
}
/**
* Start the test
*/
@Override
public synchronized void startTest(Test test) {
super.startTest(test);
System.out.print(".");
}
/**
* Start the timer with the given name. If the timer has already
* been created, send it a startTiming message. If not, create it
* and send the new timer the startTiming message.
*/
public synchronized void startTimer(String timerName) {
PerformanceTimer timer = timers.get(timerName);
if (timer == null) {
timer = new PerformanceTimer(timerName);
timers.put(timerName, timer);
timerList.add(timer);
}
timer.startTiming();
}
/**
* Look up the timer with the given name and send it a stopTiming
* message. If the timer does not exist, report an error.
*/
public synchronized void stopTimer(String timerName) {
PerformanceTimer timer = timers.get(timerName);
if (timer == null) {
throw new Error(timerName + " is not a valid timer name ");
}
timer.stopTiming();
}
/**
* Stops all timers
*/
protected void stopTimers() {
for (PerformanceTimer performanceTimer : timerList) {
performanceTimer.stopTiming();
}
}
}