0

Renamed from: LocationAwareException - org.gradle.tooling.ResultHandler receiving error notifications yet test process is working

I am using the Gradle tooling API to kick off tests via a Java Spring Boot service. I am using ScheduledFutures with the Spring Framework ThreadPoolTaskScheduler to queue up tests and run X of them at a time in a Runnable class. Everything seems to be working nicely.

Basically in my Runnable class I do the following:

ProjectConnection connection = GradleConnector.newConnector()
                .forProjectDirectory(new File(workingDir))
                .connect();
...

TestLauncher tl = connection.newTestLauncher();

...

tl.withJvmTestClasses(testClass);

...

TestResultHandler handler = new TestResultHandler();

tl.run(handler);

...

connection.close();

My TestResultHandler just dumps out info in onFailure:

import org.gradle.tooling.GradleConnectionException;
import org.gradle.tooling.ResultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestResultHandler implements ResultHandler<Object> {

    private static final Logger logger = LoggerFactory.getLogger(TestResultHandler.class);

    @Override
    public void onFailure(GradleConnectionException e) {
        logger.info("toString:");
        logger.info(e.toString());
        logger.info("getCause:");
        logger.info(e.getCause().toString());
        
        logger.info("getStackTrace:");
        for (StackTraceElement elem : e.getStackTrace())
            logger.info(elem.toString());

    }
}

My tests definitely appear to be working and I am collecting the results, but I seeing stuff like this from the TestResultHandler:

toString:
org.gradle.tooling.BuildException: Could not execute tests using connection to Gradle distribution 'https://services.gradle.org/distributions/gradle-6.8-bin.zip'.

getCause:
org.gradle.internal.exceptions.LocationAwareException: Execution failed for task ':test'.


getStackTrace:
org.gradle.tooling.internal.consumer.ExceptionTransformer.transform(ExceptionTransformer.java:51)
org.gradle.tooling.internal.consumer.ExceptionTransformer.transform(ExceptionTransformer.java:29)
org.gradle.tooling.internal.consumer.ResultHandlerAdapter.onFailure(ResultHandlerAdapter.java:43)
org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:69)
org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
java.lang.Thread.run(Thread.java:748)

Does anyone know what this means and if I should be concerned?

EDIT: Here is a sample output frome.printStackTrace(). Thanks, @ToYonos

Caused by: org.gradle.api.GradleException: Could not write XML test results for us.xxx.yyy.MiscTest to file /home/gradle/src/build/test-results/test/20210218-15_48_20_126/TEST-us.xxx.yyy.MiscTest.xml.
    at org.gradle.api.internal.tasks.testing.junit.result.Binary2JUnitXmlReportGenerator$JUnitXmlReportFileGenerator.run(Binary2JUnitXmlReportGenerator.java:125)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$QueueWorker.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.runOperation(DefaultBuildOperationQueue.java:241)
    at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.doRunBatch(DefaultBuildOperationQueue.java:222)
    at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.lambda$runBatch$0(DefaultBuildOperationQueue.java:212)
    at org.gradle.internal.resources.AbstractResourceLockRegistry.whileDisallowingLockChanges(AbstractResourceLockRegistry.java:70)
    at org.gradle.internal.work.DefaultWorkerLeaseService.whileDisallowingProjectLockChanges(DefaultWorkerLeaseService.java:185)
    at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.lambda$runBatch$1(DefaultBuildOperationQueue.java:212)
    at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:213)
    at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.runBatch(DefaultBuildOperationQueue.java:200)
    at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.run(DefaultBuildOperationQueue.java:172)
    ... 3 more
Caused by: org.gradle.api.UncheckedIOException: java.io.EOFException
    at org.gradle.api.internal.tasks.testing.junit.result.TestOutputStore$Reader.doRead(TestOutputStore.java:389)
    at org.gradle.api.internal.tasks.testing.junit.result.TestOutputStore$Reader.writeAllOutput(TestOutputStore.java:314)
    at org.gradle.api.internal.tasks.testing.junit.result.InMemoryTestResultsProvider$3.execute(InMemoryTestResultsProvider.java:61)
    at org.gradle.api.internal.tasks.testing.junit.result.InMemoryTestResultsProvider$3.execute(InMemoryTestResultsProvider.java:58)
    at org.gradle.api.internal.tasks.testing.junit.result.TestOutputStoreBackedResultsProvider.withReader(TestOutputStoreBackedResultsProvider.java:36)
    at org.gradle.api.internal.tasks.testing.junit.result.InMemoryTestResultsProvider.writeAllOutput(InMemoryTestResultsProvider.java:58)
    at org.gradle.api.internal.tasks.testing.junit.result.JUnitXmlResultWriter.writeOutputs(JUnitXmlResultWriter.java:94)
    at org.gradle.api.internal.tasks.testing.junit.result.JUnitXmlResultWriter.write(JUnitXmlResultWriter.java:79)
    at org.gradle.api.internal.tasks.testing.junit.result.Binary2JUnitXmlReportGenerator$JUnitXmlReportFileGenerator.run(Binary2JUnitXmlReportGenerator.java:122)
    ... 17 more
