Search code examples
javaevosuitejava-security-manager

Exception while running EvoSuite tests related to Security manager


I'm trying to run EvoSuite tests with this tutorial.

I'm able to generate test classes and compile them using java 8. However, when try to run it using the below command, an exception is thrown.

java  -cp ".\log4j.jar;.\ojdbc6.jar;.\commons-codec-1.3.jar;.\slf4j-log4j12-1.7.16.jar;.\slf4j-api-1.7.16.jar;D:\proj\target\classes;.\evosuite-tests;.\evosuite-standalone-runtime-1.0.6.jar;.\junit-4.12.jar;.\hamcrest-core-1.3.jar;"   org.junit.runner.JUnitCore  com.u.g.KeyClient_ESTest

Thrown Exception:

 java.lang.SecurityException: Security manager blocks ("java.sql.SQLPermission" "deregisterDriver")
    java.lang.Thread.getStackTrace(Thread.java:1556)
    org.evosuite.runtime.sandbox.MSecurityManager.checkPermission(MSecurityManager.java:434)
    java.sql.DriverManager.deregisterDriver(DriverManager.java:402)
    oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:467)
    java.sql.DriverManager.getConnection(DriverManager.java:664)
    java.sql.DriverManager.getConnection(DriverManager.java:247)
    com.u.g.KeyClient.getFromJDBC(KeyClient.java:164)
    com.u.g.KeyClient.fetchKey(KeyClient.java:95)
    com.u.g.KeyClient.<init>(KeyClient.java:40)
    com.u.g.KeyClient.getInstance(KeyClient.java:48)
    com.u.g.KeyClient_ESTest.test1(KeyClient_ESTest.java:36)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)
    org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)
    java.util.concurrent.FutureTask.run(FutureTask.java:266)
    java.lang.Thread.run(Thread.java:745)

    at org.evosuite.runtime.sandbox.MSecurityManager.checkPermission(MSecurityManager.java:452)
    at java.sql.DriverManager.deregisterDriver(DriverManager.java:402)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:467)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at com.u.g.KeyClient.getFromJDBC(KeyClient.java:164)
    at com.u.g.KeyClient.fetchKey(KeyClient.java:95)
    at com.u.g.KeyClient.<init>(KeyClient.java:40)
    at com.u.g.KeyClient.getInstance(KeyClient.java:48)
    at com.u.g.KeyClient_ESTest.test1(KeyClient_ESTest.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298)
    at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:745)

    FAILURES!!!
    Tests run: 2,  Failures: 1

Can someone please help/guide me to resolve this? Thanks in advance.

Additional Info:

The test class is a singleton, which connects to the database using JDBC API to retrieve certain values.


Solution

  • Here is solution which worked for me. The solution was to generate test claasses with below cmd option

    -Dsandbox_mode=OFF

    Complete command to generate test classes is

    C:\java8\jdk1.8.0_102\bin\java  -jar evosuite-master-1.0.6.jar -Dsandbox_mode=OFF -class com.u.g.KeyClient -projectCP ".\log4j.jar;.\ojdbc6.jar;.\commons-codec-1.3.jar;.\target\classes;" 
    

    The corresponding KeyClient_ESTest_scaffolding class will have RuntimeSetting to turn off sandbox

    @BeforeClass 
    public static void initEvoSuiteFramework() { 
    org.evosuite.runtime.RuntimeSettings.className = "com.ultimatix.gdpr.KeyClient"; 
    org.evosuite.runtime.GuiSupport.initialize(); 
    org.evosuite.runtime.RuntimeSettings.maxNumberOfThreads = 100; 
    org.evosuite.runtime.RuntimeSettings.maxNumberOfIterationsPerLoop = 10000; 
    org.evosuite.runtime.RuntimeSettings.mockSystemIn = true; 
    org.evosuite.runtime.RuntimeSettings.sandboxMode = org.evosuite.runtime.sandbox.Sandbox.SandboxMode.OFF; 
    org.evosuite.runtime.sandbox.Sandbox.initializeSecurityManagerForSUT(); 
    org.evosuite.runtime.classhandling.JDKClassResetter.init();
    setSystemProperties();
    initializeClasses();
    org.evosuite.runtime.Runtime.getInstance().resetRuntime(); 
    

    }

    Hope it helps someone facing similar problem.