[jboss-jira] [JBoss JIRA] (ELY-1293) System.currentTimeMillis() cannot be mocked on IBM JDK

Peter Palaga (JIRA) issues at jboss.org
Thu Jul 20 05:44:00 EDT 2017


    [ https://issues.jboss.org/browse/ELY-1293?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13438035#comment-13438035 ] 

Peter Palaga commented on ELY-1293:
-----------------------------------

The solution in https://github.com/wildfly-security/wildfly-elytron/pull/917/commits/675068ee6310d82376a71fc83e49a7e523e177c2 is based on adding an explicit clock to the classes under test. Having that we can provide a custom clock implementation during the test while otherwise we will let it use a standard {{Clock.systemUTC()}}.

I find this approach clean and reliable.

Clearly, this approach can be used only in situations where the code querying the current time is under our control. This is the case in {{FileAuditEndpoint}} and the fix linked above is able to solve the problem for {{PeriodicRotatingFileAuditEndpointTest}} and {{SizeRotatingFileAuditEndpointTest}}.

I'd like to hear others' thoughts, before I investigate if this approach can be used to fix also {{GssapiCompatibilitySuiteChild}}.

> System.currentTimeMillis() cannot be mocked on IBM JDK
> ------------------------------------------------------
>
>                 Key: ELY-1293
>                 URL: https://issues.jboss.org/browse/ELY-1293
>             Project: WildFly Elytron
>          Issue Type: Bug
>            Reporter: Peter Palaga
>            Assignee: Peter Palaga
>
> {{System.currentTimeMillis()}} is native in IBM JDK and at the same time, IBM JDK does not support  java.lang.instrument API for native methods. Therefore, {{System.currentTimeMillis()}} cannot be mocked on IBM JDK using jmockit.
> {code}
> JAVA_HOME=path/to/ibm/java8
> $JAVA_HOME/bin/java -version
> java version "1.8.0"
> Java(TM) SE Runtime Environment (build pxa6480sr3fp12-20160919_01(SR3 FP12))
> IBM J9 VM (build 2.8, JRE 1.8.0 Linux amd64-64 Compressed References 20160915_318796 (JIT enabled, AOT enabled)
> J9VM - R28_Java8_SR3_20160915_0912_B318796
> JIT  - tr.r14.java.green_20160818_122998
> GC   - R28_Java8_SR3_20160915_0912_B318796_CMPRSS
> J9CL - 20160915_318796)
> JCL - 20160914_01 based on Oracle jdk8u101-b13
> mvn clean test 
> {code}
> Expected: the tests mocking {{System.currentTimeMillis()}} should pass
> Actual: the tests mocking {{System.currentTimeMillis()}} throw the following exception or similar:
> {code}
> java.lang.UnsupportedOperationException: class redefinition failed: attempted to change method modifiers
> 	at org.wildfly.security.audit.PeriodicRotatingFileAuditEndpointTest$1.<init>(PeriodicRotatingFileAuditEndpointTest.java:212)
> 	at org.wildfly.security.audit.PeriodicRotatingFileAuditEndpointTest.mockTime(PeriodicRotatingFileAuditEndpointTest.java:212)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at java.lang.reflect.Method.invoke(Method.java:508)
> 	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:367)
> 	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:274)
> 	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
> 	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:161)
> 	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
> 	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
> 	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)
> {code}
> This is the case with 
> * PeriodicRotatingFileAuditEndpointTest
> * SizeRotatingFileAuditEndpointTest
> * GssapiCompatibilitySuiteChild



--
This message was sent by Atlassian JIRA
(v7.2.3#72005)


More information about the jboss-jira mailing list