Revert "[K2/N] KT-57026, KT-57208: Adjust Native & JS test infrastructures for MPP testing"

This reverts commit 6964121c15.
This commit is contained in:
Nikolay Krasko
2023-03-10 11:58:03 +01:00
committed by teamcity
parent aed6272107
commit c0c692844e
51 changed files with 106 additions and 187 deletions
@@ -32,7 +32,7 @@ abstract class AbstractNativeCInteropBaseTest : AbstractNativeSimpleTest() {
internal fun generateCInteropTestCaseWithSingleDef(defFile: File, extraArgs: List<String>): TestCase {
val moduleName: String = defFile.name
val module = TestModule.Exclusive(moduleName, emptySet(), emptySet(), emptySet())
val module = TestModule.Exclusive(moduleName, emptySet(), emptySet())
module.files += TestFile.createCommitted(defFile, module)
return TestCase(
@@ -56,7 +56,7 @@ abstract class AbstractNativeCInteropKT39120Test : AbstractNativeCInteropBaseTes
val ktFile = testPathFull.resolve(DEFAULT_FILE_NAME)
if (ktFile.exists()) {
// Just compile "main.kt" with klib1 and klib2, without running resulting executable
val module = TestModule.Exclusive(DEFAULT_MODULE_NAME, emptySet(), emptySet(), emptySet()).apply {
val module = TestModule.Exclusive(DEFAULT_MODULE_NAME, emptySet(), emptySet()).apply {
files += TestFile.createCommitted(ktFile, this)
}
val compilationResult = compileToExecutable(
@@ -107,7 +107,6 @@ abstract class AbstractNativeKlibABITest : AbstractNativeSimpleTest() {
settings = testRunSettings,
freeCompilerArgs = COMPILER_ARGS_FOR_STATIC_CACHE_AND_EXECUTABLE,
options = StaticCacheCompilation.Options.Regular,
pipelineType = testRunSettings.get(),
dependencies = createLibraryCacheDependencies(moduleDependencies) + klibArtifact.toDependency(),
expectedArtifact = klibArtifact.toStaticCacheArtifact()
)
@@ -119,8 +118,7 @@ abstract class AbstractNativeKlibABITest : AbstractNativeSimpleTest() {
name = moduleName,
directDependencySymbols = emptySet(), /* Don't need to pass any dependency symbols here.
Dependencies are already handled by the AbstractKlibABITestCase class. */
directFriendSymbols = emptySet(),
directDependsOnSymbols = emptySet(),
directFriendSymbols = emptySet()
)
private fun createTestCase(module: TestModule.Exclusive, compilerArgs: TestCompilerArgs) = TestCase(
@@ -127,7 +127,6 @@ abstract class AbstractNativeKlibBinaryCompatibilityTest : AbstractNativeSimpleT
settings = testRunSettings,
freeCompilerArgs = COMPILER_ARGS_FOR_STATIC_CACHE_AND_EXECUTABLE,
options = StaticCacheCompilation.Options.Regular,
pipelineType = testRunSettings.get(),
dependencies = moduleDependencies.map {
it.klibFile.toStaticCacheArtifact().toDependency()
} + klib.toKlib().toDependency(),
@@ -143,8 +142,7 @@ abstract class AbstractNativeKlibBinaryCompatibilityTest : AbstractNativeSimpleT
val module: TestModule.Exclusive = TestModule.Exclusive(
name = name,
directDependencySymbols = emptySet(),
directFriendSymbols = emptySet(),
directDependsOnSymbols = emptySet(),
directFriendSymbols = emptySet()
)
val localBuildDir: File =
@@ -39,7 +39,7 @@ abstract class AbstractNativeKlibContentsTest : AbstractNativeSimpleTest() {
private fun generateTestCaseWithSingleSource(source: File, extraArgs: List<String>): TestCase {
val moduleName: String = source.name
val module = TestModule.Exclusive(moduleName, emptySet(), emptySet(), emptySet())
val module = TestModule.Exclusive(moduleName, emptySet(), emptySet())
module.files += TestFile.createCommitted(source, module)
return TestCase(
@@ -80,7 +80,6 @@ internal fun AbstractNativeSimpleTest.compileToStaticCache(
settings = testRunSettings,
freeCompilerArgs = TestCompilerArgs.EMPTY,
StaticCacheCompilation.Options.Regular,
pipelineType = testRunSettings.get(),
dependencies = listOf(klib.asLibraryDependency()),
expectedArtifact = TestCompilationArtifact.KLIBStaticCache(cacheDir, klib)
)
@@ -92,7 +91,7 @@ internal fun AbstractNativeSimpleTest.generateTestCaseWithSingleModule(
freeCompilerArgs: TestCompilerArgs = TestCompilerArgs.EMPTY
): TestCase {
val moduleName: String = moduleDir?.name ?: LAUNCHER_MODULE_NAME
val module = TestModule.Exclusive(moduleName, emptySet(), emptySet(), emptySet())
val module = TestModule.Exclusive(moduleName, emptySet(), emptySet())
moduleDir?.walkTopDown()
?.filter { it.isFile && it.extension == "kt" }
@@ -9,7 +9,6 @@ package org.jetbrains.kotlin.konan.blackboxtest.support
import org.jetbrains.kotlin.konan.blackboxtest.support.TestCase.WithTestRunnerExtras
import org.jetbrains.kotlin.konan.blackboxtest.support.TestModule.Companion.allDependencies
import org.jetbrains.kotlin.konan.blackboxtest.support.TestModule.Companion.allDependsOn
import org.jetbrains.kotlin.konan.blackboxtest.support.runner.TestRunChecks
import org.jetbrains.kotlin.konan.blackboxtest.support.util.*
import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -86,19 +85,16 @@ internal sealed class TestModule {
data class Exclusive(
override val name: String,
val directDependencySymbols: Set<String>,
val directFriendSymbols: Set<String>,
val directDependsOnSymbols: Set<String>, // mimics the name from ModuleStructureExtractorImpl, thought later converted to `-Xfragment-refines` parameter
val directFriendSymbols: Set<String>
) : TestModule() {
override val files: FailOnDuplicatesSet<TestFile<Exclusive>> = FailOnDuplicatesSet()
lateinit var directDependencies: Set<TestModule>
lateinit var directFriends: Set<TestModule>
lateinit var directDependsOn: Set<TestModule>
// N.B. The following two properties throw an exception on attempt to resolve cyclic dependencies.
val allDependencies: Set<TestModule> by SM.lazyNeighbors({ directDependencies }, { it.allDependencies })
val allFriends: Set<TestModule> by SM.lazyNeighbors({ directFriends }, { it.allFriends })
val allDependsOn: Set<TestModule> by SM.lazyNeighbors({ directDependsOn }, { it.allDependsOn })
lateinit var testCase: TestCase
@@ -107,9 +103,7 @@ internal sealed class TestModule {
}
fun haveSameSymbols(other: Exclusive) =
other.directDependencySymbols == directDependencySymbols &&
other.directFriendSymbols == directFriendSymbols &&
other.directDependsOnSymbols == directDependsOnSymbols
other.directDependencySymbols == directDependencySymbols && other.directFriendSymbols == directFriendSymbols
}
data class Shared(override val name: String) : TestModule() {
@@ -128,7 +122,7 @@ internal sealed class TestModule {
final override fun toString() = "${javaClass.canonicalName}[name=$name]"
companion object {
fun newDefaultModule() = Exclusive(DEFAULT_MODULE_NAME, emptySet(), emptySet(), emptySet())
fun newDefaultModule() = Exclusive(DEFAULT_MODULE_NAME, emptySet(), emptySet())
val TestModule.allDependencies: Set<TestModule>
get() = when (this) {
@@ -142,12 +136,6 @@ internal sealed class TestModule {
is Shared, is Given -> emptySet()
}
val TestModule.allDependsOn: Set<TestModule>
get() = when (this) {
is Exclusive -> allDependsOn
is Shared, is Given -> emptySet()
}
private val SM = LockBasedStorageManager(TestModule::class.java.name)
}
}
@@ -210,13 +198,11 @@ internal class TestCase(
modules.forEach { module ->
allModules += module
allModules += module.allDependencies
allModules += module.allDependsOn
}
val rootModules = allModules.toHashSet()
allModules.forEach { module ->
rootModules -= module.allDependencies
rootModules -= module.allDependsOn
}
assertTrue(rootModules.isNotEmpty()) { "$id: No root modules in test case." }
@@ -271,7 +257,6 @@ internal class TestCase(
}
module.directFriends = module.directFriendSymbols.mapToSet(::findModule)
module.directDependsOn = module.directDependsOnSymbols.mapToSet(::findModule)
}
}
}
@@ -242,14 +242,13 @@ internal fun parseModule(parsedDirective: RegisteredDirectivesParser.ParsedDirec
val name = match.groupValues[1]
val directDependencySymbols = match.groupValues[3].split(',').filter(String::isNotEmpty).toSet()
val directFriendSymbols = match.groupValues[5].split(',').filter(String::isNotEmpty).toSet()
val directDependsOnSymbols = match.groupValues[7].split(',').filter(String::isNotEmpty).toSet()
val friendsThatAreNotDependencies = directFriendSymbols - directDependencySymbols
assertTrue(friendsThatAreNotDependencies.isEmpty()) {
"$location: Found friends that are not dependencies: $friendsThatAreNotDependencies"
}
TestModule.Exclusive(name, directDependencySymbols, directFriendSymbols, directDependsOnSymbols)
TestModule.Exclusive(name, directDependencySymbols, directFriendSymbols)
}
return module ?: fail {
@@ -260,11 +259,7 @@ internal fun parseModule(parsedDirective: RegisteredDirectivesParser.ParsedDirec
}
}
private val TEST_MODULE_REGEX = Regex("^([a-zA-Z0-9_]+)(" + // name
"\\(([a-zA-Z0-9_,]*)\\)" + // dependencies
"(\\(([a-zA-Z0-9_,]*)\\))?" + // friends
"(\\(([a-zA-Z0-9_,]*)\\))?" + // dependsOn
")?$")
private val TEST_MODULE_REGEX = Regex("^([a-zA-Z0-9_]+)(\\(([a-zA-Z0-9_,]*)\\)(\\(([a-zA-Z0-9_,]*)\\))?)?$")
internal fun parseFileName(parsedDirective: RegisteredDirectivesParser.ParsedDirective, location: Location): String {
val fileName = parsedDirective.values.singleOrNull()?.toString()
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.konan.blackboxtest.support.compilation
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.konan.blackboxtest.support.*
import org.jetbrains.kotlin.konan.blackboxtest.support.TestCase.*
import org.jetbrains.kotlin.konan.blackboxtest.support.TestModule.Companion.allDependsOn
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.ExecutableCompilation.Companion.applyTestRunnerSpecificArgs
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.ExecutableCompilation.Companion.assertTestDumpFileNotEmptyIfExists
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationArtifact.*
@@ -155,7 +154,6 @@ internal abstract class SourceBasedCompilation<A : TestCompilationArtifact>(
gcType.compilerFlag?.let { compilerFlag -> add(compilerFlag) }
gcScheduler.compilerFlag?.let { compilerFlag -> add(compilerFlag) }
pipelineType.compilerFlags.forEach { compilerFlag -> add(compilerFlag) }
applyK2MPPArgs(this)
}
override fun applyDependencies(argsBuilder: ArgsBuilder): Unit = with(argsBuilder) {
@@ -165,17 +163,6 @@ internal abstract class SourceBasedCompilation<A : TestCompilationArtifact>(
}
add(dependencies.includedLibraries) { include -> "-Xinclude=${include.path}" }
}
private fun applyK2MPPArgs(argsBuilder: ArgsBuilder): Unit = with(argsBuilder) {
if (pipelineType == PipelineType.K2 && freeCompilerArgs.compilerArgs.any { it == "-XXLanguage:+MultiPlatformProjects" }) {
sourceModules.mapToSet { "-Xfragments=${it.name}" }
.sorted().forEach { add(it) }
sourceModules.flatMapToSet { module -> module.allDependsOn.map { "-Xfragment-refines=${module.name}:${it.name}" } }
.sorted().forEach { add(it) }
sourceModules.flatMapToSet { module -> module.files.map { "-Xfragment-sources=${module.name}:${it.location.path}" } }
.sorted().forEach { add(it) }
}
}
}
internal class LibraryCompilation(
@@ -351,7 +338,6 @@ internal class StaticCacheCompilation(
settings: Settings,
freeCompilerArgs: TestCompilerArgs,
private val options: Options,
private val pipelineType: PipelineType,
dependencies: Iterable<TestCompilationDependency<*>>,
expectedArtifact: KLIBStaticCache
) : BasicCompilation<KLIBStaticCache>(
@@ -381,7 +367,6 @@ internal class StaticCacheCompilation(
override fun applySpecificArgs(argsBuilder: ArgsBuilder): Unit = with(argsBuilder) {
add("-produce", "static_cache")
pipelineType.compilerFlags.forEach { compilerFlag -> add(compilerFlag) }
when (options) {
is Options.Regular -> Unit /* Nothing to do. */
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilati
* [Library] - the [TestCompilation]s (modules) that should yield KLIBs to be consumed as dependency libraries in the current compilation.
* [FriendLibrary] - similarly but friend modules (-friend-modules).
* [IncludedLibrary] - similarly but included modules (-Xinclude).
* Note: there cannot be DependsOnLibrary type, since `dependsOn` dependency works only within a KLIB, not between KLIBs.
*/
internal sealed class TestCompilationDependencyType<A : TestCompilationArtifact>(private val artifactClass: Class<A>) {
object Library : TestCompilationDependencyType<KLIB>(KLIB::class.java)
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.konan.blackboxtest.support.TestCase.*
import org.jetbrains.kotlin.konan.blackboxtest.support.TestCompilerArgs
import org.jetbrains.kotlin.konan.blackboxtest.support.TestModule
import org.jetbrains.kotlin.konan.blackboxtest.support.TestModule.Companion.allDependencies
import org.jetbrains.kotlin.konan.blackboxtest.support.TestModule.Companion.allDependsOn
import org.jetbrains.kotlin.konan.blackboxtest.support.TestModule.Companion.allFriends
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationArtifact.*
import org.jetbrains.kotlin.konan.blackboxtest.support.compilation.TestCompilationDependencyType.*
@@ -159,7 +158,7 @@ internal class TestCompilationFactory {
LibraryCompilation(
settings = settings,
freeCompilerArgs = freeCompilerArgs,
sourceModules = sourceModules.flatMapToSet { sortDependsOnTopologically(it) },
sourceModules = sourceModules,
dependencies = dependencies.forKlib(),
expectedArtifact = klibArtifact
)
@@ -170,7 +169,6 @@ internal class TestCompilationFactory {
settings = settings,
freeCompilerArgs = freeCompilerArgs,
options = staticCacheOptions,
pipelineType = settings.get(),
dependencies = dependencies.forStaticCache(klibCompilation.asKlibDependency(type = /* does not matter in fact*/ Library)),
expectedArtifact = staticCacheArtifact
)
@@ -205,23 +203,6 @@ internal class TestCompilationFactory {
return CompilationDependencies(klibDependencies, staticCacheDependencies)
}
// mimics FirFrontendFacade.sortDependsOnTopologically(org.jetbrains.kotlin.test.model.TestModule)
private fun sortDependsOnTopologically(module: TestModule): List<TestModule> {
val sortedModules = mutableListOf<TestModule>()
val visitedModules = mutableSetOf<TestModule>()
val modulesQueue = ArrayDeque<TestModule>()
modulesQueue.add(module)
while (modulesQueue.isNotEmpty()) {
val currentModule = modulesQueue.removeFirst()
if (!visitedModules.add(currentModule)) continue
sortedModules.add(currentModule)
modulesQueue += currentModule.allDependsOn
}
return sortedModules.reversed()
}
companion object {
private fun Set<TestModule>.allDependencies() = if (size == 1) first().allDependencies else flatMapToSet { it.allDependencies }
private fun Set<TestModule>.allFriends() = if (size == 1) first().allFriends else flatMapToSet { it.allFriends }
@@ -12,7 +12,6 @@ import com.intellij.pom.PomModel
import com.intellij.pom.core.impl.PomModelImpl
import com.intellij.pom.tree.TreeAspect
import com.intellij.psi.impl.source.tree.TreeCopyHandler
import org.jetbrains.kotlin.ObsoleteTestInfrastructure
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
@@ -658,8 +657,7 @@ private class ExtTestDataFileStructureFactory(parentDisposable: Disposable) : Te
destination = TestModule.Exclusive(
name = extTestModule.name,
directDependencySymbols = extTestModule.dependencies.mapToSet(::transformDependency),
directFriendSymbols = extTestModule.friends.mapToSet(::transformDependency),
directDependsOnSymbols = extTestModule.dependsOn.mapToSet(::transformDependency),
directFriendSymbols = extTestModule.friends.mapToSet(::transformDependency)
),
baseDir = testCaseDir
) { module, file -> module.files += file }
@@ -706,15 +704,11 @@ private class ExtTestDataFileStructureFactory(parentDisposable: Disposable) : Te
private fun checkModulesConsistency() {
filesAndModules.modules.values.forEach { module ->
val unknownFriends = (module.friendsSymbols + module.friends.map { it.name }).toSet() - filesAndModules.modules.keys
assertTrue(unknownFriends.isEmpty()) { "Module $module has unknown friends: $unknownFriends" }
val unknownDependencies =
(module.dependenciesSymbols + module.dependencies.map { it.name }).toSet() - filesAndModules.modules.keys
val unknownDependsOn =
(module.dependsOnSymbols + module.dependsOn.map { it.name }).toSet() - filesAndModules.modules.keys
val unknownAllDependencies = unknownDependencies + unknownFriends + unknownDependsOn
assertTrue(unknownAllDependencies.isEmpty()) { "Module $module has unknown dependencies: $unknownAllDependencies" }
assertTrue(unknownDependencies.isEmpty()) { "Module $module has unknown dependencies: $unknownDependencies" }
assertTrue(module.files.isNotEmpty()) { "Module $module has no files" }
}
@@ -724,9 +718,8 @@ private class ExtTestDataFileStructureFactory(parentDisposable: Disposable) : Te
private class ExtTestModule(
name: String,
dependencies: List<String>,
friends: List<String>,
dependsOn: List<String>, // mimics the name from ModuleStructureExtractorImpl, thought later converted to `-Xfragment-refines` parameter
) : KotlinBaseTest.TestModule(name, dependencies, friends, dependsOn) {
friends: List<String>
) : KotlinBaseTest.TestModule(name, dependencies, friends) {
val files = mutableListOf<ExtTestFile>()
val isSupport get() = name == SUPPORT_MODULE_NAME
@@ -753,7 +746,6 @@ private class ExtTestDataFileStructureFactory(parentDisposable: Disposable) : Te
override fun hashCode() = name.hashCode() * 31 + module.hashCode()
}
@OptIn(ObsoleteTestInfrastructure::class)
private class ExtTestFileFactory : TestFiles.TestFileFactory<ExtTestModule, ExtTestFile> {
private val defaultModule by lazy { createModule(DEFAULT_MODULE_NAME, emptyList(), emptyList(), emptyList()) }
private val supportModule by lazy { createModule(SUPPORT_MODULE_NAME, emptyList(), emptyList(), emptyList()) }
@@ -772,14 +764,13 @@ private class ExtTestDataFileStructureFactory(parentDisposable: Disposable) : Te
)
}
override fun createModule(name: String, dependencies: List<String>, friends: List<String>, dependsOn: List<String>): ExtTestModule =
ExtTestModule(name, dependencies, friends, dependsOn)
override fun createModule(name: String, dependencies: List<String>, friends: List<String>, abiVersions: List<Int>): ExtTestModule =
ExtTestModule(name, dependencies, friends)
}
private inner class FilesAndModules(originalTestDataFile: File, sourceTransformers: ExternalSourceTransformers) {
private val testFileFactory = ExtTestFileFactory()
@OptIn(ObsoleteTestInfrastructure::class)
private val generatedFiles = TestFiles.createTestFiles(
/* testFileName = */ DEFAULT_FILE_NAME,
/* expectedText = */ originalTestDataFile.readText(),
@@ -49,8 +49,7 @@ internal class PredefinedTestCaseGroupProvider(annotation: PredefinedTestCases)
val module = TestModule.Exclusive(
name = testCaseId.uniqueName,
directDependencySymbols = emptySet(),
directFriendSymbols = emptySet(),
directDependsOnSymbols = emptySet(),
directFriendSymbols = emptySet()
)
val ignoredFiles = predefinedTestCase.ignoredFiles.map { it.absoluteNormalizedFile() }