diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt index 5411e5cb81d..b381e37db8f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin.Compan import org.jetbrains.kotlin.gradle.targets.native.cocoapods.CocoapodsPluginDiagnostics import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.util.assertProcessRunResult +import org.jetbrains.kotlin.gradle.util.removingTrailingNewline import org.jetbrains.kotlin.gradle.util.replaceText import org.jetbrains.kotlin.gradle.util.runProcess import org.junit.jupiter.api.BeforeAll @@ -901,6 +902,7 @@ class CocoaPodsIT : KGPBaseTest() { private val maybeCocoaPodsIsNotInstalledError = "Possible reason: CocoaPods is not installed" private val maybePodfileIsIncorrectError = "Please, check that podfile contains following lines in header" + private val missingPodExecutableInPath = "CocoaPods executable not found in your PATH" @DisplayName("Pod install emits correct error when pod binary is not present in PATH") @GradleTest @@ -922,7 +924,8 @@ class CocoaPodsIT : KGPBaseTest() { podInstallTaskName, ) { assertOutputDoesNotContain(maybePodfileIsIncorrectError) - assertOutputContains(maybeCocoaPodsIsNotInstalledError) + assertOutputDoesNotContain(maybeCocoaPodsIsNotInstalledError) + assertOutputContains(missingPodExecutableInPath) } } } @@ -954,6 +957,58 @@ class CocoaPodsIT : KGPBaseTest() { } } + @DisplayName("Installing pod with custom defined pod executable in the local.properties") + @GradleTest + fun testPodInstallWithCustomExecutablePath(gradleVersion: GradleVersion) { + val podPathRun = runProcess(listOf("which", "pod"), Path("/").toFile()) + val pathWithoutCocoapods = "/bin:/usr/bin" + nativeProjectWithCocoapodsAndIosAppPodFile( + gradleVersion = gradleVersion, + environmentVariables = EnvironmentalVariables( + mapOf("PATH" to pathWithoutCocoapods) + ) + ) { + + val podPath = podPathRun.output.removingTrailingNewline() + + assertTrue { + podPath.isNotBlank() + } + assertTrue { + podPathRun.exitCode != 1 + } + + buildGradleKts.addCocoapodsBlock( + """ + framework { + baseName = "kotlin-library" + } + name = "kotlin-library" + podfile = project.file("ios-app/Podfile") + """.trimIndent() + ) + + buildAndFailWithCocoapodsWrapper(podInstallTaskName) { + assertOutputContains(missingPodExecutableInPath) + } + + projectPath.resolve("local.properties") + .also { if (!it.exists()) it.createFile() } + .apply { + append("\n") + appendText( + """ + kotlin.apple.cocoapods.bin=${podPath} + """.trimIndent() + ) + } + + buildWithCocoapodsWrapper(podInstallTaskName) { + assertTasksExecuted(podInstallTaskName) + } + } + } + private fun TestProject.buildAndFailWithCocoapodsWrapper( vararg buildArguments: String, assertions: BuildResult.() -> Unit = {}, diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/stringUtil.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/stringUtil.kt index 6c6ca7a4460..c673122462f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/stringUtil.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/util/stringUtil.kt @@ -10,4 +10,5 @@ fun String.checkedReplace(original: String, replacement: String): String { return replace(original, replacement) } -fun String.capitalize() = replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() } \ No newline at end of file +fun String.capitalize() = replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() } +fun String.removingTrailingNewline(): String = this.dropLastWhile { it == '\n' } \ No newline at end of file