GithubHelp home page GithubHelp logo

nebula-test's Introduction

Nebula Test

Support Status Maven Central Build Apache 2.0

Classes specific to testing a Gradle project, leveraging Spock

Documentation

The project wiki contains the full documentation for the library.

LICENSE

Copyright 2014-2021 Netflix, Inc.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

nebula-test's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nebula-test's Issues

nebula-test 10.0.0+ requires manual registration of junitplatform

After upgrading nebula-test to 10.0.0+, tests written in a subproject with just nebula-test are not included in the ./gradlew test run. This silently drops tests from running.

Adding the following to the project's build.gradle fixes the issue:

// Spock 2 is based on JUnit Platform and needs to be enabled explicitly.
tasks.withType(Test).configureEach {
    useJUnitPlatform()
}

which was taken from: https://docs.gradle.org/current/userguide/upgrading_version_6.html#building_gradle_plugins_with_groovy_3

Is there a way for nebula-test to automatically register with the junit platform (like it did before) to avoid this pitfall?

MyPluginProjectSpec.apply-does-not-throw-exceptions always fails under Windows presumably due to open file handle

MyPluginProjectSpec:

class MyPluginProjectSpec extends PluginProjectSpec {

Test failure:

: Unable to delete file D:\workspaces\testautomation\buildsystem\gradle\...\plugins\...\build\test\MyPluginProjectSpec\apply-does-not-throw-exceptions_1\userHome\native\19\windows-i386\native-platform.dll
    at org.apache.tools.ant.taskdefs.Delete.handle(Delete.java:719)
    at org.apache.tools.ant.taskdefs.Delete.removeDir(Delete.java:768)
    at org.apache.tools.ant.taskdefs.Delete.removeDir(Delete.java:764)
    at org.apache.tools.ant.taskdefs.Delete.removeDir(Delete.java:764)
    at org.apache.tools.ant.taskdefs.Delete.removeDir(Delete.java:764)
    at org.apache.tools.ant.taskdefs.Delete.removeDir(Delete.java:764)
    at org.apache.tools.ant.taskdefs.Delete.execute(Delete.java:586)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at groovy.util.AntBuilder.performTask(AntBuilder.java:319)
    at groovy.util.AntBuilder.nodeCompleted(AntBuilder.java:264)
    at groovy.util.BuilderSupport.doInvokeMethod(BuilderSupport.java:147)
    at groovy.util.AntBuilder.doInvokeMethod(AntBuilder.java:203)
    at groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:64)
    at nebula.test.ProjectSpec.cleanup(ProjectSpec.groovy:37)

My current workaround is to override a method of PluginProjectSpec in MyPluginProjectSpec:

import org.apache.tools.ant.taskdefs.condition.Os

...

    boolean deleteProjectDir() {
        return !Os.isFamily(Os.FAMILY_WINDOWS)
    }

But now it is not delete for each test case, and I would hope a fix (or workaround?) in PluginProjectSpec is better (and helps in general).

[SECURITY] Releases are built/executed/released in the context of insecure/untrusted code

CWE-829: Inclusion of Functionality from Untrusted Control Sphere
CWE-494: Download of Code Without Integrity Check

The build files indicate that this project is resolving dependencies over HTTP instead of HTTPS. Any of these artifacts could have been MITM to maliciously compromise them and infect the build artifacts that were produced. Additionally, if any of these JARs or other dependencies were compromised, any developers using these could continue to be infected past updating to fix this.

This vulnerability has a CVSS v3.0 Base Score of 8.1/10
https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

This isn't just theoretical

POC code has existed since 2014 to maliciously compromise a JAR file inflight.
See:

MITM Attacks Increasingly Common

See:

Source Locations

Nebula-Kotlin-Plugin
Nebula-Closure-Plugin
Nebula-Grails-Plugin
Nebula-Test

Aside

I originally reported this to the Netflix Bug Bounty program but it was marked as "Not applicable". That report can be found here:
https://bugcrowd.com/submissions/ffe701c31fa7f2a54a9b63b69e48c6b165dedd91df72a8d0d0c088e6d6518687

Public Disclosure

Option 1: File for a CVE

A project maintainer for this project should probably file for a CVE number to inform the public about this vulnerability in the build for this project. The goal is to inform the public that there was a potential for published build artifacts to have been maliciously compromised in earlier releases.

If a maintainer on this project works for or is associated with a CNA, please have them file it with them:
cve.mitre.org/cve/request_id.html

Otherwise, an open source CVE should be filed for here:
iwantacve.org

Option 2: Manually validate the release artifacts

If this project's build is fully reproducible. An alternative to filing for a CVE is to go back and build the earlier releases (with the HTTPS patch applied) to confirm the artifacts were not tampered when they were built. This can be done by comparing the hashes of the artifacts built locally with the ones published. If the hashes of all previous artifacts match those that are published, you can safely assume that the releases were not tampered with.

Again, this assumes that the build if fully reproducible and will require significantly more work.

Ivy `patternLayout` breaks backwards compatiblity

The use of patternLayout in n.t.d.GradleDependencyGenerator breaks backwards compatibility with Gradle 4.x. It appears this change causes the problem. patternLayout is added in Gradle 5, so invoking this class will result in an error like:

org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method patternLayout() for arguments [build_e435034qi9j7da3zn5b1hmt0p$_run_closure1$_closure2$_closure3$_closure5$_closure6@36195c5f] on object of type org.gradle.api.internal.artifacts.repositories.DefaultIvyArtifactRepository.

I didn't see anything in the changelog or readme indicating that Gradle 4 was no longer supported.

IntegrationSpecs applying Android Gradle Plugin v3.0 fail with GradleException

When setting up a basic IntegrationSpec that applies the latest Android Gradle Plugin v3.0 (com.android.application) and running the default clean task the test will fail with the following stacktrace:

org.gradle.api.GradleException: Build aborted because of an internal error.
	at nebula.test.functional.internal.DefaultExecutionResult.rethrowFailure(DefaultExecutionResult.groovy:97)
	at nebula.test.IntegrationSpec.runTasksSuccessfully(IntegrationSpec.groovy:187)
	at com.something.test.TestSpec.test case(TestSpec.groovy:22)
