You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2022/01/01 00:19:55 UTC

[maven-surefire] 01/01: [SUREFIRE-1975] JDK18 - The Security Manager is deprecated and will be removed in a future release

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

tibordigana pushed a commit to branch SUREFIRE-1975
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git

commit e4d67a5de9b93d29fd94390155ff67e8a749b1aa
Author: Tibor Digaňa <ti...@apache.org>
AuthorDate: Sat Jan 1 01:19:42 2022 +0100

    [SUREFIRE-1975] JDK18 - The Security Manager is deprecated and will be removed in a future release
---
 .../surefire/api/util/internal/ObjectUtils.java    |  9 +++++++
 .../java/org/apache/maven/JUnit4SuiteTest.java     |  4 ++-
 .../api/util/internal/ObjectUtilsTest.java}        | 30 ++++++++--------------
 .../maven/surefire/booter/ProviderFactory.java     |  3 ++-
 .../its/jiras/Surefire34SecurityManagerIT.java     |  9 +++++++
 .../maven/surefire/junit/JUnit3Provider.java       | 26 +++++++++++++------
 .../maven/surefire/junit/JUnitTestSetTest.java     | 30 ++++++++++++++++++++++
 7 files changed, 82 insertions(+), 29 deletions(-)

diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/util/internal/ObjectUtils.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/util/internal/ObjectUtils.java
index b316be2..50acdb1 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/api/util/internal/ObjectUtils.java
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/util/internal/ObjectUtils.java
@@ -22,6 +22,8 @@ package org.apache.maven.surefire.api.util.internal;
 import java.lang.management.ManagementFactory;
 import java.util.Map;
 
+import static org.apache.maven.surefire.api.util.ReflectionUtils.tryLoadClass;
+
 /**
  * Similar to Java 7 java.util.Objects.
  *
@@ -44,4 +46,11 @@ public final class ObjectUtils
     {
         return ManagementFactory.getRuntimeMXBean().getSystemProperties();
     }
+
+    public static boolean isSecurityManagerSupported()
+    {
+        ClassLoader classLoader = ObjectUtils.class.getClassLoader();
+        Class<?> smClass = tryLoadClass( classLoader, "java.lang.SecurityManager" );
+        return smClass != null && !smClass.isAnnotationPresent( Deprecated.class );
+    }
 }
diff --git a/surefire-api/src/test/java/org/apache/maven/JUnit4SuiteTest.java b/surefire-api/src/test/java/org/apache/maven/JUnit4SuiteTest.java
index c707ed6..016cce4 100644
--- a/surefire-api/src/test/java/org/apache/maven/JUnit4SuiteTest.java
+++ b/surefire-api/src/test/java/org/apache/maven/JUnit4SuiteTest.java
@@ -42,6 +42,7 @@ import org.apache.maven.surefire.api.util.internal.ChannelsReaderTest;
 import org.apache.maven.surefire.api.util.internal.ChannelsWriterTest;
 import org.apache.maven.surefire.api.util.internal.ConcurrencyUtilsTest;
 import org.apache.maven.surefire.api.util.internal.ImmutableMapTest;
+import org.apache.maven.surefire.api.util.internal.ObjectUtilsTest;
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 
@@ -72,7 +73,8 @@ import org.junit.runners.Suite;
     ChannelsWriterTest.class,
     AsyncSocketTest.class,
     AbstractStreamEncoderTest.class,
-    AbstractStreamDecoderTest.class
+    AbstractStreamDecoderTest.class,
+    ObjectUtilsTest.class
 } )
 @RunWith( Suite.class )
 public class JUnit4SuiteTest
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/util/internal/ObjectUtils.java b/surefire-api/src/test/java/org/apache/maven/surefire/api/util/internal/ObjectUtilsTest.java
similarity index 59%
copy from surefire-api/src/main/java/org/apache/maven/surefire/api/util/internal/ObjectUtils.java
copy to surefire-api/src/test/java/org/apache/maven/surefire/api/util/internal/ObjectUtilsTest.java
index b316be2..07194ea 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/api/util/internal/ObjectUtils.java
+++ b/surefire-api/src/test/java/org/apache/maven/surefire/api/util/internal/ObjectUtilsTest.java
@@ -19,29 +19,21 @@ package org.apache.maven.surefire.api.util.internal;
  * under the License.
  */
 
