Support testing multiple frameworks in single FrameworkTest

This commit is contained in:
Svyatoslav Scherbina
2019-10-14 13:14:51 +03:00
committed by SvyatoslavScherbina
parent c19e21b491
commit 9180befd83
2 changed files with 33 additions and 18 deletions
+12 -6
View File
@@ -3657,9 +3657,11 @@ def targetName = target.name
if (isAppleTarget(project)) { if (isAppleTarget(project)) {
task testValuesFramework(type: FrameworkTest) { task testValuesFramework(type: FrameworkTest) {
frameworkName = 'Values' final String frameworkName = 'Values'
testName = frameworkName
frameworkNames = [frameworkName]
final String dir = "$testOutputFramework/$frameworkName" final String dir = "$testOutputFramework/$testName"
final File lazyHeader = file("$dir/$target-lazy.h") final File lazyHeader = file("$dir/$target-lazy.h")
doLast { doLast {
@@ -3693,12 +3695,14 @@ if (isAppleTarget(project)) {
} }
task testValuesGenericsFramework(type: FrameworkTest) { task testValuesGenericsFramework(type: FrameworkTest) {
frameworkName = 'ValuesGenerics' final String frameworkName = 'ValuesGenerics'
testName = frameworkName
frameworkNames = [frameworkName]
konanArtifacts { konanArtifacts {
framework(frameworkName, targets: [ target ]) { framework(frameworkName, targets: [ target ]) {
srcDir 'framework/values' srcDir 'framework/values'
srcDir 'framework/values_generics' srcDir 'framework/values_generics'
baseDir "$testOutputFramework/$frameworkName" baseDir "$testOutputFramework/$testName"
if (!useCustomDist) { if (!useCustomDist) {
dependsOn ":${target}CrossDistRuntime", ':commonDistRuntime', ':distCompiler' dependsOn ":${target}CrossDistRuntime", ':commonDistRuntime', ':distCompiler'
@@ -3712,12 +3716,14 @@ if (isAppleTarget(project)) {
} }
task testStdlibFramework(type: FrameworkTest) { task testStdlibFramework(type: FrameworkTest) {
frameworkName = 'Stdlib' final String frameworkName = 'Stdlib'
testName = frameworkName
frameworkNames = [frameworkName]
fullBitcode = true fullBitcode = true
konanArtifacts { konanArtifacts {
framework(frameworkName, targets: [ targetName ]) { framework(frameworkName, targets: [ targetName ]) {
srcDir 'framework/stdlib' srcDir 'framework/stdlib'
baseDir "$testOutputFramework/$frameworkName" baseDir "$testOutputFramework/$testName"
if (!useCustomDist) { if (!useCustomDist) {
dependsOn ":${targetName}CrossDistRuntime", ':commonDistRuntime', ':distCompiler' dependsOn ":${targetName}CrossDistRuntime", ':commonDistRuntime', ':distCompiler'
@@ -19,14 +19,18 @@ import java.nio.file.Paths
* according to a pattern "compileKonan${frameworkName}". * according to a pattern "compileKonan${frameworkName}".
* *
* @property swiftSources Swift-language test sources that use a given framework * @property swiftSources Swift-language test sources that use a given framework
* @property frameworkName a framework name * @property testName test name
* @property frameworkNames names of frameworks
*/ */
open class FrameworkTest : DefaultTask() { open class FrameworkTest : DefaultTask() {
@Input @Input
lateinit var swiftSources: List<String> lateinit var swiftSources: List<String>
@Input @Input
lateinit var frameworkName: String lateinit var testName: String
@Input
lateinit var frameworkNames: List<String>
@Input @Input
var fullBitcode: Boolean = false var fullBitcode: Boolean = false
@@ -41,8 +45,11 @@ open class FrameworkTest : DefaultTask() {
if (!(project.property("useCustomDist") as Boolean)) { if (!(project.property("useCustomDist") as Boolean)) {
setRootDependency("${target}CrossDist", "${target}CrossDistRuntime", "commonDistRuntime", "distCompiler") setRootDependency("${target}CrossDist", "${target}CrossDistRuntime", "commonDistRuntime", "distCompiler")
} }
check(::frameworkName.isInitialized) { "Framework name should be set" } check(::testName.isInitialized) { "Test name should be set" }
dependsOn(project.tasks.getByName("compileKonan$frameworkName")) check(::frameworkNames.isInitialized) { "Framework names should be set" }
frameworkNames.forEach { frameworkName ->
dependsOn(project.tasks.getByName("compileKonan$frameworkName"))
}
return this return this
} }
@@ -50,21 +57,23 @@ open class FrameworkTest : DefaultTask() {
@TaskAction @TaskAction
fun run() { fun run() {
val frameworkParentDirPath = "$testOutput/$frameworkName/${project.testTarget.name}" val frameworkParentDirPath = "$testOutput/$testName/${project.testTarget.name}"
val frameworkPath = "$frameworkParentDirPath/$frameworkName.framework" frameworkNames.forEach { frameworkName ->
val frameworkBinaryPath = "$frameworkPath/$frameworkName" val frameworkPath = "$frameworkParentDirPath/$frameworkName.framework"
validateBitcodeEmbedding(frameworkBinaryPath) val frameworkBinaryPath = "$frameworkPath/$frameworkName"
codesign(project, frameworkPath) validateBitcodeEmbedding(frameworkBinaryPath)
codesign(project, frameworkPath)
}
// create a test provider and get main entry point // create a test provider and get main entry point
val provider = Paths.get(testOutput, frameworkName, "provider.swift") val provider = Paths.get(testOutput, testName, "provider.swift")
FileWriter(provider.toFile()).use { FileWriter(provider.toFile()).use {
it.write(""" it.write("""
|// THIS IS AUTOGENERATED FILE |// THIS IS AUTOGENERATED FILE
|// This method is invoked by the main routine to get a list of tests |// This method is invoked by the main routine to get a list of tests
|func registerProvider() { |func registerProvider() {
| // TODO: assuming this naming for now | // TODO: assuming this naming for now
| ${frameworkName}Tests() | ${testName}Tests()
|} |}
""".trimMargin()) """.trimMargin())
} }
@@ -80,7 +89,7 @@ open class FrameworkTest : DefaultTask() {
"-F", frameworkParentDirPath, "-F", frameworkParentDirPath,
"-Xcc", "-Werror" // To fail compilation on warnings in framework header. "-Xcc", "-Werror" // To fail compilation on warnings in framework header.
) )
val testExecutable = Paths.get(testOutput, frameworkName, "swiftTestExecutable") val testExecutable = Paths.get(testOutput, testName, "swiftTestExecutable")
compileSwift(project, project.testTarget, sources, options, testExecutable, fullBitcode) compileSwift(project, project.testTarget, sources, options, testExecutable, fullBitcode)
runTest(testExecutable) runTest(testExecutable)