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


The following commit(s) were added to refs/heads/master by this push:
     new ce1f32af87 Fix computation of min in Summary report
ce1f32af87 is described below

commit ce1f32af87009886fc4c3eea18aae7f4772407c5
Author: Vladimir Sitnikov <[email protected]>
AuthorDate: Wed Jul 12 13:18:41 2023 +0300

    Fix computation of min in Summary report
    
    Fixes https://github.com/apache/jmeter/issues/6043
---
 gradle.properties                                  |   2 +-
 .../java/org/apache/jmeter/util/Calculator.java    |   3 +-
 .../org/apache/jmeter/util/CalculatorTest.kt       | 149 +++++++++++++++++++++
 xdocs/changes.xml                                  |   7 +-
 xdocs/changes_history.xml                          | 135 +++++++++++++++++++
 5 files changed, 290 insertions(+), 6 deletions(-)

diff --git a/gradle.properties b/gradle.properties
index aa8745682f..123dfc216c 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -31,7 +31,7 @@ kotlin.code.style=official
 # This is version for Apache JMeter itself
 # Note: it should not include "-SNAPSHOT" as it is automatically added by 
build.gradle.kts
 # Release version can be generated by using -Prelease or -Prc=<int> arguments
-jmeter.version=5.6.2
+jmeter.version=5.6.3
 
 # Plugins
 
