Skip to content

Commit

Permalink
KT-68494 Update Swift Export integration tests
Browse files Browse the repository at this point in the history
  • Loading branch information
AYastrebov authored and qodana-bot committed Jun 10, 2024
1 parent af3585e commit 6253a64
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.util.runProcess
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.condition.OS
import org.junit.jupiter.api.io.TempDir
import java.io.File
import java.nio.file.Path
import kotlin.io.path.*
import kotlin.test.assertContains
Expand Down Expand Up @@ -43,11 +44,11 @@ class SwiftExportIT : KGPBaseTest() {
assertTasksExecuted(":shared:linkSwiftExportBinaryDebugStaticIosArm64")
assertTasksExecuted(":shared:iosArm64DebugGenerateSPMPackage")
assertTasksExecuted(":shared:iosArm64DebugBuildSPMPackage")
assertTasksExecuted(":shared:iosArm64DebugMergeLibraries")
assertTasksExecuted(":shared:mergeIosDebugSwiftExportLibraries")
assertTasksExecuted(":shared:copyDebugSPMIntermediates")
assertTasksSkipped(":shared:embedAndSignAppleFrameworkForXcode")

assertDirectoryInProjectExists("shared/build/MergedLibraries/iosArm64/Debug")
assertDirectoryInProjectExists("shared/build/MergedLibraries/ios/Debug")
assertDirectoryInProjectExists("shared/build/SPMBuild/iosArm64/Debug")
assertDirectoryInProjectExists("shared/build/SPMDerivedData")
assertDirectoryInProjectExists("shared/build/SPMPackage/iosArm64/Debug")
Expand Down Expand Up @@ -163,7 +164,7 @@ class SwiftExportIT : KGPBaseTest() {
}

val swiftFile = projectPath
.resolve("shared/build/SwiftExport/iosArm64/Debug/files/Shared.swift")
.resolve("shared/build/SwiftExport/iosArm64/Debug/files/Shared/Shared.swift")
.readText()

assert(swiftFile.contains("iosBar()")) { "Swift file doesn't contain iosBar() from iosMain source set" }
Expand All @@ -174,6 +175,83 @@ class SwiftExportIT : KGPBaseTest() {
assert(swiftFile.contains("foobar(")) { "Swift file doesn't contain foobar( from commonMain source set" }
}
}

@DisplayName("check Swift Export contains symbols for different API surfaces")
@GradleTest
fun testSwiftExportMultipleAPISurfaces(
gradleVersion: GradleVersion,
@TempDir testBuildDir: Path,
) {
nativeProject(
"simpleSwiftExport",
gradleVersion,
) {
projectPath.enableSwiftExport()

build(
":shared:embedAndSignAppleFrameworkForXcode",
environmentVariables = swiftExportEmbedAndSignEnvVariables(testBuildDir, listOf("arm64", "x86_64"), "iphonesimulator")
) {
assertTasksExecuted(":shared:copyDebugSPMIntermediates")
}

val builtProductsDir = projectPath.resolve("shared/build/builtProductsDir").toFile()

//get x64 slice
runProcess(
listOf("lipo", "-thin", "x86_64", "libShared.a", "-output", "libShared_x86.a"),
builtProductsDir
)

//get arm64 slice
runProcess(
listOf("lipo", "-thin", "arm64", "libShared.a", "-output", "libShared_arm.a"),
builtProductsDir
)

val x64Symbols = runProcess(
listOf("nm", "libShared_x86.a"),
builtProductsDir
)

val arm64Symbols = runProcess(
listOf("nm", "libShared_arm.a"),
builtProductsDir
)

assert(x64Symbols.output.contains("iosX64Bar")) {
"Doesn't contain iosX64Bar() from iosX64Main API surface"
}

assert(arm64Symbols.output.contains("iosSimulatorArm64Bar")) {
"Doesn't contain iosSimulatorArm64Bar() from iosSimulatorArm64Main API surface"
}

val sdkVersion = runProcess(
listOf("xcrun", "--sdk", "iphonesimulator", "--show-sdk-version"),
projectPath.toFile()
)

assert(sdkVersion.isSuccessful)

// Check arm64 compilation
val arm64Compilation = swiftCompile(
projectPath.toFile(),
builtProductsDir,
"arm64-apple-ios${sdkVersion.output.trim()}-simulator"
)

// Check x86_64 compilation
val x64Compilation = swiftCompile(
projectPath.toFile(),
builtProductsDir,
"x86_64-apple-ios${sdkVersion.output.trim()}-simulator"
)

assert(arm64Compilation.isSuccessful)
assert(x64Compilation.isSuccessful)
}
}
}

@OptIn(EnvironmentalVariablesOverride::class)
Expand All @@ -192,6 +270,16 @@ private fun GradleProject.swiftExportEmbedAndSignEnvVariables(
"BUILT_PRODUCTS_DIR" to projectPath.resolve("shared/build/builtProductsDir").absolutePathString(),
)

private fun swiftCompile(workingDir: File, libDir: File, target: String) = runProcess(
listOf(
"xcrun", "--sdk", "iphonesimulator", "swiftc", "./Consumer.swift",
"-I", libDir.canonicalPath, "-target", target,
"-Xlinker", "-L", "-Xlinker", libDir.canonicalPath, "-Xlinker", "-lShared",
"-framework", "Foundation", "-framework", "UIKit"
),
workingDir
)

internal fun Path.enableSwiftExport() {
resolve("local.properties")
.also { if (!it.exists()) it.createFile() }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
@testable import Shared

#if arch(arm64)
com.github.jetbrains.swiftexport.iosSimulatorArm64Bar()
#elseif arch(x86_64)
com.github.jetbrains.swiftexport.iosX64Bar()
#else
#error("Not supposed to happen")
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,4 @@ kotlin {
baseName = "Shared"
}
}

sourceSets {
val commonMain by getting
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.github.jetbrains.swiftexport

fun iosArm64Bar(): Int = 1255
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.github.jetbrains.swiftexport

fun iosSimulatorArm64Bar(): Int = 12567
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.github.jetbrains.swiftexport

fun iosX64Bar(): Int = 1256

0 comments on commit 6253a64

Please sign in to comment.