Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Test events were not received" in Android Studio Artic Fox #83

Closed
gmerinojimenez opened this issue Sep 2, 2021 · 32 comments · Fixed by #92, #101 or #117
Closed

"Test events were not received" in Android Studio Artic Fox #83

gmerinojimenez opened this issue Sep 2, 2021 · 32 comments · Fixed by #92, #101 or #117

Comments

@gmerinojimenez
Copy link

gmerinojimenez commented Sep 2, 2021

After migrating to Android Studio Artic Fox, when running unit tests from the IDE, it says "Test events were not received"

image

Here is the output:

Executing tasks: [:app:cleanTestDebugUnitTest, :app:testDebugUnitTest] in project /Users/gmerino/Workspace/personal/TestsInRemote


> Configure project :
Here's Mirakle 1.4.3. All tasks will be executed on arc-prod-1.tuenti.io.
> Task :uploadToRemote
> Task :executeOnRemote
> Task :app:cleanTestDebugUnitTest
> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:generateDebugResValues UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:compileDebugKotlin
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:bundleDebugClasses UP-TO-DATE
> Task :app:compileDebugUnitTestKotlin
> Task :app:preDebugUnitTestBuild UP-TO-DATE
> Task :app:javaPreCompileDebugUnitTest UP-TO-DATE
> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE
> Task :app:processDebugJavaRes NO-SOURCE
> Task :app:processDebugUnitTestJavaRes NO-SOURCE
> Task :app:testDebugUnitTest
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/7.0.2/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 2s
18 actionable tasks: 4 executed, 14 up-to-date
> Task :downloadInParallel
> Task :downloadFromRemote
> Task :mirakle
Total time : 5.592 secs
Task uploadToRemote took : 0.316 secs
Task executeOnRemote took : 3.027 secs
Task downloadFromRemote took : 0.393 secs
5 actionable tasks: 5 executed
10:06:51: Tasks execution finished ':app:cleanTestDebugUnitTest :app:testDebugUnitTest --tests "com.gmerino.testsinremote.ExampleUnitTest"'.

I've tried with different versions of Gradle and also use Junit4 & Junit5, but I wasn't able to find a workaround

Steps to reproduce
Create an empty project in Android Studio, it will create a class called ExampleUnitTest. Try executing that test when mirakle is configured.

IntelliJ
I've also reproduced it in IntelliJ IDEA 2021.2.1 with the same STRs

@Adambl4
Copy link
Owner

Adambl4 commented Sep 2, 2021

Hey, thanks for the clear report.
Could you try 1.5.0-RC-1 and let me know does it work

 classpath 'io.github.adambl4:mirakle:1.5.0-RC-1'

@gmerinojimenez
Copy link
Author

Hi @Adambl4, thanks for the answer, tested and still the same.

BTW, my mirakle setup is like this:

initscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'io.github.adambl4:mirakle:1.5.0-RC-1'
    }
}

apply plugin: Mirakle

rootProject {
    mirakle {
        host 'arc-prod-1.tuenti.io'
        rsyncToRemoteArgs += ["-zPq", "--no-inc-recursive", "--info=progress2", "--exclude='.git'", "--copy-links"]
        rsyncFromRemoteArgs += ["-zPq", "--no-inc-recursive", "--info=progress2", "--exclude='.git'",  "--keep-dirlinks"]
        downloadInParallel true
        downloadInterval 2000
    }
}

@Adambl4
Copy link
Owner

Adambl4 commented Sep 2, 2021

Add this line to mirakle_init script and send me the output.

println("Gradle start params = " + gradle.startParameter)

rootProject {
    mirakle {
         ....
    }
}

@gmerinojimenez
Copy link
Author

Sure, this is the output:

Gradle start params = StartParameter{taskRequests=[DefaultTaskExecutionRequest{args=[mirakle],projectPath='null'}], excludedTaskNames=[], currentDir=/Users/gmerino/Workspace/personal/TestsInRemote, projectProperties={android.injected.attribution.file.location=/Users/gmerino/Workspace/personal/TestsInRemote/.gradle, android.injected.invoked.from.ide=true, android.injected.studio.version=2021.1.1 Canary 10}, systemPropertiesArgs={idea.active=true, idea.version=2021.1}, gradleUserHomeDir=/Users/gmerino/.gradle, gradleHome=/Users/gmerino/.gradle/wrapper/dists/gradle-7.0.2-bin/857tjihv64xamwrf0h14cai3r/gradle-7.0.2, logLevel=LIFECYCLE, showStacktrace=INTERNAL_EXCEPTIONS, buildFile=/Users/gmerino/Workspace/personal/TestsInRemote/mirakle_build_file_stub, initScripts=[/private/var/folders/kl/kdf2gp8s0c76qqq9bb39mszr0000gp/T/ijmapper.gradle, /private/var/folders/kl/kdf2gp8s0c76qqq9bb39mszr0000gp/T/ijresolvers1.gradle, /private/var/folders/kl/kdf2gp8s0c76qqq9bb39mszr0000gp/T/ijtestinit4.gradle], dryRun=false, rerunTasks=false, offline=false, refreshDependencies=false, parallelProjectExecution=false, configureOnDemand=false, maxWorkerCount=8, buildCacheEnabled=false, writeDependencyLocks=false, verificationMode=STRICT, refreshKeys=false}

@Adambl4
Copy link
Owner

Adambl4 commented Sep 2, 2021

Okay. Could you also add this to mirake config and send me the output of upload and download tasks.

rsyncToRemoteArgs += ["-i", "-c"]
rsyncFromRemoteArgs += ["-i", "-c"]

@gmerinojimenez
Copy link
Author

This is the full output now:

Executing tasks: [:app:cleanTestDebugUnitTest, :app:testDebugUnitTest] in project /Users/gmerino/Workspace/personal/TestsInRemote

Gradle start params = StartParameter{taskRequests=[DefaultTaskExecutionRequest{args=[mirakle],projectPath='null'}], excludedTaskNames=[], currentDir=/Users/gmerino/Workspace/personal/TestsInRemote, projectProperties={android.injected.attribution.file.location=/Users/gmerino/Workspace/personal/TestsInRemote/.gradle, android.injected.invoked.from.ide=true, android.injected.studio.version=2021.1.1 Canary 10}, systemPropertiesArgs={idea.active=true, idea.version=2021.1}, gradleUserHomeDir=/Users/gmerino/.gradle, gradleHome=/Users/gmerino/.gradle/wrapper/dists/gradle-7.0.2-bin/857tjihv64xamwrf0h14cai3r/gradle-7.0.2, logLevel=LIFECYCLE, showStacktrace=INTERNAL_EXCEPTIONS, buildFile=/Users/gmerino/Workspace/personal/TestsInRemote/mirakle_build_file_stub, initScripts=[/private/var/folders/kl/kdf2gp8s0c76qqq9bb39mszr0000gp/T/ijmapper.gradle, /private/var/folders/kl/kdf2gp8s0c76qqq9bb39mszr0000gp/T/ijresolvers1.gradle, /private/var/folders/kl/kdf2gp8s0c76qqq9bb39mszr0000gp/T/ijtestinit4.gradle], dryRun=false, rerunTasks=false, offline=false, refreshDependencies=false, parallelProjectExecution=false, configureOnDemand=false, maxWorkerCount=8, buildCacheEnabled=false, writeDependencyLocks=false, verificationMode=STRICT, refreshKeys=false}
> Configure project :
Here's Mirakle 1.5.0-RC-1. All tasks will be executed on arc-prod-1.tuenti.io.
> Task :uploadToRemote
> Task :executeOnRemote
<ijLog><event type='reportLocation' testReport='/Users/gmerino/Workspace/personal/TestsInRemote/app/build/reports/tests/testDebugUnitTest/index.html' /></ijLog>
> Task :app:cleanTestDebugUnitTest
> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:generateDebugResValues UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:bundleDebugClasses UP-TO-DATE
> Task :app:compileDebugUnitTestKotlin UP-TO-DATE
> Task :app:preDebugUnitTestBuild UP-TO-DATE
> Task :app:javaPreCompileDebugUnitTest UP-TO-DATE
> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE
> Task :app:processDebugJavaRes NO-SOURCE
> Task :app:processDebugUnitTestJavaRes NO-SOURCE
> Task :app:testDebugUnitTest
<ijLog><event type='beforeSuite'><ijLogEol/>  <test id=':app:testDebugUnitTest' parentId=''><ijLogEol/>    <descriptor name='Gradle Test Run :app:testDebugUnitTest' className='' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeSuite'><ijLogEol/>  <test id='16.1' parentId=':app:testDebugUnitTest'><ijLogEol/>    <descriptor name='Gradle Test Executor 16' className='' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='16.3' parentId='16.2'><ijLogEol/>    <descriptor name='addition_isCorrect()' className='com.gmerino.testsinremote.ExampleUnitTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='afterSuite'><ijLogEol/>  <test id='16.2' parentId='16.1'><ijLogEol/>    <descriptor name='ExampleUnitTest' className='com.gmerino.testsinremote.ExampleUnitTest' /><ijLogEol/>    <result resultType='SUCCESS' startTime='1630587533337' endTime='1630587533359'><ijLogEol/>      <failureType>error</failureType><ijLogEol/>    </result><ijLogEol/>  </test><ijLogEol/></event></ijLog>
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/7.0.2/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 1s
18 actionable tasks: 2 executed, 16 up-to-date
> Task :downloadInParallel
> Task :downloadFromRemote
> Task :mirakle
Total time : 3.076 secs
Task uploadToRemote took : 0.312 secs
Task executeOnRemote took : 1.821 secs
Task downloadFromRemote took : 0.362 secs
5 actionable tasks: 5 executed

Build Analyzer results available
14:58:54: Tasks execution finished ':app:cleanTestDebugUnitTest :app:testDebugUnitTest --tests "com.gmerino.testsinremote.ExampleUnitTest"'.

@Adambl4
Copy link
Owner

Adambl4 commented Sep 2, 2021

