You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2011/11/10 09:25:33 UTC

svn commit: r1200210 - in /jmeter/trunk: src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/ xdocs/

Author: pmouawad
Date: Thu Nov 10 08:25:32 2011
New Revision: 1200210

URL: http://svn.apache.org/viewvc?rev=1200210&view=rev
Log:
Bug 52104 - TCP Sampler handles badly errors
Bug 52087 - TCPClient interface does not allow for partial reads

Added:
    jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/ReadException.java   (with props)
Modified:
    jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/BinaryTCPClientImpl.java
    jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/LengthPrefixedBinaryTCPClientImpl.java
    jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClient.java
    jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClientImpl.java
    jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPSampler.java
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/BinaryTCPClientImpl.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/BinaryTCPClientImpl.java?rev=1200210&r1=1200209&r2=1200210&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/BinaryTCPClientImpl.java (original)
+++ jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/BinaryTCPClientImpl.java Thu Nov 10 08:25:32 2011
@@ -115,23 +115,27 @@ public class BinaryTCPClientImpl extends
      * @return hex-encoded binary string
      * @throws IOException 
      */
-    public String read(InputStream is) throws IOException {
-        byte[] buffer = new byte[4096];
-        ByteArrayOutputStream w = new ByteArrayOutputStream();
-        int x = 0;
-        while ((x = is.read(buffer)) > -1) {
-            w.write(buffer, 0, x);
-            if (useEolByte && (buffer[x - 1] == eolByte)) {
-                break;
-            }
-        }
+    public String read(InputStream is) throws ReadException {
+    	ByteArrayOutputStream w = new ByteArrayOutputStream();
+        try {
+			byte[] buffer = new byte[4096];
+			int x = 0;
+			while ((x = is.read(buffer)) > -1) {
+			    w.write(buffer, 0, x);
+			    if (useEolByte && (buffer[x - 1] == eolByte)) {
+			        break;
+			    }
+			}
 
-        IOUtils.closeQuietly(w); // For completeness
-        final String hexString = JOrphanUtils.baToHexString(w.toByteArray());
-        if(log.isDebugEnabled()) {
-            log.debug("Read: " + w.size() + "\n" + hexString);
-        }
-        return hexString;
+			IOUtils.closeQuietly(w); // For completeness
+			final String hexString = JOrphanUtils.baToHexString(w.toByteArray());
+			if(log.isDebugEnabled()) {
+			    log.debug("Read: " + w.size() + "\n" + hexString);
+			}
+			return hexString;
+		} catch (IOException e) {
+			throw new ReadException("", e, JOrphanUtils.baToHexString(w.toByteArray()));
+		}
     }
 
 }

Modified: jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/LengthPrefixedBinaryTCPClientImpl.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/LengthPrefixedBinaryTCPClientImpl.java?rev=1200210&r1=1200209&r2=1200210&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/LengthPrefixedBinaryTCPClientImpl.java (original)
+++ jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/LengthPrefixedBinaryTCPClientImpl.java Thu Nov 10 08:25:32 2011
@@ -73,24 +73,29 @@ public class LengthPrefixedBinaryTCPClie
     /**
      * {@inheritDoc}
      */
