15f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/* 25f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 35f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * contributor license agreements. See the NOTICE file distributed with 45f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * this work for additional information regarding copyright ownership. 55f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 65f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * (the "License"); you may not use this file except in compliance with 75f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * the License. You may obtain a copy of the License at 85f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 95f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Unless required by applicable law or agreed to in writing, software 125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * See the License for the specific language governing permissions and 165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * limitations under the License. 175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @author Vitaly A. Provodin 215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 29.01.2005 255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.share; 275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.DataInputStream; 295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.DataOutputStream; 305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.EOFException; 315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.IOException; 32f071b0daf89102f441718079a50562a970846a59Nicolas Geoffrayimport java.net.InetAddress; 33ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffrayimport java.net.InetSocketAddress; 345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.net.Socket; 355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.net.ServerSocket; 3662caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffrayimport java.net.UnknownHostException; 375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.DebuggeeSynchronizer; 395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.LogWriter; 405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.TestErrorException; 415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.TestOptions; 425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * This class implements <code>DebuggeeSynchronizer</code> interface using 455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * TCP/IP sockets. All operations can be timed out according to default timeout. 465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class JPDADebuggeeSynchronizer implements DebuggeeSynchronizer { 485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public final static String SGNL_READY = "ready"; 505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public final static String SGNL_CONTINUE = "continue"; 525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected Socket clientSocket = null; 545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected ServerSocket serverSocket = null; 565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected DataOutputStream out; 585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected DataInputStream in; 605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected TestOptions settings; 625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected LogWriter logWriter; 645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * A constructor that initializes an instance of the class with specified 675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <code>LogWriter</code> and <code>TestOptions</code>. 685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @param logWriter 705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The instance of implementation of LogWriter. 715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @param settings 725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Instance of test options. 735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public JPDADebuggeeSynchronizer(LogWriter logWriter, TestOptions settings) { 755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes super(); 765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes this.logWriter = logWriter; 775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes this.settings = settings; 785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Sends specified message to synchronization channel. 825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @param message 845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * a message to be sent. 855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized void sendMessage(String message) { 875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out.writeUTF(message); 895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out.flush(); 905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Message sent: " + message); 915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException(e); 935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Receives message from synchronization channel and compares it with the 985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * expected <code>message</code>. 995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @param message 1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * expected message. 1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @return <code>true</code> if received string is equals to 1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <code>message</code> otherwise - <code>false</code>. 1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized boolean receiveMessage(String message) { 1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String msg; 1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Waiting for message: " + message); 1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes msg = in.readUTF(); 1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Received message: " + msg); 1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (EOFException e) { 1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return false; 1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.printError(e); 1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return false; 1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return message.equalsIgnoreCase(msg); 1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Receives message from synchronization channel. 1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @return received string or null if connection was closed. 1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized String receiveMessage() { 1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String msg; 1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Waiting for any messsage"); 1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes msg = in.readUTF(); 1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Received message: " + msg); 1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (EOFException e) { 1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return null; 1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException(e); 1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return msg; 1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Receives message from synchronization channel without Exception. 1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @return received string 1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized String receiveMessageWithoutException(String invoker) { 1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String msg; 1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Waiting for any message"); 1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes msg = in.readUTF(); 1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Received message: " + msg); 1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (Throwable thrown) { 1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (invoker != null) { 1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("#### receiveMessageWithoutException: Exception occurred:"); 1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("#### " + thrown); 1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("#### Invoker = " + invoker); 1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes msg = "" + thrown; 1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return msg; 1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 163ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray * Returns socket address for connecting to the server. 1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 1653b4bb97bf62acc68ec8be64f78e99e6ff6371e85Roland Levillain * If <code>serverAddress.getPort()</code> returns 0 (i.e., 1663b4bb97bf62acc68ec8be64f78e99e6ff6371e85Roland Levillain * <code>org.apache.harmony.jpda.tests.framework.TestOptions.DEFAULT_SYNC_PORT</code>), 1673b4bb97bf62acc68ec8be64f78e99e6ff6371e85Roland Levillain * a port will automatically be chosen by the OS when the server is bound to a socket. 1683b4bb97bf62acc68ec8be64f78e99e6ff6371e85Roland Levillain * 169ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray * @return socket address 1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 171ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray public InetSocketAddress getSyncServerAddress() { 172ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray // Use the LOOPBACK directly instead of doing a DNS lookup. 173ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray int port = settings.getSyncPortNumber(); 17462caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffray try { 17562caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffray // Use IPv4 to ensure we do not depend on IPv6 to run these tests. 17662caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffray // TODO(25178637): Use InetAddress.getLoopbackAddress() instead. 17762caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffray return new InetSocketAddress( 17862caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffray InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 }), port); 17962caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffray } catch (UnknownHostException e) { 18062caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffray throw new TestErrorException( 18162caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffray "[SYNC] Exception in binding for socket sync connection", e); 18262caab4659c16e09f8f7ca93c13f2186d306aafeNicolas Geoffray } 1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Binds server to listen socket port. 1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 188f29bf6ef8cea6851f70ed5d794e57a3c69e4a51aRoland Levillain * If <code>serverAddress.getPort()</code> returns 0 (i.e., 189f29bf6ef8cea6851f70ed5d794e57a3c69e4a51aRoland Levillain * <code>org.apache.harmony.jpda.tests.framework.TestOptions.DEFAULT_SYNC_PORT</code>), 190f29bf6ef8cea6851f70ed5d794e57a3c69e4a51aRoland Levillain * the OS will choose a port automatically for this server socket. 191f29bf6ef8cea6851f70ed5d794e57a3c69e4a51aRoland Levillain * 1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @return port number 1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized int bindServer() { 195ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray InetSocketAddress serverAddress = getSyncServerAddress(); 1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 197ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray logWriter.println("[SYNC] Binding socket on: " + serverAddress); 198ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray serverSocket = new ServerSocket(serverAddress.getPort(), 0, serverAddress.getAddress()); 199f29bf6ef8cea6851f70ed5d794e57a3c69e4a51aRoland Levillain int localPort = serverSocket.getLocalPort(); 200f29bf6ef8cea6851f70ed5d794e57a3c69e4a51aRoland Levillain logWriter.println("[SYNC] Bound socket on: " + serverAddress 201f29bf6ef8cea6851f70ed5d794e57a3c69e4a51aRoland Levillain + " (local port: " + localPort + ")" ); 202f29bf6ef8cea6851f70ed5d794e57a3c69e4a51aRoland Levillain return localPort; 2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException( 2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "[SYNC] Exception in binding for socket sync connection", e); 2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 2105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Accepts sync connection form server side. 2115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 2125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized void startServer() { 2135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes long timeout = settings.getTimeout(); 2145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 2155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes serverSocket.setSoTimeout((int) timeout); 2165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Accepting socket connection"); 2175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes clientSocket = serverSocket.accept(); 2185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Accepted socket connection"); 2195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes clientSocket.setSoTimeout((int) timeout); 2215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out = new DataOutputStream(clientSocket.getOutputStream()); 2225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes in = new DataInputStream(clientSocket.getInputStream()); 2235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 2245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException( 2255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "[SYNC] Exception in accepting socket sync connection", e); 2265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 2305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Attaches for sync connection from client side.. 2315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 2325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public synchronized void startClient() { 2335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes long timeout = settings.getTimeout(); 234ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray InetSocketAddress serverAddress = getSyncServerAddress(); 2355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 236ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray logWriter.println("[SYNC] Attaching socket to: " + serverAddress); 237ea82049f8c0f088c6e2bccc09b332d84fbc34b87Nicolas Geoffray clientSocket = new Socket(serverAddress.getAddress(), serverAddress.getPort()); 2385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Attached socket"); 2395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes clientSocket.setSoTimeout((int) timeout); 2415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out = new DataOutputStream(clientSocket.getOutputStream()); 2425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes in = new DataInputStream(clientSocket.getInputStream()); 2435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 2445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes throw new TestErrorException( 2455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "[SYNC] Exception in attaching for socket sync connection", e); 2465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 2505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Stops synchronization work. It ignores <code>IOException</code> but 2515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * prints a message. 2525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 2535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public void stop() { 2545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes try { 2555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (out != null) 2565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes out.close(); 2575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (in != null) 2585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes in.close(); 2595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (clientSocket != null) 2605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes clientSocket.close(); 2615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (serverSocket != null) 2625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes serverSocket.close(); 2635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } catch (IOException e) { 2645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 2655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("[SYNC] Ignoring exception in closing socket sync connection: " + e); 2665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("[SYNC] Closed socket"); 2685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes} 270