Caused by: org.gradle.internal.exceptions.LocationAwareException: A problem occurred configuring root project 'test-project'.
	at org.gradle.initialization.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:74)
	at org.gradle.initialization.MultipleBuildFailuresExceptionAnalyser.transform(MultipleBuildFailuresExceptionAnalyser.java:47)
	at org.gradle.initialization.StackTraceSanitizingExceptionAnalyser.transform(StackTraceSanitizingExceptionAnalyser.java:30)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:137)
	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:109)
	at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:78)
	at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:75)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:152)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:100)
	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:75)
	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:53)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$1.run(RunAsBuildOperationBuildActionRunner.java:43)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:47)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:57)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:32)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:64)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:45)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
	at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:60)
	at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:60)
	at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:34)
	at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:143)
	at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:118)
	at org.gradle.tooling.internal.provider.DefaultConnection.getModel(DefaultConnection.java:188)
	at org.gradle.tooling.internal.consumer.connection.CancellableModelBuilderBackedModelProducer.produceModel(CancellableModelBuilderBackedModelProducer.java:53)
	at org.gradle.tooling.internal.consumer.connection.PluginClasspathInjectionSupportedCheckModelProducer.produceModel(PluginClasspathInjectionSupportedCheckModelProducer.java:41)
	at org.gradle.tooling.internal.consumer.connection.AbstractConsumerConnection.run(AbstractConsumerConnection.java:58)
	at org.gradle.tooling.internal.consumer.connection.ParameterValidatingConsumerConnection.run(ParameterValidatingConsumerConnection.java:46)
	at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:89)
	at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:83)
	at org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.run(LazyConsumerActionExecutor.java:84)
	at org.gradle.tooling.internal.consumer.connection.CancellableConsumerActionExecutor.run(CancellableConsumerActionExecutor.java:45)
	at org.gradle.tooling.internal.consumer.connection.ProgressLoggingConsumerActionExecutor.run(ProgressLoggingConsumerActionExecutor.java:58)
	at org.gradle.tooling.internal.consumer.connection.RethrowingErrorsConsumerActionExecutor.run(RethrowingErrorsConsumerActionExecutor.java:38)
	at org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:55)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project 'test-project'.
	at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:94)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:89)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.doConfigure(LifecycleProjectEvaluator.java:70)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.access$100(LifecycleProjectEvaluator.java:34)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$ConfigureProject.run(LifecycleProjectEvaluator.java:110)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:50)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:656)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:135)
	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
	at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:36)
	at org.gradle.initialization.DefaultGradleLauncher$ConfigureBuild.run(DefaultGradleLauncher.java:249)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
	at org.gradle.initialization.DefaultGradleLauncher.configureBuild(DefaultGradleLauncher.java:167)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:126)
	... 56 more
Caused by: org.gradle.internal.event.ListenerNotificationException: Failed to notify project evaluation listener.
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:86)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:76)
	... 75 more
Caused by: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
	at com.android.sdklib.BuildToolInfo.fromLocalPackage(BuildToolInfo.java:242)
	at com.android.sdklib.repository.AndroidSdkHandler.getLatestBuildTool(AndroidSdkHandler.java:796)
	at com.android.sdklib.repository.targets.PlatformTarget.<init>(PlatformTarget.java:143)
	at com.android.sdklib.repository.targets.AndroidTargetManager.getTargetMap(AndroidTargetManager.java:94)
	at com.android.sdklib.repository.targets.AndroidTargetManager.getTargets(AndroidTargetManager.java:80)
	at com.android.sdklib.repository.targets.AndroidTargetManager.getTargetFromHashString(AndroidTargetManager.java:154)
	at com.android.builder.sdk.DefaultSdkLoader.getTargetInfo(DefaultSdkLoader.java:119)
	at com.android.build.gradle.internal.SdkHandler.initTarget(SdkHandler.java:171)
	at com.android.build.gradle.BasePlugin.ensureTargetSetup(BasePlugin.java:718)
	at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:600)
	at com.android.build.gradle.BasePlugin.lambda$null$3(BasePlugin.java:555)
	at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
	at com.android.build.gradle.BasePlugin.lambda$createTasks$4(BasePlugin.java:551)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:91)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:80)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	... 81 more

Using fork may lead to hanging test (Windows + IntelliJ IDEA) and should add/print gradle daemon standard out and err to test output

While my gradle plug-in (note that it internally depends/requires some project configuration resolving) worked in real usage, it failed in nebula-test.

Interesting part of my plug-in's build.gradle file:

dependencies {
    compile (group: 'org.codehaus.groovy.modules.http-builder', name: 'http-builder', version: '0.7')

    compile gradleApi()

    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile (group: 'com.netflix.nebula', name: 'nebula-test', version: '2.2.0') {
        exclude module: 'groovy-all'
    }
}

With some dirty temp custom gradle plug-in/task adaptions I get some pointer to the root cause:

org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':pom'.
    at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration.rethrowFailure(DefaultLenientConfiguration.java:52)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfiguration.rethrowFailure(DefaultResolvedConfiguration.java:36)
    at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyResolver$FilesAggregatingResolvedConfiguration.rethrowFailure(SelfResolvingDependencyResolver.java:110)
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingArtifactDependencyResolver$ErrorHandlingResolvedConfiguration.rethrowFailure(ErrorHandlingArtifactDependencyResolver.java:180)
    at org.gradle.api.artifacts.ResolvedConfiguration$rethrowFailure$0.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
    at com....build.artifactory.My...Task.findAllArtifacts(My...Task.groovy:47)
    at com....build.artifactory.My...Task.promote(My...Task.groovy:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:226)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:589)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:572)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:310)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
    at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:90)
    at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:54)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
    at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:44)
    at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:31)
    at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:62)
    at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:34)
    at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:113)
    at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:98)
    at org.gradle.tooling.internal.provider.DefaultConnection.getModel(DefaultConnection.java:164)
    at org.gradle.tooling.internal.consumer.connection.CancellableModelBuilderBackedModelProducer.produceModel(CancellableModelBuilderBackedModelProducer.java:58)
    at org.gradle.tooling.internal.consumer.connection.AbstractConsumerConnection.run(AbstractConsumerConnection.java:56)
    at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:82)
    at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:76)
    at org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.run(LazyConsumerActionExecutor.java:83)
    at org.gradle.tooling.internal.consumer.connection.ProgressLoggingConsumerActionExecutor.run(ProgressLoggingConsumerActionExecutor.java:58)
    at org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:55)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: org.gradle.internal.resolve.ModuleVersionResolveException: Could not resolve com...:product-webui:6.3.1.20150521-124555.
Required by:
    :applying-plug-in-and-calling-promote-task-with-dryRun-succeeds:unspecified
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.resolve(RepositoryChainDependencyResolver.java:81)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainAdapter.resolve(RepositoryChainAdapter.java:69)
    at org.gradle.api.internal.artifacts.ivyservice.clientmodule.ClientModuleResolver.resolve(ClientModuleResolver.java:44)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$ModuleVersionResolveState.resolve(DependencyGraphBuilder.java:576)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$ModuleVersionResolveState.getMetaData(DependencyGraphBuilder.java:586)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.calculateTargetConfigurations(DependencyGraphBuilder.java:271)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.attachToTargetConfigurations(DependencyGraphBuilder.java:245)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:155)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.resolveDependencyGraph(DependencyGraphBuilder.java:93)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:83)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyResolver$1.execute(DefaultDependencyResolver.java:125)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyResolver$1.execute(DefaultDependencyResolver.java:90)
    at org.gradle.internal.Transformers$4.transform(Transformers.java:137)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:61)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:39)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyResolver.resolve(DefaultDependencyResolver.java:90)
    at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver$1.run(CacheLockingArtifactDependencyResolver.java:42)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:192)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:175)
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:106)
    at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.useCache(DefaultCacheFactory.java:187)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManager.useCache(DefaultCacheLockingManager.java:64)
    at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver.resolve(CacheLockingArtifactDependencyResolver.java:40)
    at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyResolver.resolve(SelfResolvingDependencyResolver.java:45)
    at org.gradle.api.internal.artifacts.ivyservice.ShortcircuitEmptyConfigsArtifactDependencyResolver.resolve(ShortcircuitEmptyConfigsArtifactDependencyResolver.java:58)
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingArtifactDependencyResolver.resolve(ErrorHandlingArtifactDependencyResolver.java:47)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolve(DefaultConfigurationResolver.java:46)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveNow(DefaultConfiguration.java:263)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:253)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getResolvedConfiguration(Unknown Source)
    at org.gradle.api.artifacts.Configuration$getResolvedConfiguration$0.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
    at com....build.artifactory.My...Task.findAllArtifacts(My...Task.groovy:43)
    ... 61 more
Caused by: org.gradle.internal.resolve.ModuleVersionResolveException: Could not resolve com...:product-webui:6.3.1.20150521-124555.
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess.resolveComponentMetaData(ErrorHandlingModuleComponentRepository.java:91)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMetaDataResolveState.process(ComponentMetaDataResolveState.java:66)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMetaDataResolveState.resolve(ComponentMetaDataResolveState.java:45)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.findBestMatch(RepositoryChainDependencyResolver.java:114)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.findBestMatch(RepositoryChainDependencyResolver.java:97)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.resolve(RepositoryChainDependencyResolver.java:70)
    ... 96 more
Caused by: org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.MetaDataParseException: Could not parse Ivy file file:/C:/Users/cwat-rfuerede/.gradle/caches/modules-2/metadata-2.15/descriptors/com.../product-webui/6.3.1.20150521-124555/bc13144451aeae90b59d28a6a4b88226/ivy.xml
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$Parser$1.execute(IvyXmlModuleDescriptorParser.java:494)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$Parser$1.execute(IvyXmlModuleDescriptorParser.java:486)
    at org.gradle.internal.resource.AbstractExternalResource.withContent(AbstractExternalResource.java:81)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$Parser.parse(IvyXmlModuleDescriptorParser.java:486)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser.doParseDescriptorWithProvidedParser(IvyXmlModuleDescriptorParser.java:100)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser.doParseDescriptor(IvyXmlModuleDescriptorParser.java:91)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser.doParseDescriptor(IvyXmlModuleDescriptorParser.java:76)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.AbstractModuleDescriptorParser.parseDescriptor(AbstractModuleDescriptorParser.java:44)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.AbstractModuleDescriptorParser.parseMetaData(AbstractModuleDescriptorParser.java:31)
    at org.gradle.api.internal.artifacts.ivyservice.modulecache.ModuleDescriptorStore.parseModuleDescriptorFile(ModuleDescriptorStore.java:68)
    at org.gradle.api.internal.artifacts.ivyservice.modulecache.ModuleDescriptorStore.getModuleDescriptor(ModuleDescriptorStore.java:48)
    at org.gradle.api.internal.artifacts.ivyservice.modulecache.DefaultModuleMetaDataCache.getCachedModuleDescriptor(DefaultModuleMetaDataCache.java:73)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$LocateInCacheRepositoryAccess.resolveComponentMetaDataFromCache(CachingModuleComponentRepository.java:158)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$LocateInCacheRepositoryAccess.resolveComponentMetaData(CachingModuleComponentRepository.java:154)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.BaseModuleComponentRepositoryAccess.resolveComponentMetaData(BaseModuleComponentRepositoryAccess.java:42)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.memcache.InMemoryCachedModuleComponentRepository$CachedAccess.resolveComponentMetaData(InMemoryCachedModuleComponentRepository.java:75)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess.resolveComponentMetaData(ErrorHandlingModuleComponentRepository.java:89)
    ... 101 more
