@Override
	public void evaluate() throws Throwable {

		//
		// We must wait so the next test does not start before the last test is finished.  This
		// can happen when we throw an exception from this method.
		// 
		waitForPreviousTestToFinish();

		TestThread testThread = new TestThread(testStatement);
		lastTestThread = testThread;
		testThread.start();

		waitForTestUnlessExceptions(testThread);

		//
		// Print any exceptions not from the test thread.
		//
		printNonTestThreadExceptions();

		// 
		// Throw any exceptions in order to fail the test.
		//

		// Prefer test exception over non-test thread exceptions.
		if (testThread.exceptionFromTest != null) {
			maybePrintConsoleTestThreadExceptionMessage();
			throw testThread.exceptionFromTest;
		}

		TestExceptionTracker nonTestThreadTracker = getFirstNonTestThreadExceptionTracker();
		if (nonTestThreadTracker == null) {
			return; // no exceptions to report
		}

		//
		// Throw the non-test thread exception.  This normally would not trigger a test failure, 
		// but we want to clean these up, so fail the test.
		//
		throw nonTestThreadTracker.getCombinedException();
	}
The time period after which a test will be forcibly terminated
Ghidra/Framework/Generic/src/main/java/generic/test/ConcurrentTestExceptionStatement.java