I'm testing on the same AS version and it works. Let's try to synchronize our env.

  1. Update Gradle to 7.2
  2. Disable downloadInParallel
  3. Try to run the same test 5 times in sequence.

Could you also do the following:

  1. ssh to remote machine
  2. cd to your project directory
  3. ls that there is mirakle_init_scripts folder with 3 files (ijmapper.gradle, ijresolvers1.gradle, ijtestinit4.gradle) in root of project dir and check they are all not empty (cat ijmapper.gradle)

@gmerinojimenez
Copy link
Author

Ok, done,

this is my mirakle script now:

initscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'io.github.adambl4:mirakle:1.5.0-RC-1'
    }
}

apply plugin: Mirakle
println("Gradle start params = " + gradle.startParameter)

rootProject {
    mirakle {
        host 'arc-prod-1.tuenti.io'
        rsyncToRemoteArgs += ["-zPq", "--no-inc-recursive", "--info=progress2", "--exclude='.git'", "--exclude='.gradle'", "--copy-links"]
        rsyncFromRemoteArgs += ["-zPq", "--no-inc-recursive", "--info=progress2", "--exclude='.git'", "--exclude='.gradle'", "--keep-dirlinks"]
	rsyncToRemoteArgs += ["-i", "-c"]
    }
}

and the three files were there, this is what they have:

[TUENTI] [gmerino@arc-prod-1 ~/mirakle/TestsInRemote/mirakle_init_scripts]$ cat ijmapper.gradle
if(!ext.has('mapPath')) ext.mapPath = { path -> path }
[TUENTI] [gmerino@arc-prod-1 ~/mirakle/TestsInRemote/mirakle_init_scripts]$ cat ijresolvers1.gradle
//-- Generated by org.jetbrains.kotlin.idea.gradle.testing.KotlinTestTasksResolver
gradle.taskGraph.whenReady { taskGraph ->
    taskGraph.allTasks.each { task ->
        def taskSuperClass = task.class
        while (taskSuperClass != Object.class) {
            if (taskSuperClass.canonicalName == "org.jetbrains.kotlin.gradle.tasks.KotlinTest") {
                try {
                    KotlinMppTestLogger.logTestReportLocation(task.reports?.html?.entryPoint?.path)
                    KotlinMppTestLogger.configureTestEventLogging(task)
                    task.testLogging.showStandardStreams = false
                }
                catch (all) {
                    logger.error("", all)
                }
                return
            } else {
                taskSuperClass = taskSuperClass.superclass
            }
        }
    }
}
//
//-- Generated by org.jetbrains.kotlin.idea.gradle.testing.KotlinTestTasksResolver
import groovy.xml.MarkupBuilder
import org.gradle.api.internal.tasks.testing.TestDescriptorInternal

class KotlinMppTestLogger {
    static def configureTestEventLogging(def task) {
        task.beforeSuite { descriptor -> logTestEvent("beforeSuite", descriptor, null, null) }
        task.afterSuite { descriptor, result -> logTestEvent("afterSuite", descriptor, null, result) }

        task.beforeTest { descriptor -> logTestEvent("beforeTest", descriptor, null, null) }
        task.onOutput { descriptor, event -> logTestEvent("onOutput", descriptor, event, null) }
        task.afterTest { descriptor, result -> logTestEvent("afterTest", descriptor, null, result) }
    }

    static def logTestEvent(testEventType, TestDescriptorInternal testDescriptor, testEvent, testResult) {
        def writer = new StringWriter()
        def xml = new MarkupBuilder(writer)
        xml.event(type: testEventType) {
            test(id: testDescriptor.id, parentId: testDescriptor.parent?.id ?: '') {
                if (testDescriptor) {
                    descriptor(name: testDescriptor.displayName ?: '', className: testDescriptor.className ?: '')
                }
                if (testEvent) {
                    def message = escapeCdata(testEvent.message)
                    event(destination: testEvent.destination) {
                        xml.mkp.yieldUnescaped("$message")
                    }
                }
                if (testResult) {
                    def errorMsg = escapeCdata(testResult.exception?.message ?: '')
                    def stackTrace = escapeCdata(getStackTrace(testResult.exception))
                    result(resultType: testResult.resultType ?: '', startTime: testResult.startTime, endTime: testResult.endTime) {
                        def exception = testResult.exception
                        if (exception?.message?.trim()) xml.mkp.yieldUnescaped("<errorMsg>$errorMsg</errorMsg>")
                        if (exception) xml.mkp.yieldUnescaped("<stackTrace>$stackTrace</stackTrace>")

                        if ('kotlin.AssertionError'.equals(exception?.class?.name) || exception instanceof AssertionError) {
                            failureType('assertionFailed')
                            return
                        }

                        failureType('error')
                    }
                }
            }
        }

        writeLog(writer.toString())
    }

    static String escapeCdata(String s) {
        return "<![CDATA[" + s?.getBytes("UTF-8")?.encodeBase64()?.toString() + "]]>";
    }

    static def wrap(String s) {
        if(!s) return s;
        s.replaceAll("\r\n|\n\r|\n|\r","<ijLogEol/>\n")
    }

    static def writeLog(s) {
        println String.format("\n<ijLog>%s</ijLog>", wrap(s))
    }

    static def logTestReportLocation(def report) {
        if(!report) return
        def writer = new StringWriter()
        def xml = new MarkupBuilder(writer)
        xml.event(type: 'reportLocation', testReport: report)
        writeLog(writer.toString());
    }

    static def logConfigurationError(aTitle, aMessage, boolean openSettings) {
        def writer = new StringWriter()
        def xml = new MarkupBuilder(writer)
        xml.event(type: 'configurationError', openSettings: openSettings) {
            title(aTitle)
            message(aMessage)
        }
        writeLog(writer.toString());
    }

    static def getStackTrace(Throwable t) {
        if(!t) return ''
        StringWriter sw = new StringWriter()
        t.printStackTrace(new PrintWriter(sw))
        sw.toString()
    }
}
//
//-- Generated by org.jetbrains.plugins.gradle.service.project.JavaGradleProjectResolver
import org.gradle.api.Task
import org.gradle.api.tasks.testing.Test

gradle.taskGraph.whenReady { taskGraph ->
  taskGraph.allTasks.each { Task task ->
    if (task instanceof Test) {
      try {
        task.doFirst {
          try {
            def urls = task.classpath.files.findAll {
              it.name == 'idea_rt.jar' || it.name.startsWith('junit')
            }.collect { it.toURI().toURL() }
            def classLoader = Class.forName("org.gradle.launcher.daemon.bootstrap.DaemonMain").getClassLoader()
            if (classLoader instanceof URLClassLoader) {
              for (URL url : urls) {
                classLoader.addURL(url)
              }
            }
            else {
              logger.error("unable to enhance gradle daemon classloader with idea_rt.jar")
            }
          }
          catch (RuntimeException all) {
            logger.error("unable to enhance gradle daemon classloader with idea_rt.jar", all)
          }
        }

        IJTestEventLogger.logTestReportLocation(task.reports?.html?.entryPoint?.path)
        IJTestEventLogger.configureTestEventLogging(task)
        task.testLogging.showStandardStreams = false
      }
      catch (all) {
        logger.error("", all)
      }
    }
  }
}

//
//-- Generated by org.jetbrains.plugins.gradle.service.project.JavaGradleProjectResolver
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.


import groovy.xml.MarkupBuilder
import org.gradle.api.tasks.testing.TestDescriptor
import org.gradle.api.tasks.testing.TestListener
import org.gradle.api.tasks.testing.TestOutputEvent
import org.gradle.api.tasks.testing.TestOutputListener
import org.gradle.api.tasks.testing.TestResult

class IJTestEventLogger {
  static def configureTestEventLogging(def task) {
    task.addTestListener(
      new TestListener() {
        @Override
        void beforeSuite(TestDescriptor descriptor) {
          logTestEvent("beforeSuite", descriptor, null, null)
        }

        @Override
        void afterSuite(TestDescriptor descriptor, TestResult result) {
          logTestEvent("afterSuite", descriptor, null, result)
        }

        @Override
        void beforeTest(TestDescriptor descriptor) {
          logTestEvent("beforeTest", descriptor, null, null)
        }

        @Override
        void afterTest(TestDescriptor descriptor, TestResult result) {
          logTestEvent("afterTest", descriptor, null, result)
        }
      }
    )

    task.addTestOutputListener(new TestOutputListener() {
      @Override
      void onOutput(TestDescriptor descriptor, TestOutputEvent event) {
        logTestEvent("onOutput", descriptor, event, null)
      }
    })
  }

