You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by vl...@apache.org on 2023/06/16 05:39:26 UTC

[jmeter] branch master updated (43797046fa -> c46e37a4f0)

This is an automated email from the ASF dual-hosted git repository.

vladimirsitnikov pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git


    from 43797046fa fix: restore public static final String references to literals for backward compatibility
     new 7ebbd98c6f test: add SampleEvent.toString and SampleResult.toDebugString for better debug representation
     new c46e37a4f0 test: CollectSamplesListener should be NoThreadClone, so it collects all the events

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/jmeter/samplers/SampleEvent.java    | 23 +++++++++
 .../org/apache/jmeter/samplers/SampleResult.java   | 56 ++++++++++++++++++++++
 .../jmeter/samplers/StatisticalSampleResult.java   |  7 +++
 .../openmodel/ThreadsInterruptAtFinishTest.kt      |  4 +-
 .../jmeter/test/samplers/CollectSamplesListener.kt |  3 +-
 .../protocol/http/sampler/HTTPSampleResult.java    |  8 ++++
 .../protocol/http/HttpRequestInterruptTest.kt      | 30 +++++++-----
 7 files changed, 116 insertions(+), 15 deletions(-)


[jmeter] 01/02: test: add SampleEvent.toString and SampleResult.toDebugString for better debug representation

Posted by vl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

vladimirsitnikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git

commit 7ebbd98c6f24bcb6df7d807f030b215046d10416
Author: Vladimir Sitnikov <si...@gmail.com>
AuthorDate: Fri Jun 16 08:35:31 2023 +0300

    test: add SampleEvent.toString and SampleResult.toDebugString for better debug representation
---
 .../org/apache/jmeter/samplers/SampleEvent.java    | 23 +++++++++
 .../org/apache/jmeter/samplers/SampleResult.java   | 56 ++++++++++++++++++++++
 .../jmeter/samplers/StatisticalSampleResult.java   |  7 +++
 .../protocol/http/sampler/HTTPSampleResult.java    |  8 ++++
 4 files changed, 94 insertions(+)

diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/SampleEvent.java b/src/core/src/main/java/org/apache/jmeter/samplers/SampleEvent.java
index ff7dd02691..d42ec38a12 100644
--- a/src/core/src/main/java/org/apache/jmeter/samplers/SampleEvent.java
+++ b/src/core/src/main/java/org/apache/jmeter/samplers/SampleEvent.java
@@ -224,4 +224,27 @@ public class SampleEvent implements Serializable {
         return isTransactionSampleEvent;
     }
 
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("SampleEvent{");
+        sb.append("hostname='").append(hostname).append('\'');
+        sb.append(", threadGroup='").append(threadGroup).append('\'');
+        sb.append(", isTransactionSampleEvent=").append(isTransactionSampleEvent);
+        if (values != null && values.length > 0) {
+            sb.append("values=[");
+            for (int i = 0; i < variableNames.length; i++) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+                sb.append('\'').append(variableNames[i]).append("', '").append(values[i]).append('\'');
+            }
+            sb.append(']');
+        }
+        if (result != null) {
+            sb.append(", result=").append(result.toDebugString());
+        }
+        sb.append('}');
+        return sb.toString();
+    }
 }
diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java b/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java
index a8eb891583..2518f26c31 100644
--- a/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java
+++ b/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java
@@ -936,6 +936,62 @@ public class SampleResult implements Serializable, Cloneable, Searchable {
         return getSampleLabel();
     }
 
