< prev index next >
tools/FxTestRunner/src/client/test/runner/TestScript.java
Print this page
rev 319 : 8160349: [TEST BUG] Hanged test blocks port and breaks following tests
Summary: Now each test uses random free port and test runner correctly handles interrupts from javatest.
*** 47,56 ****
--- 47,58 ----
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
+ import java.util.concurrent.Semaphore;
+ import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.runner.RunWith;
import test.javaclient.shared.CanvasRunner;
import test.javaclient.shared.Utils;
*** 59,68 ****
--- 61,71 ----
*
* @author shura, mrkam, Sergey Grinev, Victor Shubov
*/
public class TestScript extends htmltestrunner.TestScript {
+ private static final int FORCED_TERMINATION_TIMEOUT = 5000;
private static final boolean verbose = true; //TODO: use real logger
private volatile Process process = null;
private volatile ServerSocket cmdServer = null;
private volatile Socket cmdSocket;
private volatile ObjectOutputStream commandStream;
*** 91,106 ****
System.out.println("Mode:" + runMode);
System.out.println("Result Dir:" + resultDir);
if (needToRun(testClassName, testName, runMode)) {
try {
! startServer();
if (runMode.equals(BasicFXInterview.RUN_MODE_DESKTOP)
|| runMode.equals(BasicFXInterview.RUN_MODE_DESKTOP_SWING_INTEROPERABILITY)
|| runMode.equals(BasicFXInterview.RUN_MODE_DESKTOP_SWT_INTEROPERABILITY)) {
! runTd(description, resultDir);
} else {
runPlugin(td, resultDir, BasicFXInterview.RUN_MODE_JNLP.equals(runMode));
}
} catch (Throwable e) {
e.printStackTrace(System.err);
--- 94,109 ----
System.out.println("Mode:" + runMode);
System.out.println("Result Dir:" + resultDir);
if (needToRun(testClassName, testName, runMode)) {
try {
! int masterPort = startServer();
if (runMode.equals(BasicFXInterview.RUN_MODE_DESKTOP)
|| runMode.equals(BasicFXInterview.RUN_MODE_DESKTOP_SWING_INTEROPERABILITY)
|| runMode.equals(BasicFXInterview.RUN_MODE_DESKTOP_SWT_INTEROPERABILITY)) {
! runTd(description, resultDir, masterPort);
} else {
runPlugin(td, resultDir, BasicFXInterview.RUN_MODE_JNLP.equals(runMode));
}
} catch (Throwable e) {
e.printStackTrace(System.err);
*** 130,139 ****
--- 133,143 ----
}
commandStream.close();
interrupt(Status.error(e.toString()));
}
+ Semaphore s = new Semaphore(0);
resultThread = new Thread(new Runnable() {
@Override
public void run() {
try {
System.err.println("Waiting for exit");
*** 189,202 ****
--- 193,215 ----
// }
//
// jemmyProcess.destroy();
// }
System.out.println("DONE");
+ s.release();
}
}
}, "I'm waiting for test's result");
resultThread.start();
+ try {
+ s.acquire();
+ } catch (InterruptedException ex) {
+ System.out.println("Interrupt from test runner: " + ex);
+ resultThread.interrupt();
+ process.destroyForcibly();
+ process.waitFor(FORCED_TERMINATION_TIMEOUT, TimeUnit.MILLISECONDS);
+ }
}
}
@Override
protected void showTestDialog(TestDescription td, TestEnvironment env) {
*** 285,295 ****
* @param resultDir
* @return
* @throws IOException
* @throws Fault
*/
! protected String[] tdCmdArgs(TestDescription td, String resultDir) throws IOException, Fault {
String testClassName = td.getParameter(RunUITestFinder.UNIT_TEST_CLASS_NAME);
boolean isJunit = Boolean.parseBoolean(td.getParameter(RunUITestFinder.TYPE_JUNIT));
//String fxSdkHome = td.getParameter(BasicFXInterview.FX_SDK_HOME_PARAM_NAME);
--- 298,308 ----
* @param resultDir
* @return
* @throws IOException
* @throws Fault
*/
! protected String[] tdCmdArgs(TestDescription td, String resultDir, int port) throws IOException, Fault {
String testClassName = td.getParameter(RunUITestFinder.UNIT_TEST_CLASS_NAME);
boolean isJunit = Boolean.parseBoolean(td.getParameter(RunUITestFinder.TYPE_JUNIT));
//String fxSdkHome = td.getParameter(BasicFXInterview.FX_SDK_HOME_PARAM_NAME);
*** 381,390 ****
--- 394,404 ----
command = addToArray(command, ipV4);
command = addToArray(command, jvmArgPrismOrder, jvmArgLibraryPath, jvmArgImageUtils);
command = addToArray(command, additionalOptions);
command = addToArray(command, jvmArgNoDesc, jvmProxyHost, jvmProxyPort, jvmInterop, swtTestOpt);
command = addToArray(command, jvmArgClientTestRoot);
+ command = addToArray(command, "-DmasterPort=" + port);
command = addToArray(command, "-classpath", System.getProperty("java.class.path"));
// command = addToArray(command, "-Xdebug", "-Xnoagent", "-Djava.compiler=NONE", "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5858");
command = addToArray(command, isJunit ? JUnit2TestRunner.class.getName() : TestRunner.class.getName(), testClassName);
return command;
}
*** 406,436 ****
*/
protected void doRunTd(String[] command) throws IOException {
process = Runtime.getRuntime().exec(deleteEmptyElements(command));
}
! private void startServer() throws IOException {
! System.out.println("Starting server at " + CommonTestRunnerWorker.PORT);
int iRetryCount = 3;
boolean bindDone = false;
while ( (iRetryCount > 0) && (false==bindDone) ) {
iRetryCount = iRetryCount - 1;
try {
! cmdServer = new ServerSocket(CommonTestRunnerWorker.PORT);
bindDone = true;
} catch (java.net.BindException be) {
bindDone = false;
System.out.println(" === bind exception ===");
! Socket socket = new Socket( "127.0.0.1", CommonTestRunnerWorker.PORT);
commandStream = new ObjectOutputStream(socket.getOutputStream());
sendCommand(CommandType.ABORT);
try {Thread.sleep(100);} catch(Exception e){}
}
}// retry loop end
cmdServer.setSoTimeout(60000); // we need to be generous for plugin mode, it gets to "download" runnable
}
private void waitForConnection() throws IOException {
System.out.println("Waiting for connection...");
cmdSocket = cmdServer.accept();
--- 420,452 ----
*/
protected void doRunTd(String[] command) throws IOException {
process = Runtime.getRuntime().exec(deleteEmptyElements(command));
}
! private int startServer() throws IOException {
! System.out.println("Starting server." );
int iRetryCount = 3;
boolean bindDone = false;
while ( (iRetryCount > 0) && (false==bindDone) ) {
iRetryCount = iRetryCount - 1;
try {
! cmdServer = new ServerSocket(0);
! System.out.println("Started server at port " + cmdServer.getLocalPort());
bindDone = true;
} catch (java.net.BindException be) {
bindDone = false;
System.out.println(" === bind exception ===");
! Socket socket = new Socket("127.0.0.1", cmdServer.getLocalPort());
commandStream = new ObjectOutputStream(socket.getOutputStream());
sendCommand(CommandType.ABORT);
try {Thread.sleep(100);} catch(Exception e){}
}
}// retry loop end
cmdServer.setSoTimeout(60000); // we need to be generous for plugin mode, it gets to "download" runnable
+ return cmdServer.getLocalPort();
}
private void waitForConnection() throws IOException {
System.out.println("Waiting for connection...");
cmdSocket = cmdServer.accept();
*** 479,490 ****
ex.printStackTrace(System.err);
}
return result;
}
! private void runTd(TestDescription td, String resultDir) throws IOException, InterruptedException, Fault {
! String[] command = tdCmdArgs(td, resultDir);
dumpProcessExecution(resultDir, command, null);
doRunTd(command);
System.out.println("Logs: " + resultDir + File.separator);
if (process != null) {
--- 495,506 ----
ex.printStackTrace(System.err);
}
return result;
}
! private void runTd(TestDescription td, String resultDir, int port) throws IOException, InterruptedException, Fault {
! String[] command = tdCmdArgs(td, resultDir, port);
dumpProcessExecution(resultDir, command, null);
doRunTd(command);
System.out.println("Logs: " + resultDir + File.separator);
if (process != null) {
*** 520,530 ****
writer.flush();
}
private static final String pluginPath = "./dist-plugin/";
private static final String pluginFile = "JavaClientPluginTest";
! private void runPlugin(TestDescription td, String resultDir, boolean isJnlp) throws IOException, Fault {
String testClassName = td.getParameter(RunUITestFinder.UNIT_TEST_CLASS_NAME);
String testName = td.getParameter(RunUITestFinder.TEST_NAME);
//TODO: add non-junit tests support
boolean isJunit = Boolean.parseBoolean(td.getParameter(RunUITestFinder.TYPE_JUNIT));
--- 536,547 ----
writer.flush();
}
private static final String pluginPath = "./dist-plugin/";
private static final String pluginFile = "JavaClientPluginTest";
! private void runPlugin(TestDescription td, String resultDir, boolean isJnlp)
! throws IOException, Fault {
String testClassName = td.getParameter(RunUITestFinder.UNIT_TEST_CLASS_NAME);
String testName = td.getParameter(RunUITestFinder.TEST_NAME);
//TODO: add non-junit tests support
boolean isJunit = Boolean.parseBoolean(td.getParameter(RunUITestFinder.TYPE_JUNIT));
< prev index next >