com.github.vlsi.checksum-dependency.sha512=FAC41BF54A7C833BEAE9AB64083F6BEB3E1935BD6866C1B2F1D48FF926ABA4AECA53600FC3E41BE6ECBC87B73CE12F59C59836FB2E1DECC9408288060D66E988
diff --git a/src/core/src/main/java/org/apache/jmeter/util/Calculator.java 
b/src/core/src/main/java/org/apache/jmeter/util/Calculator.java
index 345d01df3c..0107186160 100644
--- a/src/core/src/main/java/org/apache/jmeter/util/Calculator.java
+++ b/src/core/src/main/java/org/apache/jmeter/util/Calculator.java
@@ -53,7 +53,7 @@ public class Calculator {
 
     private final String label;
 
-    private final AtomicLong startTime = new AtomicLong(Long.MAX_VALUE);
+    private final AtomicLong startTime = new AtomicLong();
 
     private final LongAccumulator elapsedTime = new LongAccumulator(Math::max, 
Long.MIN_VALUE);
 
@@ -63,6 +63,7 @@ public class Calculator {
 
     public Calculator(String label) {
         this.label = label;
+        clear();
     }
 
     public void clear() {
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/util/CalculatorTest.kt 
b/src/core/src/test/kotlin/org/apache/jmeter/util/CalculatorTest.kt
new file mode 100644
index 0000000000..d4be64a6b4
--- /dev/null
+++ b/src/core/src/test/kotlin/org/apache/jmeter/util/CalculatorTest.kt
@@ -0,0 +1,149 @@
+/*
+ * 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.util
+
+import org.apache.jmeter.samplers.SampleResult
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+import kotlin.math.pow
+import kotlin.math.sqrt
+
+class CalculatorTest {
+    val calculator = Calculator()
+
+    @Test
+    fun min() {
+        assertEquals(Long.MAX_VALUE, calculator.min, "min()")
+        calculator.addSample(SampleResult(10, 42))
+        assertEquals(42, calculator.min, "min(42)")
+        calculator.addSample(SampleResult(10, 40))
+        assertEquals(40, calculator.min, "min(42, 40)")
+        calculator.addSample(SampleResult(10, 50))
+        assertEquals(40, calculator.min, "min(42, 40, 50)")
+        calculator.addSample(SampleResult(10, 50).apply { sampleCount = 2 })
+        assertEquals(25, calculator.min, "min(42, 40, 50, 50/2)")
+    }
+
+    @Test
+    fun max() {
+        assertEquals(Long.MIN_VALUE, calculator.max, "max()")
+        calculator.addSample(SampleResult(10, 40))
+        assertEquals(40, calculator.max, "max(40)")
+        calculator.addSample(SampleResult(10, 42))
+        assertEquals(42, calculator.max, "max(40, 42)")
+        calculator.addSample(SampleResult(10, 30))
+        assertEquals(42, calculator.max, "max(40, 42, 30)")
+        calculator.addSample(SampleResult(10, 90).apply { sampleCount = 2 })
+        assertEquals(45, calculator.max, "max(40, 42, 30, 90/2)")
+    }
+
+    @Test
+    fun countLong() {
+        assertEquals(0, calculator.countLong, "countLong()")
+        calculator.addSample(SampleResult(10, 40))
+        assertEquals(1, calculator.countLong, "countLong(40)")
+        calculator.addSample(SampleResult(10, 42))
+        assertEquals(2, calculator.countLong, "countLong(40, 42)")
+        calculator.addSample(SampleResult(10, 42).apply { sampleCount = 2 })
+        assertEquals(4, calculator.countLong, "countLong(40, 42, 42/2)")
+    }
+
+    @Test
+    fun mean() {
+        assertEquals(0.0, calculator.mean, "mean()")
+        calculator.addSample(SampleResult(10, 40))
+        assertEquals(40.0, calculator.mean, 0.001, "mean(40)")
+        calculator.addSample(SampleResult(10, 42))
+        assertEquals((40.0 + 42.0) / 2, calculator.mean, 0.001, "mean(40, 42)")
+        calculator.addSample(SampleResult(10, 48).apply { sampleCount = 2 })
+        assertEquals((40.0 + 42.0 + 48) / 4, calculator.mean, 0.001, "mean(40, 
42, 48/2)")
+    }
+
+    @Test
+    fun standardDeviation() {
+        assertEquals(0.0, calculator.standardDeviation, "standardDeviation()")
+        calculator.addSample(SampleResult(10, 40))
+        assertEquals(0.0, calculator.standardDeviation, 
"standardDeviation(40)")
+        calculator.addSample(SampleResult(10, 42))
+        assertEquals(1.0, calculator.standardDeviation, "standardDeviation(40, 
42)")
+        calculator.addSample(SampleResult(10, 43))
+        // Math.sqrt((sumOfSquares / count) - (mean * mean))
+        assertEquals(
+            sqrt((40 * 40 + 42 * 42 + 43 * 43) / 3.0 - ((40.0 + 42 + 43) / 
3).pow(2)),
+            calculator.standardDeviation,
+            0.001,
+            "standardDeviation(40, 42, 43)"
+        )
+        calculator.addSample(SampleResult(10, 48).apply { sampleCount = 2 })
+        assertEquals(
+            sqrt((40 * 40 + 42 * 42 + 43 * 43 + 24 * 24 + 24 * 24) / 5.0 - 
((40.0 + 42 + 43 + 24 + 24) / 5.0).pow(2)),
+            calculator.standardDeviation,
+            0.001,
+            "standardDeviation(40, 42, 43, 48/2)"
+        )
+    }
+
+    @Test
+    fun errorPercentage() {
+        assertEquals(0.0, calculator.errorPercentage, 0.001, 
"errorPercentage()")
+        calculator.addSample(SampleResult(10, 40).apply { isSuccessful = false 
})
+        assertEquals(1.0, calculator.errorPercentage, 0.001, 
"errorPercentage(KO)")
+        calculator.addSample(SampleResult(10, 42).apply { isSuccessful = false 
})
+        assertEquals(1.0, calculator.errorPercentage, 0.001, 
"errorPercentage(KO, KO)")
+        calculator.addSample(SampleResult(10, 42).apply { isSuccessful = true 
})
+        assertEquals(0.666, calculator.errorPercentage, 0.001, 
"errorPercentage(KO, KO, OK)")
+    }
+
+    @Test
+    fun bytesPerSecond() {
+        assertEquals(0.0, calculator.bytesPerSecond, "bytesPerSecond()")
+        calculator.addSample(SampleResult(40, 30).apply { setBodySize(50L) })
+        assertEquals(
+            50.0 * 1000 / (40 - 10.0),
+            calculator.bytesPerSecond,
+            0.001,
+            "bytesPerSecond({50bytes, 10ms..40ms})"
+        )
+        calculator.addSample(SampleResult(60, 20).apply { setBodySize(70L) })
+        assertEquals(
+            (50 + 70.0) * 1000 / (60 - 10.0),
+            calculator.bytesPerSecond,
+            0.001,
+            "bytesPerSecond({50bytes, 10ms..40ms}, {70bytes, 40ms..60ms})"
+        )
+    }
+
+    @Test
+    fun sentBytesPerSecond() {
+        assertEquals(0.0, calculator.sentBytesPerSecond, 
"sentBytesPerSecond()")
+        calculator.addSample(SampleResult(40, 30).apply { sentBytes = 50L })
+        assertEquals(
+            50.0 * 1000 / (40 - 10.0),
+            calculator.sentBytesPerSecond,
+            0.001,
+            "sentBytesPerSecond({sent=50bytes, 10ms..40ms})"
+        )
+        calculator.addSample(SampleResult(60, 20).apply { sentBytes = 70L })
+        assertEquals(
+            (50 + 70.0) * 1000 / (60 - 10.0),
+            calculator.sentBytesPerSecond,
+            0.001,
+            "sentBytesPerSecond({sent=50bytes, 10ms..40ms}, {sent=70bytes, 
40ms..60ms})"
+        )
+    }
+}
diff --git a/xdocs/changes.xml b/xdocs/changes.xml
index 811752b5f2..81842e2e84 100644
--- a/xdocs/changes.xml
+++ b/xdocs/changes.xml
@@ -52,9 +52,9 @@ JMeter 5.6.x requires Java 8 or later for execution (Java 17 
or later recommende
 <b>The next major release would require Java 11 or later.</b>
 </note>
 
-<!--  =================== 5.6.2 =================== -->
+<!--  =================== 5.6.3 =================== -->
 
-<h1>Version 5.6.2 </h1>
+<h1>Version 5.6.3 </h1>
 <p>
 Summary
 </p>
@@ -68,8 +68,7 @@ Summary
 
 <h3>General</h3>
 <ul>
-  <li><pr>6042</pr><issue>6041</issue>Fix compatibility with Maven's pom.xml 
parser by adding explicit versions for
-    <code>com.google.auto.service:auto-service-annotations</code> (regression 
since 5.6)</li>
+  <li><pr></pr><issue>6043</issue>Fix computation of <code>min</code> in 
<code>Summary report</code> (regression since 5.6.0)</li>
 </ul>
 
  <!--  =================== Thanks =================== -->
diff --git a/xdocs/changes_history.xml b/xdocs/changes_history.xml
index ef64c33ad2..7a52370a97 100644
--- a/xdocs/changes_history.xml
+++ b/xdocs/changes_history.xml
@@ -42,6 +42,137 @@ Current changes are detailed in <a 
href="changes.html">Changes</a>.
 <p><b>Changes sections are chronologically ordered from top (most recent) to 
bottom
 (least recent)</b></p>
 
+<!--  =================== 5.6.2 =================== -->
+
+<h1>Version 5.6.2 </h1>
+<p>
+Summary
+</p>
+<ul>
+<li><a href="#Bug fixes">Bug fixes</a></li>
+</ul>
+
+ <!-- =================== Bug fixes =================== -->
+
+<ch_section>Bug fixes</ch_section>
+
+<h3>General</h3>
+<ul>
+  <li><pr>6042</pr><issue>6041</issue>Fix compatibility with Maven's pom.xml 
parser by adding explicit versions for
+    <code>com.google.auto.service:auto-service-annotations</code> (regression 
since 5.6)</li>
+</ul>
+
+ <!--  =================== Thanks =================== -->
+
+<ch_section>Thanks</ch_section>
+<p>We thank all contributors mentioned in bug and improvement sections above:
+</p>
+<ul>
+</ul>
+<p>We also thank bug reporters who helped us improve JMeter.</p>
+<ul>
+</ul>
+<p>
+Apologies if we have omitted anyone else.
+</p>
+ <!--  =================== Known bugs or issues related to JAVA Bugs 
=================== -->
+
+<ch_section>Known problems and workarounds</ch_section>
+<ul>
+  <li><issue>6043</issue> <code>Min</code> is always <code>0</code> in 
<code>Summary Report</code> (fixed in 5.6.3)</li>
+
+<li>The Once Only controller behaves correctly under a Thread Group or Loop 
Controller,
+but otherwise its behaviour is not consistent (or clearly specified).</li>
+
+<li>
+The numbers that appear to the left of the green box are the number of active 
threads / total number of threads,
+the total number of threads only applies to a locally run test, otherwise it 
will show <code>0</code> (see <bugzilla>55510</bugzilla>).
+</li>
+
+<li>
+Note that under some windows systems you may have this WARNING:
+<source>
+java.util.prefs.WindowsPreferences
+WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0
+x80000002. Windows RegCreateKeyEx(&hellip;) returned error code 5.
+</source>
+The fix is to run JMeter as Administrator, it will create the registry key for 
you, then you can restart JMeter as a normal user and you won't have the 
warning anymore.
+</li>
+
+<li>
+You may encounter the following error:
+<source>java.security.cert.CertificateException: Certificates does not conform 
to algorithm constraints</source>
+ if you run a HTTPS request on a web site with a SSL certificate (itself or 
one of SSL certificates in its chain of trust) with a signature
+ algorithm using MD2 (like <code>md2WithRSAEncryption</code>) or with a SSL 
certificate with a size lower than 1024 bits.
+This error is related to increased security in Java 8+.
+<br></br>
+To allow you to perform your HTTPS request, you can downgrade the security of 
your Java installation by editing
+the Java <code>jdk.certpath.disabledAlgorithms</code> property. Remove the MD2 
value or the constraint on size, depending on your case.
+<br></br>
+This property is in this file:
+<source>JAVA_HOME/jre/lib/security/java.security</source>
+See  <bugzilla>56357</bugzilla> for details.
+</li>
+
+<li>
+Under Mac OSX Aggregate Graph will show wrong values due to mirroring effect 
on numbers.
+This is due to a known Java bug, see Bug <a 
href="https://bugs.openjdk.java.net/browse/JDK-8065373"; >JDK-8065373</a>
+The fix is to use JDK8_u45 or later.
+</li>
+
+<li>
+View Results Tree may fail to display some HTML code under HTML renderer, see 
<bugzilla>54586</bugzilla>.
+This is due to a known Java bug which fails to parse "<code>px</code>" units 
in row/col attributes.
+See Bug <a href="https://bugs.openjdk.java.net/browse/JDK-8031109"; 
>JDK-8031109</a>
+The fix is to use JDK9 b65 or later.
+</li>
+
+<li>
+JTable selection with keyboard 
(<keycombo><keysym>SHIFT</keysym><keysym>up/down</keysym></keycombo>) is 
totally unusable with Java 7 on Mac OSX.
+This is due to a known Java bug <a 
href="https://bugs.openjdk.java.net/browse/JDK-8025126"; >JDK-8025126</a>
+The fix is to use JDK 8 b132 or later.
+</li>
+
+<li>
+Since Java 11 the JavaScript implementation <a 
href="https://openjdk.java.net/jeps/335";>Nashorn has been deprecated</a>.
+Java will emit the following deprecation warnings, if you are using JavaScript 
based on Nashorn.
+<source>
+Warning: Nashorn engine is planned to be removed from a future JDK release
+</source>
+To silence these warnings, add 
<code>-Dnashorn.args=--no-deprecation-warning</code> to your Java arguments.
+That can be achieved by setting the enviroment variable <code>JVM_ARGS</code>
+<source>
+export JVM_ARGS="-Dnashorn.args=--no-deprecation-warning"
+</source>
+</li>
+
+<li>
+With Java 15 the JavaScript implementation <a 
href="https://openjdk.java.net/jeps/372";>Nashorn has been removed</a>. To add 
back a JSR-223 compatible JavaScript engine you have two options:
+  <dl>
+    <dt>Use Mozilla Rhino</dt>
+    <dd>Copy <a 
href="https://github.com/mozilla/rhino/releases/download/Rhino1_7_14_Release/rhino-engine-1.7.14.jar";>rhino-engine-1.7.14.jar</a>
 into <code>$JMETER_HOME/lib/ext</code>.</dd>
+    <dt>Use OpenJDK Nashorn</dt>
+    <dd>
+      The OpenJDK Nashorn implementation comes as a module. To use it, you 
will have to download it and add it to the module path. A hacky way to download 
the version 15.0 (or later) and its dependencies and set the module path is 
outlined below:
+      <source>
+mkdir lib/modules
+pushd lib/modules
+wget 
https://repo1.maven.org/maven2/org/openjdk/nashorn/nashorn-core/15.3/nashorn-core-15.3.jar
+wget https://repo1.maven.org/maven2/org/ow2/asm/asm/9.5/asm-9.5.jar
+wget 
https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.5/asm-commons-9.5.jar
+wget https://repo1.maven.org/maven2/org/ow2/asm/asm-util/9.5/asm-util-9.5.jar
+wget https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.5/asm-tree-9.5.jar
+wget 
https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.5/asm-analysis-9.5.jar
+popd
+export JVM_ARGS="--module-path $PWD/lib/modules"
+./bin/jmeter
+      </source>
+    </dd>
+  </dl>
+</li>
+
+</ul>
+
 <!--  =================== 5.6.1 =================== -->
 
 <h1>Version 5.6.1</h1>
@@ -122,6 +253,8 @@ Apologies if we have omitted anyone else.
 <ul>
   <li><code>pom.xml</code> misses <code>&lt;version&gt;</code> tags for 
<code>auto-service-annotations</code>, so Maven can't infer transitive 
dependencies. The issue is resolved in 5.6.2</li>
 
+  <li><issue>6043</issue> <code>Min</code> is always <code>0</code> in 
<code>Summary Report</code> (fixed in 5.6.3)</li>
+
 <li>The Once Only controller behaves correctly under a Thread Group or Loop 
Controller,
 but otherwise its behaviour is not consistent (or clearly specified).</li>
 
@@ -410,6 +543,8 @@ Apologies if we have omitted anyone else.
 <ul>
   <li><issue>6008</issue> ThreadGroups are running endlessly in non-gui mode 
(fixed in 5.6.1, see <pr>6011</pr>)</li>
 
+  <li><issue>6043</issue> <code>Min</code> is always <code>0</code> in 
<code>Summary Report</code> (fixed in 5.6.3)</li>
+
   <li><pr>5987</pr>HTTP sampler sends filenames with percent-encoded UTF-8, 
however it is not aligned with the browsers. The workaround is to refrain 
non-ASCII filenames</li>
 
   <li><issue>6004</issue>Java Request sampler cannot be enabled again after 
disabling in UI (fixed in 5.6.1, <pr>6012</pr>)</li>

Reply via email to