[IC] Add unit tests for CachesManager closing in transaction

#KT-56052 In Progress
This commit is contained in:
Alexander.Likhachev
2023-01-30 21:36:49 +01:00
committed by Space Team
parent 2bff38dd27
commit 04a5c7761c
@@ -10,10 +10,22 @@ import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.junit.jupiter.api.io.TempDir
import java.io.Closeable
import java.nio.file.Files
import java.nio.file.Path
private class CacheMock(private val throwsException: Boolean = false) : Closeable {
var closed = false
override fun close() {
if (throwsException) {
throw Exception()
}
closed = true
}
}
abstract class BaseCompilationTransactionTest {
@TempDir
protected lateinit var stashDir: Path
@@ -23,14 +35,55 @@ abstract class BaseCompilationTransactionTest {
abstract fun createTransaction(): CompilationTransaction
protected fun useTransaction(block: CompilationTransaction.() -> Unit) = createTransaction().also { it.use(block) }
protected fun useTransaction(block: CompilationTransaction.() -> Unit) = createTransaction().also { it.runWithin(body = block) }
@Test
fun testNoOp() {
useTransaction() {
useTransaction {
// do nothing
}
}
@Test
fun testCachesClosedOnSuccessfulTransaction() {
val cacheMock = CacheMock()
useTransaction {
cachesManager = cacheMock
markAsSuccessful()
}
assertTrue(cacheMock.closed)
}
@Test
fun testCachesClosedOnNonSuccessfulTransaction() {
val cacheMock = CacheMock()
useTransaction {
cachesManager = cacheMock
}
assertTrue(cacheMock.closed)
}
@Test
fun testCachesClosedOnExceptionInsideTransaction() {
val cacheMock = CacheMock()
assertThrows<Exception> {
useTransaction {
cachesManager = cacheMock
throw Exception()
}
}
assertTrue(cacheMock.closed)
}
@Test
fun testCachesCloseExceptionIsWrapped() {
val cacheMock = CacheMock(true)
assertThrows<CachesManagerCloseException> {
useTransaction {
cachesManager = cacheMock
}
}
}
}
class NonRecoverableCompilationTransactionTest : BaseCompilationTransactionTest() {
@@ -207,4 +260,42 @@ class RecoverableCompilationTransactionTest : BaseCompilationTransactionTest() {
}
assertFalse(Files.exists(file))
}
@Test
fun testChangesAreRevertedOnExecutionException() {
val file1 = workingDir.resolve("1.txt")
val file2 = workingDir.resolve("2.txt")
Files.write(file1, "something".toByteArray())
assertThrows<Exception> {
useTransaction {
registerAddedOrChangedFile(file1)
Files.write(file1, "other".toByteArray())
registerAddedOrChangedFile(file2)
Files.write(file2, "other".toByteArray())
markAsSuccessful()
throw Exception()
}
}
assertEquals("something", String(Files.readAllBytes(file1)))
assertFalse(Files.exists(file2))
}
@Test
fun testChangesAreRevertedOnCachesCloseException() {
val file1 = workingDir.resolve("1.txt")
val file2 = workingDir.resolve("2.txt")
Files.write(file1, "something".toByteArray())
assertThrows<CachesManagerCloseException> {
useTransaction {
cachesManager = CacheMock(true)
registerAddedOrChangedFile(file1)
Files.write(file1, "other".toByteArray())
registerAddedOrChangedFile(file2)
Files.write(file2, "other".toByteArray())
markAsSuccessful()
}
}
assertEquals("something", String(Files.readAllBytes(file1)))
assertFalse(Files.exists(file2))
}
}