-import java.lang.management.ManagementFactory;
-import java.util.Map;
+import org.junit.Test;
+
+import static org.fest.assertions.Assertions.assertThat;
 
 /**
- * Similar to Java 7 java.util.Objects.
- *
- * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
- * @since 2.20
+ * @since 3.0.0-M6
  */
-public final class ObjectUtils
+public class ObjectUtilsTest
 {
-    private ObjectUtils()
-    {
-        throw new IllegalStateException( "no instantiable constructor" );
-    }
-
-    public static <T> T useNonNull( T target, T fallback )
-    {
-        return target == null ? fallback : target;
-    }
-
-    public static Map<String, String> systemProps()
+    @Test
+    public void shouldSupportSecurityManager()
     {
-        return ManagementFactory.getRuntimeMXBean().getSystemProperties();
+        float javaVersion = Float.parseFloat( System.getProperty( "java.specification.version" ) );
+        boolean isJava17Plus = javaVersion >= 17;
+        assertThat( ObjectUtils.isSecurityManagerSupported() )
+            .isEqualTo( !isJava17Plus );
     }
 }
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
index 86b430e..43461df 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
@@ -32,6 +32,7 @@ import static org.apache.maven.surefire.api.util.ReflectionUtils.getMethod;
 import static org.apache.maven.surefire.api.util.ReflectionUtils.invokeGetter;
 import static org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray;
 import static org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray2;
+import static org.apache.maven.surefire.api.util.internal.ObjectUtils.isSecurityManagerSupported;
 
 /**
  * Creates the surefire provider.
@@ -85,7 +86,7 @@ public class ProviderFactory
         }
         finally
         {
-            if ( restoreStreams && System.getSecurityManager() == null )
+            if ( restoreStreams && ( !isSecurityManagerSupported() || System.getSecurityManager() == null ) )
             {
                 System.setOut( orgSystemOut );
                 System.setErr( orgSystemErr );
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire34SecurityManagerIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire34SecurityManagerIT.java
index bb80aec..a3be026 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire34SecurityManagerIT.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire34SecurityManagerIT.java
@@ -21,8 +21,11 @@ package org.apache.maven.surefire.its.jiras;
 
 import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
 import org.apache.maven.surefire.its.fixture.SurefireLauncher;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
+import static org.apache.maven.surefire.its.fixture.HelperAssertions.assumeJavaMaxVersion;
+
 /**
  * SUREFIRE-621 Asserts proper test counts when running junit 3 tests in parallel
  *
@@ -31,6 +34,12 @@ import org.junit.Test;
 public class Surefire34SecurityManagerIT
     extends SurefireJUnit4IntegrationTestCase
 {
+    @BeforeClass
+    public static void checkJavaVersion()
+    {
+        assumeJavaMaxVersion( 16 );
+    }
+
     @Test
     public void testSecurityManager()
     {
diff --git a/surefire-providers/surefire-junit3/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java b/surefire-providers/surefire-junit3/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java
index f7c2c0c..cc0924e 100644
--- a/surefire-providers/surefire-junit3/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java
+++ b/surefire-providers/surefire-junit3/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java
@@ -19,6 +19,7 @@ package org.apache.maven.surefire.junit;
  * under the License.
  */
 
+import org.apache.maven.surefire.api.util.internal.ObjectUtils;
 import org.apache.maven.surefire.common.junit3.JUnit3Reflector;
 import org.apache.maven.surefire.common.junit3.JUnit3TestChecker;
 import org.apache.maven.surefire.api.provider.AbstractProvider;
@@ -31,13 +32,13 @@ import org.apache.maven.surefire.api.report.SimpleReportEntry;
 import org.apache.maven.surefire.api.report.TestSetReportEntry;
 import org.apache.maven.surefire.api.suite.RunResult;
 import org.apache.maven.surefire.api.testset.TestSetFailedException;
