diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt new file mode 100644 index 00000000000..fdeb549d63d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt @@ -0,0 +1,111 @@ +/* + * Copyright 2010-2021 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.gradle + +import org.jetbrains.kotlin.konan.target.HostManager +import org.junit.Assume +import org.junit.BeforeClass +import kotlin.test.Test + +class AppleFrameworkIT : KotlinAndroid36GradleIT() { + companion object { + private val gradleVersion = GradleVersionRequired.FOR_MPP_SUPPORT + + @BeforeClass + @JvmStatic + fun assumeItsMac() { + Assume.assumeTrue(HostManager.hostIsMac) + } + } + + override val defaultGradleVersion: GradleVersionRequired + get() = gradleVersion + + @Test + fun `assemble debug AppleFrameworkForXcode for IosArm64`() { + with(Project("sharedAppleFramework")) { + val options: BuildOptions = defaultBuildOptions().copy( + customEnvironmentVariables = mapOf( + "CONFIGURATION" to "debug", + "SDK_NAME" to "iphoneos123" + ) + ) + build("assembleAppleFrameworkForXcode", options = options) { + assertSuccessful() + assertTasksExecuted(":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64") + assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework") + assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework.dSYM") + } + + build("assembleAppleFrameworkForXcode", options = options) { + assertSuccessful() + assertTasksUpToDate(":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64") + assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework") + assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework.dSYM") + } + } + } + + @Test + fun `check there aren't Xcode tasks without Xcode environment`() { + with(Project("sharedAppleFramework")) { + build("tasks") { + assertSuccessful() + assertTasksNotRegistered( + ":shared:assembleAppleFrameworkForXcode", + ":shared:embedAndSignAppleFrameworkForXcode" + ) + } + } + } + + @Test + fun `check all registered tasks with Xcode environment for Debug IosArm64 configuration`() { + with(Project("sharedAppleFramework")) { + val options: BuildOptions = defaultBuildOptions().copy( + customEnvironmentVariables = mapOf( + "CONFIGURATION" to "Debug", + "SDK_NAME" to "iphoneos", + "EXPANDED_CODE_SIGN_IDENTITY" to "-", + "TARGET_BUILD_DIR" to "testBuildDir", + "FRAMEWORKS_FOLDER_PATH" to "testFrameworksDir" + ) + ) + build("tasks", options = options) { + assertSuccessful() + assertTasksRegistered( + ":shared:assembleAppleFrameworkForXcode", + ":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64", + ":shared:embedAndSignAppleFrameworkForXcode" + ) + assertTasksNotRegistered(":shared:assembleSharedDebugAppleFrameworkForXcodeIosX64") + } + } + } + + @Test + fun `check there isn't embedAndSignAppleFrameworkForXcode task without required Xcode environments`() { + with(Project("sharedAppleFramework")) { + val options: BuildOptions = defaultBuildOptions().copy( + customEnvironmentVariables = mapOf( + "CONFIGURATION" to "Debug", + "SDK_NAME" to "iphoneos" + ) + ) + build("tasks", options = options) { + assertSuccessful() + assertTasksRegistered( + ":shared:assembleAppleFrameworkForXcode", + ":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64", + ) + assertTasksNotRegistered( + ":shared:embedAndSignAppleFrameworkForXcode", + ":shared:assembleSharedDebugAppleFrameworkForXcodeIosX64" + ) + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index 239d8fd6f29..79501388d9a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -247,7 +247,8 @@ abstract class BaseGradleIT { val configurationCache: Boolean = false, val configurationCacheProblems: ConfigurationCacheProblems = ConfigurationCacheProblems.FAIL, val warningMode: WarningMode = WarningMode.Fail, - val useFir: Boolean = false + val useFir: Boolean = false, + val customEnvironmentVariables: Map = mapOf() ) enum class ConfigurationCacheProblems { @@ -662,6 +663,12 @@ abstract class BaseGradleIT { } } + fun CompiledProject.assertTasksNotRegistered(vararg tasks: String) { + for (task in tasks) { + assertNotContains("'Register task $task'") + } + } + fun CompiledProject.assertTasksRegisteredByPrefix(taskPrefixes: Iterable) { for (prefix in taskPrefixes) { assertContainsRegex("'Register task $prefix\\w*'".toRegex()) @@ -963,6 +970,7 @@ Finished executing task ':$taskName'| options.gradleUserHome?.let { put("GRADLE_USER_HOME", it.canonicalPath) } + putAll(options.customEnvironmentVariables) } private fun String.normalize() = this.lineSequence().joinToString(SYSTEM_LINE_SEPARATOR) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/build.gradle.kts new file mode 100644 index 00000000000..0c1f858a805 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/build.gradle.kts @@ -0,0 +1,22 @@ +buildscript { + repositories { + gradlePluginPortal() + jcenter() + google() + mavenCentral() + mavenLocal() + } + dependencies { + classpath(kotlin("gradle-plugin:${property("kotlin_version")}")) + classpath("com.android.tools.build:gradle:${property("android_tools_version")}") + } +} + +allprojects { + repositories { + google() + jcenter() + mavenCentral() + mavenLocal() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/gradle.properties new file mode 100644 index 00000000000..1d0d44f1d8e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/gradle.properties @@ -0,0 +1,2 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true +kotlin.native.enableDependencyPropagation=false diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/settings.gradle.kts new file mode 100644 index 00000000000..432ad7d3d31 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/settings.gradle.kts @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + google() + jcenter() + gradlePluginPortal() + mavenCentral() + } +} + +include(":shared") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/build.gradle.kts new file mode 100644 index 00000000000..726353469ba --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + kotlin("multiplatform") + id("com.android.library") +} + +kotlin { + android() + + ios() { + binaries { + framework { + baseName = "shared" + } + } + } +} + +android { + compileSdkVersion(30) + sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") + defaultConfig { + minSdkVersion(21) + targetSdkVersion(30) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/androidMain/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/androidMain/AndroidManifest.xml new file mode 100644 index 00000000000..f7655ddbb99 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/androidMain/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/androidMain/kotlin/com/github/jetbrains/myapplication/Platform.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/androidMain/kotlin/com/github/jetbrains/myapplication/Platform.kt new file mode 100644 index 00000000000..572b187a694 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/androidMain/kotlin/com/github/jetbrains/myapplication/Platform.kt @@ -0,0 +1,5 @@ +package com.github.jetbrains.myapplication + +actual class Platform actual constructor() { + actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Greeting.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Greeting.kt new file mode 100644 index 00000000000..54e8258971c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Greeting.kt @@ -0,0 +1,7 @@ +package com.github.jetbrains.myapplication + +class Greeting { + fun greeting(): String { + return "Hello, ${Platform().platform}!" + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Platform.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Platform.kt new file mode 100644 index 00000000000..fc5b86a8890 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Platform.kt @@ -0,0 +1,5 @@ +package com.github.jetbrains.myapplication + +expect class Platform() { + val platform: String +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/iosMain/kotlin/com/github/jetbrains/myapplication/Platform.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/iosMain/kotlin/com/github/jetbrains/myapplication/Platform.kt new file mode 100644 index 00000000000..35faeabe59f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/sharedAppleFramework/shared/src/iosMain/kotlin/com/github/jetbrains/myapplication/Platform.kt @@ -0,0 +1,7 @@ +package com.github.jetbrains.myapplication + +import platform.UIKit.UIDevice + +actual class Platform actual constructor() { + actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion +} \ No newline at end of file