Fix handling of Throwable in tryTest/catch

Throwable could be used as a type argument to catch(), but it would
possibly never be caught, because the method only catches Exception.

Notably, junit assertions fail with AssertionError, which is not a
subclass of Exception. Due to that, tests or utilities like
DeviceConfigRule that have failing assertions in catch() would not
run the subsequent cleanup steps.

Bug: 210377950
Test: atest CleanupTest
Change-Id: I54e2922cb466f077ba4d219f8c3c6f885316296c
This commit is contained in:
Remi NGUYEN VAN
2022-06-21 12:52:10 +09:00
parent 53a144ea2e
commit a79814aade
2 changed files with 20 additions and 1 deletions

View File

@@ -174,6 +174,25 @@ class CleanupTest {
assertTrue(thrown.suppressedExceptions.isEmpty())
}
@Test
fun testAssertionErrorInCatch() {
var x = 1
val thrown = assertFailsWith<AssertionError> {
tryTest {
x = 2
throw TestException1()
}.catch<TestException1> {
x = 3
fail("Test failure in catch")
} cleanup {
assertTrue(x == 3)
x = 4
}
}
assertTrue(x == 4)
assertTrue(thrown.suppressedExceptions.isEmpty())
}
@Test
fun testMultipleCleanups() {
var x = 1

View File

@@ -90,7 +90,7 @@ inline class TryExpr<T>(val result: Result<T>) {
if (originalException !is E) return this
return TryExpr(try {
Result.success(block(originalException))
} catch (e: Exception) {
} catch (e: Throwable) {
Result.failure(e)
})
}