[MPP] Fix NewMultiplatformIT and make it run on arm macOS

^KT-58822
This commit is contained in:
Timofey Solonin
2023-06-27 22:37:00 +02:00
committed by Space Team
parent f467c970b2
commit d6d1ed6c35
9 changed files with 43 additions and 72 deletions
@@ -830,6 +830,14 @@ abstract class BaseGradleIT {
fun CompiledProject.assertTestResults( fun CompiledProject.assertTestResults(
@TestDataFile assertionFileName: String, @TestDataFile assertionFileName: String,
vararg testReportNames: String vararg testReportNames: String
) = assertTestResults(
resourcesRootFile.resolve(assertionFileName),
*testReportNames
)
fun CompiledProject.assertTestResults(
assertionXmlFile: File,
vararg testReportNames: String
) { ) {
val projectDir = project.projectDir val projectDir = project.projectDir
val testReportDirs = testReportNames.map { projectDir.resolve("build/test-results/$it").toPath() } val testReportDirs = testReportNames.map { projectDir.resolve("build/test-results/$it").toPath() }
@@ -844,7 +852,7 @@ abstract class BaseGradleIT {
val excl = "Invalid connection: com.apple.coresymbolicationd" val excl = "Invalid connection: com.apple.coresymbolicationd"
s.lines().filter { it != excl }.joinToString("\n") s.lines().filter { it != excl }.joinToString("\n")
} }
val expectedTestResults = prettyPrintXml(resourcesRootFile.resolve(assertionFileName).readText()) val expectedTestResults = prettyPrintXml(assertionXmlFile.readText())
assertEquals(expectedTestResults, actualTestResults) assertEquals(expectedTestResults, actualTestResults)
} }
@@ -22,11 +22,10 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX
import org.jetbrains.kotlin.gradle.plugin.sources.UnsatisfiedSourceSetVisibilityException import org.jetbrains.kotlin.gradle.plugin.sources.UnsatisfiedSourceSetVisibilityException
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.testbase.TestVersions import org.jetbrains.kotlin.gradle.testbase.*
import org.jetbrains.kotlin.gradle.testbase.assertHasDiagnostic
import org.jetbrains.kotlin.gradle.testbase.assertNoDiagnostic
import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.gradle.util.*
import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.library.KLIB_PROPERTY_SHORT_NAME import org.jetbrains.kotlin.library.KLIB_PROPERTY_SHORT_NAME
import org.jetbrains.kotlin.library.KLIB_PROPERTY_UNIQUE_NAME import org.jetbrains.kotlin.library.KLIB_PROPERTY_UNIQUE_NAME
import org.junit.Assert import org.junit.Assert
@@ -688,6 +687,14 @@ open class NewMultiplatformIT : BaseGradleIT() {
} }
} }
private val targetName = when (HostManager.host) {
KonanTarget.LINUX_X64 -> "linux64"
KonanTarget.MACOS_X64 -> "macos64"
KonanTarget.MACOS_ARM64 -> "macosArm64"
KonanTarget.MINGW_X64 -> "mingw64"
else -> fail("Unsupported host")
}
@Test @Test
fun testLibWithTests() = doTestLibWithTests(transformNativeTestProject("new-mpp-lib-with-tests", gradleVersion)) fun testLibWithTests() = doTestLibWithTests(transformNativeTestProject("new-mpp-lib-with-tests", gradleVersion))
@@ -737,7 +744,6 @@ open class NewMultiplatformIT : BaseGradleIT() {
arrayOf( arrayOf(
it + "com/example/lib/CommonKt.class", it + "com/example/lib/CommonKt.class",
it + "com/example/lib/MainKt.class", it + "com/example/lib/MainKt.class",
it + "Script.class",
it + "META-INF/new-mpp-lib-with-tests.kotlin_module" it + "META-INF/new-mpp-lib-with-tests.kotlin_module"
) )
}, },
@@ -751,22 +757,15 @@ open class NewMultiplatformIT : BaseGradleIT() {
) )
expectedKotlinOutputFiles.forEach { assertFileExists(it) } expectedKotlinOutputFiles.forEach { assertFileExists(it) }
val expectedTestResults = projectDir.resolve("TEST-all.xml")
// Gradle 6.6+ slightly changed format of xml test results expectedTestResults.replaceText("<target>", targetName)
// If, in the test project, preset name was updated,
// update accordingly test result output for Gradle 6.6+
val testGradleVersion = chooseWrapperVersionOrFinishTest()
val expectedTestResults = if (GradleVersion.version(testGradleVersion) < GradleVersion.version("6.6")) {
"testProject/new-mpp-lib-with-tests/TEST-all-pre6.6.xml"
} else {
"testProject/new-mpp-lib-with-tests/TEST-all.xml"
}
assertTestResults( assertTestResults(
expectedTestResults, expectedTestResults,
"jsNodeTest", "jsNodeTest",
"test", // jvmTest "test", // jvmTest
"${nativeHostTargetName}Test" "${targetName}Test"
) )
} }
} }
@@ -1796,7 +1795,11 @@ open class NewMultiplatformIT : BaseGradleIT() {
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
// TOOD: add Kotlin/JS tests once they can be tested without much performance overhead // TOOD: add Kotlin/JS tests once they can be tested without much performance overhead
val targetsToTest = listOf("jvm", nativeHostTargetName) + listOf("ios").takeIf { HostManager.hostIsMac }.orEmpty() val targetsToTest = listOf("jvm", nativeHostTargetName) + when (HostManager.host) {
KonanTarget.MACOS_X64 -> listOf("iosX64")
KonanTarget.MACOS_ARM64 -> listOf("iosSimulatorArm64")
else -> emptyList()
}
val testTasks = targetsToTest.flatMap { listOf(":${it}Test", ":${it}IntegrationTest") }.toTypedArray() val testTasks = targetsToTest.flatMap { listOf(":${it}Test", ":${it}IntegrationTest") }.toTypedArray()
build(*testTasks) { build(*testTasks) {
@@ -30,11 +30,12 @@ import kotlin.test.assertFalse
import kotlin.test.assertTrue import kotlin.test.assertTrue
internal object MPPNativeTargets { internal object MPPNativeTargets {
val current = when { val current = when (HostManager.host) {
HostManager.hostIsMingw -> "mingw64" KonanTarget.LINUX_X64 -> "linux64"
HostManager.hostIsLinux -> "linux64" KonanTarget.MACOS_X64 -> "macos64"
HostManager.hostIsMac -> "macos64" KonanTarget.MACOS_ARM64 -> "macosArm64"
else -> error("Unknown host") KonanTarget.MINGW_X64 -> "mingw64"
else -> error("Unsupported host")
} }
val unsupported = when { val unsupported = when {
@@ -49,7 +49,9 @@ kotlin {
mingwX64("mingw64") {} mingwX64("mingw64") {}
linuxX64("linux64") {} linuxX64("linux64") {}
macosX64("macos64") {} macosX64("macos64") {}
iosX64("ios") {} macosArm64("macosArm64") {}
iosX64("iosX64") {}
iosSimulatorArm64("iosSimulatorArm64") {}
targets.matching { it.name != "metadata" }.all { targets.matching { it.name != "metadata" }.all {
compilations.create("integrationTest") { compilations.create("integrationTest") {
@@ -90,7 +92,7 @@ kotlin {
} }
} }
targets.matching { it.name == "mingw64" || it.name == "linux64" || it.name == "macos64" || it.name == "ios" }.all { targets.matching { it.name == "mingw64" || it.name == "linux64" || it.name == "macos64" || it.name == "macosArm64" || it.name == "iosX64" || it.name == "iosSimulatorArm64" }.all {
testRuns { testRuns {
getByName("test").filter { excludeTestsMatching("*.secondTest") } getByName("test").filter { excludeTestsMatching("*.secondTest") }
@@ -1,43 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<results>
<testsuite name="com.example.lib.TestCommonCode" tests="2" skipped="0" failures="0" errors="0" timestamp="..." hostname="..." time="...">
<properties />
<testcase name="testId" classname="com.example.lib.TestCommonCode" time="..." />
<testcase name="testExpectedFun" classname="com.example.lib.TestCommonCode" time="..." />
<system-out />
<system-err />
</testsuite>
<testsuite name="com.example.lib.TestCommonCode" tests="2" skipped="0" failures="0" errors="0" timestamp="..." hostname="..." time="...">
<properties />
<testcase name="testId" classname="com.example.lib.TestCommonCode" time="..." />
<testcase name="testExpectedFun" classname="com.example.lib.TestCommonCode" time="..." />
<system-out><![CDATA[1]]></system-out>
<system-err />
</testsuite>
<testsuite name="com.example.lib.TestCommonCode" tests="2" skipped="0" failures="0" errors="0" timestamp="..." hostname="..." time="...">
<properties />
<testcase name="testId" classname="com.example.lib.TestCommonCode" time="..." />
<testcase name="testExpectedFun" classname="com.example.lib.TestCommonCode" time="..." />
<system-out />
<system-err />
</testsuite>
<testsuite name="com.example.lib.TestJava" tests="1" skipped="0" failures="0" errors="0" timestamp="..." hostname="..." time="...">
<properties />
<testcase name="testJava" classname="com.example.lib.TestJava" time="..." />
<system-out />
<system-err />
</testsuite>
<testsuite name="com.example.lib.TestJs" tests="1" skipped="0" failures="0" errors="0" timestamp="..." hostname="..." time="...">
<properties />
<testcase name="testJsSpecificCode" classname="com.example.lib.TestJs" time="..." />
<system-out />
<system-err />
</testsuite>
<testsuite name="com.example.lib.TestWithJava" tests="1" skipped="0" failures="0" errors="0" timestamp="..." hostname="..." time="...">
<properties />
<testcase name="testJavaClass" classname="com.example.lib.TestWithJava" time="..." />
<system-out />
<system-err />
</testsuite>
</results>
@@ -16,8 +16,8 @@
</testsuite> </testsuite>
<testsuite name="com.example.lib.TestCommonCode" tests="2" skipped="0" failures="0" errors="0" timestamp="..." hostname="..." time="..."> <testsuite name="com.example.lib.TestCommonCode" tests="2" skipped="0" failures="0" errors="0" timestamp="..." hostname="..." time="...">
<properties /> <properties />
<testcase name="testId[linux64]" classname="com.example.lib.TestCommonCode" time="..." /> <testcase name="testId[<target>]" classname="com.example.lib.TestCommonCode" time="..." />
<testcase name="testExpectedFun[linux64]" classname="com.example.lib.TestCommonCode" time="..." /> <testcase name="testExpectedFun[<target>]" classname="com.example.lib.TestCommonCode" time="..." />
<system-out /> <system-out />
<system-err /> <system-err />
</testsuite> </testsuite>
@@ -23,6 +23,7 @@ kotlin {
fromPreset(presets.jvm, 'jvmWithoutJava') fromPreset(presets.jvm, 'jvmWithoutJava')
fromPreset(presets.jvmWithJava, 'jvmWithJava') fromPreset(presets.jvmWithJava, 'jvmWithJava')
fromPreset(presets.macosX64, 'macos64') fromPreset(presets.macosX64, 'macos64')
fromPreset(presets.macosArm64, 'macosArm64')
fromPreset(presets.linuxX64, 'linux64') fromPreset(presets.linuxX64, 'linux64')
fromPreset(presets.mingwX64, 'mingw64') fromPreset(presets.mingwX64, 'mingw64')
} }
@@ -56,7 +57,7 @@ kotlin {
} }
} }
nativeMain nativeMain
configure([macos64Main, linux64Main, mingw64Main]) { configure([macos64Main, macosArm64Main, linux64Main, mingw64Main]) {
dependsOn nativeMain dependsOn nativeMain
} }
} }
@@ -14,6 +14,7 @@ kotlin {
nodejs() nodejs()
} }
val macos64 = macosX64("macos64") val macos64 = macosX64("macos64")
val macosArm64 = macosArm64("macosArm64")
val linux64 = linuxX64("linux64") val linux64 = linuxX64("linux64")
val mingw64 = mingwX64("mingw64") val mingw64 = mingwX64("mingw64")
@@ -49,7 +50,7 @@ kotlin {
} }
val nativeMain by creating val nativeMain by creating
configure(listOf(macos64, linux64, mingw64)) { configure(listOf(macos64, macosArm64, linux64, mingw64)) {
compilations["main"].defaultSourceSet.dependsOn(nativeMain) compilations["main"].defaultSourceSet.dependsOn(nativeMain)
} }
} }