< 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 >