|
What this is
Other links
The source code// $Header: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/samplers/SampleResult.java,v 1.29 2004/03/13 14:06:20 sebb Exp $ /* * Copyright 2001-2004 The Apache Software Foundation. * * Licensed 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.samplers; import java.io.Serializable; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import junit.framework.TestCase; import org.apache.avalon.framework.configuration.Configuration; import org.apache.jmeter.assertions.AssertionResult; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.LogTarget; import org.apache.log.Logger; import org.apache.log.format.Formatter; import org.apache.log.format.RawFormatter; import org.apache.log.output.io.WriterTarget; /** * This is a nice packaging for the various information returned from taking a * sample of an entry. * * @version $Revision: 1.29 $ $Date: 2004/03/13 14:06:20 $ */ public class SampleResult implements Serializable { /** * Data type value indicating that the response data is text. * * @see #getDataType * @see #setDataType(java.lang.String) */ public final static String TEXT = "text"; /** * Data type value indicating that the response data is binary. * * @see #getDataType * @see #setDataType(java.lang.String) */ public final static String BINARY = "bin"; /* empty array which can be returned instead of null */ private static final byte [] EMPTY_BA = new byte [0]; private byte[] responseData; private String responseCode; private String label; private String samplerData; private String threadName; private String responseMessage=""; private String responseHeaders=""; // Never return null private String contentType; // e.g. text/html; charset=utf-8 private String requestHeaders=""; private long timeStamp = 0;// the time stamp - can be start or end private long startTime = 0; private long endTime = 0; private long idleTime = 0;// Allow for non-sample time private long pauseTime = 0;// Start of pause (if any) private List assertionResults; private List subResults; private String dataType; private boolean success; private Set files; private String dataEncoding;// (is this really the character set?) e.g. ISO-8895-1, UTF-8 private long time = 0; private boolean stopThread = false; //Should thread terminate? private boolean stopTest = false; //Should test terminate? private boolean isMonitor = false; //TODO do contentType and/or dataEncoding belong in HTTPSampleResult instead? private final static String TOTAL_TIME = "totalTime"; transient private static Logger log = LoggingManager.getLoggerForClass(); private static final boolean startTimeStamp = JMeterUtils.getPropDefault("sampleresult.timestamp.start",false); public SampleResult() { time = 0; } /** * Construct a 'parent' result for an already-existing result, essentially * cloning it * * @param res existing sample result */ public SampleResult(SampleResult res) { setStartTime(res.getStartTime()); setTime(0); setSampleLabel(res.getSampleLabel()); setRequestHeaders(res.getRequestHeaders()); setResponseData(res.getResponseData()); setResponseCode(res.getResponseCode()); setSuccessful(res.isSuccessful()); setResponseMessage(res.getResponseMessage()); setDataType(res.getDataType()); setResponseHeaders(res.getResponseHeaders()); addSubResult(res); // this will add res.getTime() to getTime(). } /** * Create a sample with a specific elapsed time * but don't allow the times to be changed later * * (only used by HTTPSampleResult) * * @param elapsed time * @param atend create the sample finishing now, else starting now */ protected SampleResult(long elapsed, boolean atend) { long now = System.currentTimeMillis(); if (atend){ setTimes(now - elapsed, now); } else { setTimes(now, now + elapsed); } } /** * Create a sample with specific start and end times * for test purposes, but don't allow the times to be changed later * * (used by StatVisualizerModel.Test) * * @param start start time * @param end end time */ public static SampleResult createTestSample(long start, long end) { SampleResult res = new SampleResult(); res.setStartTime(start); res.setEndTime(end); return res; } /** * Create a sample with a specific elapsed time * for test purposes, but don't allow the times to be changed later * * @param elapsed - desired elapsed time */ public static SampleResult createTestSample(long elapsed) { long now = System.currentTimeMillis(); return createTestSample(now,now+elapsed); } /** * Allow users to create a sample with specific timestamp and elapsed times * for cloning purposes, but don't allow the times to be changed later * * Currently used by SaveService only * * @param stamp - this may be a start time or an end time * @param elapsed */ public SampleResult(long stamp, long elapsed) { // Maintain the timestamp relationships if (startTimeStamp) { setTimes(stamp, stamp + elapsed); } else { setTimes(stamp - elapsed, stamp); } } /** * Method to set the elapsed time for a sample. * Retained for backward compatibility with 3rd party add-ons * It is assumed that the method is called at the end of a sample * * Must not be used in conjunction with sampleStart()/End() * * @deprecated use sampleStart() and sampleEnd() instead * @param elapsed time in milliseconds */ public void setTime(long elapsed){ long now = System.currentTimeMillis(); setTimes(now-elapsed,now); } public void setMarked(String filename) { if (files == null) { files = new HashSet(); } files.add(filename); } public boolean isMarked(String filename) { return files != null && files.contains(filename); } public String getResponseCode() { return responseCode; } public void setResponseCode(String code) { responseCode = code; } public String getResponseMessage() { return responseMessage; } public void setResponseMessage(String msg) { responseMessage = msg; } public String getThreadName() { return threadName; } public void setThreadName(String threadName) { this.threadName = threadName; } public long getTimeStamp() { return timeStamp; } public String getSampleLabel() { return label; } public void setSampleLabel(String label) { this.label = label; } public void addAssertionResult(AssertionResult assertResult) { if (assertionResults == null) { assertionResults = new ArrayList(); } assertionResults.add(assertResult); } /** * Gets the assertion results associated with this sample. * * @return an array containing the assertion results for this sample. * Returns null if there are no assertion results. */ public AssertionResult[] getAssertionResults() { if (assertionResults == null) { return null; } return (AssertionResult[]) assertionResults.toArray( new AssertionResult[0]); } public void addSubResult(SampleResult subResult) { if (subResults == null) { subResults = new ArrayList(); } subResults.add(subResult); setTime(getTime()+subResult.getTime()); } /** * Gets the subresults associated with this sample. * * @return an array containing the subresults for this sample. Returns * null if there are no subresults. */ public SampleResult[] getSubResults() { if (subResults == null) { return null; } return (SampleResult[]) subResults.toArray(new SampleResult[0]); } public void configure(Configuration info) { time = info.getAttributeAsLong(TOTAL_TIME, 0L); } /** * Sets the responseData attribute of the SampleResult object. * * @param response the new responseData value */ public void setResponseData(byte[] response) { responseData = response; } /** * Gets the responseData attribute of the SampleResult object. * * @return the responseData value */ public byte[] getResponseData() { return responseData; } /** * Convenience method to get responseData as a non-null byte array * * @return the responseData. If responseData is null * then an empty byte array is returned rather than null. * */ public byte [] responseDataAsBA() { return responseData == null ? EMPTY_BA : responseData; } public void setSamplerData(String s) { samplerData = s; } public String getSamplerData() { return samplerData; } /** * Get the time it took this sample to occur. * @return elapsed time in milliseonds * */ public long getTime() { return time; } public boolean isSuccessful() { return success; } public void setDataType(String dataType) { this.dataType = dataType; } public String getDataType() { return dataType; } /** * Sets the successful attribute of the SampleResult object. * * @param success the new successful value */ public void setSuccessful(boolean success) { this.success = success; } /** * Returns the display name. * * @return display name of this sample result */ public String toString() { return getSampleLabel(); } /** * Returns the dataEncoding. */ public String getDataEncoding() { if (dataEncoding != null) { return dataEncoding; } else { return "ISO-8859-1";// 8859-1 is not a valid Java data encoding .. } } /** * Sets the dataEncoding. * @param dataEncoding the dataEncoding to set, e.g. ISO-8895-1, UTF-8 */ public void setDataEncoding(String dataEncoding) { this.dataEncoding = dataEncoding; } /** * @return whether to stop the test */ public boolean isStopTest() { return stopTest; } /** * @return whether to stop this thread */ public boolean isStopThread() { return stopThread; } /** * @param b */ public void setStopTest(boolean b) { stopTest = b; } /** * @param b */ public void setStopThread(boolean b) { stopThread = b; } /** * @return the request headers */ public String getRequestHeaders() { return requestHeaders; } /** * @return the response headers */ public String getResponseHeaders() { return responseHeaders; } /** * @param string - request headers */ public void setRequestHeaders(String string) { requestHeaders = string; } /** * @param string - response headers */ public void setResponseHeaders(String string) { responseHeaders = string; } /** * @return the content type - text or bin */ public String getContentType() { return contentType; } /** * @param string */ public void setContentType(String string) { contentType = string; } /** * @return the end time */ public long getEndTime() { return endTime; } /** * @return the start time */ public long getStartTime() { return startTime; } /* * Helper methods * N.B. setStartTime must be called before setEndTime * * setStartTime is used by HTTPSampleResult to clone * the parent sampler and allow the original start time to be kept */ protected final void setStartTime(long start) { startTime = start; if (startTimeStamp){ timeStamp = startTime; } } private void setEndTime(long end) { endTime = end; if (!startTimeStamp){ timeStamp = endTime; } if (startTime == 0){ log.error("setEndTime must be called after setStartTime" , new Throwable("Invalid call sequence")); //TODO should this throw an error? } else { time = endTime - startTime - idleTime; } } private void setTimes(long start, long end) { setStartTime(start); setEndTime(end); } /** * Record the start time of a sample * */ public void sampleStart() { if (startTime == 0){ setStartTime(System.currentTimeMillis()); } else { log.error("sampleStart called twice" , new Throwable("Invalid call sequence")); } } /** * Record the end time of a sample and calculate the elapsed time * */ public void sampleEnd() { if (endTime == 0){ setEndTime(System.currentTimeMillis()); } else { log.error("sampleEnd called twice" , new Throwable("Invalid call sequence")); } } /** * Pause a sample * */ public void samplePause() { if (pauseTime != 0) { log.error("samplePause called twice",new Throwable("Invalid call sequence")); } pauseTime = System.currentTimeMillis(); } /** * Resume a sample * */ public void sampleResume() { if (pauseTime == 0) { log.error("sampleResume without samplePause",new Throwable("Invalid call sequence")); } idleTime += System.currentTimeMillis() - pauseTime; pauseTime=0; } /** * When a Sampler is working as a monitor * @param monitor */ public void setMonitor(boolean monitor){ isMonitor = monitor; } /** * If the sampler is a monitor, method will * return true. * @return true if the sampler is a monitor */ public boolean isMonitor(){ return isMonitor; } ////////////////////////////// Start of Test Code /////////////////////////// //TODO need more tests - particularly for the new functions public static class Test extends TestCase { public Test(String name) { super(name); } public void testElapsed() throws Exception { SampleResult res = new SampleResult(); // Check sample increments OK res.sampleStart(); Thread.sleep(100); res.sampleEnd(); assertTrue(res.getTime() >= 100); } public void testPause() throws Exception { SampleResult res = new SampleResult(); // Check sample increments OK res.sampleStart(); Thread.sleep(100); res.samplePause(); Thread.sleep(200); // Re-increment res.sampleResume(); Thread.sleep(100); res.sampleEnd(); assertTrue(res.getTime() >= 200); assertFalse(res.getTime() >= 290); // we hope! } private static Formatter fmt=new RawFormatter(); private StringWriter wr = null; public void divertLog() { wr=new StringWriter(1000); LogTarget [] lt = {new WriterTarget(wr,fmt)}; log.setLogTargets(lt); } public void testPause2() throws Exception { divertLog(); SampleResult res = new SampleResult(); res.sampleStart(); res.samplePause(); assertTrue(wr.toString().length()==0); res.samplePause(); assertFalse(wr.toString().length()==0); } // TODO some more invalid sequence tests needed } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.