  static def logTestEvent(testEventType, TestDescriptor testDescriptor, testEvent, testResult) {
    def writer = new StringWriter()
    def xml = new MarkupBuilder(writer)
    xml.event(type: testEventType) {
      test(id: testDescriptor.id, parentId: testDescriptor.parent?.id ?: '') {
        if (testDescriptor) {
          descriptor(name: getName(testDescriptor) ?: '', className: testDescriptor.className ?: '')
        }
        if (testEvent) {
          def message = escapeCdata(testEvent.message)
          event(destination: testEvent.destination) {
            xml.mkp.yieldUnescaped("$message")
          }
        }
        if (testResult) {
          def errorMsg = escapeCdata(testResult.exception?.message ?: '')
          def stackTrace = escapeCdata(getStackTrace(testResult.exception))
          result(resultType: testResult.resultType ?: '', startTime: testResult.startTime, endTime: testResult.endTime) {
            def exception = testResult.exception
            if (exception?.message?.trim()) xml.mkp.yieldUnescaped("<errorMsg>$errorMsg</errorMsg>")
            if (exception) xml.mkp.yieldUnescaped("<stackTrace>$stackTrace</stackTrace>")

            if ('junit.framework.ComparisonFailure'.equals(exception?.class?.name) ||
                'org.junit.ComparisonFailure'.equals(exception?.class?.name)) {
              def expected = escapeCdata(exception.fExpected)
              def actual = escapeCdata(exception.fActual)
              failureType('comparison')
              xml.mkp.yieldUnescaped("<expected>$expected</expected>")
              xml.mkp.yieldUnescaped("<actual>$actual</actual>")
              return
            }
            try {
              def fileComparisonFailure
              if ('com.intellij.rt.execution.junit.FileComparisonFailure'.equals(exception?.class?.name)) {
                fileComparisonFailure = exception
              }
              else if ('com.intellij.rt.execution.junit.FileComparisonFailure'.equals(exception?.cause?.class?.name)) {
                fileComparisonFailure = exception.cause
              }

              if (fileComparisonFailure) {
                def expected = escapeCdata(fileComparisonFailure.expected)
                def actual = escapeCdata(fileComparisonFailure.actual)
                def filePath = escapeCdata(fileComparisonFailure.filePath)
                def actualFilePath
                if (exception.hasProperty('actualFilePath')) {
                  actualFilePath = escapeCdata(fileComparisonFailure.actualFilePath)
                }
                failureType('comparison')
                xml.mkp.yieldUnescaped("<expected>$expected</expected>")
                xml.mkp.yieldUnescaped("<actual>$actual</actual>")
                xml.mkp.yieldUnescaped("<filePath>$filePath</filePath>")
                if (actualFilePath) xml.mkp.yieldUnescaped("<actualFilePath>$actualFilePath</actualFilePath>")
                return
              }
            }
            catch (ignore) {
            }
            if ('junit.framework.AssertionFailedError'.equals(exception?.class?.name) || exception instanceof AssertionError) {
              failureType('assertionFailed')
              return
            }
            failureType('error')
          }
        }
      }
    }

    writeLog(writer.toString())
  }

  static String escapeCdata(String s) {
    return "<![CDATA[" + s?.getBytes("UTF-8")?.encodeBase64()?.toString() + "]]>";
  }

  static def wrap(String s) {
    if(!s) return s;
    s.replaceAll("\r\n|\n\r|\n|\r","<ijLogEol/>")
  }

  static def writeLog(s) {
    println String.format("<ijLog>%s</ijLog>", wrap(s))
  }

  static def logTestReportLocation(def report) {
    if(!report) return
    def writer = new StringWriter()
    def xml = new MarkupBuilder(writer)
    xml.event(type: 'reportLocation', testReport: report)
    writeLog(writer.toString());
  }

  static def logConfigurationError(aTitle, aMessage, boolean openSettings) {
    def writer = new StringWriter()
    def xml = new MarkupBuilder(writer)
    xml.event(type: 'configurationError', openSettings: openSettings) {
      title(aTitle)
      message(aMessage)
    }
    writeLog(writer.toString());
  }

  static def getStackTrace(Throwable t) {
    if(!t) return ''
    StringWriter sw = new StringWriter()
    t.printStackTrace(new PrintWriter(sw))
    sw.toString()
  }

  static def getName(TestDescriptor descriptor) {
    try {
      return descriptor.getDisplayName()
    } catch (Throwable ignore) {
      return descriptor.getName()
    }
  }
}
//
//-- Generated by com.android.tools.utp.GradleAndroidProjectResolverExtension
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * 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.
 */

import java.lang.reflect.Proxy

/**
 * An action to attach a listener to DeviceProviderInstrumentTestTasks for communicating
 * instrumentation test results between AGP and AS.
 */
class SetupUtpTestResultListenerAction implements Action<TaskExecutionGraph> {

  @Override
  void execute(TaskExecutionGraph taskGraph) {
    final String ENABLE_UTP_TEST_REPORT_PROPERTY = "com.android.tools.utp.GradleAndroidProjectResolverExtension.enable"
    final String ON_RESULT_TAG = "UTP_TEST_RESULT_ON_TEST_RESULT_EVENT"

    taskGraph.allTasks.each { task ->
      if (!task.project.hasProperty(ENABLE_UTP_TEST_REPORT_PROPERTY) ||
          !task.project.property(ENABLE_UTP_TEST_REPORT_PROPERTY).toString().toBoolean()) {
        return
      }

      Class<?> testTaskClass
      try {
        testTaskClass = task.class.classLoader.loadClass(
          "com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask")
      } catch (ClassNotFoundException e) {
        return
      }

      if (!testTaskClass.isInstance(task)) {
        return
      }

      Class<?> listenerClass
      try {
        listenerClass = task.class.classLoader.loadClass(
          "com.android.build.gradle.internal.testing.utp.UtpTestResultListener")
      } catch (ClassNotFoundException e) {
        // Project's AGP version is too old and UtpTestResultListener is not available.
        return
      }

      def listener = Proxy.newProxyInstance(
        listenerClass.classLoader,
        [ listenerClass ] as Class<?>[]) { _, method, args ->
        switch(method.name) {
          case "onTestResultEvent":
            def binaryProto = args[0].class.getMethod("toByteArray").invoke(args[0]) as byte[]
            def encodedProto = Base64.getEncoder().encodeToString(binaryProto)
            println("<${ON_RESULT_TAG}>${encodedProto}</${ON_RESULT_TAG}>")
            break
        }
      }

      def setListenerMethod = testTaskClass.getMethod(
        "setUtpTestResultListener", listenerClass)

      setListenerMethod.invoke(task, listener)
    }
  }
}

gradle.taskGraph.whenReady(new SetupUtpTestResultListenerAction())

//
//-- Generated by org.jetbrains.kotlin.idea.configuration.KotlinGradleCoroutineDebugProjectResolver
gradle.taskGraph.whenReady { TaskExecutionGraph taskGraph ->
    taskGraph.allTasks.each { Task task ->
        if (task instanceof Test || task instanceof JavaExec) {
            task.doFirst { Task forkedTask ->
                def kotlinxCoroutinesCoreJar = forkedTask.classpath.find { it.name.startsWith("kotlinx-coroutines-core") }
                if (kotlinxCoroutinesCoreJar) {
                    def results = (kotlinxCoroutinesCoreJar.getName() =~ /kotlinx-coroutines-core(\-jvm)?-(\d[\w\.\-]+)\.jar$/).findAll()
                    if (results) {
                        def version = results.first()[2]
                        def referenceVersion = org.gradle.util.VersionNumber.parse('1.3.7-255')
                        if (org.gradle.util.VersionNumber.parse(version) > referenceVersion) {
                            forkedTask.jvmArgs ("-javaagent:${kotlinxCoroutinesCoreJar?.absolutePath}", "-ea")
                        }
                    }
                }
            }
        }
    }
}
[TUENTI] [gmerino@arc-prod-1 ~/mirakle/TestsInRemote/mirakle_init_scripts]$ cat ijtestinit4.gradle

String[] ijTestIncludes = ['com.gmerino.testsinremote.ExampleUnitTest']

Class abstractTestTaskClass = null
try {
  abstractTestTaskClass = Class.forName("org.gradle.api.tasks.testing.AbstractTestTask")
} catch (ClassNotFoundException ex) {
 // ignore, class not available
}

gradle.taskGraph.whenReady { taskGraph ->
  taskGraph.allTasks.each { Task task ->
    if (task instanceof Test || (abstractTestTaskClass != null && abstractTestTaskClass.isAssignableFrom(task.class))) {
      try {
        task.outputs.upToDateWhen { false }
        String[] strings = ['*']
        if(ijTestIncludes != strings) {
          def filter = task.getFilter()
          filter.setIncludePatterns(new String[0])
          ijTestIncludes.each(){ filter.includeTestsMatching "${it}" }
        }
      }
      catch (all) {
        logger.error("", all)
      }
    }
  }
}

I've tried several times and the result is the same, the tests execute successfully, but seems like Android Studio doesn't get notified and it says that "Test events were not received"

@Adambl4
Copy link
Owner

Adambl4 commented Sep 2, 2021

Hmm, still not clear.
Could you also add this to mirakle_init and send the output

taskGraph.whenReady { taskGraph ->
    if (taskGraph.hasTask(":executeOnRemote")) {
        gradle.rootProject.executeOnRemote.doLast {
            println("============REMOTE GRADLE ARGUMENTS===============")
            println(rootProject.executeOnRemote.args.join("\n"))
            println("============REMOTE GRADLE ARGUMENTS===============")
        }
    }
}

@gmerinojimenez
Copy link
Author

Of course, here you have:

Executing tasks: [:app:cleanTestDebugUnitTest, :app:testDebugUnitTest] in project /Users/gmerino/Workspace/personal/TestsInRemote

