Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-71957

Jira plugin test "hudson.plugins.jira.JiraCreateReleaseNotesTest" fails on Java 21

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Minor Minor
    • jira-plugin
    • None
    • Maven 3.9.4, macOS 13.5, OpenJDK 21 build 35, calling "mvn clean package"

      The plugin reports test failure(s) when running on Java 21:

      [INFO] Running hudson.plugins.jira.JiraCreateReleaseNotesTest
      [ERROR] Tests run: 6, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 1.430 s <<< FAILURE! -- in hudson.plugins.jira.JiraCreateReleaseNotesTest
      [ERROR] hudson.plugins.jira.JiraCreateReleaseNotesTest.failBuildOnErrorEmptyRelease -- Time elapsed: 0.008 s <<< ERROR!
      java.lang.NullPointerException: Cannot enter synchronized block because "lock" is null
      	at java.base/java.lang.Throwable.printStackTrace(Throwable.java:672)
      	at java.base/java.lang.Throwable.printStackTrace(Throwable.java:749)
      	at hudson.plugins.jira.JiraCreateReleaseNotes.setUp(JiraCreateReleaseNotes.java:142)
      	at hudson.plugins.jira.JiraCreateReleaseNotes.setUp(JiraCreateReleaseNotes.java:116)
      	at jenkins.tasks.SimpleBuildWrapper.setUp(SimpleBuildWrapper.java:294)
      	at jenkins.tasks.SimpleBuildWrapper.setUp(SimpleBuildWrapper.java:290)
      	at hudson.plugins.jira.JiraCreateReleaseNotesTest.failBuildOnErrorEmptyRelease(JiraCreateReleaseNotesTest.java:141)
      	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
      	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
      	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
      	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
      	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
      	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
      	at org.mockito.internal.runners.DefaultInternalRunner$1$1.evaluate(DefaultInternalRunner.java:55)
      	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
      	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
      	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
      	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
      	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
      	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
      	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
      	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
      	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
      	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
      	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
      	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
      	at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:100)
      	at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:107)
      	at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:41)
      	at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
      	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
      	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
      	at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:42)
      	at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80)
      	at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:72)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)
      	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
      	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
      	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
      	at org.apache.maven.surefire.junitplatform.LazyLauncher.execute(LazyLauncher.java:56)
      	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:184)
      	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:148)
      	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:120)
      	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
      	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
      	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
      	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
      
      [ERROR] hudson.plugins.jira.JiraCreateReleaseNotesTest.failBuildOnErrorEmptyProjectKey -- Time elapsed: 0.004 s <<< ERROR!
      java.lang.NullPointerException: Cannot enter synchronized block because "lock" is null
      	at java.base/java.lang.Throwable.printStackTrace(Throwable.java:672)
      	at java.base/java.lang.Throwable.printStackTrace(Throwable.java:749)
      	at hudson.plugins.jira.JiraCreateReleaseNotes.setUp(JiraCreateReleaseNotes.java:142)
      	at hudson.plugins.jira.JiraCreateReleaseNotes.setUp(JiraCreateReleaseNotes.java:116)
      	at jenkins.tasks.SimpleBuildWrapper.setUp(SimpleBuildWrapper.java:294)
      	at jenkins.tasks.SimpleBuildWrapper.setUp(SimpleBuildWrapper.java:290)
      	at hudson.plugins.jira.JiraCreateReleaseNotesTest.failBuildOnErrorEmptyProjectKey(JiraCreateReleaseNotesTest.java:131)
      	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
      	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
      	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
      	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
      	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
      	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
      	at org.mockito.internal.runners.DefaultInternalRunner$1$1.evaluate(DefaultInternalRunner.java:55)
      	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
      	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
      	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
      	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
      	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
      	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
      	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
      	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
      	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
      	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
      	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
      	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
      	at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:100)
      	at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:107)
      	at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:41)
      	at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
      	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
      	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
      	at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:42)
      	at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80)
      	at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:72)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)
      	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)
      	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
      	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
      	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
      	at org.apache.maven.surefire.junitplatform.LazyLauncher.execute(LazyLauncher.java:56)
      	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:184)
      	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:148)
      	at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:120)
      	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
      	at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
      	at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
      	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
      

          [JENKINS-71957] Jira plugin test "hudson.plugins.jira.JiraCreateReleaseNotesTest" fails on Java 21

          Basil Crow added a comment -

          notmyfault Have you investigated the cause of the failure?

          Basil Crow added a comment - notmyfault Have you investigated the cause of the failure?

          Adrien Lecharpentier added a comment - - edited

          So, this doesn't happen with Java 17 but starts at least in Java 20.

          Adrien Lecharpentier added a comment - - edited So, this doesn't happen with Java 17 but starts at least in Java 20.

          Adrien Lecharpentier added a comment - - edited

          Here is what I found.

          In JiraCreateReleaseNotes#setUp method, if there is anything wrong happening, the exception is supposed to be printed using Exception#printStackTrace method using the TaskListener provided in parameter.

          The TaskListener is mocked in the test. The call to TaskListener#fatalError with any string and any object array, will return a mocked PrintWriter.

          The Throwable#printStackTrace(PrintWriter) method is encapsulating its parameter into a WrappedPrintWriter object. That class has a method lock which is used to get a object to lock a concurrent operation (the synchronized operation).

          The problem in the tests is that the PrintWriter is mocked and that the WrappedPrintWriter#lock method is using SharedSecrets.getJavaIOPrintWriterAccess().lock(printWriter) to return the lock object. As the `printWriter is a mock, its lock field is null.

          Using Java 17, the WrappedPrintWriter#lock method was returning the wrapped PrintWriter. This is why it was working before.

          Adrien Lecharpentier added a comment - - edited Here is what I found. In JiraCreateReleaseNotes#setUp method, if there is anything wrong happening, the exception is supposed to be printed using Exception#printStackTrace method using the TaskListener provided in parameter. The TaskListener is mocked in the test. The call to TaskListener#fatalError with any string and any object array, will return a mocked PrintWriter . The Throwable#printStackTrace(PrintWriter) method is encapsulating its parameter into a WrappedPrintWriter object. That class has a method lock which is used to get a object to lock a concurrent operation (the synchronized operation). The problem in the tests is that the PrintWriter is mocked and that the WrappedPrintWriter#lock method is using SharedSecrets.getJavaIOPrintWriterAccess().lock(printWriter) to return the lock object. As the ` printWriter is a mock, its lock field is null . Using Java 17, the WrappedPrintWriter#lock method was returning the wrapped PrintWriter . This is why it was working before.

          Basil Crow added a comment -

          I have seen this type of problem before with other plugins and fixed it with new PrintWriter(OutputStream.nullOutputStream())

          Basil Crow added a comment - I have seen this type of problem before with other plugins and fixed it with new PrintWriter(OutputStream.nullOutputStream())

          Thanks basil. I opened the pull request with that.

          Adrien Lecharpentier added a comment - Thanks basil . I opened the pull request with that.

          Adrien Lecharpentier added a comment - Merged in https://github.com/jenkinsci/jira-plugin/commit/0f08314eff3814b4c8a7001ff81a397b6b1a2425

          Adrien Lecharpentier added a comment - Released in https://github.com/jenkinsci/jira-plugin/releases/tag/jira-3.11

            alecharp Adrien Lecharpentier
            notmyfault Alexander Brandes
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: