robolectric/robolectric-gradle-plugin

"Could not normalize path for file" error occurs on Windows when $testRunTask.classpath.asPath is called

changecong opened this issue · 9 comments

I am using the plugin version 0.13.+ on my project.

The plugin works properly on a Linux machine, however, while running gradle clean testDebug on Windows, I saw the following failure reported.

:leftnav:testDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':leftnav:testDebug'.
> Could not normalize path for file '<a-list-of-Android-SDK-jar-files>'

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':leftnav:testDebug'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
        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:305)
        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:29)
        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:80)
        at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
        at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
        at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:51)
        at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:171)
        at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:237)
        at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:210)
        at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35)
        at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
        at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:206)
        at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
        at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
        at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
        at org.gradle.launcher.Main.doAction(Main.java:33)
        at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
        at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
        at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
        at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
Caused by: org.gradle.api.UncheckedIOException: Could not normalize path for file '<a-list-of-Android-jar-files>'.
        at org.gradle.api.internal.file.AbstractFileResolver.normalise(AbstractFileResolver.java:138)
        at org.gradle.api.internal.file.AbstractFileResolver.resolve(AbstractFileResolver.java:79)
        at org.gradle.api.internal.file.AbstractFileResolver.resolve(AbstractFileResolver.java:60)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext$FileCollectionConverter.convertInto(DefaultFileCollectionResolveContext.java:173)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.doResolve(DefaultFileCollectionResolveContext.java:134)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.resolveAsFileCollections(DefaultFileCollectionResolveContext.java:82)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext$FileCollectionConverter.convertInto(DefaultFileCollectionResolveContext.java:157)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.doResolve(DefaultFileCollectionResolveContext.java:98)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.resolveAsFileCollections(DefaultFileCollectionResolveContext.java:82)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext$FileCollectionConverter.convertInto(DefaultFileCollectionResolveContext.java:157)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.doResolve(DefaultFileCollectionResolveContext.java:98)
        at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.resolveAsFileCollections(DefaultFileCollectionResolveContext.java:82)
        at org.gradle.api.internal.file.CompositeFileCollection.getSourceCollections(CompositeFileCollection.java:144)
        at org.gradle.api.internal.file.CompositeFileCollection.getFiles(CompositeFileCollection.java:38)
        at org.gradle.api.internal.file.AbstractFileCollection.getAsPath(AbstractFileCollection.java:64)
        at org.robolectric.gradle.RobolectricPlugin$_apply_closure1_closure4.doCall(RobolectricPlugin.groovy:131)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:548)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:529)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
        ... 44 more
Caused by: java.io.IOException: The filename, directory name, or volume label syntax is incorrect
        at org.gradle.api.internal.file.AbstractFileResolver.normalise(AbstractFileResolver.java:94)
        ... 63 more

I've tried to switch to 0.14.+, the issue was still reproduced on Windows.

According to the log, I find the exception is thrown when the code logging the classpath from this line
https://github.com/robolectric/robolectric-gradle-plugin/blob/master/src/main/groovy/org/robolectric/gradle/RobolectricPlugin.groovy#L154

After commenting the log code, the plugin works well on Windows.

Could anyone please tell me if there is a plan to fix this issue? Thanks.

I realized that after commenting the log code, the plugin only works when there is no a test case running.

Once there is a test, the "Could not normalize path for file" error occurs again, and the stacktrace is different with the above one. Thus I am wondering if some other code, which executed when running test, are broken as well.

What is the root folder of your Android/Gradle project? The plugin seems to work fine in my VM…

I am also able to reproduce this.
This is happening for me when the compileSdkVersion for the android project is Google APIs:21.

Works fine if the compileSdkVersion is 21

@ChristianBecker
Here is the path of my project: 'C:\Tablets\workspaces', some of my team members are using Windows, and I think they are using different paths, and we all have the same problem.

@Pratyul
I am a little confused, were you able to reproduce the issue or not? Thanks.

Yes I am able to reproduce this.
Works fine for all the projects which are compiled using SDK 21.
But for the project which is compiled using Google APIs, it gives the same error.

Thanks for confirming. Any clue about why this issue occurs?

We are developing an app using Amazon SDK, per this page: https://developer.amazon.com/public/resources/development-tools/ide-tools/tech-docs/01-setting-up-your-development-environment, it seems like we have to configure the compileSdkVersion in this format:

compileSdkVersion = "Amazon.com:Amazon Fire Phone SDK Addon:17"
erd commented

The issue with $testRunTask.classpath.asPath should be fixed as we rely on the unit test support added in version 1.1.0 of the Android Gradle plugin to build and run the tests. Please re-open if I am mistaken.

It looks like a fix was committed for this, but I can't seem to find it in a release, I'm assuming the fix was dropped because it's not needed for the latest version of robolectic? We actually logged a gradle bug for this:

So, instead of patching robolectic, we resolved it by patching gradle (we can't move to the new version of robolectric yet). If we fixed the robolectic plugin the issue would just manifest itself elsewhere later...

Anyway, it sounds like this isn't an issue anymore, but in the event that it is later, maybe info will be helpful.