diff --git a/ci/build.sh b/ci/build.sh index 401cddc..e8da19e 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -15,7 +15,7 @@ BUILD_COMMAND+="apt-get update && apt-get --assume-yes install git && " if [ "$USER_ID" == "0" ]; then echo "Warning: running as r00t." -else +else BUILD_COMMAND+="apt-get --assume-yes install sudo && " BUILD_COMMAND+="groupadd --gid $USER_ID build_user && " BUILD_COMMAND+="useradd --shell /bin/bash --uid $USER_ID --gid $USER_ID --create-home build_user && " diff --git a/composer/src/main/kotlin/com/gojuno/composer/Instrumentation.kt b/composer/src/main/kotlin/com/gojuno/composer/Instrumentation.kt index 287ce9f..962fea0 100644 --- a/composer/src/main/kotlin/com/gojuno/composer/Instrumentation.kt +++ b/composer/src/main/kotlin/com/gojuno/composer/Instrumentation.kt @@ -54,8 +54,8 @@ private fun String.substringBetween(first: String, second: String): String { return substring(startIndex, endIndex) } -private fun String.parseInstrumentationStatusValue(key: String): String = - substringBetween("INSTRUMENTATION_STATUS: $key=", "INSTRUMENTATION_STATUS").trim() +private fun String.parseInstrumentationStatusValue(key: String): String = substringBetween("INSTRUMENTATION_STATUS: $key=", "INSTRUMENTATION_STATUS") + .trim() private fun parseInstrumentationEntry(str: String): InstrumentationEntry = InstrumentationEntry( @@ -74,7 +74,7 @@ private fun parseInstrumentationEntry(str: String): InstrumentationEntry = } .let { statusCode -> when (statusCode) { - null -> throw IllegalStateException("Unknown test result status code, please report that to Composer maintainers $str") + null -> throw IllegalStateException("Unknown test result status code [$statusCode], please report that to Composer maintainers $str") else -> statusCode } }, @@ -86,12 +86,13 @@ fun readInstrumentationOutput(output: File): Observable { data class result(val buffer: String = "", val readyForProcessing: Boolean = false) return tail(output) + .map { it.trim() } // `INSTRUMENTATION_CODE: -1` is last line printed by instrumentation, even if 0 tests were run. .takeWhile { !it.startsWith("INSTRUMENTATION_CODE") } .scan(result()) { previousResult, newLine -> val buffer = when (previousResult.readyForProcessing) { true -> newLine - false -> "${previousResult.buffer}\n$newLine" + false -> "${previousResult.buffer}${System.lineSeparator()}$newLine" } result(buffer = buffer, readyForProcessing = newLine.startsWith("INSTRUMENTATION_STATUS_CODE")) @@ -101,7 +102,7 @@ fun readInstrumentationOutput(output: File): Observable { } fun Observable.asTests(): Observable { - data class result(val entries: List = emptyList(), val tests: List = emptyList()) + data class result(val entries: List = emptyList(), val tests: List = emptyList(), val totalTestsCount: Int = 0) return this .scan(result()) { previousResult, newEntry -> @@ -110,7 +111,15 @@ fun Observable.asTests(): Observable { .mapIndexed { index, first -> val second = entries .subList(index + 1, entries.size) - .firstOrNull { first.clazz == it.clazz && first.test == it.test && first.current == it.current } + .firstOrNull { + first.clazz == it.clazz + && + first.test == it.test + && + first.current == it.current + && + first.statusCode != it.statusCode + } if (second == null) null else first to second } @@ -123,7 +132,7 @@ fun Observable.asTests(): Observable { StatusCode.Ok -> Passed StatusCode.Ignored -> Ignored StatusCode.Failure, StatusCode.AssumptionFailure -> Failed(stacktrace = second.stack) - StatusCode.Start -> throw IllegalStateException("Unexpected Start code in second entry, please report that to Composer maintainers ($first, $second)") + StatusCode.Start -> throw IllegalStateException("Unexpected status code [${second.statusCode}] in second entry, please report that to Composer maintainers ($first, $second)") }, durationNanos = second.timestampNanos - first.timestampNanos ) @@ -131,10 +140,21 @@ fun Observable.asTests(): Observable { result( entries = entries.filter { entry -> tests.firstOrNull { it.className == entry.clazz && it.testName == entry.test } == null }, - tests = tests + tests = tests, + totalTestsCount = previousResult.totalTestsCount + tests.size ) } - .takeUntil { it.entries.count { it.current == it.numTests } >= 2 } + .takeUntil { + if (it.entries.count { it.current == it.numTests } == 2) { + if (it.totalTestsCount < it.entries.first().numTests) { + throw IllegalStateException("Less tests were emitted than Instrumentation reported: $it") + } + + true + } else { + false + } + } .filter { it.tests.isNotEmpty() } .flatMap { Observable.from(it.tests) } } diff --git a/composer/src/test/kotlin/com/gojuno/composer/InstrumentationSpec.kt b/composer/src/test/kotlin/com/gojuno/composer/InstrumentationSpec.kt index 5c2d42b..7ce0ae8 100644 --- a/composer/src/test/kotlin/com/gojuno/composer/InstrumentationSpec.kt +++ b/composer/src/test/kotlin/com/gojuno/composer/InstrumentationSpec.kt @@ -6,262 +6,553 @@ import org.jetbrains.spek.api.Spek import org.jetbrains.spek.api.dsl.context import org.jetbrains.spek.api.dsl.it import rx.observers.TestSubscriber +import java.util.concurrent.TimeUnit.SECONDS class InstrumentationSpec : Spek({ context("read output with failed test") { - val subscriber by memoized { TestSubscriber() } - val tests by memoized { mutableListOf() } + val entries by memoized { readInstrumentationOutput(fileFromJarResources("instrumentation-output-failed-test.txt")) } + val entriesSubscriber by memoized { TestSubscriber() } perform { - readInstrumentationOutput(fileFromJarResources("instrumentation-output-failed-test.txt")) - .asTests() - .subscribe(subscriber) - - subscriber.awaitTerminalEvent() - subscriber.onNextEvents.forEach { test -> - tests.add(test.copy(durationNanos = 0)) // We have no control over system time in tests. - } + entries.subscribe(entriesSubscriber) + entriesSubscriber.awaitTerminalEvent(30, SECONDS) } - it("emits expected tests") { - assertThat(tests).isEqualTo(listOf( - Test( - className = "net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest", - testName = "on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError", - result = Failed(stacktrace = """java.net.UnknownHostException: Artem test - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError.1.invoke(AddCreditCardForUserWithNoPaymentsTest.kt:245) - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError.1.invoke(AddCreditCardForUserWithNoPaymentsTest.kt:44) - at net.juno.rd.functional_tests.screens.AddCreditCardScreen.Companion.invoke(AddCreditCardScreen.kt:23) - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError(AddCreditCardForUserWithNoPaymentsTest.kt:238) - at java.lang.reflect.Method.invoke(Native Method) - at org.junit.runners.model.FrameworkMethod.1.runReflectiveCall(FrameworkMethod.java:50) - at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) - at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) - at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) - at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) - at org.junit.rules.ExpectedException.ExpectedExceptionStatement.evaluate(ExpectedException.java:239) - at net.juno.rd.functional_tests.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) - at com.gojuno.mockserver1.ServerImpl.apply.1.evaluate(ServerImpl.kt:112) - at net.juno.rd.functional_tests.utils.RetryRule.runTest(RetryRule.kt:43) - at net.juno.rd.functional_tests.utils.RetryRule.access.runTest(RetryRule.kt:14) - at net.juno.rd.functional_tests.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) - at org.junit.rules.RunRules.evaluate(RunRules.java:20) - at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) - at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) - at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) - at org.junit.runners.ParentRunner.3.run(ParentRunner.java:290) - at org.junit.runners.ParentRunner.1.schedule(ParentRunner.java:71) - at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) - at org.junit.runners.ParentRunner.access.000(ParentRunner.java:58) - at org.junit.runners.ParentRunner.2.evaluate(ParentRunner.java:268) - at org.junit.runners.ParentRunner.run(ParentRunner.java:363) - at org.junit.runners.Suite.runChild(Suite.java:128) - at org.junit.runners.Suite.runChild(Suite.java:27) - at org.junit.runners.ParentRunner.3.run(ParentRunner.java:290) - at org.junit.runners.ParentRunner.1.schedule(ParentRunner.java:71) - at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) - at org.junit.runners.ParentRunner.access.000(ParentRunner.java:58) - at org.junit.runners.ParentRunner.2.evaluate(ParentRunner.java:268) - at org.junit.runners.ParentRunner.run(ParentRunner.java:363) - at org.junit.runner.JUnitCore.run(JUnitCore.java:137) - at org.junit.runner.JUnitCore.run(JUnitCore.java:115) - at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) - at android.support.test.runner.JunoAndroidRunner.onStart(JunoAndroidRunner.kt:107) - at android.app.Instrumentation.InstrumentationThread.run(Instrumentation.java:1932)"""), - durationNanos = 0 - ), - Test( - className = "net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest", - testName = "onMastercardCreditCardFirst2NumbersEnteredDisplaysMasterCardIcon", - result = Passed, - durationNanos = 0 - ), - Test( - className = "net.juno.rd.functional_tests.tests.AddCreditCardForUserWithPaymentMethod", - testName = "successfullyAddsAmericanExpressCardShowsNumberForItAndItIsNotDefault", - result = Passed, - durationNanos = 0 - ), - Test( - className = "net.juno.rd.functional_tests.tests.AddCreditCardForUserWithPaymentMethod", - testName = "successfullyAddsMasterCardShowsNumberForItAndItIsNotDefault", - result = Passed, - durationNanos = 0 + it("emits expected entries") { + // We have no control over system time in tests. + assertThat(entriesSubscriber.onNextEvents.map { it.copy(timestampNanos = 0) }).isEqualTo(listOf( + InstrumentationEntry( + numTests = 4, + stream = "com.example.test.TestClass:", + id = "AndroidJUnitRunner", + test = "test1", + clazz = "com.example.test.TestClass", + current = 1, + stack = "", + statusCode = StatusCode.Start, + timestampNanos = 0 ), - Test( - className = "net.juno.rd.functional_tests.tests.ConfirmationWithUserWithNoPaymentMethodTest", - testName = "onAddPaymentButtonTappedOpensAddCreditCardScreen", - result = Passed, - durationNanos = 0 + InstrumentationEntry( + numTests = 4, + stream = """Error in test1(com.example.test.TestClass): +java.net.UnknownHostException: Test Exception +at com.example.test.TestClass.test1.1.invoke(TestClass.kt:245) +at com.example.test.TestClass.test1.1.invoke(TestClass.kt:44) +at com.example.test.TestClass.test1(TestClass.kt:238) +at java.lang.reflect.Method.invoke(Native Method) +at org.junit.runners.model.FrameworkMethod.1.runReflectiveCall(FrameworkMethod.java:50) +at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) +at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) +at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) +at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) +at org.junit.rules.ExpectedException.ExpectedExceptionStatement.evaluate(ExpectedException.java:239) +at com.example.test.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) +at com.example.test.utils.RetryRule.runTest(RetryRule.kt:43) +at com.example.test.utils.RetryRule.access.runTest(RetryRule.kt:14) +at com.example.test.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) +at org.junit.rules.RunRules.evaluate(RunRules.java:20) +at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) +at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) +at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) +at org.junit.runners.ParentRunner.3.run(ParentRunner.java:290) +at org.junit.runners.ParentRunner.1.schedule(ParentRunner.java:71) +at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) +at org.junit.runners.ParentRunner.access.000(ParentRunner.java:58) +at org.junit.runners.ParentRunner.2.evaluate(ParentRunner.java:268) +at org.junit.runners.ParentRunner.run(ParentRunner.java:363) +at org.junit.runners.Suite.runChild(Suite.java:128) +at org.junit.runners.Suite.runChild(Suite.java:27) +at org.junit.runners.ParentRunner.3.run(ParentRunner.java:290) +at org.junit.runners.ParentRunner.1.schedule(ParentRunner.java:71) +at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) +at org.junit.runners.ParentRunner.access.000(ParentRunner.java:58) +at org.junit.runners.ParentRunner.2.evaluate(ParentRunner.java:268) +at org.junit.runners.ParentRunner.run(ParentRunner.java:363) +at org.junit.runner.JUnitCore.run(JUnitCore.java:137) +at org.junit.runner.JUnitCore.run(JUnitCore.java:115) +at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) +at android.support.test.runner.JunoAndroidRunner.onStart(JunoAndroidRunner.kt:107) +at android.app.Instrumentation.InstrumentationThread.run(Instrumentation.java:1932)""", + id = "AndroidJUnitRunner", + test = "test1", + clazz = "com.example.test.TestClass", + current = 1, + stack = """java.net.UnknownHostException: Test Exception +at com.example.test.TestClass.test1.1.invoke(TestClass.kt:245) +at com.example.test.TestClass.test1.1.invoke(TestClass.kt:44) +at com.example.test.TestClass.test1(TestClass.kt:238) +at java.lang.reflect.Method.invoke(Native Method) +at org.junit.runners.model.FrameworkMethod.1.runReflectiveCall(FrameworkMethod.java:50) +at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) +at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) +at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) +at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) +at org.junit.rules.ExpectedException.ExpectedExceptionStatement.evaluate(ExpectedException.java:239) +at com.example.test.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) +at com.example.test.utils.RetryRule.runTest(RetryRule.kt:43) +at com.example.test.utils.RetryRule.access.runTest(RetryRule.kt:14) +at com.example.test.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) +at org.junit.rules.RunRules.evaluate(RunRules.java:20) +at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) +at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) +at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) +at org.junit.runners.ParentRunner.3.run(ParentRunner.java:290) +at org.junit.runners.ParentRunner.1.schedule(ParentRunner.java:71) +at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) +at org.junit.runners.ParentRunner.access.000(ParentRunner.java:58) +at org.junit.runners.ParentRunner.2.evaluate(ParentRunner.java:268) +at org.junit.runners.ParentRunner.run(ParentRunner.java:363) +at org.junit.runners.Suite.runChild(Suite.java:128) +at org.junit.runners.Suite.runChild(Suite.java:27) +at org.junit.runners.ParentRunner.3.run(ParentRunner.java:290) +at org.junit.runners.ParentRunner.1.schedule(ParentRunner.java:71) +at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) +at org.junit.runners.ParentRunner.access.000(ParentRunner.java:58) +at org.junit.runners.ParentRunner.2.evaluate(ParentRunner.java:268) +at org.junit.runners.ParentRunner.run(ParentRunner.java:363) +at org.junit.runner.JUnitCore.run(JUnitCore.java:137) +at org.junit.runner.JUnitCore.run(JUnitCore.java:115) +at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) +at android.support.test.runner.JunoAndroidRunner.onStart(JunoAndroidRunner.kt:107) +at android.app.Instrumentation.InstrumentationThread.run(Instrumentation.java:1932)""", + statusCode = StatusCode.Failure, + timestampNanos = 0 ), - Test( - className = "net.juno.rd.functional_tests.tests.ForgotPasswordTest", - testName = "onEmailAddressFieldInvalidTextEnteredEmailMeAResetLinkButtonIsNotActive", - result = Passed, - durationNanos = 0 + InstrumentationEntry( + numTests = 4, + stream = "", + id = "AndroidJUnitRunner", + test = "test2", + clazz = "com.example.test.TestClass", + current = 2, + stack = "", + statusCode = StatusCode.Start, + timestampNanos = 0 ), - Test( - className = "net.juno.rd.functional_tests.tests.ForgotPasswordWithPredefinedEmailTest", - testName = "tapOnResetLinkShowsAlert", - result = Passed, - durationNanos = 0 + InstrumentationEntry( + numTests = 4, + stream = ".", + id = "AndroidJUnitRunner", + test = "test2", + clazz = "com.example.test.TestClass", + current = 2, + stack = "", + statusCode = StatusCode.Ok, + timestampNanos = 0 ), - Test( - className = "net.juno.rd.functional_tests.tests.LoginTest", - testName = "onEmailEnteredAndLoginButtonTappedShowsPasswordCannotBeEmpty", - result = Passed, - durationNanos = 0 + InstrumentationEntry( + numTests = 4, + stream = "com.example.test.TestClass:", + id = "AndroidJUnitRunner", + test = "test3", + clazz = "com.example.test.TestClass", + current = 3, + stack = "", + statusCode = StatusCode.Start, + timestampNanos = 0 ), - Test( - className = "net.juno.rd.functional_tests.tests.LoginTest", - testName = "onLoginWithUnsettledDebtDisplaysYourPaymentMethodDeclinedAlert", - result = Passed, - durationNanos = 0 + InstrumentationEntry( + numTests = 4, + stream = ".", + id = "AndroidJUnitRunner", + test = "test3", + clazz = "com.example.test.TestClass", + current = 3, + stack = "", + statusCode = StatusCode.Ok, + timestampNanos = 0 ), - Test( - className = "net.juno.rd.functional_tests.tests.SignUpFirstNameTest", - testName = "onPhotoIconTappedShowsChoosePhotoOptionInAppropriatePanel", - result = Passed, - durationNanos = 0 + InstrumentationEntry( + numTests = 4, + stream = "", + id = "AndroidJUnitRunner", + test = "test4", + clazz = "com.example.test.TestClass", + current = 4, + stack = "", + statusCode = StatusCode.Start, + timestampNanos = 0 ), - Test( - className = "net.juno.rd.functional_tests.tests.SignUpFirstNameTest", - testName = "onBackButtonTappedNavigatesToSignUpPasswordScreenWithEnteredPassword", - result = Passed, - durationNanos = 0 - ), - Test( - className = "net.juno.rd.functional_tests.tests.SignUpLastNameTest", - testName = "onOkTappedClosesWeCannotVerifyYourNumberAlertAndNavigatesToSignUpPhoneScreenWithEnteredEarlierPhoneNumber", - result = Passed, - durationNanos = 0 - ), - Test( - className = "net.juno.rd.functional_tests.tests.SignUpPhoneTest", - testName = "onCloseButtonTappedNavigatesToOnboardingScreen", - result = Passed, - durationNanos = 0 - ), - Test( - className = "net.juno.rd.functional_tests.tests.SignUpPhoneTest", - testName = "onPhoneNumberEnteredDisplaysClearButton", - result = Passed, - durationNanos = 0 + InstrumentationEntry( + numTests = 4, + stream = ".", + id = "AndroidJUnitRunner", + test = "test4", + clazz = "com.example.test.TestClass", + current = 4, + stack = "", + statusCode = StatusCode.Ok, + timestampNanos = 0 ) )) } - it("completes stream") { - subscriber.assertCompleted() + it("completest stream") { + entriesSubscriber.assertCompleted() } it("does not emit error") { - subscriber.assertNoErrors() + entriesSubscriber.assertNoErrors() + } + + context("as tests") { + + val testsSubscriber by memoized { TestSubscriber() } + + perform { + entries.asTests().subscribe(testsSubscriber) + testsSubscriber.awaitTerminalEvent(30, SECONDS) + } + + it("emits expected tests") { + // We have no control over system time in tests. + assertThat(testsSubscriber.onNextEvents.map { it.copy(durationNanos = 0) }).isEqualTo(listOf( + Test( + className = "com.example.test.TestClass", + testName = "test1", + result = Failed(stacktrace = """java.net.UnknownHostException: Test Exception +at com.example.test.TestClass.test1.1.invoke(TestClass.kt:245) +at com.example.test.TestClass.test1.1.invoke(TestClass.kt:44) +at com.example.test.TestClass.test1(TestClass.kt:238) +at java.lang.reflect.Method.invoke(Native Method) +at org.junit.runners.model.FrameworkMethod.1.runReflectiveCall(FrameworkMethod.java:50) +at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) +at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) +at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) +at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) +at org.junit.rules.ExpectedException.ExpectedExceptionStatement.evaluate(ExpectedException.java:239) +at com.example.test.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) +at com.example.test.utils.RetryRule.runTest(RetryRule.kt:43) +at com.example.test.utils.RetryRule.access.runTest(RetryRule.kt:14) +at com.example.test.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) +at org.junit.rules.RunRules.evaluate(RunRules.java:20) +at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) +at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) +at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) +at org.junit.runners.ParentRunner.3.run(ParentRunner.java:290) +at org.junit.runners.ParentRunner.1.schedule(ParentRunner.java:71) +at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) +at org.junit.runners.ParentRunner.access.000(ParentRunner.java:58) +at org.junit.runners.ParentRunner.2.evaluate(ParentRunner.java:268) +at org.junit.runners.ParentRunner.run(ParentRunner.java:363) +at org.junit.runners.Suite.runChild(Suite.java:128) +at org.junit.runners.Suite.runChild(Suite.java:27) +at org.junit.runners.ParentRunner.3.run(ParentRunner.java:290) +at org.junit.runners.ParentRunner.1.schedule(ParentRunner.java:71) +at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) +at org.junit.runners.ParentRunner.access.000(ParentRunner.java:58) +at org.junit.runners.ParentRunner.2.evaluate(ParentRunner.java:268) +at org.junit.runners.ParentRunner.run(ParentRunner.java:363) +at org.junit.runner.JUnitCore.run(JUnitCore.java:137) +at org.junit.runner.JUnitCore.run(JUnitCore.java:115) +at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) +at android.support.test.runner.JunoAndroidRunner.onStart(JunoAndroidRunner.kt:107) +at android.app.Instrumentation.InstrumentationThread.run(Instrumentation.java:1932)"""), + durationNanos = 0 + ), + Test( + className = "com.example.test.TestClass", + testName = "test2", + result = Passed, + durationNanos = 0 + ), + Test( + className = "com.example.test.TestClass", + testName = "test3", + result = Passed, + durationNanos = 0 + ), + Test( + className = "com.example.test.TestClass", + testName = "test4", + result = Passed, + durationNanos = 0 + ) + )) + } + + it("completes stream") { + testsSubscriber.assertCompleted() + } + + it("does not emit error") { + testsSubscriber.assertNoErrors() + } } } context("read output with 0 tests") { - val subscriber by memoized { TestSubscriber() } - val tests by memoized { mutableListOf() } + val entries by memoized { readInstrumentationOutput(fileFromJarResources("instrumentation-output-0-tests.txt")) } + val entriesSubscriber by memoized { TestSubscriber() } perform { - readInstrumentationOutput(fileFromJarResources("instrumentation-output-0-tests.txt")) - .asTests() - .subscribe(subscriber) - - subscriber.awaitTerminalEvent() - subscriber.onNextEvents.forEach { test -> - tests.add(test.copy(durationNanos = 0)) // We have no control over system time in tests. - } + entries.subscribe(entriesSubscriber) + entriesSubscriber.awaitTerminalEvent(30, SECONDS) } - it("does not emit any value") { - subscriber.assertNoValues() + it("does not emit any entry") { + entriesSubscriber.assertNoValues() } it("completest stream") { - subscriber.assertCompleted() + entriesSubscriber.assertCompleted() } it("does not emit error") { - subscriber.assertNoErrors() + entriesSubscriber.assertNoErrors() + } + + context("as tests") { + + val testsSubscriber by memoized { TestSubscriber() } + + perform { + entries.asTests().subscribe(testsSubscriber) + testsSubscriber.awaitTerminalEvent(30, SECONDS) + } + + it("does not emit any test") { + testsSubscriber.assertNoValues() + } + + it("completest stream") { + testsSubscriber.assertCompleted() + } + + it("does not emit error") { + testsSubscriber.assertNoErrors() + } } } context("read unordered output") { - val subscriber by memoized { TestSubscriber() } - val tests by memoized { mutableListOf() } + val entries by memoized { readInstrumentationOutput(fileFromJarResources("instrumentation-unordered-output.txt")) } + val entriesSubscriber by memoized { TestSubscriber() } perform { - readInstrumentationOutput(fileFromJarResources("instrumentation-unordered-output.txt")) - .asTests() - .subscribe(subscriber) - - subscriber.awaitTerminalEvent() - subscriber.onNextEvents.forEach { test -> - tests.add(test.copy(durationNanos = 0)) // We have no control over system time in tests. - } + entries.subscribe(entriesSubscriber) + entriesSubscriber.awaitTerminalEvent(30, SECONDS) } - it("emits expected tests") { - assertThat(tests).isEqualTo(listOf( - Test( - className = "com.example.functional_tests.tests.TestClass1", - testName = "test1", - result = Passed, - durationNanos = 0L + it("emits expected entries") { + // We have no control over system time in tests. + assertThat(entriesSubscriber.onNextEvents.map { it.copy(timestampNanos = 0) }).isEqualTo(listOf( + InstrumentationEntry( + numTests = 3, + stream = "com.example.test.TestClass:", + id = "AndroidJUnitRunner", + test = "test1", + clazz = "com.example.test.TestClass", + current = 1, + stack = "", + statusCode = StatusCode.Start, + timestampNanos = 0 ), - Test( - className = "com.example.functional_tests.tests.TestClass2", - testName = "test2", - result = Passed, - durationNanos = 0L + InstrumentationEntry( + numTests = 3, + stream = ".", + id = "AndroidJUnitRunner", + test = "test1", + clazz = "com.example.test.TestClass", + current = 1, + stack = "", + statusCode = StatusCode.Ok, + timestampNanos = 0 ), - Test( - className = "com.example.functional_tests.tests.TestClass2", - testName = "test3", - result = Passed, - durationNanos = 0L - ) - )) + InstrumentationEntry( + numTests = 3, + stream = "com.example.test.TestClass:", + id = "AndroidJUnitRunner", + test = "test2", + clazz = "com.example.test.TestClass", + current = 2, + stack = "", + statusCode = StatusCode.Start, + timestampNanos = 0 + ), + InstrumentationEntry( + numTests = 3, + stream = "", + id = "AndroidJUnitRunner", + test = "test3", + clazz = "com.example.test.TestClass", + current = 3, + stack = "", + statusCode = StatusCode.Start, + timestampNanos = 0 + ), + InstrumentationEntry( + numTests = 3, + stream = ".", + id = "AndroidJUnitRunner", + test = "test2", + clazz = "com.example.test.TestClass", + current = 2, + stack = "", + statusCode = StatusCode.Ok, + timestampNanos = 0 + ), + InstrumentationEntry( + numTests = 3, + stream = ".", + id = "AndroidJUnitRunner", + test = "test3", + clazz = "com.example.test.TestClass", + current = 3, + stack = "", + statusCode = StatusCode.Ok, + timestampNanos = 0 + )) + ) + } + + it("completest stream") { + entriesSubscriber.assertCompleted() + } + + it("does not emit error") { + entriesSubscriber.assertNoErrors() + } + + context("as tests") { + + val testsSubscriber by memoized { TestSubscriber() } + + perform { + entries.asTests().subscribe(testsSubscriber) + testsSubscriber.awaitTerminalEvent(30, SECONDS) + } + + it("emits expected tests") { + assertThat(testsSubscriber.onNextEvents.map { it.copy(durationNanos = 0) }).isEqualTo(listOf( + Test( + className = "com.example.test.TestClass", + testName = "test1", + result = Passed, + durationNanos = 0L + ), + Test( + className = "com.example.test.TestClass", + testName = "test2", + result = Passed, + durationNanos = 0L + ), + Test( + className = "com.example.test.TestClass", + testName = "test3", + result = Passed, + durationNanos = 0L + ) + )) + } + + it("completest stream") { + testsSubscriber.assertCompleted() + } + + it("does not emit error") { + testsSubscriber.assertNoErrors() + } } } context("read output with ignored test") { - val subscriber by memoized { TestSubscriber() } - val tests by memoized { mutableListOf() } + val entries by memoized { readInstrumentationOutput(fileFromJarResources("instrumentation-output-ignored-test.txt")) } + val entriesSubscriber by memoized { TestSubscriber() } perform { - readInstrumentationOutput(fileFromJarResources("instrumentation-output-ignored-test.txt")) - .asTests() - .subscribe(subscriber) - - subscriber.awaitTerminalEvent() - subscriber.onNextEvents.forEach { test -> - tests.add(test.copy(durationNanos = 0)) // We have no control over system time in tests. - } + entries.subscribe(entriesSubscriber) + entriesSubscriber.awaitTerminalEvent(30, SECONDS) } - it("emits expected tests") { - assertThat(tests).isEqualTo(listOf( - Test( - className = "com.example.functional_tests.TestClass", - testName = "test1", - result = Passed, - durationNanos = 0L + it("emits expected entries") { + // We have no control over system time in tests. + assertThat(entriesSubscriber.onNextEvents.map { it.copy(timestampNanos = 0) }).isEqualTo(listOf( + InstrumentationEntry( + numTests = 2, + stream = "com.example.test.TestClass:", + id = "AndroidJUnitRunner", + test = "test1", + clazz = "com.example.test.TestClass", + current = 1, + stack = "", + statusCode = StatusCode.Start, + timestampNanos = 0 ), - Test( - className = "com.example.functional_tests.TestClass", - testName = "test2", - result = Ignored, - durationNanos = 0L - ) - )) + InstrumentationEntry( + numTests = 2, + stream = ".", + id = "AndroidJUnitRunner", + test = "test1", + clazz = "com.example.test.TestClass", + current = 1, + stack = "", + statusCode = StatusCode.Ok, + timestampNanos = 0 + ), + InstrumentationEntry( + numTests = 2, + stream = "", + id = "AndroidJUnitRunner", + test = "test2", + clazz = "com.example.test.TestClass", + current = 2, + stack = "", + statusCode = StatusCode.Start, + timestampNanos = 0 + ), + InstrumentationEntry( + numTests = 2, + stream = "", + id = "AndroidJUnitRunner", + test = "test2", + clazz = "com.example.test.TestClass", + current = 2, + stack = "", + statusCode = StatusCode.Ignored, + timestampNanos = 0 + )) + ) + } + + it("completest stream") { + entriesSubscriber.assertCompleted() + } + + it("does not emit error") { + entriesSubscriber.assertNoErrors() + } + + context("as tests") { + + val testsSubscriber by memoized { TestSubscriber() } + + perform { + entries.asTests().subscribe(testsSubscriber) + testsSubscriber.awaitTerminalEvent(30, SECONDS) + } + + it("emits expected tests") { + assertThat(testsSubscriber.onNextEvents.map { it.copy(durationNanos = 0) }).isEqualTo(listOf( + Test( + className = "com.example.test.TestClass", + testName = "test1", + result = Passed, + durationNanos = 0L + ), + Test( + className = "com.example.test.TestClass", + testName = "test2", + result = Ignored, + durationNanos = 0L + ) + )) + } } } }) diff --git a/composer/src/test/resources/instrumentation-output-failed-test.txt b/composer/src/test/resources/instrumentation-output-failed-test.txt index ff36747..56e45a7 100644 --- a/composer/src/test/resources/instrumentation-output-failed-test.txt +++ b/composer/src/test/resources/instrumentation-output-failed-test.txt @@ -1,20 +1,19 @@ -adb shell am instrument -w -r -e numShards 20 -e shardIndex 1 -e reportFailuresToCrashlytics true com.gojuno.rider.dev.test/android.support.test.runner.JunoAndroidRunner -INSTRUMENTATION_STATUS: numtests=14 +adb shell am instrument -w -r -e numShards 20 -e shardIndex 1 com.example.test/android.support.test.runner.JunoAndroidRunner +INSTRUMENTATION_STATUS: numtests=4 INSTRUMENTATION_STATUS: stream= -net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest: +com.example.test.TestClass: INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest +INSTRUMENTATION_STATUS: test=test1 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=1 INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 +INSTRUMENTATION_STATUS: numtests=4 INSTRUMENTATION_STATUS: stream= -Error in on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError(net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest): -java.net.UnknownHostException: Artem test - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError.1.invoke(AddCreditCardForUserWithNoPaymentsTest.kt:245) - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError.1.invoke(AddCreditCardForUserWithNoPaymentsTest.kt:44) - at net.juno.rd.functional_tests.screens.AddCreditCardScreen.Companion.invoke(AddCreditCardScreen.kt:23) - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError(AddCreditCardForUserWithNoPaymentsTest.kt:238) +Error in test1(com.example.test.TestClass): +java.net.UnknownHostException: Test Exception + at com.example.test.TestClass.test1.1.invoke(TestClass.kt:245) + at com.example.test.TestClass.test1.1.invoke(TestClass.kt:44) + at com.example.test.TestClass.test1(TestClass.kt:238) at java.lang.reflect.Method.invoke(Native Method) at org.junit.runners.model.FrameworkMethod.1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) @@ -22,11 +21,10 @@ java.net.UnknownHostException: Artem test at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.rules.ExpectedException.ExpectedExceptionStatement.evaluate(ExpectedException.java:239) - at net.juno.rd.functional_tests.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) - at com.gojuno.mockserver1.ServerImpl.apply.1.evaluate(ServerImpl.kt:112) - at net.juno.rd.functional_tests.utils.RetryRule.runTest(RetryRule.kt:43) - at net.juno.rd.functional_tests.utils.RetryRule.access.runTest(RetryRule.kt:14) - at net.juno.rd.functional_tests.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) + at com.example.test.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) + at com.example.test.utils.RetryRule.runTest(RetryRule.kt:43) + at com.example.test.utils.RetryRule.access.runTest(RetryRule.kt:14) + at com.example.test.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) @@ -52,13 +50,12 @@ java.net.UnknownHostException: Artem test at android.app.Instrumentation.InstrumentationThread.run(Instrumentation.java:1932) INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest -INSTRUMENTATION_STATUS: stack=java.net.UnknownHostException: Artem test - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError.1.invoke(AddCreditCardForUserWithNoPaymentsTest.kt:245) - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError.1.invoke(AddCreditCardForUserWithNoPaymentsTest.kt:44) - at net.juno.rd.functional_tests.screens.AddCreditCardScreen.Companion.invoke(AddCreditCardScreen.kt:23) - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError(AddCreditCardForUserWithNoPaymentsTest.kt:238) +INSTRUMENTATION_STATUS: test=test1 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass +INSTRUMENTATION_STATUS: stack=java.net.UnknownHostException: Test Exception + at com.example.test.TestClass.test1.1.invoke(TestClass.kt:245) + at com.example.test.TestClass.test1.1.invoke(TestClass.kt:44) + at com.example.test.TestClass.test1(TestClass.kt:238) at java.lang.reflect.Method.invoke(Native Method) at org.junit.runners.model.FrameworkMethod.1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) @@ -66,11 +63,10 @@ INSTRUMENTATION_STATUS: stack=java.net.UnknownHostException: Artem test at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.rules.ExpectedException.ExpectedExceptionStatement.evaluate(ExpectedException.java:239) - at net.juno.rd.functional_tests.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) - at com.gojuno.mockserver1.ServerImpl.apply.1.evaluate(ServerImpl.kt:112) - at net.juno.rd.functional_tests.utils.RetryRule.runTest(RetryRule.kt:43) - at net.juno.rd.functional_tests.utils.RetryRule.access.runTest(RetryRule.kt:14) - at net.juno.rd.functional_tests.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) + at com.example.test.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) + at com.example.test.utils.RetryRule.runTest(RetryRule.kt:43) + at com.example.test.utils.RetryRule.access.runTest(RetryRule.kt:14) + at com.example.test.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) @@ -97,206 +93,58 @@ INSTRUMENTATION_STATUS: stack=java.net.UnknownHostException: Artem test INSTRUMENTATION_STATUS: current=1 INSTRUMENTATION_STATUS_CODE: -2 -INSTRUMENTATION_STATUS: numtests=14 +INSTRUMENTATION_STATUS: numtests=4 INSTRUMENTATION_STATUS: stream= INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onMastercardCreditCardFirst2NumbersEnteredDisplaysMasterCardIcon -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest +INSTRUMENTATION_STATUS: test=test2 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=2 INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 +INSTRUMENTATION_STATUS: numtests=4 INSTRUMENTATION_STATUS: stream=. INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onMastercardCreditCardFirst2NumbersEnteredDisplaysMasterCardIcon -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest +INSTRUMENTATION_STATUS: test=test2 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=2 INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 +INSTRUMENTATION_STATUS: numtests=4 INSTRUMENTATION_STATUS: stream= -net.juno.rd.functional_tests.tests.AddCreditCardForUserWithPaymentMethod: +com.example.test.TestClass: INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=successfullyAddsAmericanExpressCardShowsNumberForItAndItIsNotDefault -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.AddCreditCardForUserWithPaymentMethod +INSTRUMENTATION_STATUS: test=test3 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=3 INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 +INSTRUMENTATION_STATUS: numtests=4 INSTRUMENTATION_STATUS: stream=. INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=successfullyAddsAmericanExpressCardShowsNumberForItAndItIsNotDefault -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.AddCreditCardForUserWithPaymentMethod +INSTRUMENTATION_STATUS: test=test3 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=3 INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 +INSTRUMENTATION_STATUS: numtests=4 INSTRUMENTATION_STATUS: stream= INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=successfullyAddsMasterCardShowsNumberForItAndItIsNotDefault -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.AddCreditCardForUserWithPaymentMethod +INSTRUMENTATION_STATUS: test=test4 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=4 INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 +INSTRUMENTATION_STATUS: numtests=4 INSTRUMENTATION_STATUS: stream=. INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=successfullyAddsMasterCardShowsNumberForItAndItIsNotDefault -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.AddCreditCardForUserWithPaymentMethod +INSTRUMENTATION_STATUS: test=test4 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=4 INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -net.juno.rd.functional_tests.tests.ConfirmationWithUserWithNoPaymentMethodTest: -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onAddPaymentButtonTappedOpensAddCreditCardScreen -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.ConfirmationWithUserWithNoPaymentMethodTest -INSTRUMENTATION_STATUS: current=5 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onAddPaymentButtonTappedOpensAddCreditCardScreen -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.ConfirmationWithUserWithNoPaymentMethodTest -INSTRUMENTATION_STATUS: current=5 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -net.juno.rd.functional_tests.tests.ForgotPasswordTest: -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onEmailAddressFieldInvalidTextEnteredEmailMeAResetLinkButtonIsNotActive -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.ForgotPasswordTest -INSTRUMENTATION_STATUS: current=6 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onEmailAddressFieldInvalidTextEnteredEmailMeAResetLinkButtonIsNotActive -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.ForgotPasswordTest -INSTRUMENTATION_STATUS: current=6 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -net.juno.rd.functional_tests.tests.ForgotPasswordWithPredefinedEmailTest: -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=tapOnResetLinkShowsAlert -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.ForgotPasswordWithPredefinedEmailTest -INSTRUMENTATION_STATUS: current=7 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=tapOnResetLinkShowsAlert -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.ForgotPasswordWithPredefinedEmailTest -INSTRUMENTATION_STATUS: current=7 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -net.juno.rd.functional_tests.tests.LoginTest: -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onEmailEnteredAndLoginButtonTappedShowsPasswordCannotBeEmpty -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.LoginTest -INSTRUMENTATION_STATUS: current=8 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onEmailEnteredAndLoginButtonTappedShowsPasswordCannotBeEmpty -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.LoginTest -INSTRUMENTATION_STATUS: current=8 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onLoginWithUnsettledDebtDisplaysYourPaymentMethodDeclinedAlert -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.LoginTest -INSTRUMENTATION_STATUS: current=9 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onLoginWithUnsettledDebtDisplaysYourPaymentMethodDeclinedAlert -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.LoginTest -INSTRUMENTATION_STATUS: current=9 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -net.juno.rd.functional_tests.tests.SignUpFirstNameTest: -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onPhotoIconTappedShowsChoosePhotoOptionInAppropriatePanel -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpFirstNameTest -INSTRUMENTATION_STATUS: current=10 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onPhotoIconTappedShowsChoosePhotoOptionInAppropriatePanel -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpFirstNameTest -INSTRUMENTATION_STATUS: current=10 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onBackButtonTappedNavigatesToSignUpPasswordScreenWithEnteredPassword -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpFirstNameTest -INSTRUMENTATION_STATUS: current=11 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onBackButtonTappedNavigatesToSignUpPasswordScreenWithEnteredPassword -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpFirstNameTest -INSTRUMENTATION_STATUS: current=11 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -net.juno.rd.functional_tests.tests.SignUpLastNameTest: -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onOkTappedClosesWeCannotVerifyYourNumberAlertAndNavigatesToSignUpPhoneScreenWithEnteredEarlierPhoneNumber -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpLastNameTest -INSTRUMENTATION_STATUS: current=12 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onOkTappedClosesWeCannotVerifyYourNumberAlertAndNavigatesToSignUpPhoneScreenWithEnteredEarlierPhoneNumber -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpLastNameTest -INSTRUMENTATION_STATUS: current=12 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -net.juno.rd.functional_tests.tests.SignUpPhoneTest: -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onCloseButtonTappedNavigatesToOnboardingScreen -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpPhoneTest -INSTRUMENTATION_STATUS: current=13 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onCloseButtonTappedNavigatesToOnboardingScreen -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpPhoneTest -INSTRUMENTATION_STATUS: current=13 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream= -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onPhoneNumberEnteredDisplaysClearButton -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpPhoneTest -INSTRUMENTATION_STATUS: current=14 -INSTRUMENTATION_STATUS_CODE: 1 -INSTRUMENTATION_STATUS: numtests=14 -INSTRUMENTATION_STATUS: stream=. -INSTRUMENTATION_STATUS: id=AndroidJUnitRunner -INSTRUMENTATION_STATUS: test=onPhoneNumberEnteredDisplaysClearButton -INSTRUMENTATION_STATUS: class=net.juno.rd.functional_tests.tests.SignUpPhoneTest -INSTRUMENTATION_STATUS: current=14 -INSTRUMENTATION_STATUS_CODE: 0 -INSTRUMENTATION_RESULT: stream= Time: 96.641 There was 1 failure: -1) on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError(net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest) -java.net.UnknownHostException: Artem test - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError.1.invoke(AddCreditCardForUserWithNoPaymentsTest.kt:245) - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError.1.invoke(AddCreditCardForUserWithNoPaymentsTest.kt:44) - at net.juno.rd.functional_tests.screens.AddCreditCardScreen.Companion.invoke(AddCreditCardScreen.kt:23) - at net.juno.rd.functional_tests.tests.AddCreditCardForUserWithNoPaymentsTest.on400WithUnknownErrorReceivedOnAddPaymentMethodShowsGenericServerError(AddCreditCardForUserWithNoPaymentsTest.kt:238) +1) test1(com.example.test.TestClass) +java.net.UnknownHostException: Test Exception + at com.example.test.TestClass.test1.1.invoke(TestClass.kt:245) + at com.example.test.TestClass.test1.1.invoke(TestClass.kt:44) + at com.example.test.screens.AddCreditCardScreen.Companion.invoke(AddCreditCardScreen.kt:23) + at com.example.test.TestClass.test1(TestClass.kt:238) at java.lang.reflect.Method.invoke(Native Method) at org.junit.runners.model.FrameworkMethod.1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) @@ -304,11 +152,10 @@ java.net.UnknownHostException: Artem test at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.rules.ExpectedException.ExpectedExceptionStatement.evaluate(ExpectedException.java:239) - at net.juno.rd.functional_tests.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) - at com.gojuno.mockserver1.ServerImpl.apply.1.evaluate(ServerImpl.kt:112) - at net.juno.rd.functional_tests.utils.RetryRule.runTest(RetryRule.kt:43) - at net.juno.rd.functional_tests.utils.RetryRule.access.runTest(RetryRule.kt:14) - at net.juno.rd.functional_tests.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) + at com.example.test.utils.LaunchAppRule.apply.1.evaluate(LaunchAppRule.kt:36) + at com.example.test.utils.RetryRule.runTest(RetryRule.kt:43) + at com.example.test.utils.RetryRule.access.runTest(RetryRule.kt:14) + at com.example.test.utils.RetryRule.apply.1.evaluate(RetryRule.kt:29) at org.junit.rules.RunRules.evaluate(RunRules.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) @@ -334,7 +181,7 @@ java.net.UnknownHostException: Artem test at android.app.Instrumentation.InstrumentationThread.run(Instrumentation.java:1932) FAILURES!!! -Tests run: 14, Failures: 1 +Tests run: 4, Failures: 1 INSTRUMENTATION_CODE: -1 diff --git a/composer/src/test/resources/instrumentation-output-ignored-test.txt b/composer/src/test/resources/instrumentation-output-ignored-test.txt index 24b4c66..98f3115 100644 --- a/composer/src/test/resources/instrumentation-output-ignored-test.txt +++ b/composer/src/test/resources/instrumentation-output-ignored-test.txt @@ -1,30 +1,30 @@ INSTRUMENTATION_STATUS: numtests=2 INSTRUMENTATION_STATUS: stream= -com.example.functional_tests.tests.TestClass: +com.example.test.TestClass: INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test1 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.TestClass +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=1 INSTRUMENTATION_STATUS_CODE: 1 INSTRUMENTATION_STATUS: numtests=2 INSTRUMENTATION_STATUS: stream=. INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test1 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.TestClass +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=1 INSTRUMENTATION_STATUS_CODE: 0 INSTRUMENTATION_STATUS: numtests=2 INSTRUMENTATION_STATUS: stream= INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test2 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.TestClass +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=2 INSTRUMENTATION_STATUS_CODE: 1 INSTRUMENTATION_STATUS: numtests=2 INSTRUMENTATION_STATUS: stream= INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test2 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.TestClass +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=2 INSTRUMENTATION_STATUS_CODE: -3 INSTRUMENTATION_RESULT: stream= diff --git a/composer/src/test/resources/instrumentation-unordered-output.txt b/composer/src/test/resources/instrumentation-unordered-output.txt index 73904d3..0f1a8c5 100644 --- a/composer/src/test/resources/instrumentation-unordered-output.txt +++ b/composer/src/test/resources/instrumentation-unordered-output.txt @@ -1,45 +1,45 @@ INSTRUMENTATION_STATUS: numtests=3 INSTRUMENTATION_STATUS: stream= -com.example.functional_tests.tests.TestClass1: +com.example.test.TestClass: INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test1 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.tests.TestClass1 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=1 INSTRUMENTATION_STATUS_CODE: 1 INSTRUMENTATION_STATUS: numtests=3 INSTRUMENTATION_STATUS: stream=. INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test1 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.tests.TestClass1 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=1 INSTRUMENTATION_STATUS_CODE: 0 INSTRUMENTATION_STATUS: numtests=3 INSTRUMENTATION_STATUS: stream= -com.example.functional_tests.tests.TestClass2: +com.example.test.TestClass: INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test2 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.tests.TestClass2 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=2 INSTRUMENTATION_STATUS_CODE: 1 INSTRUMENTATION_STATUS: numtests=3 INSTRUMENTATION_STATUS: stream= INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test3 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.tests.TestClass2 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=3 INSTRUMENTATION_STATUS_CODE: 1 INSTRUMENTATION_STATUS: numtests=3 INSTRUMENTATION_STATUS: stream=. INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test2 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.tests.TestClass2 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=2 INSTRUMENTATION_STATUS_CODE: 0 INSTRUMENTATION_STATUS: numtests=3 INSTRUMENTATION_STATUS: stream=. INSTRUMENTATION_STATUS: id=AndroidJUnitRunner INSTRUMENTATION_STATUS: test=test3 -INSTRUMENTATION_STATUS: class=com.example.functional_tests.tests.TestClass2 +INSTRUMENTATION_STATUS: class=com.example.test.TestClass INSTRUMENTATION_STATUS: current=3 INSTRUMENTATION_STATUS_CODE: 0