[IC] Add unit tests for InMemoryStorageWrapper
#KT-56052 Fixed
This commit is contained in:
committed by
Space Team
parent
4aedf77431
commit
8bb0c5135b
+143
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.incremental.storage
|
||||
|
||||
import org.jetbrains.kotlin.incremental.IncrementalCompilationContext
|
||||
import org.jetbrains.kotlin.incremental.runWithin
|
||||
import org.jetbrains.kotlin.incremental.testingUtils.assertEqualDirectories
|
||||
import org.junit.jupiter.api.Assertions.*
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.api.io.TempDir
|
||||
import java.io.Closeable
|
||||
import java.nio.file.Files
|
||||
import java.nio.file.Path
|
||||
|
||||
class InMemoryStorageWrapperTest {
|
||||
@TempDir
|
||||
private lateinit var workingDir: Path
|
||||
|
||||
@Test
|
||||
fun testNoStorageIsCreatedOnFail() {
|
||||
val storageRoot = workingDir.resolve("storage")
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = true, successful = false) {
|
||||
val key = LookupSymbolKey("a", "a")
|
||||
it[key] = setOf(1, 2)
|
||||
it.append(key, setOf(3))
|
||||
}
|
||||
assertFalse(Files.exists(storageRoot))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testStorageIsProperlyCreatedOnSuccess() {
|
||||
val storageRoot = workingDir.resolve("storage")
|
||||
val key = LookupSymbolKey("a", "a")
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = true, successful = true) {
|
||||
it[key] = setOf(1, 2)
|
||||
it.append(key, setOf(3))
|
||||
}
|
||||
assertTrue(Files.isDirectory(storageRoot))
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = false, successful = true) {
|
||||
assertEquals(setOf(1, 2, 3), it[key])
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Covered scenarios:
|
||||
* - By existing key
|
||||
* - set (key3)
|
||||
* - append (key1)
|
||||
* - remove (key2)
|
||||
* - By non-existing key
|
||||
* - set (key5)
|
||||
* - append (key4)
|
||||
* - clean
|
||||
*/
|
||||
@Test
|
||||
fun testExistingStorageIsProperlyModifiedOnSuccess() {
|
||||
val storageRoot = workingDir.resolve("storage")
|
||||
val key1 = LookupSymbolKey("a", "a")
|
||||
val key2 = LookupSymbolKey("b", "b")
|
||||
val key3 = LookupSymbolKey("c", "c")
|
||||
val key4 = LookupSymbolKey("d", "d")
|
||||
val key5 = LookupSymbolKey("e", "e")
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = false, successful = true) {
|
||||
it[key1] = setOf(1, 2)
|
||||
it[key2] = setOf(1, 2)
|
||||
it[key3] = setOf(1)
|
||||
}
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = true, successful = true) {
|
||||
it.append(key1, setOf(3))
|
||||
it.remove(key2)
|
||||
it[key3] = setOf(5)
|
||||
it.append(key4, setOf(4))
|
||||
it.append(key5, setOf(5))
|
||||
}
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = false, successful = true) {
|
||||
assertEquals(setOf(1, 2, 3), it[key1])
|
||||
assertNull(it[key2])
|
||||
assertEquals(setOf(5), it[key3])
|
||||
assertEquals(setOf(4), it[key4])
|
||||
assertEquals(setOf(5), it[key5])
|
||||
}
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = true, successful = true) {
|
||||
it.clean()
|
||||
it.append(key1, setOf(4))
|
||||
}
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = false, successful = true) {
|
||||
assertEquals(setOf(4), it[key1])
|
||||
assertNull(it[key2])
|
||||
assertNull(it[key3])
|
||||
assertNull(it[key4])
|
||||
assertNull(it[key5])
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testExistingStorageIsNotModifiedOnFail() {
|
||||
val storageRoot = workingDir.resolve("storage")
|
||||
val key1 = LookupSymbolKey("a", "a")
|
||||
val key2 = LookupSymbolKey("b", "b")
|
||||
val key3 = LookupSymbolKey("c", "c")
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = false, successful = true) {
|
||||
it[key1] = setOf(1, 2)
|
||||
it[key2] = setOf(1, 2)
|
||||
}
|
||||
val savedState = workingDir.resolve("backup")
|
||||
storageRoot.toFile().copyRecursively(savedState.toFile())
|
||||
withLookupMapInTransaction(storageRoot, useInMemoryWrapper = true, successful = false) {
|
||||
it.clean()
|
||||
it.append(key1, setOf(3))
|
||||
it.remove(key2)
|
||||
it[key3] = setOf(5)
|
||||
}
|
||||
assertEqualDirectories(savedState.toFile(), storageRoot.toFile(), forgiveExtraFiles = false)
|
||||
}
|
||||
|
||||
private fun withLookupMapInTransaction(
|
||||
storageRoot: Path,
|
||||
useInMemoryWrapper: Boolean,
|
||||
successful: Boolean,
|
||||
dataProvider: (LookupMap) -> Unit
|
||||
) {
|
||||
val storageFile = storageRoot.resolve("lookup").toFile()
|
||||
val fileToPathConverter = RelativeFileToPathConverter(storageFile)
|
||||
val icContext = IncrementalCompilationContext(
|
||||
pathConverter = fileToPathConverter,
|
||||
keepIncrementalCompilationCachesInMemory = useInMemoryWrapper
|
||||
)
|
||||
icContext.transaction.runWithin { transaction ->
|
||||
val lookupMap = LookupMap(storageFile, icContext)
|
||||
transaction.cachesManager = Closeable {
|
||||
lookupMap.flush(false)
|
||||
lookupMap.close()
|
||||
}
|
||||
dataProvider(lookupMap)
|
||||
if (successful) {
|
||||
transaction.markAsSuccessful()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user