diff --git a/idea/idea-gradle-native/tests/org/jetbrains/kotlin/ide/konan/gradle/GradleNativeLibrariesInIDENamingTest.kt b/idea/idea-gradle-native/tests/org/jetbrains/kotlin/ide/konan/gradle/GradleNativeLibrariesInIDENamingTest.kt index b966a2a99eb..4749f09d377 100644 --- a/idea/idea-gradle-native/tests/org/jetbrains/kotlin/ide/konan/gradle/GradleNativeLibrariesInIDENamingTest.kt +++ b/idea/idea-gradle-native/tests/org/jetbrains/kotlin/ide/konan/gradle/GradleNativeLibrariesInIDENamingTest.kt @@ -26,7 +26,26 @@ import org.junit.Test import org.junit.runners.Parameterized import java.io.File -class GradleNativeLibrariesInIDENamingTest : GradleImportingTestCase() { +abstract class TestCaseWithFakeKotlinNative : GradleImportingTestCase() { + protected fun configureProject() { + configureByFiles() + + // include data dir with fake Kotlin/Native libraries + val testSuiteDataDir = testDataDirectory().parentFile + val kotlinNativeHome = testSuiteDataDir.resolve(FAKE_KOTLIN_NATIVE_HOME_RELATIVE_PATH) + + kotlinNativeHome.walkTopDown() + .filter { it.isFile } + .forEach { pathInTestSuite -> + // need to put copied file one directory upper than the project root, so adding ".." to the beginning of relative path + // reason: distribution KLIBs should not be appear in IDEA indexes, so they should be located outside of the project root + val relativePathInProject = DOUBLE_DOT_PATH.resolve(pathInTestSuite.relativeTo(testSuiteDataDir)) + createProjectSubFile(relativePathInProject.toString(), pathInTestSuite.readText()) + } + } +} + +class GradleNativeLibrariesInIDENamingTest : TestCaseWithFakeKotlinNative() { // Test naming of Kotlin/Native libraries in projects with Gradle plugin 1.3.21+ @Test @@ -50,23 +69,6 @@ class GradleNativeLibrariesInIDENamingTest : GradleImportingTestCase() { override fun testDataDirName() = "nativeLibraries" - private fun configureProject() { - configureByFiles() - - // include data dir with fake Kotlin/Native libraries - val testSuiteDataDir = testDataDirectory().parentFile - val kotlinNativeHome = testSuiteDataDir.resolve(FAKE_KOTLIN_NATIVE_HOME_RELATIVE_PATH) - - kotlinNativeHome.walkTopDown() - .filter { it.isFile } - .forEach { pathInTestSuite -> - // need to put copied file one directory upper than the project root, so adding ".." to the beginning of relative path - // reason: distribution KLIBs should not be appear in IDEA indexes, so they should be located outside of the project root - val relativePathInProject = DOUBLE_DOT_PATH.resolve(pathInTestSuite.relativeTo(testSuiteDataDir)) - createProjectSubFile(relativePathInProject.toString(), pathInTestSuite.readText()) - } - } - companion object { @Parameterized.Parameters(name = "{index}: with Gradle-{0}") @Throws(Throwable::class) @@ -116,7 +118,7 @@ private fun assertValidModule(module: Module, projectRoot: String) { nativeLibraries.forEach { assertValidNativeLibrary(it, projectRoot) } val kotlinVersion = requireNotNull(module.externalCompilerVersion) { - "External compiler version shoul not be null" + "External compiler version should not be null" } val expectedNativeLibraryNames = when { diff --git a/idea/idea-gradle-native/tests/org/jetbrains/kotlin/ide/konan/gradle/GradleNativeLibrariesPropagationTest.kt b/idea/idea-gradle-native/tests/org/jetbrains/kotlin/ide/konan/gradle/GradleNativeLibrariesPropagationTest.kt new file mode 100644 index 00000000000..ccabb8017ac --- /dev/null +++ b/idea/idea-gradle-native/tests/org/jetbrains/kotlin/ide/konan/gradle/GradleNativeLibrariesPropagationTest.kt @@ -0,0 +1,86 @@ +/* + * Copyright 2010-2019 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.ide.konan.gradle + +import com.intellij.openapi.roots.DependencyScope +import org.jetbrains.kotlin.gradle.ModuleInfo +import org.jetbrains.kotlin.gradle.checkProjectStructure +import org.jetbrains.kotlin.idea.codeInsight.gradle.GradleImportingTestCase +import org.jetbrains.kotlin.idea.configuration.externalCompilerVersion +import org.jetbrains.plugins.gradle.util.GradleConstants +import org.junit.Test +import org.junit.runners.Parameterized + +class GradleNativeLibrariesPropagationTest : TestCaseWithFakeKotlinNative() { + + override fun getExternalSystemConfigFileName() = GradleConstants.KOTLIN_DSL_SCRIPT_NAME + + override fun testDataDirName() = "nativeLibraries" + + private val testedTargets = setOf("ios_arm64", "ios_x64", "watchos_arm32", "watchos_x86") + + @Test + fun testCommonIOS() { + configureProject() + importProject() + + checkProjectStructure( + myProject, + projectPath, + exhaustiveModuleList = false, + exhaustiveSourceSourceRootList = false, + exhaustiveDependencyList = false, + exhaustiveTestsList = false + ) { + + // No platform libraries should be propagated to commonMain since we have a JVM target. + module("project_commonMain") { + noPlatformLibrary("Foundation") + noPlatformLibrary("CFNetwork") + noPlatformLibrary("WatchKit") + } + + module("project_appleMain") { + // Common iOS/watchOS libraries are propagated. + hasPlatformLibrary("Foundation", "watchos_arm32") + + // iOS- and watchOS-specific libraries are not propagated. + noPlatformLibrary("CFNetwork") + noPlatformLibrary("WatchKit") + } + + module("project_iosMain") { + // iOS libraries are propagated. + hasPlatformLibrary("Foundation", "ios_arm64") + hasPlatformLibrary("CFNetwork", "ios_arm64") + + // WatchKit is unavailable for iOS and shouldn't be propagated. + noPlatformLibrary("WatchKit") + } + } + } + + private val ModuleInfo.kotlinVersion: String + get() = requireNotNull(module.externalCompilerVersion) { "External compiler version should not be null" } + + private fun ModuleInfo.noPlatformLibrary(libraryName: String, targets: Collection = testedTargets) { + targets.forEach { target -> + assertNoDepForModule(module.name,"Kotlin/Native $kotlinVersion - $libraryName [$target]") + } + } + + private fun ModuleInfo.hasPlatformLibrary(libraryName: String, target: String) { + libraryDependency("Kotlin/Native $kotlinVersion - $libraryName [$target]", DependencyScope.PROVIDED) + noPlatformLibrary(libraryName, testedTargets - target) + } + + companion object { + @Parameterized.Parameters(name = "{index}: with Gradle-{0}") + @Throws(Throwable::class) + @JvmStatic + fun data() = listOf(arrayOf("4.10.2")) + } +} diff --git a/idea/idea-gradle-native/tests/org/jetbrains/kotlin/ide/konan/gradle/GradleNativeLibrariesPropagationTest.kt.as34 b/idea/idea-gradle-native/tests/org/jetbrains/kotlin/ide/konan/gradle/GradleNativeLibrariesPropagationTest.kt.as34 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/nativeLibraries/commonIOS/build.gradle.kts b/idea/testData/gradle/nativeLibraries/commonIOS/build.gradle.kts new file mode 100644 index 00000000000..b06591d67db --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/commonIOS/build.gradle.kts @@ -0,0 +1,35 @@ +plugins { + kotlin("multiplatform") version "1.3.60-dev-2515" +} + +repositories { + jcenter() + maven { setUrl("https://dl.bintray.com/kotlin/kotlin-dev") } +} + +kotlin { + val jvm = jvm() + val iosDev = iosArm64() + val iosSim = iosX64() + val watchDev = watchosArm32() + val watchSim = watchosX86() + + sourceSets { + val commonMain by getting + val appleMain by creating { + dependsOn(commonMain) + } + + val iosMain by creating { + dependsOn(appleMain) + } + + configure(listOf(watchDev, watchSim)) { + compilations["main"].defaultSourceSet.dependsOn(appleMain) + } + + configure(listOf(iosDev, iosSim)) { + compilations["main"].defaultSourceSet.dependsOn(iosMain) + } + } +} diff --git a/idea/testData/gradle/nativeLibraries/commonIOS/gradle.properties b/idea/testData/gradle/nativeLibraries/commonIOS/gradle.properties new file mode 100644 index 00000000000..aa6223dfcaa --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/commonIOS/gradle.properties @@ -0,0 +1,2 @@ +org.jetbrains.kotlin.native.home=../kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION +kotlin.mpp.enableGranularSourceSetsMetadata=true \ No newline at end of file diff --git a/idea/testData/gradle/nativeLibraries/commonIOS/settings.gradle.kts b/idea/testData/gradle/nativeLibraries/commonIOS/settings.gradle.kts new file mode 100644 index 00000000000..891ddc4234b --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/commonIOS/settings.gradle.kts @@ -0,0 +1,7 @@ +pluginManagement { + repositories { + jcenter() + gradlePluginPortal() + maven { setUrl("https://dl.bintray.com/kotlin/kotlin-dev") } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/CFNetwork/linkdata/empty.knm b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/CFNetwork/linkdata/empty.knm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/CFNetwork/manifest b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/CFNetwork/manifest new file mode 100644 index 00000000000..04eafdaaab3 --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/CFNetwork/manifest @@ -0,0 +1,2 @@ +unique_name=CFNetwork +compiler_version=1.0.0 diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/Foundation/linkdata/empty.knm b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/Foundation/linkdata/empty.knm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/Foundation/manifest b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/Foundation/manifest new file mode 100644 index 00000000000..1b3f1d76d06 --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_arm64/Foundation/manifest @@ -0,0 +1,2 @@ +unique_name=Foundation +compiler_version=1.0.0 diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/CFNetwork/linkdata/empty.knm b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/CFNetwork/linkdata/empty.knm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/CFNetwork/manifest b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/CFNetwork/manifest new file mode 100644 index 00000000000..04eafdaaab3 --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/CFNetwork/manifest @@ -0,0 +1,2 @@ +unique_name=CFNetwork +compiler_version=1.0.0 diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/Foundation/linkdata/empty.knm b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/Foundation/linkdata/empty.knm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/Foundation/manifest b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/Foundation/manifest new file mode 100644 index 00000000000..1b3f1d76d06 --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/ios_x64/Foundation/manifest @@ -0,0 +1,2 @@ +unique_name=Foundation +compiler_version=1.0.0 diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/Foundation/linkdata/empty.knm b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/Foundation/linkdata/empty.knm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/Foundation/manifest b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/Foundation/manifest new file mode 100644 index 00000000000..1b3f1d76d06 --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/Foundation/manifest @@ -0,0 +1,2 @@ +unique_name=Foundation +compiler_version=1.0.0 diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/WatchKit/linkdata/empty.knm b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/WatchKit/linkdata/empty.knm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/WatchKit/manifest b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/WatchKit/manifest new file mode 100644 index 00000000000..9b6e3f1b4e5 --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_arm32/WatchKit/manifest @@ -0,0 +1,2 @@ +unique_name=WatchKit +compiler_version=1.0.0 diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/Foundation/linkdata/empty.knm b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/Foundation/linkdata/empty.knm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/Foundation/manifest b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/Foundation/manifest new file mode 100644 index 00000000000..1b3f1d76d06 --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/Foundation/manifest @@ -0,0 +1,2 @@ +unique_name=Foundation +compiler_version=1.0.0 diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/WatchKit/linkdata/empty.knm b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/WatchKit/linkdata/empty.knm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/WatchKit/manifest b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/WatchKit/manifest new file mode 100644 index 00000000000..9b6e3f1b4e5 --- /dev/null +++ b/idea/testData/gradle/nativeLibraries/kotlin-native-data-dir/kotlin-native-PLATFORM-VERSION/klib/platform/watchos_x86/WatchKit/manifest @@ -0,0 +1,2 @@ +unique_name=WatchKit +compiler_version=1.0.0