Gradle start params = StartParameter{taskRequests=[DefaultTaskExecutionRequest{args=[mirakle],projectPath='null',rootDir='null'}], excludedTaskNames=[], currentDir=/Users/gmerino/Workspace/personal/TestsInRemote, projectProperties={android.injected.attribution.file.location=/Users/gmerino/Workspace/personal/TestsInRemote/.gradle, android.injected.invoked.from.ide=true, android.injected.studio.version=2021.1.1 Canary 10}, systemPropertiesArgs={idea.active=true, idea.version=2021.1}, gradleUserHomeDir=/Users/gmerino/.gradle, gradleHome=/Users/gmerino/.gradle/wrapper/dists/gradle-7.2-bin/2dnblmf4td7x66yl1d74lt32g/gradle-7.2, logLevel=LIFECYCLE, showStacktrace=INTERNAL_EXCEPTIONS, buildFile=/Users/gmerino/Workspace/personal/TestsInRemote/mirakle_build_file_stub, initScripts=[/private/var/folders/kl/kdf2gp8s0c76qqq9bb39mszr0000gp/T/ijmapper.gradle, /private/var/folders/kl/kdf2gp8s0c76qqq9bb39mszr0000gp/T/ijresolvers1.gradle, /private/var/folders/kl/kdf2gp8s0c76qqq9bb39mszr0000gp/T/ijtestinit4.gradle], dryRun=false, rerunTasks=false, offline=false, refreshDependencies=false, parallelProjectExecution=false, configureOnDemand=false, maxWorkerCount=8, buildCacheEnabled=false, writeDependencyLocks=false, verificationMode=STRICT, refreshKeys=false}
> Configure project :
Here's Mirakle 1.5.0-RC-1. All tasks will be executed on arc-prod-1.tuenti.io.
> Task :uploadToRemote
> Task :executeOnRemote
<ijLog><event type='reportLocation' testReport='/Users/gmerino/Workspace/personal/TestsInRemote/app/build/reports/tests/testDebugUnitTest/index.html' /></ijLog>
> Task :app:cleanTestDebugUnitTest
> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:checkDebugAarMetadata UP-TO-DATE
> Task :app:generateDebugResValues UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugMainManifest UP-TO-DATE
> Task :app:processDebugManifest UP-TO-DATE
> Task :app:processDebugManifestForPackage UP-TO-DATE
> Task :app:processDebugResources UP-TO-DATE
> Task :app:compileDebugKotlin UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:bundleDebugClasses UP-TO-DATE
> Task :app:compileDebugUnitTestKotlin UP-TO-DATE
> Task :app:preDebugUnitTestBuild UP-TO-DATE
> Task :app:javaPreCompileDebugUnitTest UP-TO-DATE
> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE
> Task :app:processDebugJavaRes NO-SOURCE
> Task :app:processDebugUnitTestJavaRes NO-SOURCE
> Task :app:testDebugUnitTest
<ijLog><event type='beforeSuite'><ijLogEol/>  <test id=':app:testDebugUnitTest' parentId=''><ijLogEol/>    <descriptor name='Gradle Test Run :app:testDebugUnitTest' className='' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeSuite'><ijLogEol/>  <test id='14.1' parentId=':app:testDebugUnitTest'><ijLogEol/>    <descriptor name='Gradle Test Executor 14' className='' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='14.3' parentId='14.2'><ijLogEol/>    <descriptor name='addition_isCorrect()' className='com.gmerino.testsinremote.ExampleUnitTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 1s
18 actionable tasks: 2 executed, 16 up-to-date
============REMOTE GRADLE ARGUMENTS===============
arc-prod-1.tuenti.io
~/mirakle/"TestsInRemote"/gradlew
-Pmirakle.build.on.remote=true
-p ~/mirakle/"TestsInRemote"
:app:cleanTestDebugUnitTest
:app:testDebugUnitTest
--continue
--project-prop
"android.injected.invoked.from.ide=true"
--project-prop
"android.injected.studio.version=2021.1.1 Canary 10"
--system-prop
"idea.active=true"
--system-prop
"idea.version=2021.1"
--init-script mirakle_init_scripts/ijtestinit4.gradle
--init-script mirakle_init_scripts/ijresolvers1.gradle
--init-script mirakle_init_scripts/ijmapper.gradle
============REMOTE GRADLE ARGUMENTS===============
> Task :downloadFromRemote
> Task :mirakle
Total time : 2.529 secs
Task uploadToRemote took : 0.332 secs
Task executeOnRemote took : 1.864 secs
Task downloadFromRemote took : 0.303 secs
4 actionable tasks: 4 executed

Build Analyzer results available
15:30:55: Tasks execution finished ':app:cleanTestDebugUnitTest :app:testDebugUnitTest --tests "com.gmerino.testsinremote.ExampleUnitTest"'.

@nimeacuerdo
Copy link

Hi, any updates on this?

@gmerinojimenez
Copy link
Author

Thank you very much, @Adambl4

@Adambl4
Copy link
Owner

Adambl4 commented Oct 22, 2021

Guys, could you check does it work for you with io.github.adambl4:mirakle:1.5.0-RC-2

@Adambl4 Adambl4 reopened this Oct 22, 2021
@gmerinojimenez
Copy link
Author

on it

@gmerinojimenez
Copy link
Author

it is working for me :) let me check with more teammates

@gmerinojimenez
Copy link
Author

gmerinojimenez commented Oct 22, 2021

Hmm sorry, I thought it was going well, but checking the logs I'm seeing

> Task :uploadToRemote
> Task :executeOnRemote
FAILURE: Build failed with an exception.
* Where:
Initialization script '/Users/gmerino/Workspace/android-messenger/mirakle_init_scripts/ijresolvers1.gradle' line: 416
* What went wrong:
Could not compile initialization script '/Users/gmerino/Workspace/android-messenger/mirakle_init_scripts/ijresolvers1.gradle'.
> startup failed:
  initialization script '/Users/gmerino/Workspace/android-messenger/mirakle_init_scripts/ijresolvers1.gradle': 416: unable to resolve class com.intellij.openapi.externalSystem.rt.execution.ForkedDebuggerHelper
   @ line 416, column 1.
     import com.intellij.openapi.externalSystem.rt.execution.ForkedDebuggerHelper    
     ^
  
  1 error
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 802ms

does that long ring any bells?

@Adambl4
Copy link
Owner

Adambl4 commented Oct 22, 2021

Could you try the latest Gradle version 7.3-rc-2 or you are already on it?

@gmerinojimenez
Copy link
Author

I've tried with that version, here is the log for a failing test:

