blob: 02c1de4074b53cb69ee7c174c2eb2f833e98d0fc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ua.tests.help.util;
import org.junit.Assert;
public class ParallelTestSupport {
public interface ITestCase {
/**
* Runs a test case one time
* @return null if the test passes, otherwise a string representing
* the reason for the failure
* @throws Exception
*/
public String runTest() throws Exception;
}
public static void testSingleCase(ITestCase testCase, int repetitions) {
String result = null;
for (int i = 0; i < repetitions && result == null; i++) {
try {
result = testCase.runTest();
} catch (Exception e) {
result = e.getMessage();
}
if (result != null) {
Assert.fail(result);
}
}
}
public static void testInParallel(ITestCase[] testCases, int repetitions) {
int numberOfThreads = testCases.length;
TestThread[] testThreads = new TestThread[numberOfThreads];
for (int i = 0; i < numberOfThreads; i++) {
testThreads[i] = new TestThread(i, testCases[i], repetitions);
testThreads[i].start();
}
// Now wait for the threads to complete
boolean complete = false;
do {
complete = true;
for (int i = 0; i < numberOfThreads && complete; i++) {
if (testThreads[i].isAlive()) {
complete = false;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Assert.fail("Interrupted Exception");
}
}
}
} while (!complete);
for (int i = 0; i < numberOfThreads; i++) {
if (testThreads[i].failureReason != null) {
Assert.fail(testThreads[i].failureReason);
}
}
}
private static class TestThread extends Thread {
private int index;
private ITestCase testCase;
private int repetitions;
public TestThread(int index, ITestCase testCase, int repetitions) {
this.index = index;
this.testCase = testCase;
this.repetitions = repetitions;
}
public String failureReason = null;
@Override
public void run() {
for (int j = 0; j <= repetitions; j++) {
try {
String unexpected = testCase.runTest();
if (unexpected != null) {
failureReason = "Thread " + index + ", iteration " + j + ": " + unexpected;
return;
}
} catch (Exception e) {
failureReason = e.getMessage();
return;
}
}
}
}
}