Caused by: java.lang.ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration
    at org.apache.xerces.parsers.SAXParser.<init>(Unknown Source)
    at org.apache.xerces.parsers.SAXParser.<init>(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.<init>(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl.<init>(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(Unknown Source)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$ParserHelper.newSAXParser(IvyXmlModuleDescriptorParser.java:1223)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$ParserHelper.parse(IvyXmlModuleDescriptorParser.java:1264)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$Parser$1.execute(IvyXmlModuleDescriptorParser.java:492)
    ... 117 more

Sounds very much related to:

I tried the suggested workaround of "fork = true" (maybe note that I am on Windows using IntelliJ IDEA):

  • within IntelliJ IDEA the test hangs until I kill the gradle daemon, however the test seems to succeed, but nothing is found in system out and err of test report, so I was suspicious
  • from cygwin cmd line it actually works, but nothing is found in system out and err of test report, so I was suspicious
    • => I filed this issue with two suggestions:
      • when "fork = true" and the gradle daemon is used, then please print the gradle daemons std out and err to have it in the test result
      • maybe add a little note of caution for the IntelliJ IDEA test hanging problem to the fork option in the documentation

Because the original problem was a classloader issue, the following workaround based on the aforementioned github issues helps from within IDEA (i.e. without forking), but is IMHO very ugly (and it was non-obvious and time consuming and seemingly others have similar problems?):

build.gradle:

dependencies {
    compile (group: 'org.codehaus.groovy.modules.http-builder', name: 'http-builder', version: '0.7') {
        exclude module: 'xercesImpl' // !
    }

    //compile gradleApi() // !
    compile files(gradleApi().resolve().findAll { !it.name.startsWith('xerces') && !it.name.startsWith('xml-apis') }) // !

    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile (group: 'com.netflix.nebula', name: 'nebula-test', version: '2.2.0') {
        exclude module: 'groovy-all'
    }
}

7.2.4 not in Maven Central

nebula-test 7.2.4 is not in Maven Central:

Could not resolve all files for configuration ':funcTestCompileClasspath'.
> Could not find com.netflix.nebula:nebula-test:7.2.4.
  Searched in the following locations:
    - https://repo.maven.apache.org/maven2/com/netflix/nebula/nebula-test/7.2.4/nebula-test-7.2.4.pom
    - https://repo.maven.apache.org/maven2/com/netflix/nebula/nebula-test/7.2.4/nebula-test-7.2.4.jar

Maybe there was some issues with syncing between JCenter and Maven Central or some changes from that commit broke it.

ClassCastException while resolving real dependencies - IntegrationSpec

When trying to resolve dependencies a ClassCastException is thrown...

when running a simpe test like
'''groovy{
def 'check dependencies'(){

    buildFile << '''
        apply plugin: 'java'

        repositories{
            mavenCentral()
        }

        dependencies{
            compile 'com.google.guava:guava:18.0'
        }


        task testNebula<<{
            configurations.compile.each { println it.absolutePath}
        }

    '''.stripIndent()
    when:

    ExecutionResult result = runTasksSuccessfully(':testNebula')

    then:
    result.standardOutput.contains(':testNebula')
}

this exception is thrown

Caused by: org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.MetaDataParseException: Could not parse POM https://repo1.maven.org/maven2/com/google/guava/guava/18.0/guava-18.0.pom
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.PomReader$1.transform(PomReader.java:100)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.PomReader$1.transform(PomReader.java:95)
at org.gradle.internal.resource.AbstractExternalResource.withContent(AbstractExternalResource.java:64)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.PomReader.(PomReader.java:95)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.GradlePomModuleDescriptorParser.doParseDescriptor(GradlePomModuleDescriptorParser.java:60)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.AbstractModuleDescriptorParser.parseDescriptor(AbstractModuleDescriptorParser.java:44)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.AbstractModuleDescriptorParser.parseMetaData(AbstractModuleDescriptorParser.java:39)
at org.gradle.api.internal.artifacts.repositories.resolver.MavenResolver.parseMetaDataFromResource(MavenResolver.java:184)
at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceResolver.parseMetaDataFromArtifact(ExternalResourceResolver.java:168)
at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceResolver.resolveStaticDependency(ExternalResourceResolver.java:141)
at org.gradle.api.internal.artifacts.repositories.resolver.MavenResolver.doResolveComponentMetaData(MavenResolver.java:82)
at org.gradle.api.internal.artifacts.repositories.resolver.ExternalResourceResolver$RemoteRepositoryAccess.resolveComponentMetaData(ExternalResourceResolver.java:391)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CacheLockReleasingModuleComponentsRepository$LockReleasingRepositoryAccess$2.run(CacheLockReleasingModuleComponentsRepository.java:65)
at org.gradle.internal.Factories$1.create(Factories.java:22)
at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:237)
at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:308)
at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:114)
at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.longRunningOperation(DefaultCacheFactory.java:179)
at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManager.longRunningOperation(DefaultCacheLockingManager.java:56)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CacheLockReleasingModuleComponentsRepository$LockReleasingRepositoryAccess.resolveComponentMetaData(CacheLockReleasingModuleComponentsRepository.java:63)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$ResolveAndCacheRepositoryAccess.resolveComponentMetaData(CachingModuleComponentRepository.java:284)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.BaseModuleComponentRepositoryAccess.resolveComponentMetaData(BaseModuleComponentRepositoryAccess.java:38)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.memcache.InMemoryCachedModuleComponentRepository$CachedAccess.resolveComponentMetaData(InMemoryCachedModuleComponentRepository.java:70)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMetaDataResolveState.process(ComponentMetaDataResolveState.java:70)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMetaDataResolveState.resolve(ComponentMetaDataResolveState.java:62)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.findBestMatch(RepositoryChainDependencyResolver.java:114)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.findBestMatch(RepositoryChainDependencyResolver.java:97)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.resolve(RepositoryChainDependencyResolver.java:70)
... 84 more
Caused by: java.lang.ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration
at org.apache.ivy.util.XMLHelper.getDocBuilder(XMLHelper.java:210)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.PomReader.parseToDom(PomReader.java:190)
at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.PomReader$1.transform(PomReader.java:98)
... 111 more

com.xx.yy.TestSpec > check if conventionMapping FAILED
org.gradle.api.GradleException at TestSpec.groovy:32
Caused by: org.gradle.internal.exceptions.LocationAwareException
Caused by: org.gradle.api.tasks.TaskExecutionException
Caused by: org.gradle.api.artifacts.ResolveException
Caused by: org.gradle.internal.resolve.ModuleVersionResolveException
Caused by: org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.MetaDataParseException
Caused by: java.lang.ClassCastException

How to access plugin or task instances to inject mocks?

I'm going to have to test my plugin with some mock objects, which my plugin normally loads from a FQCN and instantiates. I'm considering how I could refactor my plugin so I could directly inject mock instances for the purposes of testing, instead of having the plugin load the class from a FQCN. I can see how to refactor the plugin class, but I don't see how I can access the plugin or task class from the spec method so I can inject mocks.

(Have you considered creating a mailing list for usage questions? Now that Spock has reached 1.0, once nebula-test supports Spock 1.0, you may see an uptick in usage, especially from clueless people like me. :) .)

Release 4.4.3 doesn't work with Gradle 3.3

I'm upgrading a repo that uses nebula-test -- palantir/gradle-baseline#117 -- to Gradle 3.3 and upgraded nebula-test to 4.4.3 in the process. However many of my tests are still failing with this stacktrace:

java.lang.NoSuchMethodError: org.gradle.internal.classloader.ClasspathUtil.getClasspath(Ljava/lang/ClassLoader;)Ljava/util/List;
	at nebula.test.functional.internal.classpath.ClasspathAddingInitScriptBuilder.getClasspathUrls(ClasspathAddingInitScriptBuilder.groovy:51)
	at nebula.test.functional.internal.classpath.ClasspathAddingInitScriptBuilder.getClasspathAsFiles(ClasspathAddingInitScriptBuilder.groovy:41)
	at nebula.test.functional.internal.classpath.ClasspathAddingInitScriptBuilder.build(ClasspathAddingInitScriptBuilder.groovy:19)
	at nebula.test.functional.internal.classpath.ClasspathInjectingGradleHandleFactory.start(ClasspathInjectingGradleHandleFactory.groovy:29)
	at nebula.test.functional.internal.DefaultGradleRunner.handle(DefaultGradleRunner.groovy:40)
	at nebula.test.IntegrationSpec.launcher(IntegrationSpec.groovy:91)
	at nebula.test.IntegrationSpec.runTasks(IntegrationSpec.groovy:287)
	at nebula.test.IntegrationSpec.runTasksSuccessfully(IntegrationSpec.groovy:272)
	at com.palantir.baseline.BaselineConfigIntegrationTest.Installs config(BaselineConfigIntegrationTest.groovy:38)

The change from PR #73 has taken effect, but the call to ClasspathUtil.getClasspath is still failing. I believe the problem to be that it's looking for the signature that returns a java.util.List which does not exist in the gradle-api.

Pulling out the classfile for ClasspathAddingInitScriptBuilder.groovy I see that this groovy code

    private static List<URL> getClasspathUrls(ClassLoader classLoader) {
        Object cp = ClasspathUtil.getClasspath(classLoader)
        if (cp instanceof List<URL>) {
            return (List<URL>) cp
        }
        if (cp instanceof ClassPath) { // introduced by gradle/gradle@0ab8bc2
            return ((ClassPath) cp).asURLs
        }
        throw new IllegalStateException("Unable to extract classpath urls from type ${cp.class.canonicalName}")
    }

is compiled into this bytecode

  private static java.util.List<java.net.URL> getClasspathUrls(java.lang.ClassLoader);
    Code:
       0: aload_0
       1: invokestatic  #95                 // Method org/gradle/internal/classloader/ClasspathUtil.getClasspath:(Ljava/lang/ClassLoader;)Ljava/util/List;
       4: astore_1
       5: aload_1
       6: pop
       7: aload_1
       8: instanceof    #97                 // class java/util/List
      11: ifeq          19
      14: aload_1
      15: checkcast     #97                 // class java/util/List
      18: areturn
...<snip>...

Note that the method call is to the old version of the Gradle method that returns a List, rather than the new one which returns a ClassPath object. When running with Gradle 3.3 the version that returns a List does not exist. If we compiled against Gradle 3.3 then the method call would be to the method that returns a ClassPath object, and when running against Gradle 3.2 that method would not exist.

Due to this compile-time dependency linking nebula-test to Gradle, we won't be able to support both Gradle 3.2 and 3.3 in the same release of nebula-test without more runtime magic. The way I've seen this done in Spark/Hadoop is to use reflection to see if a method exists and then call it reflectively, rather than at compile time like done in the initial 3.3 support PR.

Therefore to fix this I propose upgrading nebula-test to compile against Gradle 3.3, which will increase nebula-test's minimum Gradle version to 3.3

Support for JDK 1.6

Hi,

thanks for the great work. This is an awesome plugin.

I was wondering whether you could enable support for JDK 1.6 as Gradle also supports JDK 1.6.

I'm a little confused because in der bootstrap.gradle it enables the Source/Target-Compability for JDK 1.6 but this file is never included.

I played a little with it locally but as it turns out: Just compiling it with JDK 1.6 doesn't work out of the box as the required nebula-plugin-plugin also relies on JDK 1.7.

Thank you very much & kind regards,
Chris

Modify dependency generation

Remove dependency on using gradle to generate out ivy and maven repositories to make it more portable between versions and be a candidate for pull request to the Gradle TestKit

Show output on execution failure if not expected

Doing some refactoring I often have integration tests with failing tasks. In many cases the error message (task 'xxx' failed) is not enough to get know what happened. What's more I cannot simply add println result.standardoutput as the test execution is aborted (I need to switch to runTasksWithFailure()).
It would be handy to have a switch printOutputOnFailure (disabled by default) to print stdout (and stderr?) on failure when runTasksSuccessfully() was used.

Gradle deamon in not killed after test execution

Hi,

I validate my plugin against various range of Gradle versions (from 2.0 up to 2.5) and after text executions all Gradle daemons are alive (they are 5. for now but number is growing along with new gradle releases). It would be very nice to have an option to kill Gradle daemons after forked test execution.

Classpath issues when dealing with Gradle 2.0-rc-1

Came across an issue when trying to add tests to verify plugins for Gradle 2.0-rc-1.
In ClasspathAddingInitScriptBuilder, we add all the JARs currently in the URLClassLoader to the init script, however this causes problems when the plugin project is Gradle 1.x and testing for Gradle 2.x (or vice versa).

The main issues seems to be that groovy-all and spock are getting added and since they are incompatible, you get a bunch of errors. We'll probably need to add some filter to the jars that are let through to the init script. Not a great solution (and fragile) but could be a good place to start.

This is very obvious when running tests in IntelliJ because all the IDEA libraries get placed into the init script.

Question: Gradle 2.4 support

When I try to run gradle test on the gradle-2.4 branch, the apply plugin: 'nebula-test' line gives:

A problem occurred evaluating root project 'nebula-test'.
> org/gradle/listener/BroadcastDispatch

Is this a problem with Nebula, with Gradle, or am I doing something wrong? Or is this branch not ready yet? Is there a workaround?

Provide convenient way to clean up test project at test completion

After running a bunch of integration tests, my "build/test/" folder has dozens of test project folders. These will go away when I "clean", and I can manually clean up old ones, but I would think these could be cleaned up a bit automatically. I could define a finalizing task (not even sure how to do that yet) that removes the test project directory, but I don't know how to determine the name of the folder. It's entirely possible I would want this folder to stick around if the test fails (or make it easy to toggle it so it doesn't delete it), but if the test succeeds I can't see a good reason to keep it around.

TestKitSpecification does not throw exception on failure when calling runTasksSuccessfully

If you add --info to troubleshoot:

java.lang.NullPointerException: Cannot get property 'outcome' on null object

	at com.netflix.lint.rule.TestKitSpecification.runTasksSuccessfully_closure2(TestKitSpecification.groovy:45)
	at groovy.lang.Closure.call(Closure.java:414)
	at groovy.lang.Closure.call(Closure.java:430)
	at com.netflix.lint.rule.TestKitSpecification.runTasksSuccessfully(TestKitSpecification.groovy:43)
	at com.netflix.lint.rule.dependency.ThirdPartyBomReplacementRuleSpec.multiproject bom replacement(ThirdPartyBomReplacementRuleSpec.groovy:364)

ClassCastException during integration spec when listing dependencies

The following project:

build.gradle:

apply plugin: 'groovy'

repositories {
    mavenCentral()
}

dependencies {
    compile gradleApi()
    compile localGroovy()
    testCompile 'com.netflix.nebula:nebula-test:2.2.1', {
        exclude module: 'groovy-all'
    }
}

src/test/groovy/nebula/TestIntegrationSpec.groovy:

package nebula

import nebula.test.IntegrationSpec
import nebula.test.functional.ExecutionResult

class TestIntegrationSpec extends IntegrationSpec {

    def "can list dependencies"() {
        setup:
        buildFile << """
            apply plugin: 'java'
            repositories {
                mavenCentral()
            }
            dependencies {
                compile 'org.slf4j:slf4j-api:1.7.6'
            }
            sourceSets.main.compileClasspath.each { println it }
        """.stripIndent()

        expect:
        runTasksSuccessfully('build')
    }

}

leads with gradle 2.4-rc-1 and gradle 2.3 to a ClassCastException while executing the test:

org.gradle.api.GradleException: Build aborted because of an internal error.
    at nebula.test.functional.internal.DefaultExecutionResult.rethrowFailure(DefaultExecutionResult.groovy:97)
    at nebula.test.IntegrationSpec.runTasksSuccessfully(IntegrationSpec.groovy:251)
    at nebula.TestIntegrationSpec.can list dependencies(TestIntegrationSpec.groovy:33)
Caused by: org.gradle.internal.exceptions.LocationAwareException: Build file '/home/tobias/tmp/nebula-test/build/test/nebula.TestIntegrationSpec/can-list-dependencies_2/build.gradle' line: 11
A problem occurred evaluating root project 'can-list-dependencies'.
    at org.gradle.initialization.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:77)
    at org.gradle.initialization.MultipleBuildFailuresExceptionAnalyser.transform(MultipleBuildFailuresExceptionAnalyser.java:47)
    at org.gradle.initialization.StackTraceSanitizingExceptionAnalyser.transform(StackTraceSanitizingExceptionAnalyser.java:30)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:108)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:90)
    at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:54)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
    at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:44)
    at org.gradle.tooling.internal.provider.DaemonBuildActionExecuter.execute(DaemonBuildActionExecuter.java:31)
    at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:62)
    at org.gradle.tooling.internal.provider.LoggingBridgingBuildActionExecuter.execute(LoggingBridgingBuildActionExecuter.java:34)
    at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:113)
    at org.gradle.tooling.internal.provider.ProviderConnection.run(ProviderConnection.java:98)
    at org.gradle.tooling.internal.provider.DefaultConnection.getModel(DefaultConnection.java:164)
    at org.gradle.tooling.internal.consumer.connection.CancellableModelBuilderBackedModelProducer.produceModel(CancellableModelBuilderBackedModelProducer.java:58)
    at org.gradle.tooling.internal.consumer.connection.AbstractConsumerConnection.run(AbstractConsumerConnection.java:56)
    at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:82)
    at org.gradle.tooling.internal.consumer.DefaultBuildLauncher$1.run(DefaultBuildLauncher.java:76)
    at org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.run(LazyConsumerActionExecutor.java:83)
    at org.gradle.tooling.internal.consumer.connection.ProgressLoggingConsumerActionExecutor.run(ProgressLoggingConsumerActionExecutor.java:58)
    at org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:55)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: org.gradle.api.GradleScriptException: A problem occurred evaluating root project 'can-list-dependencies'.
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:76)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl$1.run(DefaultScriptPluginFactory.java:148)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:156)
    at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:39)
    at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
    at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:55)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:487)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:85)
    at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
    at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:33)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:129)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
    ... 22 more
Caused by: org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':compile'.
    at org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration.rethrowFailure(DefaultLenientConfiguration.java:52)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultResolvedConfiguration.rethrowFailure(DefaultResolvedConfiguration.java:36)
    at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyResolver$FilesAggregatingResolvedConfiguration.rethrowFailure(SelfResolvingDependencyResolver.java:110)
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingArtifactDependencyResolver$ErrorHandlingResolvedConfiguration.rethrowFailure(ErrorHandlingArtifactDependencyResolver.java:180)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getFiles(DefaultConfiguration.java:467)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getFiles(DefaultConfiguration.java:218)
    at org.gradle.api.internal.file.AbstractFileCollection.iterator(AbstractFileCollection.java:60)
    at build_csrf1zgj8onjumycudf8c6y7x.run(/home/tobias/tmp/nebula-test/build/test/nebula.TestIntegrationSpec/can-list-dependencies_2/build.gradle:11)
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:74)
    ... 34 more
Caused by: org.gradle.internal.resolve.ModuleVersionResolveException: Could not resolve org.slf4j:slf4j-api:1.7.6.
Required by:
    :can-list-dependencies:unspecified
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.resolve(RepositoryChainDependencyResolver.java:81)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainAdapter.resolve(RepositoryChainAdapter.java:69)
    at org.gradle.api.internal.artifacts.ivyservice.clientmodule.ClientModuleResolver.resolve(ClientModuleResolver.java:44)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$ModuleVersionResolveState.resolve(DependencyGraphBuilder.java:576)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$ModuleVersionResolveState.getMetaData(DependencyGraphBuilder.java:586)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.calculateTargetConfigurations(DependencyGraphBuilder.java:271)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder$DependencyEdge.attachToTargetConfigurations(DependencyGraphBuilder.java:245)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:155)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.resolveDependencyGraph(DependencyGraphBuilder.java:93)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:83)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyResolver$1.execute(DefaultDependencyResolver.java:125)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyResolver$1.execute(DefaultDependencyResolver.java:90)
    at org.gradle.internal.Transformers$4.transform(Transformers.java:137)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:61)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:39)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyResolver.resolve(DefaultDependencyResolver.java:90)
    at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver$1.run(CacheLockingArtifactDependencyResolver.java:42)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:192)
    at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:175)
    at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:106)
    at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.useCache(DefaultCacheFactory.java:187)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManager.useCache(DefaultCacheLockingManager.java:64)
    at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver.resolve(CacheLockingArtifactDependencyResolver.java:40)
    at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyResolver.resolve(SelfResolvingDependencyResolver.java:45)
    at org.gradle.api.internal.artifacts.ivyservice.ShortcircuitEmptyConfigsArtifactDependencyResolver.resolve(ShortcircuitEmptyConfigsArtifactDependencyResolver.java:58)
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingArtifactDependencyResolver.resolve(ErrorHandlingArtifactDependencyResolver.java:47)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolve(DefaultConfigurationResolver.java:46)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveNow(DefaultConfiguration.java:263)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:253)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getFiles(DefaultConfiguration.java:465)
    ... 38 more
Caused by: org.gradle.internal.resolve.ModuleVersionResolveException: Could not resolve org.slf4j:slf4j-api:1.7.6.
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess.resolveComponentMetaData(ErrorHandlingModuleComponentRepository.java:91)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMetaDataResolveState.process(ComponentMetaDataResolveState.java:66)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ComponentMetaDataResolveState.resolve(ComponentMetaDataResolveState.java:45)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.findBestMatch(RepositoryChainDependencyResolver.java:114)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.findBestMatch(RepositoryChainDependencyResolver.java:97)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainDependencyResolver.resolve(RepositoryChainDependencyResolver.java:70)
    ... 68 more
Caused by: org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.MetaDataParseException: Could not parse Ivy file file:/home/tobias/.gradle/caches/modules-2/metadata-2.15/descriptors/org.slf4j/slf4j-api/1.7.6/4471c3b2f5ea2d40ffaa8b3948cdbacd/ivy.xml
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$Parser$1.execute(IvyXmlModuleDescriptorParser.java:494)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$Parser$1.execute(IvyXmlModuleDescriptorParser.java:486)
    at org.gradle.internal.resource.AbstractExternalResource.withContent(AbstractExternalResource.java:81)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$Parser.parse(IvyXmlModuleDescriptorParser.java:486)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser.doParseDescriptorWithProvidedParser(IvyXmlModuleDescriptorParser.java:100)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser.doParseDescriptor(IvyXmlModuleDescriptorParser.java:91)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser.doParseDescriptor(IvyXmlModuleDescriptorParser.java:76)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.AbstractModuleDescriptorParser.parseDescriptor(AbstractModuleDescriptorParser.java:44)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.AbstractModuleDescriptorParser.parseMetaData(AbstractModuleDescriptorParser.java:31)
    at org.gradle.api.internal.artifacts.ivyservice.modulecache.ModuleDescriptorStore.parseModuleDescriptorFile(ModuleDescriptorStore.java:68)
    at org.gradle.api.internal.artifacts.ivyservice.modulecache.ModuleDescriptorStore.getModuleDescriptor(ModuleDescriptorStore.java:48)
    at org.gradle.api.internal.artifacts.ivyservice.modulecache.DefaultModuleMetaDataCache.getCachedModuleDescriptor(DefaultModuleMetaDataCache.java:73)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$LocateInCacheRepositoryAccess.resolveComponentMetaDataFromCache(CachingModuleComponentRepository.java:158)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$LocateInCacheRepositoryAccess.resolveComponentMetaData(CachingModuleComponentRepository.java:154)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.BaseModuleComponentRepositoryAccess.resolveComponentMetaData(BaseModuleComponentRepositoryAccess.java:42)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.memcache.InMemoryCachedModuleComponentRepository$CachedAccess.resolveComponentMetaData(InMemoryCachedModuleComponentRepository.java:75)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ErrorHandlingModuleComponentRepository$ErrorHandlingModuleComponentRepositoryAccess.resolveComponentMetaData(ErrorHandlingModuleComponentRepository.java:89)
    ... 73 more
Caused by: java.lang.ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$ParserHelper.newSAXParser(IvyXmlModuleDescriptorParser.java:1223)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$ParserHelper.parse(IvyXmlModuleDescriptorParser.java:1264)
    at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.IvyXmlModuleDescriptorParser$Parser$1.execute(IvyXmlModuleDescriptorParser.java:492)
    ... 89 more```

Task state detection incorrect when have sub-projects with same task

Checking the state/result of a task can return an incorrect value if the same task also ran in a sub-project. This method can incorrectly return the result from the sub-project task:

https://github.com/nebula-plugins/nebula-test/blob/master/src/main/groovy/nebula/test/functional/internal/toolingapi/BuildLauncherBackedGradleHandle.groovy#L118-L119

e.g. if it is checking if :myTask was SKIPPED, it will return true if :subproject:myTask was SKIPPED even if :myTask was not.

A simple fix would be to ensure there was whitespace before the task name so it matches the whole task path:

stdout.contains(" $taskName $stateIdentifier".toString())

Upgrade to Spock 1.0

Spock 1.0 has been out for a while now (in internet time, I suppose), and Nebula is only on 0.7. I got confusing errors until I realized I had to remove my Spock 1.0 dependency for Nebula to work. When is Nebula going to be ported to Spock 1.0?

How does nebula ensure the java process end?

Hi Guys,

I have been noticed when I use the following snippet in a plugin:

new FileNameFinder().getFileNames(path, includes, exclusions)

The first instance of a test that exercises it will pass but all subsequent tests exercising the code fail.

I have published an example project for this: https://github.com/iwarapter/nebula-test-example which contains two identical tests. One passes, one fails. When the clean build has finished there is a lingering java process still left over.

Can anyone shed some light on this?

println not included in result.standardOutput in 2.0 branch

Working on my plugin migration to Gradle 2.x (and nebula-test 2.x) I noticed that messages send directly to stdout and stderr (via println or System.err.println) are not included in respectively result.standardOutput and result.standardError. It works fine in 1.12 branch.

A library I use in my plugin to do the logic uses java.util.logging and by default writes to stderr and in addition use println directly and I have problem asserting its execution. I could bind stdout and stderr to selected logging level in Gradle, but I don't know if I want to bind stderr to INFO level.

Plugin link from portal refers to "nebula-publishing-plugin"

If I go to the plugin portal and search for "nebula-test", the entry it gives me is titled "Publishing related plugins" and which actually refers to the "nebula-publishing-plugin". In order to get to nebula-test, I have to go up a level in github and find it in the children.

Allow for retrieving the path to a generated Maven/Ivy repository

The class GradleDependencyGenerator allows for generating Maven and Ivy repositories based on a root directory. However, internally it adds another directory to it which is not exposed to the end user (mavenrepo and ivyrepo). It would be helpful if the generate methods would return the File of the referenced repository.

FR: Add support to determine Gradle versions

The use case I have in mind is to test a plugin against incompatibilities that are lurking in upcoming Gradle versions (RC, nightly). The IntegrationSpec already allows for testing a plugin against certain versions by specifying a gradleVersion. Currently every plugin tester has to write its own logic that determines e.g. the latest RC or nightly build. Integrating this logic into nebula-test would facilitate this a lot.

There is already a REST API (serving JSON) where this information could be retrieved from (just browse to the appropriate sub resource): Gradle Version Information

Suggestion: have "fileExists()" allow Ant-style wildcard paths

Especially when using IntegrationSpec, building a path deep into the test project directory to verify the creation of a file can be annoying, and a maintenance issue. It would be useful if the path specified with "fileExists()" could use "**" and other wildcards to verify the presence of a file deep within the project structure.

CLASSPATH_DEFAULT doesn't handle subprojects

GradleRunner.CLASSPATH_DEFAULT combines CLASSPATH_USER_DIR and CLASSPATH_CACHE. However, that doesn't take into account Gradle subprojects (in particular, the USER_DIR filter is too restrictive when the test is in some subproject with a sibling-subproject dependency).

I'm not claiming this is a general solution, but the following currently works for me!

public static final Predicate<URL> CLASSPATH_NO_WRAPPER = new Predicate<URL>() {
    @Override
    boolean apply(URL url) {
        !url.path.contains('/wrapper/dists')
    }
}

// ...

classpathFilter = CLASSPATH_NO_WRAPPER

Default classpath filtering from #49 unintentionally filters user (cwd) class path due to 2 little bugs (on Windows)

This leads to the fact that the gradle plug-in under test (not being in gradle cache yet, because it is just being built and tested) is not in the classpath of the nebula test of the plug-in...

Current code in GradleRunner:

    static final Predicate<URL> CLASSPATH_USER_DIR = new Predicate<URL>() {
        @Override
        boolean apply(URL url) {
            File userDir = new File(StandardSystemProperty.USER_DIR.value())
            return url.path.startsWith(userDir.path)
        }
    }

Debug logs show the problem right away:

url: file:/D:/workspaces/testautomation/buildsystem/gradle/???/plugins/artifactory/build/classes/test/
userDir: D:\workspaces\testautomation\buildsystem\gradle\???\plugins\artifactory
userDir.path: D:\workspaces\testautomation\buildsystem\gradle\???\plugins\artifactory
url.path: /D:/workspaces/testautomation/buildsystem/gradle/???/plugins/artifactory/build/classes/test/

Thus, it does not work on Windows, because of:

  • the leading '/' in url.path
  • '/' vs. ''

(It seems to be okay on Mac.)

The solution seems to be changing the return statement check of the GradleRunner.CLASSPATH_USER_DIR predicate like this for example:

    static final Predicate<URL> CLASSPATH_USER_DIR = new Predicate<URL>() {
        @Override
        boolean apply(URL url) {
            File userDir = new File(StandardSystemProperty.USER_DIR.value())
            return url.path.substring(1).startsWith(userDir.path.replace('\\', '/'))
            // Or:
            //return url.path.contains(userDir.path.replace('\\', '/'))
        }
    }

Default classpath filtering breaks IntelliJ 2017.2 test launch configurations

IntelliJ sets the working directory to the module directory, which will cause any projects that are dependent to be filtered and excluded from the classpath. The filtering in nebula.test.functional.GradleRunner#CLASSPATH_PROJECT_DIR should be smarter, and include all project classpaths, rather than just the current working directory.

Workaround is to set the working directory to the root project directory (as in the case when running from Gradle).

Nebula test fails to get Gradle distribution

I filed this SO posting: http://stackoverflow.com/questions/29262982/gradle-nebula-test-fails-to-download-gradle-distribution .

To reiterate, I had a working Gradle build, which had, and which continues to, download artifacts from the public internet (so Gradle has the correct proxy settings). I started to add nebula test so I could write integration tests. I first had to resolve a Spock version conflict (I was using 1.0, you're using 0.7). Once that was fixed, it seemed to try to go further, but then it fails with this:

Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradle-2.3-bin.zip'.

The SO posting has the full stacktrace. What's curious is that although I'm able to set breakpoints in my plugin code in Eclipse and step through it, my attempts to set breakpoints in the nebula test code were seemingly ignored.

Note that I was even able to "wget" the same zip file from the same shell I ran the build from, and I noticed that wget pointed out that the initial request got a 301, and it redirected to the permanent location. Is this mechanism in nebula test not properly handling 301s?

Ability to test precompiled Kotlin script plugins

I wanted to contribute a fix for an issue in a plugin I'm using that uses nebula-test.
Unfortunately it seems this is not possible right now.
The issue I want to fix is only happening when applying the plugin in a precompiled Kotlin script plugin.

The problem is, that you use a command-line init script to inject the project classes to the test build.
Those init scripts are only applied to the main build, not to the buildSrc build. (gradle/gradle#1055)

To also inject into the buildSrc build, you would need to use a custom Gradle distribution (e. g. let the wrapper / tooling api download the version to test against into a custom folder, then manipulate it before executing the actual test) in which the init script is present in init.d, then it would also be effective on the buildSrc build.

But even then I'm not sure whether it would work, as for the issue to test I need to apply the plugin via plugins-DSL block so that static accessors are generated for it and I think this would not work with just having the plugin in the classpath.
Instead you would probably need to actually build the artifacts, make a maven or ivy repository out of it and configure it as plugin repository using the init script in the custom gradle distribution.

Generator's Connector ignores actual gradle wrapper.

Tooling API will try to download your version of gradle from service.gradle.org, irrelevant if the wrapper being used actually came from there. Meaning that internally since we use a custom distribution internally, the Connector doesn't work since it's trying to download distribution in from service.gradle.org. You can see this logic in org.gradle.tooling.internal.consumer.DistributionFactory:

private Distribution getDownloadedDistribution(String gradleVersion) {
    URI distUri = new DistributionLocator().getDistributionFor(GradleVersion.version(gradleVersion));
    return getDistribution(distUri);
}

Either see if this was fixed in a new Gradle, or start writing out a gradle/wrapper/gradle-wrapper.properties when generating the repo projects.

is this plugin deprecated?

I aske because the Plugin Overview page shows this plugin to be deprecated. There doesn't seem to be any mention in this repository though...

I really enjoy using this plugin vs the Gradle TestKit mostly because it:

  1. removes any boilerplate code required to make the test code available to the test build
  2. fixes an issue with library ordering in IntelliJ

I see that this project is still:

  • receiving updates (updates to the latest version of gradle)
  • being used by the other nebula plugins

Is it recommended to use this plugin, at least until the Gradle TestKit gains feature parity?

Ability to generate proper directories for parameterized tests

Hi,

I use spock parameterized tests along with nebula.
When I have test method

def '[Gradle #params.sGradleVersion ,layout: #params.sPluginToApply task: #params.sTaskToRun] properties in paths'(Parameters.ParametersHolder params)

spock generates test names as

[Gradle 2.4, layout: 'java', task: test] properties in path

but nebula generates its directories for each test as

-Gradle-params-sGradleVersion-layout-params-sPluginToApply-task-params-sTaskToRun-properties-in-paths_5

so it is not clear to distinguish which directory matches to which test.
It is possible to generate directory name based on actual parameters values (as spock generates test name)?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.