1 6 package de.uka.ipd.coverage.plugin.remote; 7 8 import java.io.IOException ; 9 import java.io.ObjectOutputStream ; 10 import java.lang.reflect.Constructor ; 11 import java.lang.reflect.InvocationTargetException ; 12 import java.net.Socket ; 13 import java.net.UnknownHostException ; 14 15 import org.eclipse.jdt.internal.junit.runner.RemoteTestRunner; 16 17 import de.uka.ipd.coverage.junit.CoverageTestResult; 18 import de.uka.ipd.coverage.recording.CoverageClassLoader; 19 import de.uka.ipd.coverage.utils.Logger; 20 21 25 public class CoverageRemoteTestRunner { 26 27 public CoverageRemoteTestRunner(String [] completeArgs) { 28 run(completeArgs); 29 } 30 31 public static void main(String [] args) { 32 String [] completeArgs = completeTestRunnerArguments(args); 33 ClassLoader loader = new CoverageClassLoader(); 34 Class printerClass; 35 try { 36 printerClass = loader.loadClass(CoverageRemoteTestRunner.class.getName()); 37 Constructor constr = printerClass.getDeclaredConstructor(new Class [] { String [].class }); 38 constr.newInstance(new Object [] { completeArgs }); 39 } catch (ClassNotFoundException e) { 40 e.printStackTrace(); 41 } catch (SecurityException e) { 42 e.printStackTrace(); 43 } catch (NoSuchMethodException e) { 44 e.printStackTrace(); 45 } catch (IllegalArgumentException e) { 46 e.printStackTrace(); 47 } catch (InstantiationException e) { 48 e.printStackTrace(); 49 } catch (IllegalAccessException e) { 50 e.printStackTrace(); 51 } catch (InvocationTargetException e) { 52 e.printStackTrace(); 53 } 54 } 55 56 private void run(String [] completeArgs) { 57 Logger.getInstance().debug("CoverageRemoteTestRunner: instanciating CoverageClassLoader."); createAndAddShutdownHook(completeArgs); 60 61 RemoteTestRunner.main(completeArgs); 62 } 63 64 65 66 private void createAndAddShutdownHook(final String [] completeArgs) { 67 Runnable shutdownHook = new Runnable () { 68 public void run() { 69 Logger logger = new Logger(CoverageRemoteTestRunner.this); 70 logger.info("JUnit is finished. Entering ShutdownHook."); int port = Integer.MIN_VALUE; 72 for (int i = 0; i < completeArgs.length; i++) { 73 if (completeArgs[i].equals("-coveragePort")) { port = Integer.parseInt(completeArgs[i + 1]); 75 } 76 } 77 String host = null; 78 try { 79 Socket socket = initSocket(logger, port, host); 80 logger.info("Sending RegisteredMethods to the client..."); ObjectOutputStream out = new ObjectOutputStream (socket.getOutputStream()); 82 out.writeObject(CoverageTestResult.getRegisteredMethods()); 83 out.close(); 84 logger.info("Finished sending."); socket.close(); 86 } catch (UnknownHostException e) { 87 logger.log(e); 88 e.printStackTrace(); 89 } catch (IOException e) { 90 logger.log(e); 91 e.printStackTrace(); 92 } 93 logger.info("ShutdownHook done."); } 95 96 101 private Socket initSocket(Logger logger, int port, String host) { 102 logger.debug("Trying to connect to port: " + port + "..."); Socket socket = null; 104 final long TIMEOUT = 10000; 105 long giveUpTime = TIMEOUT + System.currentTimeMillis(); 106 while (System.currentTimeMillis() < giveUpTime) { 107 try { 108 socket = new Socket (host, port); 109 return socket; 110 } catch (UnknownHostException e) { 111 } catch (IOException e) { 112 } 113 } 114 throw new RuntimeException ("Could not connect to socket!"); } 116 117 }; 118 Runtime.getRuntime().addShutdownHook(new Thread (shutdownHook)); 119 } 120 121 122 123 126 private static String [] completeTestRunnerArguments(String [] args) { 127 String [] remoteTestRunnerArgs = new String [args.length + 1]; 128 System.arraycopy(args, 0, remoteTestRunnerArgs, 0, args.length); 129 130 remoteTestRunnerArgs[args.length] = "-debugging"; return remoteTestRunnerArgs; 133 } 134 } 135 | Popular Tags |