-import org.apache.maven.surefire.api.util.ReflectionUtils;
 import org.apache.maven.surefire.api.util.RunOrderCalculator;
 import org.apache.maven.surefire.api.util.ScanResult;
 import org.apache.maven.surefire.api.util.TestsToRun;
 
 import java.util.Map;
 
+import static org.apache.maven.surefire.api.util.ReflectionUtils.instantiate;
 import static org.apache.maven.surefire.api.util.internal.ObjectUtils.systemProps;
 
 /**
@@ -100,13 +101,7 @@ public class JUnit3Provider
             final RunListener reporter = reporterFactory.createReporter();
             ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) reporter );
             Map<String, String> systemProperties = systemProps();
-            String smClassName = System.getProperty( "surefire.security.manager" );
-            if ( smClassName != null )
-            {
-                SecurityManager securityManager =
-                    ReflectionUtils.instantiate( getClass().getClassLoader(), smClassName, SecurityManager.class );
-                System.setSecurityManager( securityManager );
-            }
+            setSystemManager( System.getProperty( "surefire.security.manager" ) );
 
             for ( Class<?> clazz : testsToRun )
             {
@@ -121,6 +116,21 @@ public class JUnit3Provider
         return runResult;
     }
 
+    static void setSystemManager( String smClassName ) throws TestSetFailedException
+    {
+        if ( smClassName != null )
+        {
+            if ( !ObjectUtils.isSecurityManagerSupported() )
+            {
+                throw new TestSetFailedException( "JDK does not support overriding Security Manager with "
+                    + "a value in system property 'surefire.security.manager'." );
+            }
+            ClassLoader classLoader = JUnit3Provider.class.getClassLoader();
+            SecurityManager sm = instantiate( classLoader, smClassName, SecurityManager.class );
+            System.setSecurityManager( sm );
+        }
+    }
+
     private SurefireTestSet createTestSet( Class<?> clazz )
     {
         return reflector.isJUnit3Available() && jUnit3TestChecker.accept( clazz )
diff --git a/surefire-providers/surefire-junit3/src/test/java/org/apache/maven/surefire/junit/JUnitTestSetTest.java b/surefire-providers/surefire-junit3/src/test/java/org/apache/maven/surefire/junit/JUnitTestSetTest.java
index 594dcc5..b6b93de 100644
--- a/surefire-providers/surefire-junit3/src/test/java/org/apache/maven/surefire/junit/JUnitTestSetTest.java
+++ b/surefire-providers/surefire-junit3/src/test/java/org/apache/maven/surefire/junit/JUnitTestSetTest.java
@@ -22,15 +22,19 @@ package org.apache.maven.surefire.junit;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
+import org.apache.maven.surefire.api.testset.TestSetFailedException;
 import org.apache.maven.surefire.common.junit3.JUnit3Reflector;
 import org.apache.maven.surefire.api.report.ReportEntry;
 import org.apache.maven.surefire.api.report.RunListener;
 import org.apache.maven.surefire.api.report.RunMode;
 import org.apache.maven.surefire.api.report.TestSetReportEntry;
+import org.apache.maven.surefire.shared.lang3.JavaVersion;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.apache.maven.surefire.api.util.ReflectionUtils.invokeGetter;
+
 /**
  *
  */
@@ -54,6 +58,32 @@ public class JUnitTestSetTest
                       succeededTests.get( 0 ).getName() );
     }
 
+    public void testSystemManager()
+    {
+        float javaVersion = Float.parseFloat( JavaVersion.JAVA_RECENT.toString() );
+        boolean isDeprecated = javaVersion >= 17;
+        try
+        {
+            JUnit3Provider.setSystemManager( "java.lang.SecurityManager" );
+
+            if ( isDeprecated )
+            {
+                fail();
+            }
+
+            Object sm = invokeGetter( System.class, null, "getSecurityManager" );
+            assertNotNull( sm );
+            assertEquals( "java.lang.SecurityManager", sm.getClass().getName() );
+        }
+        catch ( TestSetFailedException e )
+        {
+            if ( !isDeprecated )
+            {
+                fail();
+            }
+        }
+    }
+
     /**
      *
      */