scoverage / scalac-scoverage-plugin

Scoverage Scala Code Coverage Core Libs
https://github.com/scoverage
Apache License 2.0
423 stars 126 forks source link

CoverageAggregator fails java.lang.NoSuchMethodError on Scala 2.13.x #490

Closed rhass closed 1 year ago

rhass commented 1 year ago

Describe the bug

Scala 2.13 changed the Array object such that the call .toSeq no longer works. I suspect this migration doc is relevant to this issue: https://docs.scala-lang.org/overviews/core/collections-migration-213.html

It also appears there isn't any code-coverage for this code path in CoverageAggregator, which may be why this continues to pass tests.

This issue breaks the the gradle-scoverage .aggregate method which results in the following stack trace:

Caused by: java.lang.NoSuchMethodError: 'java.lang.Object scala.Predef$.refArrayOps(java.lang.Object[])'    
at scoverage.report.CoverageAggregator$.aggregate(CoverageAggregator.scala:18) |  
-- | --
  |   | at scoverage.report.CoverageAggregator.aggregate(CoverageAggregator.scala) |  
  |   | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) |  
  |   | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) |  
  |   | at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) |  
  |   | at org.scoverage.ScoverageReport$_report_closure1.doCall(ScoverageReport.groovy:51) |  
  |   | at org.scoverage.ScoverageReport$_report_closure1.doCall(ScoverageReport.groovy) |  
  |   | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) |  
  |   | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) |  
  |   | at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) |  
  |   | at org.scoverage.ScoverageRunner.run(ScoverageRunner.groovy:32) |  
  |   | at org.scoverage.ScoverageRunner$run.call(Unknown Source) |  
  |   | at org.scoverage.ScoverageReport.report(ScoverageReport.groovy:47) |  
  |   | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) |  
  |   | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) |  
  |   | at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) |  
  |   | at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104) |  
  |   | at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) |  
  |   | at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) |  
  |   | at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) |  
  |   | at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:242) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68) |  
  |   | at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:227) |  
  |   | at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:210) |  
  |   | at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:193) |  
  |   | at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:171) |  
  |   | at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89) |  
  |   | at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40) |  
  |   | at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53) |  
  |   | at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) |  
  |   | at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50) |  
  |   | at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40) |  
  |   | at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68) |  
  |   | at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38) |  
  |   | at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48) |  
  |   | at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36) |  
  |   | at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41) |  
  |   | at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74) |  
  |   | at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) |  
  |   | at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51) |  
  |   | at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29) |  
  |   | at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:61) |  
  |   | at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:42) |  
  |   | at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60) |  
  |   | at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27) |  
  |   | at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:180) |  
  |   | at org.gradle.internal.execution.steps.BuildCacheStep.executeAndStoreInCache(BuildCacheStep.java:155) |  
  |   | at org.gradle.internal.execution.steps.BuildCacheStep.lambda$executeWithCache$4(BuildCacheStep.java:125) |  
  |   | at org.gradle.internal.execution.steps.BuildCacheStep.lambda$executeWithCache$5(BuildCacheStep.java:125) |  
  |   | at org.gradle.internal.Try$Success.map(Try.java:164) |  
  |   | at org.gradle.internal.execution.steps.BuildCacheStep.executeWithCache(BuildCacheStep.java:85) |  
  |   | at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$0(BuildCacheStep.java:74) |  
  |   | at org.gradle.internal.Either$Left.fold(Either.java:115) |  
  |   | at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59) |  
  |   | at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) |  
  |   | at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) |  
  |   | at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36) |  
  |   | at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25) |  
  |   | at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36) |  
  |   | at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22) |  
  |   | at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:110) |  
  |   | at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56) |  
  |   | at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56) |  
  |   | at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38) |  
  |   | at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73) |  
  |   | at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44) |  
  |   | at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) |  
  |   | at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) |  
  |   | at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89) |  
  |   | at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50) |  
  |   | at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:114) |  
  |   | at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57) |  
  |   | at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76) |  
  |   | at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50) |  
  |   | at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNoEmptySources(SkipEmptyWorkStep.java:249) |  
  |   | at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86) |  
  |   | at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:54) |  
  |   | at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32) |  
  |   | at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21) |  
  |   | at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) |  
  |   | at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43) |  
  |   | at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31) |  
  |   | at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40) |  
  |   | at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:287) |  
  |   | at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40) |  
  |   | at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30) |  
  |   | at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37) |  
  |   | at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27) |  
  |   | at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44) |  
  |   | at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33) |  
  |   | at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76) |  
  |   | at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:144) |  
  |   | at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:133) |  
  |   | at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77) |  
  |   | at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) |  
  |   | at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) |  
  |   | at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) |  
  |   | at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56) |  
  |   | at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) |  
  |   | at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) |  
  |   | at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) |  
  |   | at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) |  
  |   | at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) |  
  |   | at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) |  
  |   | at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74) |  
  |   | at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:333) |  
  |   | at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:320) |  
  |   | at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:313) |  
  |   | at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:299) |  
  |   | at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:143) |  
  |   | at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:227) |  
  |   | at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:218) |  
  |   | at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:140) |  
  |   | at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) |  
  |   | at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)

Expected behavior

The expected behavior is for scoverage to function without issues.

What build tool are you using?

Gradle

Version of scoverage

1.4.11

rhass commented 1 year ago

Note, another person on the Scoverage Gitter reported the same issue: https://gitter.im/scoverage/scoverage?at=623c7ad06b912423204c90aa

ckipp01 commented 1 year ago

Thanks for the report @rhass although I don't believe this is actually an issue here but rather in the gradle plugin although I'm not sure without digging in further. However, I've gone ahead and added some tests that call this method in #491 and the 2.13 tests are passing fine. I'd recommend reporting this to the gradle plugin.

rhass commented 1 year ago

@ckipp01 Interesting! Thanks for adding this as well. I'll open an issue with the Gradle plugin.

ckipp01 commented 1 year ago

I'll go ahead and close this for now. However if you do find out that it's actually related to core here just report back.