> Task :web:testMovistarESDebugUnitTest FAILED
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='4.3' parentId='4.2'><ijLogEol/>    <descriptor name='handler should return not installed app and market urls for given app token' className='com.tuenti.web.bridge.GetAppMetadataTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='afterTest'><ijLogEol
3 tests completed, 2 failed
/>  <test id='4.3' parentId='4.2'><ijLogEol/>    <descriptor name='handler should return not installed app and market urls for given app token' className='com.tuenti.web.bridge.GetAppMetadataTest' /><ijLogEol/>    <result resultType='FAILURE' startTime='1635155570726' endTime='1635155570746'><errorMsg><![CDATA[ZXhwZWN0ZWQ6PFtHRVRfQVBQX01FVEFEQVRBXT4gYnV0IHdhczo8W0VSUk9SXT4=]]></errorMsg><stackTrace><![CDATA[b3JnLmp1bml0LkNvbXBhcmlzb25GYWlsdXJlOiBleHBlY3RlZDo8W0dFVF9BUFBfTUVUQURBVEFdPiBidXQgd2FzOjxbRVJST1JdPgoJYXQgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHMoQXNzZXJ0LmphdmE6MTE1KQoJYXQgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHMoQXNzZXJ0LmphdmE6MTQ0KQoJYXQgY29tLnR1ZW50aS53ZWIuYnJpZGdlLk1lc3NhZ2VIYW5kbGVyc1Rlc3RzS3QuZXF1YWxzVG8oTWVzc2FnZUhhbmRsZXJzVGVzdHMua3Q6NTkpCglhdCBjb20udHVlbnRpLndlYi5icmlkZ2UuTWVzc2FnZUhhbmRsZXJzVGVzdHNLdC5lcXVhbHNUbyRkZWZhdWx0KE1lc3NhZ2VIYW5kbGVyc1Rlc3RzLmt0OjU4KQoJYXQgY29tLnR1ZW50aS53ZWIuYnJpZGdlLkdldEFwcE1ldGFkYXRhVGVzdC52ZXJpZnlSZXNwb25zZShHZXRBcHBNZXRhZGF0YVRlc3Qua3Q6NzApCglhdCBjb20udHVlbnRpLndlYi5icmlkZ2UuR2V0QXBwTWV0YWRhdGFUZXN0LmhhbmRsZXIgc2hvdWxkIHJldHVybiBub3QgaW5zdGFsbGVkIGFwcCBhbmQgbWFya2V0IHVybHMgZm9yIGdpdmVuIGFwcCB0b2tlbihHZXRBcHBNZXRhZGF0YVRlc3Qua3Q6NDUpCglhdCBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZTAoTmF0aXZlIE1ldGhvZCkKCWF0IGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlKE5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5qYXZhOjYyKQoJYXQgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWZsZWN0LkRlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlKERlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuamF2YTo0MykKCWF0IGphdmEuYmFzZS9qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE1ldGhvZC5qYXZhOjU2NikKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLkZyYW1ld29ya01ldGhvZCQxLnJ1blJlZmxlY3RpdmVDYWxsKEZyYW1ld29ya01ldGhvZC5qYXZhOjUwKQoJYXQgb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMubW9kZWwuUmVmbGVjdGl2ZUNhbGxhYmxlLnJ1bihSZWZsZWN0aXZlQ2FsbGFibGUuamF2YToxMikKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLkZyYW1ld29ya01ldGhvZC5pbnZva2VFeHBsb3NpdmVseShGcmFtZXdvcmtNZXRob2QuamF2YTo0NykKCWF0IG9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuSW52b2tlTWV0aG9kLmV2YWx1YXRlKEludm9rZU1ldGhvZC5qYXZhOjE3KQoJYXQgb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3RhdGVtZW50cy5SdW5CZWZvcmVzLmV2YWx1YXRlKFJ1bkJlZm9yZXMuamF2YToyNikKCWF0IG9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuUnVuQWZ0ZXJzLmV2YWx1YXRlKFJ1bkFmdGVycy5qYXZhOjI3KQoJYXQgb3JnLmp1bml0LnJ1bGVzLlRlc3RXYXRjaGVyJDEuZXZhbHVhdGUoVGVzdFdhdGNoZXIuamF2YTo1NSkKCWF0IGNvbS50dWVudGkubWVzc2VuZ2VyLnRlc3QucnVsZXMuc3RhdGVtZW50LlRlc3RUaW1lb3V0U3RhdGVtZW50LmV2YWx1YXRlKFRlc3RUaW1lb3V0U3RhdGVtZW50LmphdmE6NDIpCglhdCBvcmcuanVuaXQucnVsZXMuUnVuUnVsZXMuZXZhbHVhdGUoUnVuUnVsZXMuamF2YToyMCkKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lci5ydW5MZWFmKFBhcmVudFJ1bm5lci5qYXZhOjMyNSkKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLkJsb2NrSlVuaXQ0Q2xhc3NSdW5uZXIucnVuQ2hpbGQoQmxvY2tKVW5pdDRDbGFzc1J1bm5lci5qYXZhOjc4KQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMuQmxvY2tKVW5pdDRDbGFzc1J1bm5lci5ydW5DaGlsZChCbG9ja0pVbml0NENsYXNzUnVubmVyLmphdmE6NTcpCglhdCBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIkMy5ydW4oUGFyZW50UnVubmVyLmphdmE6MjkwKQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDEuc2NoZWR1bGUoUGFyZW50UnVubmVyLmphdmE6NzEpCglhdCBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIucnVuQ2hpbGRyZW4oUGFyZW50UnVubmVyLmphdmE6Mjg4KQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyLmFjY2VzcyQwMDAoUGFyZW50UnVubmVyLmphdmE6NTgpCglhdCBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIkMi5ldmFsdWF0ZShQYXJlbnRSdW5uZXIuamF2YToyNjgpCglhdCBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIucnVuKFBhcmVudFJ1bm5lci5qYXZhOjM2MykKCWF0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3RpbmcuanVuaXQuSlVuaXRUZXN0Q2xhc3NFeGVjdXRvci5ydW5UZXN0Q2xhc3MoSlVuaXRUZXN0Q2xhc3NFeGVjdXRvci5qYXZhOjExMCkKCWF0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3RpbmcuanVuaXQuSlVuaXRUZXN0Q2xhc3NFeGVjdXRvci5leGVjdXRlKEpVbml0VGVzdENsYXNzRXhlY3V0b3IuamF2YTo1OCkKCWF0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3RpbmcuanVuaXQuSlVuaXRUZXN0Q2xhc3NFeGVjdXRvci5leGVjdXRlKEpVbml0VGVzdENsYXNzRXhlY3V0b3IuamF2YTozOCkKCWF0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3RpbmcuanVuaXQuQWJzdHJhY3RKVW5pdFRlc3RDbGFzc1Byb2Nlc3Nvci5wcm9jZXNzVGVzdENsYXNzKEFic3RyYWN0SlVuaXRUZXN0Q2xhc3NQcm9jZXNzb3IuamF2YTo2MikKCWF0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3RpbmcuU3VpdGVUZXN0Q2xhc3NQcm9jZXNzb3IucHJvY2Vzc1Rlc3RDbGFzcyhTdWl0ZVRlc3RDbGFzc1Byb2Nlc3Nvci5qYXZhOjUxKQoJYXQgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5pbnZva2UwKE5hdGl2ZSBNZXRob2QpCglhdCBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZShOYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuamF2YTo2MikKCWF0IGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmbGVjdC5EZWxlZ2F0aW5nTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZShEZWxlZ2F0aW5nTWV0aG9kQWNjZXNzb3JJbXBsLmphdmE6NDMpCglhdCBqYXZhLmJhc2UvamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZShNZXRob2QuamF2YTo1NjYpCglhdCBvcmcuZ3JhZGxlLmludGVybmFsLmRpc3BhdGNoLlJlZmxlY3Rpb25EaXNwYXRjaC5kaXNwYXRjaChSZWZsZWN0aW9uRGlzcGF0Y2guamF2YTozNikKCWF0IG9yZy5ncmFkbGUuaW50ZXJuYWwuZGlzcGF0Y2guUmVmbGVjdGlvbkRpc3BhdGNoLmRpc3BhdGNoKFJlZmxlY3Rpb25EaXNwYXRjaC5qYXZhOjI0KQoJYXQgb3JnLmdyYWRsZS5pbnRlcm5hbC5kaXNwYXRjaC5Db250ZXh0Q2xhc3NMb2FkZXJEaXNwYXRjaC5kaXNwYXRjaChDb250ZXh0Q2xhc3NMb2FkZXJEaXNwYXRjaC5qYXZhOjMzKQoJYXQgb3JnLmdyYWRsZS5pbnRlcm5hbC5kaXNwYXRjaC5Qcm94eURpc3BhdGNoQWRhcHRlciREaXNwYXRjaGluZ0ludm9jYXRpb25IYW5kbGVyLmludm9rZShQcm94eURpc3BhdGNoQWRhcHRlci5qYXZhOjk0KQoJYXQgY29tLnN1bi5wcm94eS4kUHJveHkyLnByb2Nlc3NUZXN0Q2xhc3MoVW5rbm93biBTb3VyY2UpCglhdCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLndvcmtlci5UZXN0V29ya2VyJDIucnVuKFRlc3RXb3JrZXIuamF2YToxNzYpCglhdCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLndvcmtlci5UZXN0V29ya2VyLmV4ZWN1dGVBbmRNYWludGFpblRocmVhZE5hbWUoVGVzdFdvcmtlci5qYXZhOjEyOSkKCWF0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3Rpbmcud29ya2VyLlRlc3RXb3JrZXIuZXhlY3V0ZShUZXN0V29ya2VyLmphdmE6MTAwKQoJYXQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwudGFza3MudGVzdGluZy53b3JrZXIuVGVzdFdvcmtlci5leGVjdXRlKFRlc3RXb3JrZXIuamF2YTo2MCkKCWF0IG9yZy5ncmFkbGUucHJvY2Vzcy5pbnRlcm5hbC53b3JrZXIuY2hpbGQuQWN0aW9uRXhlY3V0aW9uV29ya2VyLmV4ZWN1dGUoQWN0aW9uRXhlY3V0aW9uV29ya2VyLmphdmE6NTYpCglhdCBvcmcuZ3JhZGxlLnByb2Nlc3MuaW50ZXJuYWwud29ya2VyLmNoaWxkLlN5c3RlbUFwcGxpY2F0aW9uQ2xhc3NMb2FkZXJXb3JrZXIuY2FsbChTeXN0ZW1BcHBsaWNhdGlvbkNsYXNzTG9hZGVyV29ya2VyLmphdmE6MTMzKQoJYXQgb3JnLmdyYWRsZS5wcm9jZXNzLmludGVybmFsLndvcmtlci5jaGlsZC5TeXN0ZW1BcHBsaWNhdGlvbkNsYXNzTG9hZGVyV29ya2VyLmNhbGwoU3lzdGVtQXBwbGljYXRpb25DbGFzc0xvYWRlcldvcmtlci5qYXZhOjcxKQoJYXQgd29ya2VyLm9yZy5ncmFkbGUucHJvY2Vzcy5pbnRlcm5hbC53b3JrZXIuR3JhZGxlV29ya2VyTWFpbi5ydW4oR3JhZGxlV29ya2VyTWFpbi5qYXZhOjY5KQoJYXQgd29ya2VyLm9yZy5ncmFkbGUucHJvY2Vzcy5pbnRlcm5hbC53b3JrZXIuR3JhZGxlV29ya2VyTWFpbi5tYWluKEdyYWRsZVdvcmtlck1haW4uamF2YTo3NCkK]]></stackTrace><ijLogEol/>      <failureType>comparison</failureType><expected><![CDATA[R0VUX0FQUF9NRVRBREFUQQ==]]></expected><actual><![CDATA[RVJST1I=]]></actual><ijLogEol/>    </result><ijLogEol/>  </test><ijLogEol/></event></ijLog>
com.tuenti.web.bridge.GetAppMetadataTest > handler should return not installed app and market urls for given app token FAILED
    org.junit.ComparisonFailure at GetAppMetadataTest.kt:70