-    public String read(InputStream is) throws IOException{
+    public String read(InputStream is) throws ReadException{
         byte[] msg = new byte[0];
         int msgLen = 0;
         byte[] lengthBuffer = new byte[lengthPrefixLen];
-        if (is.read(lengthBuffer, 0, lengthPrefixLen) == lengthPrefixLen) {
-            msgLen = byteArrayToInt(lengthBuffer);
-            msg = new byte[msgLen];
-            int bytes = JOrphanUtils.read(is, msg, 0, msgLen);
-            if (bytes < msgLen) {
-                log.warn("Incomplete message read, expected: "+msgLen+" got: "+bytes);
-            }
+        try {
+	        if (is.read(lengthBuffer, 0, lengthPrefixLen) == lengthPrefixLen) {
+	            msgLen = byteArrayToInt(lengthBuffer);
+	            msg = new byte[msgLen];
+	            int bytes = JOrphanUtils.read(is, msg, 0, msgLen);
+	            if (bytes < msgLen) {
+	                log.warn("Incomplete message read, expected: "+msgLen+" got: "+bytes);
+	            }
+	        }
+	
+	        String buffer = JOrphanUtils.baToHexString(msg);
+	        if(log.isDebugEnabled()) {
+	            log.debug("Read: " + msgLen + "\n" + buffer);
+	        }
+	        return buffer;
+        } 
+        catch(IOException e) {
+        	throw new ReadException("", e, JOrphanUtils.baToHexString(msg));
         }
-
-        String buffer = JOrphanUtils.baToHexString(msg);
-        if(log.isDebugEnabled()) {
-            log.debug("Read: " + msgLen + "\n" + buffer);
-        }
-        return buffer;
     }
 
     /**

Added: jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/ReadException.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/ReadException.java?rev=1200210&view=auto
==============================================================================
--- jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/ReadException.java (added)
+++ jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/ReadException.java Thu Nov 10 08:25:32 2011
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.jmeter.protocol.tcp.sampler;
+
+/**
+ * Exception that contains partial response (Text read until exception occured)
+ */
+public class ReadException extends Exception {
+
+	private static final long serialVersionUID = -2770054697780959330L;
+	private String partialResponse;
+
+
+	/**
+	 * Constructor
+	 * @param message Message
+	 * @param cause Source cause
+	 * @param partialResponse  Text read until error occured
+	 */
+	public ReadException(String message, Throwable cause, String partialResponse) {
+		super(message, cause);
+		this.partialResponse = partialResponse;
+	}
+
+	/**
+	 * @return the partialResponse Text read until error occured
+	 */
+	public String getPartialResponse() {
+		return partialResponse;
+	}
+}
\ No newline at end of file

Propchange: jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/ReadException.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClient.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClient.java?rev=1200210&r1=1200209&r2=1200210&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClient.java (original)
+++ jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClient.java Thu Nov 10 08:25:32 2011
@@ -66,8 +66,9 @@ public interface TCPClient {
      * @param is -
      *            InputStream for socket
      * @return String read from socket
+     * @throws ReadException exception that can contain partial response (Response until error occured)
      */
-    String read(InputStream is) throws IOException;
+    String read(InputStream is) throws ReadException;
 
     /**
      * Get the end-of-line/end-of-message byte.
@@ -83,5 +84,4 @@ public interface TCPClient {
      *            The value to set
      */
     public void setEolByte(int eolInt);
-
 }
\ No newline at end of file

Modified: jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClientImpl.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClientImpl.java?rev=1200210&r1=1200209&r2=1200210&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClientImpl.java (original)
+++ jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPClientImpl.java Thu Nov 10 08:25:32 2011
@@ -83,21 +83,25 @@ public class TCPClientImpl extends Abstr
      * If there is no EOL byte defined, then reads until
      * the end of the stream is reached.
      */
-    public String read(InputStream is) throws IOException{
-        byte[] buffer = new byte[4096];
-        ByteArrayOutputStream w = new ByteArrayOutputStream();
-        int x = 0;
-        while ((x = is.read(buffer)) > -1) {
-            w.write(buffer, 0, x);
-            if (useEolByte && (buffer[x - 1] == eolByte)) {
-                break;
-            }
-        }
+    public String read(InputStream is) throws ReadException{
+    	ByteArrayOutputStream w = new ByteArrayOutputStream();
+        try {
+			byte[] buffer = new byte[4096];
+			int x = 0;
+			while ((x = is.read(buffer)) > -1) {
+			    w.write(buffer, 0, x);
+			    if (useEolByte && (buffer[x - 1] == eolByte)) {
+			        break;
+			    }
+			}
 
-        // do we need to close byte array (or flush it?)
-        if(log.isDebugEnabled()) {
-            log.debug("Read: " + w.size() + "\n" + w.toString());
-        }
-        return w.toString();
+			// do we need to close byte array (or flush it?)
+			if(log.isDebugEnabled()) {
+			    log.debug("Read: " + w.size() + "\n" + w.toString());
+			}
+			return w.toString();
+		} catch (IOException e) {
+			throw new ReadException("", e, w.toString());
+		}
     }
 }

Modified: jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPSampler.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPSampler.java?rev=1200210&r1=1200209&r2=1200210&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPSampler.java (original)
+++ jmeter/trunk/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPSampler.java Thu Nov 10 08:25:32 2011
@@ -33,12 +33,13 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.jmeter.config.ConfigTestElement;
-import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jmeter.samplers.AbstractSampler;
 import org.apache.jmeter.samplers.Entry;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.testelement.ThreadListener;
+import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.jorphan.util.JOrphanUtils;
 import org.apache.log.Logger;
@@ -339,42 +340,15 @@ public class TCPSampler extends Abstract
                 res.setSamplerData(req);
                 protocolHandler.write(os, req);
                 String in = protocolHandler.read(is);
-                res.setResponseData(in, null);
-                res.setDataType(SampleResult.TEXT);
-                res.setResponseCodeOK();
-                res.setResponseMessage("OK"); //$NON-NLS-1$
-                isSuccessful = true;
-                // Reset the status code if the message contains one
-                if (STATUS_PREFIX.length() > 0) {
-                    int i = in.indexOf(STATUS_PREFIX);
-                    int j = in.indexOf(STATUS_SUFFIX, i + STATUS_PREFIX.length());
-                    if (i != -1 && j > i) {
-                        String rc = in.substring(i + STATUS_PREFIX.length(), j);
-                        res.setResponseCode(rc);
-                        isSuccessful = checkResponseCode(rc);
-                        if (haveStatusProps) {
-                            res.setResponseMessage(statusProps.getProperty(rc, "Status code not found in properties")); //$NON-NLS-1$
-                        } else {
-                            res.setResponseMessage("No status property file");
-                        }
-                    } else {
-                        res.setResponseCode("999"); //$NON-NLS-1$
-                        res.setResponseMessage("Status value not found");
-                        isSuccessful = false;
-                    }
-                }
+                isSuccessful = setupSampleResult(res, in, null);
             }
-        } catch (IOException ex) {
-            log.debug("", ex);
-            isSuccessful=false;
-            res.setResponseCode("500"); //$NON-NLS-1$
-            res.setResponseMessage(ex.toString());
+        } catch (ReadException ex) {
+            log.error("", ex);
+            isSuccessful=setupSampleResult(res, ex.getPartialResponse(), ex);
             closeSocket();
         } catch (Exception ex) {
             log.error("", ex);
-            isSuccessful=false;
-            res.setResponseCode("500");
-            res.setResponseMessage(ex.toString());
+            isSuccessful=setupSampleResult(res, "", ex);
             closeSocket();
         } finally {
             // Calculate response time
@@ -387,10 +361,51 @@ public class TCPSampler extends Abstract
                 closeSocket();
             }
         }
