1ed626ea7464c25db7ea754177f36b344195da158Cédric Beustpackage org.testng.remote.strprotocol; 2ed626ea7464c25db7ea754177f36b344195da158Cédric Beust 3ed626ea7464c25db7ea754177f36b344195da158Cédric Beustimport org.testng.remote.RemoteTestNG; 4ed626ea7464c25db7ea754177f36b344195da158Cédric Beust 515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beustimport java.io.BufferedReader; 6754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beustimport java.io.BufferedWriter; 715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beustimport java.io.IOException; 815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beustimport java.io.InputStreamReader; 9754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beustimport java.io.OutputStreamWriter; 10ed626ea7464c25db7ea754177f36b344195da158Cédric Beustimport java.io.PrintWriter; 11754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beustimport java.io.UnsupportedEncodingException; 1215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beustimport java.net.SocketException; 13ed626ea7464c25db7ea754177f36b344195da158Cédric Beust 14754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beustpublic class StringMessageSender extends BaseMessageSender { 15754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust 1615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust private PrintWriter writer; 1715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust 18754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust public StringMessageSender(String host, int port) { 195c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust super(host, port, false /* no ack */); 205c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust } 215c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust 225c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust public StringMessageSender(String host, int port, boolean ack) { 235c2da9a4d95f922a413b8502f4ddc3ab0f13c9d3Cédric Beust super(host, port, ack); 24754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust } 25ed626ea7464c25db7ea754177f36b344195da158Cédric Beust 26ed626ea7464c25db7ea754177f36b344195da158Cédric Beust @Override 27754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust public void sendMessage(IMessage message) { 28ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust if (m_outStream == null) { 29ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust throw new IllegalStateException("Trying to send a message on a shutdown sender"); 30ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust } 31ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust if (writer == null) { 32ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust try { 33ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust writer = new PrintWriter(new BufferedWriter( 34ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust new OutputStreamWriter(m_outStream, "UTF-8")), //$NON-NLS-1$ 35ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust false /* autoflush */); 36ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust } catch (UnsupportedEncodingException e1) { 37ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust writer = new PrintWriter(new BufferedWriter( 38ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust new OutputStreamWriter(m_outStream)), 39ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust false /* autoflush */); 40ab96c48086fd0dc4e6c6e69648be8ee283c0bd0eCédric Beust } 41754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust } 42754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust 43ed626ea7464c25db7ea754177f36b344195da158Cédric Beust String msg = ((IStringMessage) message).getMessageAsString(); 44ed626ea7464c25db7ea754177f36b344195da158Cédric Beust if (RemoteTestNG.isVerbose()) { 45e13375131c0502f2553a694109d79cbf00732dfaCédric Beust p("Sending message:" + message); 46e13375131c0502f2553a694109d79cbf00732dfaCédric Beust p(" String version:" + msg); 47ed626ea7464c25db7ea754177f36b344195da158Cédric Beust 48ed626ea7464c25db7ea754177f36b344195da158Cédric Beust StringBuffer buf = new StringBuffer(); 49ed626ea7464c25db7ea754177f36b344195da158Cédric Beust for(int i = 0; i < msg.length(); i++) { 50ed626ea7464c25db7ea754177f36b344195da158Cédric Beust if('\u0001' == msg.charAt(i)) { 51e13375131c0502f2553a694109d79cbf00732dfaCédric Beust p(" word:[" + buf.toString() + "]"); 52ed626ea7464c25db7ea754177f36b344195da158Cédric Beust buf.delete(0, buf.length()); 53ed626ea7464c25db7ea754177f36b344195da158Cédric Beust } 54ed626ea7464c25db7ea754177f36b344195da158Cédric Beust else { 55ed626ea7464c25db7ea754177f36b344195da158Cédric Beust buf.append(msg.charAt(i)); 56ed626ea7464c25db7ea754177f36b344195da158Cédric Beust } 57ed626ea7464c25db7ea754177f36b344195da158Cédric Beust } 58e13375131c0502f2553a694109d79cbf00732dfaCédric Beust p(" word:[" + buf.toString() + "]"); 59ed626ea7464c25db7ea754177f36b344195da158Cédric Beust } 60ed626ea7464c25db7ea754177f36b344195da158Cédric Beust 613eb34813b24377dd042c9e85b8a7854af34e3b81Cédric Beust synchronized(m_ackLock) { 62754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust writer.println(msg); 63754256e4b1acba1555bcb1892a2627fd34f594c6Cédric Beust writer.flush(); 640482f188546780be2e9fbb4607765fcaaecb898bCédric Beust waitForAck(); 65ed626ea7464c25db7ea754177f36b344195da158Cédric Beust } 66ed626ea7464c25db7ea754177f36b344195da158Cédric Beust } 67ed626ea7464c25db7ea754177f36b344195da158Cédric Beust 68ed626ea7464c25db7ea754177f36b344195da158Cédric Beust private static void p(String msg) { 69ed626ea7464c25db7ea754177f36b344195da158Cédric Beust if (RemoteTestNG.isVerbose()) { 70ed626ea7464c25db7ea754177f36b344195da158Cédric Beust System.out.println("[StringMessageSender] " + msg); //$NON-NLS-1$ 71ed626ea7464c25db7ea754177f36b344195da158Cédric Beust } 72ed626ea7464c25db7ea754177f36b344195da158Cédric Beust } 73ed626ea7464c25db7ea754177f36b344195da158Cédric Beust 7415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust @Override 7515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust public IMessage receiveMessage() { 7615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust IMessage result = null; 7715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust 7815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust if (m_inReader == null) { 7915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust try { 8054c45175326b6cda1d4da7780f906871632de1d5Cédric Beust m_inReader = new BufferedReader(new InputStreamReader(m_inStream, "UTF-8")); 8115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } catch (UnsupportedEncodingException e) { 8254c45175326b6cda1d4da7780f906871632de1d5Cédric Beust m_inReader = new BufferedReader(new InputStreamReader(m_inStream)); 8315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 8415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 8515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust try { 8615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// try { 8715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// m_outputWriter = new PrintWriter(new OutputStreamWriter(fSocket.getOutputStream(), "UTF-8"), 8815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// true); 8915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// } 9015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// catch(UnsupportedEncodingException e1) { 9115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// m_outputWriter = new PrintWriter(new OutputStreamWriter(fSocket.getOutputStream()), true); 9215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// } 9315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust result = receiveMessage(m_inReader.readLine()); 94a3f78c5debcd03e7755f5ff2956a6f325e41d0b7Ryan Schmitt } catch(IOException e) { 9515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust handleThrowable(e); 9615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 9715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust 9815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust return result; 9915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// finally { 10015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// shutDown(); 10115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// return null; 10215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// } 10315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 10415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust 10515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust protected void handleThrowable(Throwable cause) { 1063eb34813b24377dd042c9e85b8a7854af34e3b81Cédric Beust if (RemoteTestNG.isVerbose()) { 1073eb34813b24377dd042c9e85b8a7854af34e3b81Cédric Beust cause.printStackTrace(); 1083eb34813b24377dd042c9e85b8a7854af34e3b81Cédric Beust } 10915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 11015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust 11115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// private String readMessage(BufferedReader in) throws IOException { 11215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// return in.readLine(); 11315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// } 11415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust 11515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust private IMessage receiveMessage(String message) { 116e13375131c0502f2553a694109d79cbf00732dfaCédric Beust if (message == null) return null; 11715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust IMessage result = null; 11815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust 11915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust int messageType = MessageHelper.getMessageType(message); 12015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust 12115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// try { 12215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust if(messageType < MessageHelper.SUITE) { 12315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust // Generic message 12415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust result = MessageHelper.unmarshallGenericMessage(message); 12515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 12615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust else if(messageType < MessageHelper.TEST) { 12715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust // Suite message 12815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust result = MessageHelper.createSuiteMessage(message); 12915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 13015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust else if(messageType < MessageHelper.TEST_RESULT) { 13115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust // Test message 13215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust result = MessageHelper.createTestMessage(message); 13315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 13415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust else { 13515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust // TestResult message 13615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust result = MessageHelper.unmarshallTestResultMessage(message); 13715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 13815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// } 13915f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// finally { 14015f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// if(isRunning() && (null != m_outputWriter)) { 14115f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// m_outputWriter.println(MessageHelper.ACK_MSG); 14215f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// m_outputWriter.flush(); 14315f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// } 14415f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust// } 14515f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust 14615f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust p("receiveMessage() received:" + result); 14715f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust return result; 14815f707e1b3e9b4360b4b1e5fa5ad7a3b396b04fdCédric Beust } 149ed626ea7464c25db7ea754177f36b344195da158Cédric Beust} 150