Caused by: java.io.EOFException
    at org.gradle.internal.serialize.kryo.KryoBackedDecoder.maybeEndOfStream(KryoBackedDecoder.java:74)
    at org.gradle.internal.serialize.kryo.KryoBackedDecoder.readBoolean(KryoBackedDecoder.java:138)
    at org.gradle.api.internal.tasks.testing.junit.result.TestOutputStore$Reader.doRead(TestOutputStore.java:350)
    ... 25 more
Caused by: com.esotericsoftware.kryo.KryoException: Buffer underflow.
    at com.esotericsoftware.kryo.io.Input.require(Input.java:181)
    at com.esotericsoftware.kryo.io.Input.readBoolean(Input.java:783)
    at org.gradle.internal.serialize.kryo.KryoBackedDecoder.readBoolean(KryoBackedDecoder.java:136)
    ... 26 more

This is actually a bit truncated. It was too large to include it all, but I think the most important parts are here.

EDIT 2:

Ran out of room here... continued in response 1 which is not really a question response.

chrismead
  • 2,163
  • 3
  • 24
  • 36
  • 1
    for debug sake, n the `onFailure`method, could you add a `e.printStackTrace()` in order to have a better view of the issue ? – ToYonos Feb 16 '21 at 11:25
  • Sure. I will add that. I think it will show the same thing as e.getStackTrace(), though. – chrismead Feb 18 '21 at 15:14
  • Looks like something in com.esotericsoftware.kryo is not thread safe https://stackoverflow.com/questions/24484022/kryo-deserialization-fails-with-kryoexception-buffer-underflow Going to turn off those reports and see if the issue goes away – chrismead Feb 18 '21 at 17:37
  • 1
    Disabling the HTML and XML reports fixed it. I get my results from class that implements org.junit.platform.launcher.TestExecutionListener, so no loss of functionality – chrismead Feb 18 '21 at 18:40
  • 1
    The way you logged the issue was not enough because it missed the causality tree. `e.printStackTrace()` is the best way to have a full picture of the issue. – ToYonos Feb 18 '21 at 23:04
  • 1
    The path `/home/gradle/src/build/test-results/test/20210218-15_48_20_126/TEST-us.xxx.yyy.MiscTest.xml` looks wrong to me. I.e. `src/build` does look wrong. Does it even exists and is it the right place for testresults? – Tobias Otto Feb 22 '21 at 09:23
  • Please see my answer, @TobiasOtto – chrismead Feb 22 '21 at 17:20

1 Answers1

0

Good eyes, @TobiasOtto. That was a custom directory. I was creating it like this:

    def now = new Date()
    def timestamp = now.format("yyyyMMdd-HH_mm_ss_SSS", TimeZone.getTimeZone('UTC'))
    reports.junitXml.destination = file("$buildDir/test-results/test/$timestamp")
    reports.html.destination = file("$testReportDir/test/$timestamp")

I am, in fact, still hitting an error and was thinking of trying the same trick with the test-results/test/binary directory

I am out of room in my question, but wanted to add another stack trace:

org.gradle.tooling.TestExecutionException: Could not execute tests using connection to Gradle distribution 'https://services.gradle.org/distributions/gradle-6.8-bin.zip'.
    at org.gradle.tooling.internal.consumer.ExceptionTransformer.transform(ExceptionTransformer.java:49)
    at org.gradle.tooling.internal.consumer.ExceptionTransformer.transform(ExceptionTransformer.java:29)
    at org.gradle.tooling.internal.consumer.ResultHandlerAdapter.onFailure(ResultHandlerAdapter.java:43)
    at org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:69)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.gradle.api.tasks.testing.TestExecutionException: Test failed.
    Failed tests:
        Test UnknownClass#executionError (Task: :test)
    at org.gradle.tooling.internal.provider.runner.TestExecutionResultEvaluator.evaluate(TestExecutionResultEvaluator.java:82)
    at org.gradle.tooling.internal.provider.runner.TestExecutionRequestActionRunner.run(TestExecutionRequestActionRunner.java:58)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:63)
    at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
    at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:77)
    at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
    at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.lambda$execute$0(InProcessBuildActionExecuter.java:54)
    at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:86)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:53)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:29)
    at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.lambda$execute$0(BuildTreeScopeLifecycleBuildActionExecuter.java:33)
    at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:49)
    at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:32)
    at org.gradle.launcher.exec.BuildTreeScopeLifecycleBuildActionExecuter.execute(BuildTreeScopeLifecycleBuildActionExecuter.java:27)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:104)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:55)
    at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:64)
    at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:37)
    at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.lambda$execute$0(SessionScopeLifecycleBuildActionExecuter.java:54)
    at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:67)
    at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:50)
    at org.gradle.tooling.internal.provider.SessionScopeLifecycleBuildActionExecuter.execute(SessionScopeLifecycleBuildActionExecuter.java:36)
    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.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
    at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
    at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
    at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
    at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
    at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
    ... 6 more

I thought the issue was resolved but it appears to not be 100% there.

I think that the complete fix is as follows... still testing but will update once I have checked a bunch of times:

test {

    reports {
        junitXml.enabled = false
        html.enabled = false
    }

    def now = new Date()
    def timestamp = now.format("yyyyMMdd-HH_mm_ss_SSS", TimeZone.getTimeZone('UTC'))
    binaryResultsDirectory = file("$testReportDir/test/$timestamp")
}

chrismead
  • 2,163
  • 3
  • 24
  • 36