All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openbakery.XcodeBuildForTestTask.groovy Maven / Gradle / Ivy

Go to download

XCode-Plugin is a plugin to allow custom XCode projects to build as generated by CMake

There is a newer version: 0.0.201
Show newest version
package org.openbakery

import org.apache.commons.configuration.plist.XMLPropertyListConfiguration
import org.gradle.api.tasks.TaskAction
import org.openbakery.xcode.Xcodebuild

import static groovy.io.FileType.ANY
import static groovy.io.FileVisitResult.SKIP_SUBTREE

class XcodeBuildForTestTask extends AbstractXcodeBuildTask {

	File outputDirectory

	XcodeBuildForTestTask() {
		super()
		dependsOn(
			XcodePlugin.XCODE_CONFIG_TASK_NAME,
			XcodePlugin.SIMULATORS_KILL_TASK_NAME
		)
		this.description = "Build the xcode project and the tests. A testbundle is created that contains the result.	"
	}

	Xcodebuild getXcodebuild() {
		final excludedDirs = ['.svn', '.git', '.hg', '.idea', 'node_modules', '.gradle', 'CMakeFiles']
		def file = null
		project.projectDir.traverse(
				type         : ANY,
				nameFilter	 : ~/.*\.xcodeproj$/,
				preDir       : { if (it.name in excludedDirs) return SKIP_SUBTREE },
				visitRoot	 : true) {
			if(file == null) {
				file = it.parentFile
			}
		}

		return new Xcodebuild(project.projectDir, commandRunner, xcode, parameters, getDestinationResolver().allFor(parameters))
	}

	@TaskAction
	def buildForTest() {
		parameters = project.xcodebuild.xcodebuildParameters.merge(parameters)

		if (parameters.scheme == null && parameters.target == null) {
			throw new IllegalArgumentException("No 'scheme' or 'target' specified, so do not know what to build");
		}

		outputDirectory = new File(project.getBuildDir(), "for-testing");
		if (!outputDirectory.exists()) {
			outputDirectory.mkdirs()
		}

		File outputFile = new File(outputDirectory, "xcodebuild-output.txt")
		commandRunner.setOutputFile(outputFile);

		xcodebuild.executeBuildForTesting(createXcodeBuildOutputAppender("XcodeBuildForTestTask") , project.xcodebuild.environment)

		createTestBundle()
	}

	def createTestBundle() {
		String bundleDirectory = project.xcodebuild.bundleName

		bundleDirectory += "-" + parameters.type

		if (parameters.simulator) {
			bundleDirectory += "-Simulator"
		}
		bundleDirectory += ".testbundle"

		File testBundleFile = new File(outputDirectory, bundleDirectory)
		testBundleFile.mkdirs()


		File xcrunfile = getXcruntestFile()
		if (xcrunfile != null) {
			copy(xcrunfile, testBundleFile)
			getAppBundles(xcrunfile).each {

				File source = new File(xcrunfile.parentFile, it)
				String path = new File(it).parent
				copy(source, new File(testBundleFile, path))
			}
			//createZip(new File(testBundleFile.absolutePath + ".zip"), testBundleFile)
		}
	}


	List getAppBundles(File xcrunfile) {

		List result = []
		XMLPropertyListConfiguration config = new XMLPropertyListConfiguration(xcrunfile)
		for (def item : config.getRoot().getChildren()) {
			if (item.getChildrenCount("TestHostPath") > 0) {
				List testHostPath = item.getChildren("TestHostPath")
				if (testHostPath.size() > 0) {
					String value = testHostPath[0].value - "__TESTROOT__/"
					result << value
					//result << new File(xcrunfile.parentFile, value)
				}
			}
		}
		return result
	}


	def getXcruntestFile() {
		def fileList = parameters.symRoot.list(
						[accept: { d, f -> f ==~ /.*xctestrun/ }] as FilenameFilter
		)

		if (fileList == null || fileList.toList().isEmpty()) {
			return null
		}
		return new File(parameters.symRoot, fileList.toList().get(0))
	}


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy