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 2019/08/12 22:41:10 UTC

[jmeter] branch master updated: Avoid use of reflection to modify static final field in SamplerMetric tests

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 c68319e  Avoid use of reflection to modify static final field in SamplerMetric tests
c68319e is described below

commit c68319eec7df89c54ef2434f5f1207288500e82e
Author: Vladimir Sitnikov <si...@gmail.com>
AuthorDate: Tue Aug 13 01:40:48 2019 +0300

    Avoid use of reflection to modify static final field in SamplerMetric tests
    
    Adding "internal" method to alter the behavior helps running test suite with Java 12
    
    The exception was
    
    org.apache.jmeter.visualizers.backend.SamplerMetricTimedModeTest > checkResetOkAndAllStats FAILED
        java.lang.NoSuchFieldException: modifiers
            at java.base/java.lang.Class.getDeclaredField(Class.java:2416)
            at org.apache.jmeter.visualizers.backend.SamplerMetricTimedModeTest.setFinalStatic(SamplerMetricTimedModeTest.java:36)
            at org.apache.jmeter.visualizers.backend.SamplerMetricTimedModeTest.initMode(SamplerMetricTimedModeTest.java:44)
---
 .../apache/jmeter/visualizers/backend/SamplerMetric.java   | 13 ++++++++++++-
 .../visualizers/backend/SamplerMetricFixedModeTest.java    | 14 ++------------
 .../visualizers/backend/SamplerMetricTimedModeTest.java    | 11 ++---------
 3 files changed, 16 insertions(+), 22 deletions(-)

diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
index afb6bd0..864835e 100644
--- a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
+++ b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java
@@ -27,6 +27,7 @@ import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 import org.apache.jmeter.control.TransactionController;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.documentation.VisibleForTesting;
 
 /**
  * Sampler metric
@@ -36,7 +37,7 @@ public class SamplerMetric {
     private static final int SLIDING_WINDOW_SIZE = JMeterUtils.getPropDefault("backend_metrics_window", 100);
     private static final int LARGE_SLIDING_WINDOW_SIZE = JMeterUtils.getPropDefault("backend_metrics_large_window", 5000);
 
-    private static final WindowMode WINDOW_MODE = WindowMode.get();
+    private static volatile WindowMode WINDOW_MODE = WindowMode.get();
 
     /**
      * Response times for OK samples
@@ -79,6 +80,16 @@ public class SamplerMetric {
     }
 
     /**
+     * Set {@link WindowMode} to use for newly created metrics.
+     * @param windowMode new visibility mode
+     */
+    @Deprecated
+    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+    public static void setDefaultWindowMode(WindowMode windowMode) {
+        WINDOW_MODE = windowMode;
+    }
+
+    /**
      * @return List of {@link DescriptiveStatistics}
      */
     private List<DescriptiveStatistics> initWindowedStats() {
diff --git a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricFixedModeTest.java b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricFixedModeTest.java
index 92baea0..14f2beb 100644
--- a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricFixedModeTest.java
+++ b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricFixedModeTest.java
@@ -31,20 +31,10 @@ public class SamplerMetricFixedModeTest {
 
     private static final int DEFAULT_ELAPSED_TIME = 1_000;
 
-    /**
-     * Method to change a static final field
-     */
-    static void setFinalStatic(Field field, Object newValue) throws Exception {
-        field.setAccessible(true);
-        Field modifiersField = Field.class.getDeclaredField("modifiers");
-        modifiersField.setAccessible(true);
-        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
-        field.set(null, newValue);
-    }
-
     @Before
     public void initMode() throws Exception {
-        setFinalStatic(SamplerMetric.class.getDeclaredField("WINDOW_MODE"), WindowMode.FIXED);
+        //noinspection deprecation
+        SamplerMetric.setDefaultWindowMode(WindowMode.FIXED);
     }
 
     @Test
diff --git a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricTimedModeTest.java b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricTimedModeTest.java
index beabbfb..1c531af 100644
--- a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricTimedModeTest.java
+++ b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricTimedModeTest.java
@@ -31,17 +31,10 @@ public class SamplerMetricTimedModeTest {
 
     private static final int DEFAULT_ELAPSED_TIME = 1_000;
 
-    static void setFinalStatic(Field field, Object newValue) throws Exception {
-        field.setAccessible(true);
-        Field modifiersField = Field.class.getDeclaredField("modifiers");
-        modifiersField.setAccessible(true);
-        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
-        field.set(null, newValue);
-    }
-
     @Before
     public void initMode() throws Exception {
-        setFinalStatic(SamplerMetric.class.getDeclaredField("WINDOW_MODE"), WindowMode.TIMED);
+        //noinspection deprecation
+        SamplerMetric.setDefaultWindowMode(WindowMode.TIMED);
     }
 
     @Test