+    public String toDebugString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName()).append('{');
+        appendDebugParameters(sb);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    protected void appendDebugParameters(StringBuilder sb) {
+        sb.append("label='").append(label).append('\'');
+        sb.append(", success=").append(success);
+        sb.append(", saveConfig=").append(saveConfig);
+        if (parent != null) {
+            sb.append(", parent=").append(parent.toDebugString());
+        }
+        sb.append(", responseCode='").append(responseCode).append('\'');
+        sb.append(", resultFileName='").append(resultFileName).append('\'');
+        sb.append(", samplerData='").append(samplerData).append('\'');
+        sb.append(", threadName='").append(threadName).append('\'');
+        sb.append(", responseMessage='").append(responseMessage).append('\'');
+        sb.append(", responseHeaders='").append(responseHeaders).append('\'');
+        sb.append(", requestHeaders='").append(requestHeaders).append('\'');
+        sb.append(", timeStamp=").append(timeStamp);
+        sb.append(", startTime=").append(startTime);
+        sb.append(", endTime=").append(endTime);
+        sb.append(", idleTime=").append(idleTime);
+        sb.append(", pauseTime=").append(pauseTime);
+        sb.append(", assertionResults=").append(assertionResults);
+        sb.append(", subResults=").append(subResults);
+        sb.append(", dataType='").append(dataType).append('\'');
+        sb.append(", files=").append(files);
+        sb.append(", dataEncoding='").append(dataEncoding).append('\'');
+        sb.append(", contentType='").append(contentType).append('\'');
+        sb.append(", elapsedTime=").append(elapsedTime);
+        sb.append(", latency=").append(latency);
+        sb.append(", connectTime=").append(connectTime);
+        sb.append(", testLogicalAction=").append(testLogicalAction);
+        sb.append(", stopThread=").append(stopThread);
+        sb.append(", stopTest=").append(stopTest);
+        sb.append(", stopTestNow=").append(stopTestNow);
+        sb.append(", sampleCount=").append(sampleCount);
+        sb.append(", bytes=").append(bytes);
+        sb.append(", headersSize=").append(headersSize);
+        sb.append(", bodySize=").append(bodySize);
+        sb.append(", groupThreads=").append(groupThreads);
+        sb.append(", allThreads=").append(allThreads);
+        sb.append(", nanoTimeOffset=").append(nanoTimeOffset);
+        sb.append(", useNanoTime=").append(useNanoTime);
+        sb.append(", nanoThreadSleep=").append(nanoThreadSleep);
+        sb.append(", sentBytes=").append(sentBytes);
+        sb.append(", location=").append(location);
+        sb.append(", ignore=").append(ignore);
+        sb.append(", subResultIndex=").append(subResultIndex);
+        sb.append(", responseDataAsString='").append(getResponseDataAsString()).append('\'');
+    }
+
     /**
      * Returns the dataEncoding or the default if no dataEncoding was provided.
      *
diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java b/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java
index 2177d5cf7c..77b1bf65c6 100644
--- a/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java
+++ b/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java
@@ -134,4 +134,11 @@ public class StatisticalSampleResult extends SampleResult implements
         }
         return sb.toString();
     }
+
+    @Override
+    protected void appendDebugParameters(StringBuilder sb) {
+        super.appendDebugParameters(sb);
+        sb.append(", errorCount=").append(errorCount);
+        sb.append(", elapsed=").append(elapsed);
+    }
 }
diff --git a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
index 0b30eaefbf..29919f4728 100644
--- a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
+++ b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
@@ -280,4 +280,12 @@ public class HTTPSampleResult extends SampleResult {
         list.add(getUrlAsString());
         return list;
     }
+
+    @Override
+    protected void appendDebugParameters(StringBuilder sb) {
+        super.appendDebugParameters(sb);
+        sb.append(", method='").append(method).append('\'');
+        sb.append(", redirectLocation='").append(redirectLocation).append('\'');
+        sb.append(", queryString='").append(queryString).append('\'');
+    }
 }


[jmeter] 02/02: test: CollectSamplesListener should be NoThreadClone, so it collects all the events

Posted by vl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

vladimirsitnikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git

commit c46e37a4f0ef8a0aa87c2ea4fe2cab9e0423c49d
Author: Vladimir Sitnikov <si...@gmail.com>
AuthorDate: Fri Jun 16 08:38:03 2023 +0300

    test: CollectSamplesListener should be NoThreadClone, so it collects all the events
    
    Previously, HttpRequestInterruptTest received no events because the
    listener was cloned, however, the test assumed there were no events because
    the sampling was interrupted.
---
 .../openmodel/ThreadsInterruptAtFinishTest.kt      |  4 +--
 .../jmeter/test/samplers/CollectSamplesListener.kt |  3 ++-
 .../protocol/http/HttpRequestInterruptTest.kt      | 30 +++++++++++++---------
 3 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/src/core/src/test/kotlin/org/apache/jmeter/threads/openmodel/ThreadsInterruptAtFinishTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/threads/openmodel/ThreadsInterruptAtFinishTest.kt
index 6e79eb8140..34d5586a65 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/threads/openmodel/ThreadsInterruptAtFinishTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/threads/openmodel/ThreadsInterruptAtFinishTest.kt
@@ -32,9 +32,9 @@ import kotlin.time.Duration.Companion.seconds
 
 class ThreadsInterruptAtFinishTest : JMeterTestCase() {
     @Test
-    @Timeout(5, unit = TimeUnit.SECONDS)
+    @Timeout(10, unit = TimeUnit.SECONDS)
     fun `openmodel interrupts sleep`() {
-        executePlanAndCollectEvents(10.seconds) {
+        assertInterruptionsPresent {
             OpenModelThreadGroup::class {
                 scheduleString = "rate(50 / sec) random_arrivals(100 ms) pause(1 s)"
                 ThreadSleep::class {
diff --git a/src/core/src/testFixtures/kotlin/org/apache/jmeter/test/samplers/CollectSamplesListener.kt b/src/core/src/testFixtures/kotlin/org/apache/jmeter/test/samplers/CollectSamplesListener.kt
index 05c7aca0d3..10869b82c7 100644
--- a/src/core/src/testFixtures/kotlin/org/apache/jmeter/test/samplers/CollectSamplesListener.kt
+++ b/src/core/src/testFixtures/kotlin/org/apache/jmeter/test/samplers/CollectSamplesListener.kt
@@ -17,6 +17,7 @@
 
 package org.apache.jmeter.test.samplers
 
+import org.apache.jmeter.engine.util.NoThreadClone
 import org.apache.jmeter.reporters.AbstractListenerElement
 import org.apache.jmeter.samplers.SampleEvent
 import org.apache.jmeter.samplers.SampleListener
@@ -25,7 +26,7 @@ import java.util.Collections
 /**
  * Collects [SampleEvent] to a list.
  */