<ijLog><event type='afterTest'><ijLogEol/>  <test id='4.5' parentId='4.2'><ijLogEol/>    <descriptor name='handler should return installed app and market urls for given app token' className='com.tuenti.web.bridge.GetAppMetadataTest' /><ijLogEol/>    <result resultType='FAILURE' startTime='1635155570746' endTime='1635155570749'><errorMsg><![CDATA[ZXhwZWN0ZWQ6PFtHRVRfQVBQX01FVEFEQVRBXT4gYnV0IHdhczo8W0VSUk9SXT4=]]></errorMsg><stackTrace><![CDATA[b3JnLmp1bml0LkNvbXBhcmlzb25GYWlsdXJlOiBleHBlY3RlZDo8W0dFVF9BUFBfTUVUQURBVEFdPiBidXQgd2FzOjxbRVJST1JdPgoJYXQgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHMoQXNzZXJ0LmphdmE6MTE1KQoJYXQgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHMoQXNzZXJ0LmphdmE6MTQ0KQoJYXQgY29tLnR1ZW50aS53ZWIuYnJpZGdlLk1lc3NhZ2VIYW5kbGVyc1Rlc3RzS3QuZXF1YWxzVG8oTWVzc2FnZUhhbmRsZXJzVGVzdHMua3Q6NTkpCglhdCBjb20udHVlbnRpLndlYi5icmlkZ2UuTWVzc2FnZUhhbmRsZXJzVGVzdHNLdC5lcXVhbHNUbyRkZWZhdWx0KE1lc3NhZ2VIYW5kbGVyc1Rlc3RzLmt0OjU4KQoJYXQgY29tLnR1ZW50aS53ZWIuYnJpZGdlLkdldEFwcE1ldGFkYXRhVGVzdC52ZXJpZnlSZXNwb25zZShHZXRBcHBNZXRhZGF0YVRlc3Qua3Q6NzApCglhdCBjb20udHVlbnRpLndlYi5icmlkZ2UuR2V0QXBwTWV0YWRhdGFUZXN0LmhhbmRsZXIgc2hvdWxkIHJldHVybiBpbnN0YWxsZWQgYXBwIGFuZCBtYXJrZXQgdXJscyBmb3IgZ2l2ZW4gYXBwIHRva2VuKEdldEFwcE1ldGFkYXRhVGVzdC5rdDozNykKCWF0IGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlMChOYXRpdmUgTWV0aG9kKQoJYXQgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5pbnZva2UoTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmphdmE6NjIpCglhdCBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZmxlY3QuRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5pbnZva2UoRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5qYXZhOjQzKQoJYXQgamF2YS5iYXNlL2phdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoTWV0aG9kLmphdmE6NTY2KQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuRnJhbWV3b3JrTWV0aG9kJDEucnVuUmVmbGVjdGl2ZUNhbGwoRnJhbWV3b3JrTWV0aG9kLmphdmE6NTApCglhdCBvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5tb2RlbC5SZWZsZWN0aXZlQ2FsbGFibGUucnVuKFJlZmxlY3RpdmVDYWxsYWJsZS5qYXZhOjEyKQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwuRnJhbWV3b3JrTWV0aG9kLmludm9rZUV4cGxvc2l2ZWx5KEZyYW1ld29ya01ldGhvZC5qYXZhOjQ3KQoJYXQgb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3RhdGVtZW50cy5JbnZva2VNZXRob2QuZXZhbHVhdGUoSW52b2tlTWV0aG9kLmphdmE6MTcpCglhdCBvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5zdGF0ZW1lbnRzLlJ1bkJlZm9yZXMuZXZhbHVhdGUoUnVuQmVmb3Jlcy5qYXZhOjI2KQoJYXQgb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuc3RhdGVtZW50cy5SdW5BZnRlcnMuZXZhbHVhdGUoUnVuQWZ0ZXJzLmphdmE6MjcpCglhdCBvcmcuanVuaXQucnVsZXMuVGVzdFdhdGNoZXIkMS5ldmFsdWF0ZShUZXN0V2F0Y2hlci5qYXZhOjU1KQoJYXQgY29tLnR1ZW50aS5tZXNzZW5nZXIudGVzdC5ydWxlcy5zdGF0ZW1lbnQuVGVzdFRpbWVvdXRTdGF0ZW1lbnQuZXZhbHVhdGUoVGVzdFRpbWVvdXRTdGF0ZW1lbnQuamF2YTo0MikKCWF0IG9yZy5qdW5pdC5ydWxlcy5SdW5SdWxlcy5ldmFsdWF0ZShSdW5SdWxlcy5qYXZhOjIwKQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyLnJ1bkxlYWYoUGFyZW50UnVubmVyLmphdmE6MzI1KQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMuQmxvY2tKVW5pdDRDbGFzc1J1bm5lci5ydW5DaGlsZChCbG9ja0pVbml0NENsYXNzUnVubmVyLmphdmE6NzgpCglhdCBvcmcuanVuaXQucnVubmVycy5CbG9ja0pVbml0NENsYXNzUnVubmVyLnJ1bkNoaWxkKEJsb2NrSlVuaXQ0Q2xhc3NSdW5uZXIuamF2YTo1NykKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lciQzLnJ1bihQYXJlbnRSdW5uZXIuamF2YToyOTApCglhdCBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIkMS5zY2hlZHVsZShQYXJlbnRSdW5uZXIuamF2YTo3MSkKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lci5ydW5DaGlsZHJlbihQYXJlbnRSdW5uZXIuamF2YToyODgpCglhdCBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIuYWNjZXNzJDAwMChQYXJlbnRSdW5uZXIuamF2YTo1OCkKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lciQyLmV2YWx1YXRlKFBhcmVudFJ1bm5lci5qYXZhOjI2OCkKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lci5ydW4oUGFyZW50UnVubmVyLmphdmE6MzYzKQoJYXQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwudGFza3MudGVzdGluZy5qdW5pdC5KVW5pdFRlc3RDbGFzc0V4ZWN1dG9yLnJ1blRlc3RDbGFzcyhKVW5pdFRlc3RDbGFzc0V4ZWN1dG9yLmphdmE6MTEwKQoJYXQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwudGFza3MudGVzdGluZy5qdW5pdC5KVW5pdFRlc3RDbGFzc0V4ZWN1dG9yLmV4ZWN1dGUoSlVuaXRUZXN0Q2xhc3NFeGVjdXRvci5qYXZhOjU4KQoJYXQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwudGFza3MudGVzdGluZy5qdW5pdC5KVW5pdFRlc3RDbGFzc0V4ZWN1dG9yLmV4ZWN1dGUoSlVuaXRUZXN0Q2xhc3NFeGVjdXRvci5qYXZhOjM4KQoJYXQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwudGFza3MudGVzdGluZy5qdW5pdC5BYnN0cmFjdEpVbml0VGVzdENsYXNzUHJvY2Vzc29yLnByb2Nlc3NUZXN0Q2xhc3MoQWJzdHJhY3RKVW5pdFRlc3RDbGFzc1Byb2Nlc3Nvci5qYXZhOjYyKQoJYXQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwudGFza3MudGVzdGluZy5TdWl0ZVRlc3RDbGFzc1Byb2Nlc3Nvci5wcm9jZXNzVGVzdENsYXNzKFN1aXRlVGVzdENsYXNzUHJvY2Vzc29yLmphdmE6NTEpCglhdCBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZTAoTmF0aXZlIE1ldGhvZCkKCWF0IGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlKE5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5qYXZhOjYyKQoJYXQgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWZsZWN0LkRlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlKERlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuamF2YTo0MykKCWF0IGphdmEuYmFzZS9qYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE1ldGhvZC5qYXZhOjU2NikKCWF0IG9yZy5ncmFkbGUuaW50ZXJuYWwuZGlzcGF0Y2guUmVmbGVjdGlvbkRpc3BhdGNoLmRpc3BhdGNoKFJlZmxlY3Rpb25EaXNwYXRjaC5qYXZhOjM2KQoJYXQgb3JnLmdyYWRsZS5pbnRlcm5hbC5kaXNwYXRjaC5SZWZsZWN0aW9uRGlzcGF0Y2guZGlzcGF0Y2goUmVmbGVjdGlvbkRpc3BhdGNoLmphdmE6MjQpCglhdCBvcmcuZ3JhZGxlLmludGVybmFsLmRpc3BhdGNoLkNvbnRleHRDbGFzc0xvYWRlckRpc3BhdGNoLmRpc3BhdGNoKENvbnRleHRDbGFzc0xvYWRlckRpc3BhdGNoLmphdmE6MzMpCglhdCBvcmcuZ3JhZGxlLmludGVybmFsLmRpc3BhdGNoLlByb3h5RGlzcGF0Y2hBZGFwdGVyJERpc3BhdGNoaW5nSW52b2NhdGlvbkhhbmRsZXIuaW52b2tlKFByb3h5RGlzcGF0Y2hBZGFwdGVyLmphdmE6OTQpCglhdCBjb20uc3VuLnByb3h5LiRQcm94eTIucHJvY2Vzc1Rlc3RDbGFzcyhVbmtub3duIFNvdXJjZSkKCWF0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3Rpbmcud29ya2VyLlRlc3RXb3JrZXIkMi5ydW4oVGVzdFdvcmtlci5qYXZhOjE3NikKCWF0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3Rpbmcud29ya2VyLlRlc3RXb3JrZXIuZXhlY3V0ZUFuZE1haW50YWluVGhyZWFkTmFtZShUZXN0V29ya2VyLmphdmE6MTI5KQoJYXQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwudGFza3MudGVzdGluZy53b3JrZXIuVGVzdFdvcmtlci5leGVjdXRlKFRlc3RXb3JrZXIuamF2YToxMDApCglhdCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLndvcmtlci5UZXN0V29ya2VyLmV4ZWN1dGUoVGVzdFdvcmtlci5qYXZhOjYwKQoJYXQgb3JnLmdyYWRsZS5wcm9jZXNzLmludGVybmFsLndvcmtlci5jaGlsZC5BY3Rpb25FeGVjdXRpb25Xb3JrZXIuZXhlY3V0ZShBY3Rpb25FeGVjdXRpb25Xb3JrZXIuamF2YTo1NikKCWF0IG9yZy5ncmFkbGUucHJvY2Vzcy5pbnRlcm5hbC53b3JrZXIuY2hpbGQuU3lzdGVtQXBwbGljYXRpb25DbGFzc0xvYWRlcldvcmtlci5jYWxsKFN5c3RlbUFwcGxpY2F0aW9uQ2xhc3NMb2FkZXJXb3JrZXIuamF2YToxMzMpCglhdCBvcmcuZ3JhZGxlLnByb2Nlc3MuaW50ZXJuYWwud29ya2VyLmNoaWxkLlN5c3RlbUFwcGxpY2F0aW9uQ2xhc3NMb2FkZXJXb3JrZXIuY2FsbChTeXN0ZW1BcHBsaWNhdGlvbkNsYXNzTG9hZGVyV29ya2VyLmphdmE6NzEpCglhdCB3b3JrZXIub3JnLmdyYWRsZS5wcm9jZXNzLmludGVybmFsLndvcmtlci5HcmFkbGVXb3JrZXJNYWluLnJ1bihHcmFkbGVXb3JrZXJNYWluLmphdmE6NjkpCglhdCB3b3JrZXIub3JnLmdyYWRsZS5wcm9jZXNzLmludGVybmFsLndvcmtlci5HcmFkbGVXb3JrZXJNYWluLm1haW4oR3JhZGxlV29ya2VyTWFpbi5qYXZhOjc0KQo=]]></stackTrace><ijLogEol/>      <failureType>comparison</failureType><expected><![CDATA[R0VUX0FQUF9NRVRBREFUQQ==]]></expected><actual><![CDATA[RVJST1I=]]></actual><ijLogEol/>    </result><ijLogEol/>  </test><ijLogEol/></event></ijLog>
com.tuenti.web.bridge.GetAppMetadataTest > handler should return installed app and market urls for given app token FAILED
    org.junit.ComparisonFailure at GetAppMetadataTest.kt:70