-
         return res;
     }
 
+	/**
+	 * Fills SampleResult object
+	 * @param sampleResult {@link SampleResult}
+	 * @param readResponse Response read until error occured
+	 * @param exception Source exception
+	 * @return boolean if sample is considered as successful
+	 */
+	private boolean setupSampleResult(SampleResult sampleResult,
+			String readResponse, 
+			Exception exception) {
+		sampleResult.setResponseData(readResponse, null);
+		sampleResult.setDataType(SampleResult.TEXT);
+		if(exception==null) {
+			sampleResult.setResponseCodeOK();
+			sampleResult.setResponseMessage("OK"); //$NON-NLS-1$
+		} else {
+			sampleResult.setResponseCode("500"); //$NON-NLS-1$
+			sampleResult.setResponseMessage(exception.toString()); //$NON-NLS-1$
+		}
+		boolean isSuccessful = exception == null;
+		// Reset the status code if the message contains one
+		if (!StringUtils.isEmpty(readResponse) && STATUS_PREFIX.length() > 0) {
+		    int i = readResponse.indexOf(STATUS_PREFIX);
+		    int j = readResponse.indexOf(STATUS_SUFFIX, i + STATUS_PREFIX.length());
+		    if (i != -1 && j > i) {
+		        String rc = readResponse.substring(i + STATUS_PREFIX.length(), j);
+		        sampleResult.setResponseCode(rc);
+		        isSuccessful = isSuccessful && checkResponseCode(rc);
+		        if (haveStatusProps) {
+		            sampleResult.setResponseMessage(statusProps.getProperty(rc, "Status code not found in properties")); //$NON-NLS-1$
+		        } else {
+		            sampleResult.setResponseMessage("No status property file");
+		        }
+		    } else {
+		        sampleResult.setResponseCode("999"); //$NON-NLS-1$
+		        sampleResult.setResponseMessage("Status value not found");
+		        isSuccessful = false;
+		    }
+		}
+		return isSuccessful;
+	}
+
     /**
      * @param rc response code
      * @return whether this represents success or not

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1200210&r1=1200209&r2=1200210&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Thu Nov 10 08:25:32 2011
@@ -161,6 +161,7 @@ these occurs, Sampler is marked as faile
 <li>Bug 51419 - JMS Subscriber: ability to use Selectors</li>
 <li>Bug 52088 - JMS Sampler : Add a selector when REQUEST / RESPONSE is chosen</li>
 <li>Bug 52104 - TCP Sampler handles badly errors</li>
+<li>Bug 52087 - TCPClient interface does not allow for partial reads</li>
 <li>Bug 52115 - SOAP/XML-RPC should not send a POST request when file to send is not found</li>
 </ul>