diff --git a/libxcode/src/main/groovy/org/openbakery/xcode/Xcode.groovy b/libxcode/src/main/groovy/org/openbakery/xcode/Xcode.groovy index 89f80ad2..274fb4df 100644 --- a/libxcode/src/main/groovy/org/openbakery/xcode/Xcode.groovy +++ b/libxcode/src/main/groovy/org/openbakery/xcode/Xcode.groovy @@ -58,7 +58,7 @@ class Xcode { if (file.exists()) { result.put(ENV_DEVELOPER_DIR, file.absolutePath) } - println file.absolutePath + return result } diff --git a/plugin/src/functionalTest/groovy/org/openbakery/KeychainCreateTaskFunctionalTest.groovy b/plugin/src/functionalTest/groovy/org/openbakery/KeychainCreateTaskFunctionalTest.groovy index c93801a1..71b02662 100644 --- a/plugin/src/functionalTest/groovy/org/openbakery/KeychainCreateTaskFunctionalTest.groovy +++ b/plugin/src/functionalTest/groovy/org/openbakery/KeychainCreateTaskFunctionalTest.groovy @@ -75,7 +75,7 @@ class KeychainCreateTaskFunctionalTest extends Specification { buildFile << """ xcodebuild { signing { - certificate = project.provisioningFile1("$certificate") + certificateURI = "$certificate.absolutePath" } } """ @@ -84,6 +84,7 @@ class KeychainCreateTaskFunctionalTest extends Specification { BuildResult result = GradleRunner.create() .withProjectDir(testProjectDir.root) .withArguments(KeychainCreateTask.TASK_NAME) + .withDebug(true) .withPluginClasspath(pluginClasspath) .build() @@ -96,7 +97,7 @@ class KeychainCreateTaskFunctionalTest extends Specification { buildFile << """ xcodebuild { signing { - certificate = project.provisioningFile1("$certificate") + certificateURI = "${certificate.toURI().toString()}" certificatePassword = "p4ssword" } } @@ -107,6 +108,7 @@ class KeychainCreateTaskFunctionalTest extends Specification { .withProjectDir(testProjectDir.root) .withArguments(KeychainCreateTask.TASK_NAME) .withPluginClasspath(pluginClasspath) + .withDebug(true) .build() then: @@ -118,7 +120,7 @@ class KeychainCreateTaskFunctionalTest extends Specification { buildFile << """ xcodebuild { signing { - certificate = project.provisioningFile1("$certificate") + certificateURI = "${certificate.toURI().toString()}" certificatePassword = "p4ssword" } } diff --git a/plugin/src/functionalTest/groovy/org/openbakery/carthage/CarthageBootStrapTaskFunctionalTest.groovy b/plugin/src/functionalTest/groovy/org/openbakery/carthage/CarthageBootStrapTaskFunctionalTest.groovy new file mode 100644 index 00000000..ec6a21fc --- /dev/null +++ b/plugin/src/functionalTest/groovy/org/openbakery/carthage/CarthageBootStrapTaskFunctionalTest.groovy @@ -0,0 +1,140 @@ +package org.openbakery.carthage + +import org.gradle.testkit.runner.BuildResult +import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.TaskOutcome +import org.junit.Rule +import org.junit.rules.TemporaryFolder +import spock.lang.Specification + +class CarthageBootStrapTaskFunctionalTest extends Specification { + @Rule + final TemporaryFolder testProjectDir = new TemporaryFolder() + + List pluginClasspath + File buildFile + GradleRunner gradleRunner + File carthageFolder + + void setup() { + buildFile = testProjectDir.newFile('build.gradle') + + buildFile << """ + plugins { + id 'org.openbakery.xcode-plugin' + } + """ + + def pluginClasspathResource = getClass().classLoader.findResource("plugin-classpath.txt") + if (pluginClasspathResource == null) { + throw new IllegalStateException("Did not find plugin classpath resource, run `testClasses` build task.") + } + + pluginClasspath = pluginClasspathResource.readLines().collect { new File(it) } + + gradleRunner = GradleRunner.create() + .withProjectDir(testProjectDir.root) + .withArguments(CarthageBootStrapTask.NAME) + .withPluginClasspath(pluginClasspath) + + carthageFolder = new File(testProjectDir.root, "Carthage") + } + + def "The task list should contain the task"() { + when: + BuildResult result = gradleRunner.build() + + then: + result.output.contains(CarthageBootStrapTask.NAME) + } + + def "The task should be skipped if no cartfile is present"() { + when: + BuildResult result = gradleRunner.build() + + then: + result.task(":" + CarthageBootStrapTask.NAME) + .outcome == TaskOutcome.SKIPPED + } + + def "The task should be executed with success if a `cartfile.resolved` file is present"() { + setup: + testProjectDir.newFile(CarthageBootStrapTask.CARTHAGE_FILE) + + when: + BuildResult result = gradleRunner.build() + + then: + result.task(":" + CarthageBootStrapTask.NAME) + .outcome == TaskOutcome.SUCCESS + } + + def "The task should resolve the defined carthage dependencies"() { + setup: + File carthageFile = testProjectDir.newFile("Cartfile") + carthageFile << """ + github "ashleymills/Reachability.swift" + """ + + File carthageResolvedFile = testProjectDir.newFile(CarthageBootStrapTask.CARTHAGE_FILE) + carthageResolvedFile << """ + github "ashleymills/Reachability.swift" "v4.1.0" + """ + + when: + BuildResult result = gradleRunner + .build() + + then: + result.task(":" + CarthageBootStrapTask.NAME) + .outcome == TaskOutcome.SUCCESS + + and: "The resolved framework should be existing only for iOS (default target)" + carthageFolder.exists() + new File(carthageFolder, "Build/iOS/Reachability.framework").exists() + !new File(carthageFolder, "Build/tvOS/Reachability.framework").exists() + + when: "Force reset and build with cache enabled" + assert carthageFolder.deleteDir() + result = gradleRunner.withArguments('--build-cache', CarthageBootStrapTask.NAME) + .build() + + then: "Should resolve the carthage dependencies from cache" + result.task(":" + CarthageBootStrapTask.NAME) + .outcome == TaskOutcome.FROM_CACHE + + new File(carthageFolder, "Build/iOS/Reachability.framework").exists() + !new File(carthageFolder, "Build/tvOS/Reachability.framework").exists() + } + + def "The task should resolve the defined carthage dependencies depending of the configured target"() { + setup: + File carthageFile = testProjectDir.newFile("Cartfile") + carthageFile << """ + github "ashleymills/Reachability.swift" + """ + + File carthageResolvedFile = testProjectDir.newFile(CarthageBootStrapTask.CARTHAGE_FILE) + carthageResolvedFile << """ + github "ashleymills/Reachability.swift" "v4.1.0" + """ + + buildFile << """ + xcodebuild { + type = "tvOS" + } + """ + + when: + BuildResult result = gradleRunner.build() + + then: + result.task(":" + CarthageBootStrapTask.NAME) + .outcome == TaskOutcome.SUCCESS + + and: "The resolved framework should be existing only for iOS (default target)" + carthageFolder.exists() + !new File(carthageFolder, "Build/iOS/Reachability.framework").exists() + new File(carthageFolder, "Build/tvOS/Reachability.framework").exists() + } +} diff --git a/plugin/src/functionalTest/groovy/org/openbakery/signing/ProvisioningInstallTaskFunctionalTest.groovy b/plugin/src/functionalTest/groovy/org/openbakery/signing/ProvisioningInstallTaskFunctionalTest.groovy index d20157ff..16dce6f6 100644 --- a/plugin/src/functionalTest/groovy/org/openbakery/signing/ProvisioningInstallTaskFunctionalTest.groovy +++ b/plugin/src/functionalTest/groovy/org/openbakery/signing/ProvisioningInstallTaskFunctionalTest.groovy @@ -30,7 +30,9 @@ class ProvisioningInstallTaskFunctionalTest extends Specification { provisioningFile1 = findResource("test1.mobileprovision") assert provisioningFile1.exists() - def pluginClasspathResource = getClass().classLoader.findResource("plugin-classpath.txt") + def pluginClasspathResource = getClass().classLoader + .findResource("plugin-classpath.txt") + if (pluginClasspathResource == null) { throw new IllegalStateException("Did not find plugin classpath resource, run `testClasses` build task.") } @@ -70,7 +72,7 @@ class ProvisioningInstallTaskFunctionalTest extends Specification { buildFile << """ xcodebuild { signing { - mobileProvisionURI = [] + mobileProvisionList = [] } } """ diff --git a/plugin/src/main/groovy/org/openbakery/XcodeBuildPluginExtension.groovy b/plugin/src/main/groovy/org/openbakery/XcodeBuildPluginExtension.groovy index 4823ee50..207649e8 100644 --- a/plugin/src/main/groovy/org/openbakery/XcodeBuildPluginExtension.groovy +++ b/plugin/src/main/groovy/org/openbakery/XcodeBuildPluginExtension.groovy @@ -35,6 +35,7 @@ class XcodeBuildPluginExtension { final Property bitcode = project.objects.property(Boolean) final Property version = project.objects.property(String) + final Property targetType = project.objects.property(Type) final Property scheme = project.objects.property(String) final DirectoryProperty archiveDirectory = project.layout.directoryProperty() final DirectoryProperty schemeArchiveFile = project.layout.directoryProperty() @@ -108,6 +109,8 @@ class XcodeBuildPluginExtension { this.symRoot.set(project.layout.buildDirectory.dir("sym")) this.sharedPrecompsDir.set(project.layout.buildDirectory.dir("shared")) this.derivedDataPath.set(project.layout.buildDirectory.dir("derivedData")) + + this.targetType.set(Type.iOS) } private void configureServices() { @@ -358,6 +361,7 @@ class XcodeBuildPluginExtension { void setType(String type) { this.type = Type.typeFromString(type) + this.targetType.set(this.type) } Type getType() { diff --git a/plugin/src/main/groovy/org/openbakery/XcodePlugin.groovy b/plugin/src/main/groovy/org/openbakery/XcodePlugin.groovy index 60727419..ce142110 100644 --- a/plugin/src/main/groovy/org/openbakery/XcodePlugin.groovy +++ b/plugin/src/main/groovy/org/openbakery/XcodePlugin.groovy @@ -116,7 +116,6 @@ class XcodePlugin implements Plugin { public static final String OCLINT_TASK_NAME = 'oclint' public static final String OCLINT_REPORT_TASK_NAME = 'oclintReport' public static final String CPD_TASK_NAME = 'cpd' - public static final String CARTHAGE_BOOTSTRAP_TASK_NAME = 'carthageBootstrap' public static final String CARTHAGE_UPDATE_TASK_NAME = 'carthageUpdate' public static final String CARTHAGE_CLEAN_TASK_NAME = 'carthageClean' @@ -522,7 +521,7 @@ class XcodePlugin implements Plugin { } private void configureSimulatorTasks(Project project) { - project.task(SIMULATORS_LIST_TASK_NAME, type: SimulatorsListTask, group: SIMULATORS_LIST_TASK_NAME) + project.task(SIMULATORS_LIST_TASK_NAME, type: SimulatorsListTask.class, group: SIMULATORS_LIST_TASK_NAME) project.task(SIMULATORS_CREATE_TASK_NAME, type: SimulatorsCreateTask, group: SIMULATORS_LIST_TASK_NAME) project.task(SIMULATORS_CLEAN_TASK_NAME, type: SimulatorsCleanTask, group: SIMULATORS_LIST_TASK_NAME) @@ -692,11 +691,17 @@ class XcodePlugin implements Plugin { private void configureCarthage(Project project) { project.task(CARTHAGE_CLEAN_TASK_NAME, type: CarthageCleanTask, group: CARTHAGE_GROUP_NAME) project.task(CARTHAGE_UPDATE_TASK_NAME, type: CarthageUpdateTask, group: CARTHAGE_GROUP_NAME) - project.task(CARTHAGE_BOOTSTRAP_TASK_NAME, type: CarthageBootStrapTask, group: CARTHAGE_GROUP_NAME) + + project.tasks.create(CarthageBootStrapTask.NAME, CarthageBootStrapTask.class) { + it.group = CARTHAGE_GROUP_NAME + it.requiredXcodeVersion.set(xcodeBuildPluginExtension.version) + it.commandRunnerProperty.set(commandRunner) + it.platform.set(xcodeBuildPluginExtension.targetType) + } } private configureCarthageDependencies(Project project) { - CarthageBootStrapTask bootStrapTask = project.getTasks().getByName(CARTHAGE_BOOTSTRAP_TASK_NAME) + CarthageBootStrapTask bootStrapTask = project.getTasks().getByName(CarthageBootStrapTask.NAME) as CarthageBootStrapTask addDependencyToBuild(project, bootStrapTask) project.getTasks() diff --git a/plugin/src/main/groovy/org/openbakery/carthage/AbstractCarthageTaskBase.groovy b/plugin/src/main/groovy/org/openbakery/carthage/AbstractCarthageTaskBase.groovy index abbb6664..d26c96ad 100644 --- a/plugin/src/main/groovy/org/openbakery/carthage/AbstractCarthageTaskBase.groovy +++ b/plugin/src/main/groovy/org/openbakery/carthage/AbstractCarthageTaskBase.groovy @@ -1,10 +1,14 @@ package org.openbakery.carthage +import groovy.transform.CompileStatic import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.openbakery.AbstractXcodeTask +import org.openbakery.CommandRunnerException +import org.openbakery.XcodeBuildPluginExtension import org.openbakery.xcode.Type +@CompileStatic abstract class AbstractCarthageTaskBase extends AbstractXcodeTask { static final String ACTION_BOOTSTRAP = "bootstrap" @@ -31,7 +35,6 @@ abstract class AbstractCarthageTaskBase extends AbstractXcodeTask { @InputFile @Optional - @PathSensitive(PathSensitivity.RELATIVE) Provider getCartFile() { // Cf https://github.com/gradle/gradle/issues/2016 File file = project.rootProject.file(CARTHAGE_FILE) @@ -43,7 +46,6 @@ abstract class AbstractCarthageTaskBase extends AbstractXcodeTask { @InputFile @Optional - @PathSensitive(PathSensitivity.RELATIVE) Provider getCartResolvedFile() { // Cf https://github.com/gradle/gradle/issues/2016 File file = project.rootProject.file(CARTHAGE_FILE_RESOLVED) @@ -55,7 +57,7 @@ abstract class AbstractCarthageTaskBase extends AbstractXcodeTask { @Input String getCarthagePlatformName() { - switch (project.xcodebuild.type) { + switch (project.extensions.findByType(XcodeBuildPluginExtension).type) { case Type.iOS: return CARTHAGE_PLATFORM_IOS case Type.tvOS: return CARTHAGE_PLATFORM_TVOS case Type.macOS: return CARTHAGE_PLATFORM_MACOS @@ -65,6 +67,7 @@ abstract class AbstractCarthageTaskBase extends AbstractXcodeTask { } @OutputDirectory + @PathSensitive(PathSensitivity.NAME_ONLY) Provider getOutputDirectory() { return project.provider { project.rootProject.file("Carthage/Build/" + getCarthagePlatformName()) @@ -74,14 +77,14 @@ abstract class AbstractCarthageTaskBase extends AbstractXcodeTask { String getCarthageCommand() { try { return commandRunner.runWithResult("which", "carthage") - } catch (CommandRunnerException) { + } catch (CommandRunnerException exception) { // ignore, because try again with full path below } try { commandRunner.runWithResult("ls", CARTHAGE_USR_BIN_PATH) return CARTHAGE_USR_BIN_PATH - } catch (CommandRunnerException) { + } catch (CommandRunnerException exception) { // ignore, because blow an exception is thrown } throw new IllegalStateException("The carthage command was not found. Make sure that Carthage is installed") diff --git a/plugin/src/main/groovy/org/openbakery/carthage/CarthageBootStrapTask.groovy b/plugin/src/main/groovy/org/openbakery/carthage/CarthageBootStrapTask.groovy index 7c6e8c43..94df3517 100644 --- a/plugin/src/main/groovy/org/openbakery/carthage/CarthageBootStrapTask.groovy +++ b/plugin/src/main/groovy/org/openbakery/carthage/CarthageBootStrapTask.groovy @@ -1,35 +1,154 @@ package org.openbakery.carthage import groovy.transform.CompileStatic -import org.gradle.api.tasks.TaskAction -import org.gradle.internal.logging.text.StyledTextOutputFactory -import org.openbakery.output.ConsoleOutputAppender +import org.gradle.api.Action +import org.gradle.api.DefaultTask +import org.gradle.api.Transformer +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.* +import org.gradle.process.ExecSpec +import org.gradle.workers.WorkerExecutor +import org.openbakery.CommandRunner +import org.openbakery.CommandRunnerException +import org.openbakery.xcode.Type +import org.openbakery.xcode.Xcode +import javax.inject.Inject + +@CacheableTask @CompileStatic -class CarthageBootStrapTask extends AbstractCarthageTaskBase { +class CarthageBootStrapTask extends DefaultTask { + + @Input + @Optional + Property requiredXcodeVersion = project.objects.property(String) + + @Input + Property carthagePlatformName = project.objects.property(String) + + @InputFile + @PathSensitive(PathSensitivity.NAME_ONLY) + RegularFileProperty cartFile = project.layout.fileProperty() + + @OutputDirectory + Property outputDirectory = project.objects.property(File) + + public static final String NAME = "carthageBootstrap" + + final Property platform = project.objects.property(Type) + final Property xcodeProperty = project.objects.property(Xcode) + final Property commandRunnerProperty = project.objects.property(CommandRunner) + + final WorkerExecutor workerExecutor - CarthageBootStrapTask() { + static final String CARTHAGE_FILE = "Cartfile.resolved" + static final String CARTHAGE_PLATFORM_IOS = "iOS" + static final String CARTHAGE_PLATFORM_MACOS = "Mac" + static final String CARTHAGE_PLATFORM_TVOS = "tvOS" + static final String CARTHAGE_PLATFORM_WATCHOS = "watchOS" + static final String CARTHAGE_USR_BIN_PATH = "/usr/local/bin/carthage" + static final String ACTION_BOOTSTRAP = "bootstrap" + static final String ARG_PLATFORM = "--platform" + static final String ARG_CACHE_BUILDS = "--cache-builds" + + @Inject + CarthageBootStrapTask(WorkerExecutor workerExecutor) { super() + this.workerExecutor = workerExecutor + setDescription "Check out and build the Carthage project dependencies" + + cartFile.set(new File(project.rootProject.rootDir, CARTHAGE_FILE)) + + carthagePlatformName.set(platform.map(new Transformer() { + @Override + String transform(Type type) { + return typeToCarthagePlatform(type) + } + })) + + outputDirectory.set(carthagePlatformName.map(new Transformer() { + @Override + File transform(String platformName) { + return new File(project.rootProject.rootDir, "Carthage/Build/" + platformName) + } + })) + + xcodeProperty.set(commandRunnerProperty.map(new Transformer() { + @Override + Xcode transform(CommandRunner commandRunner) { + return new Xcode(commandRunner) + } + })) + + onlyIf { + return cartFile.asFile.get().exists() + } + } + + void setXcode(Xcode xcode) { + this.xcode = xcode } @TaskAction void update() { - if (hasCartFile()) { - logger.info('Boostrap Carthage for platform ' + carthagePlatformName) - def output = services.get(StyledTextOutputFactory) - .create(CarthageBootStrapTask) - - List args = [getCarthageCommand(), - ACTION_BOOTSTRAP, + logger.warn('Bootstrap Carthage for platform ' + carthagePlatformName) + project.exec(new Action() { + @Override + void execute(ExecSpec execSpec) { + execSpec.args = [ACTION_BOOTSTRAP, + ARG_CACHE_BUILDS, + "--new-resolver", + "--color", "always", ARG_PLATFORM, - carthagePlatformName, - ARG_CACHE_BUILDS] + carthagePlatformName.getOrNull().toString()] as List + + execSpec.environment(getEnvValues()) + execSpec.executable = getCarthageCommand() + execSpec.workingDir(project.rootProject.projectDir) + } + }) + } - commandRunner.run(project.projectDir.absolutePath, - args, - getRequiredXcodeVersion() != null ? xcode.getXcodeSelectEnvValue(getRequiredXcodeVersion()) : null, - new ConsoleOutputAppender(output)) + private final Map getEnvValues() { + final Map envValues + if (requiredXcodeVersion.present) { + envValues = xcodeProperty.get() + .getXcodeSelectEnvValue(requiredXcodeVersion.getOrNull()) + } else { + envValues = [:] } + + return envValues + } + + private String typeToCarthagePlatform(Type type) { + switch (type) { + case Type.iOS: return CARTHAGE_PLATFORM_IOS + case Type.tvOS: return CARTHAGE_PLATFORM_TVOS + case Type.macOS: return CARTHAGE_PLATFORM_MACOS + case Type.watchOS: return CARTHAGE_PLATFORM_WATCHOS + default: return 'all' + } + } + + private String getCarthageCommand() { + try { + return commandRunnerProperty.get() + .runWithResult("which", "carthage") + } catch (CommandRunnerException exception) { + // ignore, because try again with full path below + } + + try { + commandRunnerProperty.get() + .runWithResult("ls", CARTHAGE_USR_BIN_PATH) + return CARTHAGE_USR_BIN_PATH + } catch (CommandRunnerException exception) { + // ignore, because blow an exception is thrown + } + + throw new IllegalStateException("The carthage command was not found. Make sure that Carthage is installed") } } diff --git a/plugin/src/test/groovy/org/openbakery/carthage/CarthageBootStrapTaskTest.groovy b/plugin/src/test/groovy/org/openbakery/carthage/CarthageBootStrapTaskTest.groovy deleted file mode 100644 index 8f45eeb5..00000000 --- a/plugin/src/test/groovy/org/openbakery/carthage/CarthageBootStrapTaskTest.groovy +++ /dev/null @@ -1,150 +0,0 @@ -package org.openbakery.carthage - -import org.gradle.api.Project -import org.gradle.api.provider.Provider -import org.gradle.testfixtures.ProjectBuilder -import org.junit.Rule -import org.junit.rules.ExpectedException -import org.openbakery.CommandRunner -import org.openbakery.output.ConsoleOutputAppender -import org.openbakery.xcode.Xcode -import spock.lang.Specification -import spock.lang.Unroll - -import static org.openbakery.carthage.AbstractCarthageTaskBase.* -import static org.openbakery.xcode.Type.* - -class CarthageBootStrapTaskTest extends Specification { - - CarthageBootStrapTask subject - CommandRunner commandRunner = Mock(CommandRunner) - Xcode mockXcode = Mock(Xcode) - File projectDir - File cartFile - Project project - - @Rule - public ExpectedException exception = ExpectedException.none() - - void setup() { - projectDir = File.createTempDir() - - cartFile = new File(projectDir, "Cartfile") - cartFile << 'github "Alamofire/Alamofire"' - - project = ProjectBuilder.builder() - .withProjectDir(projectDir) - .build() - - project.buildDir = new File(projectDir, 'build').absoluteFile - project.apply plugin: org.openbakery.XcodePlugin - - subject = project.getTasks().getByPath('carthageBootstrap') - assert subject != null - - subject.commandRunner = commandRunner - } - - def "The carthage bootstrap task should be present"() { - expect: - subject instanceof CarthageBootStrapTask - } - - @Unroll - def "When bootstrap is executed should only update the platform: #platform"() { - given: - commandRunner.runWithResult("which", "carthage") >> "/usr/local/bin/carthage" - project.xcodebuild.type = platform - - when: - subject.update() - - then: - 1 * commandRunner.run(_, - [CARTHAGE_USR_BIN_PATH, - ACTION_BOOTSTRAP, - ARG_PLATFORM, - carthagePlatform, - ARG_CACHE_BUILDS] - , _ - , _) >> { - args -> args[3] instanceof ConsoleOutputAppender - } - - where: - platform | carthagePlatform - tvOS | CARTHAGE_PLATFORM_TVOS - macOS | CARTHAGE_PLATFORM_MACOS - watchOS | CARTHAGE_PLATFORM_WATCHOS - iOS | CARTHAGE_PLATFORM_IOS - } - - def "The task should not be executed if the 'Cartfile` file is missing"() { - given: - commandRunner.runWithResult("which", "carthage") >> "/usr/local/bin/carthage" - project.xcodebuild.type = platform - - when: - cartFile.delete() - subject.update() - - then: - 0 * commandRunner.run(_, - getCommandRunnerArgsForPlatform(carthagePlatform), - _, - _) >> { - args -> args[3] instanceof ConsoleOutputAppender - } - - where: - platform | carthagePlatform - tvOS | CARTHAGE_PLATFORM_TVOS - macOS | CARTHAGE_PLATFORM_MACOS - watchOS | CARTHAGE_PLATFORM_WATCHOS - iOS | CARTHAGE_PLATFORM_IOS - } - - def "The subject output directory should be platform dependant"() { - when: - subject.xcode.getXcodeSelectEnvValue(_) >> new HashMap() - project.xcodebuild.type = platform - - then: - Provider outputDirectory = subject.outputDirectory - outputDirectory.isPresent() - outputDirectory.get().name == carthagePlatform - - where: - platform | carthagePlatform - tvOS | CARTHAGE_PLATFORM_TVOS - macOS | CARTHAGE_PLATFORM_MACOS - watchOS | CARTHAGE_PLATFORM_WATCHOS - iOS | CARTHAGE_PLATFORM_IOS - } - - def "The xcode selection should be applied if a xcode version is defined"() { - when: - subject.xcode.getXcodeSelectEnvValue(_) >> new HashMap() - project.xcodebuild.type = iOS - project.xcodebuild.version = version - - subject.xcode = mockXcode - subject.xcode.setVersionFromString(_) >> _ - subject.update() - - then: - 1 * mockXcode.getXcodeSelectEnvValue(version) - - where: - version | _ - "7.1.1" | _ - } - - private List getCommandRunnerArgsForPlatform(String carthagePlatform) { - return [CARTHAGE_USR_BIN_PATH, - ACTION_UPDATE, - ARG_PLATFORM, - carthagePlatform, - ARG_CACHE_BUILDS] - } -}