<ijLog><event type='afterSuite'><ijLogEol
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':web:testMovistarESDebugUnitTest'.
/>  <test id=':web:testMovistarESDebugUnitTest' parentId=''><ijLogEol/>    <descriptor name='Gradle Test Run :web:testMovistarESDebugUnitTest' className='' /><ijLogEol/>    <result resultType='FAILURE' startTime='1635155569925' endTime='1635155570837'><ijLogEol/>      <failureType>error</failureType><ijLogEol/>    </result><ijLogEol/>  </test><ijLogEol/></event></ijLog>
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
> There were failing tests. See the report at: file:/Users/gmerino/Workspace/android-messenger/web/build/reports/tests/testMovistarESDebugUnitTest/index.html
* Try:
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
See https:> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Get more help at https://help.gradle.org
//docs.gradle.org/7.3-rc-2/userguide/command_line_interface.html#sec:command_line_warnings
259 actionable tasks: 4 executed, 255 up-to-date
BUILD FAILED in 14s
> Task :downloadInParallel
> Task :downloadFromRemote
> Task :mirakle FAILED
Total time : 22.288 secs
Task uploadToRemote took : 0.726 secs
Task executeOnRemote took : 15.39 secs
Task downloadFromRemote took : 0.834 secs
9 actionable tasks: 9 executed
11:52:54: Tasks execution finished ':web:cleanTestMovistarESDebugUnitTest :web:testMovistarESDebugUnitTest --tests "com.tuenti.web.bridge.GetAppMetadataTest"'.

and the IDE keeps "executing" the test
image

@Adambl4
Copy link
Owner

Adambl4 commented Oct 31, 2021

Could you check another version please io.github.adambl4:mirakle:1.5.0-RC-3

@gmerinojimenez
Copy link
Author

Sorry for the delay, I've tested it with similar results

> Task :inappmessages:testMovistarESDebugUnitTest FAILED
<ijLog><event type='beforeSuite'><ijLogEol/>  <test id='2.1' parentId=':inappmessages:testMovistarESDebugUnitTest'><ijLogEol/>    <descriptor name='Gradle Test Executor 2' className='' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='2.3' parentId='2.2'><ijLogEol/>    <descriptor name='init a one card carousel without secondary action' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='afterTest'><ijLogEol/>  <test id='2.3' parentId='2.2'><ijLogEol/>    <descriptor name='init a one card carousel without secondary action' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>    <result resultType='FAILURE' startTime='1636016656441' endTime='1636016656457'><errorMsg><![CDATA[ZXhwZWN0ZWQ6PGZhbHNlPiBidXQgd2FzOjx0cnVlPg==]]></errorMsg><stackTrace><![CDATA[amF2YS5sYW5nLkFzc2VydGlvbkVycm9yOiBleHBlY3RlZDo8ZmFsc2U+IGJ1dCB3YXM6PHRydWU+CglhdCBvcmcuanVuaXQuQXNzZXJ0LmZhaWwoQXNzZXJ0LmphdmE6ODgpCglhdCBvcmcuanVuaXQuQXNzZXJ0LmZhaWxOb3RFcXVhbHMoQXNzZXJ0LmphdmE6ODM0KQoJYXQgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHMoQXNzZXJ0LmphdmE6MTE4KQoJYXQgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHMoQXNzZXJ0LmphdmE6MTQ0KQoJYXQgY29tLnR1ZW50aS5pbmFwcG1lc3NhZ2VzLnZpZXdtb2RlbC5DYXJvdXNlbE1lc3NhZ2VWaWV3TW9kZWxUZXN0LnZlcmlmeUNUQXMoQ2Fyb3VzZWxNZXNzYWdlVmlld01vZGVsVGVzdC5rdDo2NTUpCglhdCBjb20udHVlbnRpLmluYXBwbWVzc2FnZXMudmlld21vZGVsLkNhcm91c2VsTWVzc2FnZVZpZXdNb2RlbFRlc3QuaW5pdCBhIG9uZSBjYXJkIGNhcm91c2VsIHdpdGhvdXQgc2Vjb25kYXJ5IGFjdGlvbihDYXJvdXNlbE1lc3NhZ2VWaWV3TW9kZWxUZXN0Lmt0OjM4KQoJYXQgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5pbnZva2UwKE5hdGl2ZSBNZXRob2QpCglhdCBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZShOYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuamF2YTo2MikKCWF0IGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmbGVjdC5EZWxlZ2F0aW5nTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZShEZWxlZ2F0aW5nTWV0aG9kQWNjZXNzb3JJbXBsLmphdmE6NDMpCglhdCBqYXZhLmJhc2UvamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZShNZXRob2QuamF2YTo1NjYpCglhdCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5GcmFtZXdvcmtNZXRob2QkMS5ydW5SZWZsZWN0aXZlQ2FsbChGcmFtZXdvcmtNZXRob2QuamF2YTo1MCkKCWF0IG9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLm1vZGVsLlJlZmxlY3RpdmVDYWxsYWJsZS5ydW4oUmVmbGVjdGl2ZUNhbGxhYmxlLmphdmE6MTIpCglhdCBvcmcuanVuaXQucnVubmVycy5tb2RlbC5GcmFtZXdvcmtNZXRob2QuaW52b2tlRXhwbG9zaXZlbHkoRnJhbWV3b3JrTWV0aG9kLmphdmE6NDcpCglhdCBvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5zdGF0ZW1lbnRzLkludm9rZU1ldGhvZC5ldmFsdWF0ZShJbnZva2VNZXRob2QuamF2YToxNykKCWF0IG9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuUnVuQmVmb3Jlcy5ldmFsdWF0ZShSdW5CZWZvcmVzLmphdmE6MjYpCglhdCBvcmcuanVuaXQuaW50ZXJuYWwucnVubmVycy5zdGF0ZW1lbnRzLlJ1bkFmdGVycy5ldmFsdWF0ZShSdW5BZnRlcnMuamF2YToyNykKCWF0IG9yZy5qdW5pdC5ydWxlcy5UZXN0V2F0Y2hlciQxLmV2YWx1YXRlKFRlc3RXYXRjaGVyLmphdmE6NTUpCglhdCBjb20udHVlbnRpLm1lc3Nlbmdlci50ZXN0LnJ1bGVzLnN0YXRlbWVudC5UZXN0VGltZW91dFN0YXRlbWVudC5ldmFsdWF0ZShUZXN0VGltZW91dFN0YXRlbWVudC5qYXZhOjQyKQoJYXQgb3JnLmp1bml0LnJ1bGVzLlJ1blJ1bGVzLmV2YWx1YXRlKFJ1blJ1bGVzLmphdmE6MjApCglhdCBvcmcuanVuaXQucnVubmVycy5QYXJlbnRSdW5uZXIucnVuTGVhZihQYXJlbnRSdW5uZXIuamF2YTozMjUpCglhdCBvcmcuanVuaXQucnVubmVycy5CbG9ja0pVbml0NENsYXNzUnVubmVyLnJ1bkNoaWxkKEJsb2NrSlVuaXQ0Q2xhc3NSdW5uZXIuamF2YTo3OCkKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLkJsb2NrSlVuaXQ0Q2xhc3NSdW5uZXIucnVuQ2hpbGQoQmxvY2tKVW5pdDRDbGFzc1J1bm5lci5qYXZhOjU3KQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDMucnVuKFBhcmVudFJ1bm5lci5qYXZhOjI5MCkKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lciQxLnNjaGVkdWxlKFBhcmVudFJ1bm5lci5qYXZhOjcxKQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyLnJ1bkNoaWxkcmVuKFBhcmVudFJ1bm5lci5qYXZhOjI4OCkKCWF0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmVudFJ1bm5lci5hY2Nlc3MkMDAwKFBhcmVudFJ1bm5lci5qYXZhOjU4KQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyJDIuZXZhbHVhdGUoUGFyZW50UnVubmVyLmphdmE6MjY4KQoJYXQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyZW50UnVubmVyLnJ1bihQYXJlbnRSdW5uZXIuamF2YTozNjMpCglhdCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLmp1bml0LkpVbml0VGVzdENsYXNzRXhlY3V0b3IucnVuVGVzdENsYXNzKEpVbml0VGVzdENsYXNzRXhlY3V0b3IuamF2YToxMTApCglhdCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLmp1bml0LkpVbml0VGVzdENsYXNzRXhlY3V0b3IuZXhlY3V0ZShKVW5pdFRlc3RDbGFzc0V4ZWN1dG9yLmphdmE6NTgpCglhdCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLmp1bml0LkpVbml0VGVzdENsYXNzRXhlY3V0b3IuZXhlY3V0ZShKVW5pdFRlc3RDbGFzc0V4ZWN1dG9yLmphdmE6MzgpCglhdCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLmp1bml0LkFic3RyYWN0SlVuaXRUZXN0Q2xhc3NQcm9jZXNzb3IucHJvY2Vzc1Rlc3RDbGFzcyhBYnN0cmFjdEpVbml0VGVzdENsYXNzUHJvY2Vzc29yLmphdmE6NjIpCglhdCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLlN1aXRlVGVzdENsYXNzUHJvY2Vzc29yLnByb2Nlc3NUZXN0Q2xhc3MoU3VpdGVUZXN0Q2xhc3NQcm9jZXNzb3IuamF2YTo1MSkKCWF0IGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlMChOYXRpdmUgTWV0aG9kKQoJYXQgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5pbnZva2UoTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmphdmE6NjIpCglhdCBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZmxlY3QuRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5pbnZva2UoRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5qYXZhOjQzKQoJYXQgamF2YS5iYXNlL2phdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoTWV0aG9kLmphdmE6NTY2KQoJYXQgb3JnLmdyYWRsZS5pbnRlcm5hbC5kaXNwYXRjaC5SZWZsZWN0aW9uRGlzcGF0Y2guZGlzcGF0Y2goUmVmbGVjdGlvbkRpc3BhdGNoLmphdmE6MzYpCglhdCBvcmcuZ3JhZGxlLmludGVybmFsLmRpc3BhdGNoLlJlZmxlY3Rpb25EaXNwYXRjaC5kaXNwYXRjaChSZWZsZWN0aW9uRGlzcGF0Y2guamF2YToyNCkKCWF0IG9yZy5ncmFkbGUuaW50ZXJuYWwuZGlzcGF0Y2guQ29udGV4dENsYXNzTG9hZGVyRGlzcGF0Y2guZGlzcGF0Y2goQ29udGV4dENsYXNzTG9hZGVyRGlzcGF0Y2guamF2YTozMykKCWF0IG9yZy5ncmFkbGUuaW50ZXJuYWwuZGlzcGF0Y2guUHJveHlEaXNwYXRjaEFkYXB0ZXIkRGlzcGF0Y2hpbmdJbnZvY2F0aW9uSGFuZGxlci5pbnZva2UoUHJveHlEaXNwYXRjaEFkYXB0ZXIuamF2YTo5NCkKCWF0IGNvbS5zdW4ucHJveHkuJFByb3h5Mi5wcm9jZXNzVGVzdENsYXNzKFVua25vd24gU291cmNlKQoJYXQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwudGFza3MudGVzdGluZy53b3JrZXIuVGVzdFdvcmtlciQyLnJ1bihUZXN0V29ya2VyLmphdmE6MTc2KQoJYXQgb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwudGFza3MudGVzdGluZy53b3JrZXIuVGVzdFdvcmtlci5leGVjdXRlQW5kTWFpbnRhaW5UaHJlYWROYW1lKFRlc3RXb3JrZXIuamF2YToxMjkpCglhdCBvcmcuZ3JhZGxlLmFwaS5pbnRlcm5hbC50YXNrcy50ZXN0aW5nLndvcmtlci5UZXN0V29ya2VyLmV4ZWN1dGUoVGVzdFdvcmtlci5qYXZhOjEwMCkKCWF0IG9yZy5ncmFkbGUuYXBpLmludGVybmFsLnRhc2tzLnRlc3Rpbmcud29ya2VyLlRlc3RXb3JrZXIuZXhlY3V0ZShUZXN0V29ya2VyLmphdmE6NjApCglhdCBvcmcuZ3JhZGxlLnByb2Nlc3MuaW50ZXJuYWwud29ya2VyLmNoaWxkLkFjdGlvbkV4ZWN1dGlvbldvcmtlci5leGVjdXRlKEFjdGlvbkV4ZWN1dGlvbldvcmtlci5qYXZhOjU2KQoJYXQgb3JnLmdyYWRsZS5wcm9jZXNzLmludGVybmFsLndvcmtlci5jaGlsZC5TeXN0ZW1BcHBsaWNhdGlvbkNsYXNzTG9hZGVyV29ya2VyLmNhbGwoU3lzdGVtQXBwbGljYXRpb25DbGFzc0xvYWRlcldvcmtlci5qYXZhOjEzMykKCWF0IG9yZy5ncmFkbGUucHJvY2Vzcy5pbnRlcm5hbC53b3JrZXIuY2hpbGQuU3lzdGVtQXBwbGljYXRpb25DbGFzc0xvYWRlcldvcmtlci5jYWxsKFN5c3RlbUFwcGxpY2F0aW9uQ2xhc3NMb2FkZXJXb3JrZXIuamF2YTo3MSkKCWF0IHdvcmtlci5vcmcuZ3JhZGxlLnByb2Nlc3MuaW50ZXJuYWwud29ya2VyLkdyYWRsZVdvcmtlck1haW4ucnVuKEdyYWRsZVdvcmtlck1haW4uamF2YTo2OSkKCWF0IHdvcmtlci5vcmcuZ3JhZGxlLnByb2Nlc3MuaW50ZXJuYWwud29ya2VyLkdyYWRsZVdvcmtlck1haW4ubWFpbihHcmFkbGVXb3JrZXJNYWluLmphdmE6NzQpCg==]]></stackTrace><ijLogEol/>      <failureType>assertionFailed</failureType><ijLogEol/>    </result><ijLogEol/>  </test><ijLogEol/></event></ijLog>
com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest > init a one card carousel without secondary action FAILED
    java.lang.AssertionError at CarouselMessageViewModelTest.kt:655