-class CollectSamplesListener : AbstractListenerElement(), SampleListener {
+class CollectSamplesListener : AbstractListenerElement(), SampleListener, NoThreadClone {
     private val mutableEvents: MutableList<SampleEvent> = Collections.synchronizedList(mutableListOf<SampleEvent>())
 
     // Copy the events to prevent late arrivals after the test has finished
diff --git a/src/protocol/http/src/test/kotlin/org/apache/jmeter/protocol/http/HttpRequestInterruptTest.kt b/src/protocol/http/src/test/kotlin/org/apache/jmeter/protocol/http/HttpRequestInterruptTest.kt
index ac3f54e975..90e25213d2 100644
--- a/src/protocol/http/src/test/kotlin/org/apache/jmeter/protocol/http/HttpRequestInterruptTest.kt
+++ b/src/protocol/http/src/test/kotlin/org/apache/jmeter/protocol/http/HttpRequestInterruptTest.kt
@@ -22,35 +22,39 @@ import com.github.tomakehurst.wiremock.client.WireMock.get
 import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo
 import com.github.tomakehurst.wiremock.junit5.WireMockTest
 import org.apache.jmeter.junit.JMeterTestCase
+import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory
 import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy
-import org.apache.jmeter.samplers.SampleEvent
 import org.apache.jmeter.test.assertions.executePlanAndCollectEvents
 import org.apache.jmeter.threads.openmodel.OpenModelThreadGroup
 import org.junit.jupiter.api.Assertions.assertEquals
-import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Timeout
+import org.junit.jupiter.api.fail
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.ValueSource
 import java.util.concurrent.TimeUnit
 import kotlin.time.Duration.Companion.minutes
 import kotlin.time.Duration.Companion.seconds
 
 @WireMockTest
 class HttpRequestInterruptTest : JMeterTestCase() {
-    @Test
-    @Timeout(5, unit = TimeUnit.SECONDS)
-    fun `httpClient4 interrupts`(server: WireMockRuntimeInfo) {
+    @ParameterizedTest
+    @Timeout(10, unit = TimeUnit.SECONDS)
+    @ValueSource(strings = [HTTPSamplerFactory.IMPL_HTTP_CLIENT4, HTTPSamplerFactory.HTTP_SAMPLER_JAVA])
+    fun `http request interrupts`(httpImplementation: String, server: WireMockRuntimeInfo) {
         server.wireMock.register(
             get("/delayed")
                 .willReturn(
                     aResponse()
-                        .withStatus(200)
                         .withFixedDelay(1.minutes.inWholeMilliseconds.toInt())
+                        .withStatus(200)
                 )
         )
 
-        val events = executePlanAndCollectEvents(50.seconds) {
+        val events = executePlanAndCollectEvents(5.seconds) {
             OpenModelThreadGroup::class {
                 scheduleString = "rate(50 / sec) random_arrivals(100 ms) pause(1 s)"
                 HTTPSamplerProxy::class {
+                    implementation = httpImplementation
                     method = "GET"
                     protocol = "http"
                     domain = "localhost"
@@ -60,10 +64,12 @@ class HttpRequestInterruptTest : JMeterTestCase() {
             }
         }
 
-        assertEquals(
-            listOf<SampleEvent>(),
-            events,
-            "No samples expected as all the threads should be interrupted before the request completes"
-        )
+        assertEquals(5, events.size) { "5 events expected, got $events" }
+        if (events.any { it.result.isSuccessful || it.result.isResponseCodeOK || it.result.time < 500 }) {
+            fail(
+                "All events should be failing, and they should take more than 500ms since the requests " +
+                    "should have been cancelled after 1sec. Results are: $events"
+            )
+        }
     }
 }