<ijLog><event type='afterTest'><ijLogEol/>  <test id='2.11' parentId='2.2'><ijLogEol/>    <descriptor name='init a two cards carousel with only secondary actions as buttons in non-last cards and secondary action as button on last card' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>    <result resultType='SUCCESS' startTime='1636016656477' endTime='1636016656477'><ijLogEol/>      <failureType>error</failureType><ijLogEol/>    </result><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='2.13' parentId='2.2'><ijLogEol/>    <descriptor name='init a two cards carousel with only secondary actions as links in non-last cards and only main action on last card' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='afterTest'><ijLogEol/>  <test id='2.14' parentId='2.2'><ijLogEol/>    <descriptor name='init a one card carousel with secondary action as link' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>    <result resultType='SUCCESS' startTime='1636016656480' endTime='1636016656480'><ijLogEol/>      <failureType>error</failureType><ijLogEol/>    </result><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='2.16' parentId='2.2'><ijLogEol/>    <descriptor name='tap on call to action' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='2.22' parentId='2.2'><ijLogEol/>    <descriptor name='init a two cards carousel with only secondary actions as buttons in non-last cards and only main action on last card' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='afterTest'><ijLogEol/>  <test id='2.23' parentId='2.2'><ijLogEol/>    <descriptor name='init a two cards carousel with secondary actions as buttons but last one is link and swipe between cards' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>    <result resultType='SUCCESS' startTime='1636016656491' endTime='1636016656492'><ijLogEol/>      <failureType>error</failureType><ijLogEol/>    </result><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='2.27' parentId='2.2'><ijLogEol/>    <descriptor name='init a two cards carousel with action only on last card' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='2.28' parentId='2.2'><ijLogEol/>    <descriptor name='should not handle action yet finish' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='beforeTest'><ijLogEol/>  <test id='2.30' parentId='2.2'><ijLogEol/>    <descriptor name='init a two cards carousel with action only on last card and a secondary action as button' className='com.tuenti.inappmessages.viewmodel.CarouselMessageViewModelTest' /><ijLogEol/>  </test><ijLogEol/></event></ijLog>
<ijLog><event type='afterSuite'><ijLogEol/>  <test id=':inappmessages:testMovistarESDebugUnitTest' parentId=''><ijLogEol/>    <descriptor name='Gradle Test Run :inappmessages:testMovistarESDebugUnitTest' className='' /><ijLogEol/>    <result resultType='FAILURE' startTime='1636016655745' endTime='1636016656655'><ijLogEol/>      <failureType>error</failureType><ijLogEol/>    </result><ijLogEol/>  </test><ijLogEol/></event></ijLog>
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
See https://docs.gradle.org/7.3-rc-2/userguide/command_line_interface.html#sec:command_line_warnings
302 actionable tasks: 302 executed

image

@JSpiner
Copy link

JSpiner commented Jan 5, 2022

Same for me. Is there any updates?

@gmerinojimenez
Copy link
Author

Tried with 1.5.0 and in an empty project and me and my teammates are still having the issue. It's weird, because the first time works well, but second time starts failing.

@Adambl4 Adambl4 reopened this Feb 2, 2022
@gmerinojimenez
Copy link
Author

gmerinojimenez commented Feb 3, 2022

I've uploaded an empty project where I can reproduce the issue to a repo (anyway, it's an empty project with the example test): https://github.com/gmerinojimenez/mirakle-tests-android-studio

And added the mirakle_init_scripts folder in this branch: gmerinojimenez/mirakle-tests-android-studio#1

@JSpiner
Copy link

JSpiner commented Feb 3, 2022

Same on android studio bumblebee 2021.1.1.

@Sakh-K
Copy link

Sakh-K commented May 2, 2022

facing the same on AS bumblebee

@JSpiner
Copy link

JSpiner commented Jun 8, 2022

I tried running the command line that mirakle does.

$ ssh mainframer "~/mirakle/my_project/gradlew" -Pmirakle.build.on.remote=true -p "~/mirakle/my_project" \
":home:testDebugUnitTest" --continue --parallel --configure-on-demand --project-prop \ 
"android.injected.enableStableIds=true" --project-prop "android.injected.build.density=420dpi" --project-prop \
"android.injected.build.api=31" --project-prop "android.injected.invoked.from.ide=true" --project-prop \
"android.injected.build.abi=arm64-v8a,armeabi-v7a,armeabi" \
--project-prop "android.injected.studio.version=2021.2.1 Patch 1" --system-prop "idea.active=true" --system-prop \
"idea.version=2021.2" --stacktrace

...
FAILURE: Build failed with an exception.

* What went wrong:
Task 'Patch' not found in root project 'my_project'.

...

--project-prop "android.injected.studio.version=2021.2.1 Patch 1"

This argument causes a parsing error.
Same with 1.5.1's argument issue, I think it need to change the args passing method.
(I still haven't figured out how to make it work. I'll find out too.)

@JSpiner
Copy link

JSpiner commented Jun 19, 2022

Compose view preview does not work when using mirakle.
I think it's the same issue.

@Adambl4
Copy link
Owner

Adambl4 commented Jul 14, 2022

Hey guys, give me please some feedback on io.github.adambl4:mirakle:1.5.3-RC-4

@JSpiner
Copy link

JSpiner commented Jul 18, 2022

it also happened with io.github.adambl4:mirakle:1.5.3-RC-4 😭

Test events were not received

I think this issue should be reopened.

@Adambl4 Adambl4 reopened this Jul 18, 2022
@Adambl4
Copy link
Owner

Adambl4 commented Jul 18, 2022

@JSpiner what version of Android Studio you are using right now?
I'm on Android Studio Dolphin | 2021.3.1 Beta 5, it is the latest Beta build so far, and it works well for me.
Could you try that version please?
Also there is a repo with a simple project which I'm using to reproduce that issue, could you run test on it also.

@gmerinojimenez
Copy link
Author

gmerinojimenez commented Jul 21, 2022

Hi,

Thank you very much, @Adambl4 and @JSpiner for the work.

I've tested 1.5.3-RC-4 on Android Studio Chipmunk and the simple project and it's working for me:
image

:)

@JSpiner
Copy link

JSpiner commented Aug 15, 2022

It doesn't work to me because I have other issues, but I can see that it works with a little modification.
I made PR for my issue. So I think this issue is now resolved and can be closed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment