Skip to content

Commit

Permalink
Upgrade unit tests & fix rewriteXcTestRunV2 implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
jan-goral committed Nov 6, 2020
1 parent 67f29fb commit 390f9c7
Show file tree
Hide file tree
Showing 16 changed files with 611 additions and 456 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package ftl.ios.xctest

import com.dd.plist.NSArray
import com.dd.plist.NSDictionary
import ftl.ios.xctest.common.TEST_TARGETS
import ftl.ios.xctest.common.XctestrunMethods
import ftl.ios.xctest.common.findTestsForTarget
import ftl.ios.xctest.common.getBlueprintName
import ftl.ios.xctest.common.getTestConfigurations
import ftl.ios.xctest.common.getTestTargets
import ftl.ios.xctest.common.parseToNSDictionary
import java.io.File

Expand All @@ -27,6 +25,3 @@ private fun findXcTestNamesV2(xctestrun: File): Map<String, XctestrunMethods> {
}
}
}

private fun NSDictionary.getTestTargets(): List<NSDictionary> =
(get(TEST_TARGETS) as NSArray).array.map { it as NSDictionary }
45 changes: 27 additions & 18 deletions test_runner/src/main/kotlin/ftl/ios/xctest/RewriteXcTestRunV2.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,50 @@ package ftl.ios.xctest
import com.dd.plist.NSArray
import com.dd.plist.NSDictionary
import com.dd.plist.NSObject
import ftl.ios.xctest.common.TEST_CONFIGURATION
import com.google.common.annotations.VisibleForTesting
import ftl.ios.xctest.common.TEST_CONFIGURATIONS
import ftl.ios.xctest.common.XctestrunMethods
import ftl.ios.xctest.common.getBlueprintName
import ftl.ios.xctest.common.getTestConfigurations
import ftl.ios.xctest.common.getTestTargets
import ftl.ios.xctest.common.parseToNSDictionary
import ftl.ios.xctest.common.setOnlyTestIdentifiers
import ftl.ios.xctest.common.toByteArray

fun rewriteXcTestRunV2(
xcTestPlan: String,
filterMethods: List<String>
filterMethods: List<String> = emptyList()
): Map<String, ByteArray> =
rewriteXcTestRunV2(
parseToNSDictionary(xcTestPlan),
findXcTestNamesV2(xcTestPlan).mapValues { (_, map) ->
map.mapValues { (_, list) ->
list.filter(filterMethods::contains)
}
},
findXcTestNamesV2(xcTestPlan).filterXcTestMethods(filterMethods),
)

private fun rewriteXcTestRunV2(
@VisibleForTesting
internal fun Map<String, XctestrunMethods>.filterXcTestMethods(
names: List<String>
) = mapValues { (_, map) ->
map.mapValues { (_, list) ->
list.filter(names::contains)
}
}

@VisibleForTesting
internal fun rewriteXcTestRunV2(
root: NSDictionary,
methods: Map<String, XctestrunMethods>
): Map<String, ByteArray> =
root.getTestConfigurations().mapValues { (key, configDict) ->
root.clone().also {
val testMethods = methods[key]
?.get(configDict.getBlueprintName())
?: emptyList()

it[TEST_CONFIGURATION] = configDict
.setOnlyTestIdentifiers(testMethods)
.wrapInNSArray()
root.getTestConfigurations().mapValues { (configName, configDict) ->
root.clone().also { rootClone ->
rootClone[TEST_CONFIGURATIONS] = configDict.clone().apply {
getTestTargets().forEach { target ->
val testMethods = methods[configName]
?.get(target.getBlueprintName())
?: emptyList()
target.setOnlyTestIdentifiers(testMethods)
}
}.wrapInNSArray()
}.toByteArray()
}.toMap()

private fun NSObject.wrapInNSArray() = NSArray().also { it.setValue(0, this) }
private fun NSObject.wrapInNSArray() = NSArray(1).also { it.setValue(0, this) }
16 changes: 11 additions & 5 deletions test_runner/src/main/kotlin/ftl/ios/xctest/common/Util.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ typealias XctestrunMethods = Map<String, List<String>>

internal const val XCTEST_METADATA = "__xctestrun_metadata__"
internal const val FORMAT_VERSION = "FormatVersion"
internal const val TEST_CONFIGURATION = "TestConfiguration"
internal const val TEST_CONFIGURATIONS = "TestConfigurations"
internal const val TEST_TARGETS = "TestTargets"
internal const val TEST_PLAN = "TestPlan"
internal const val NAME = "Name"
Expand All @@ -28,19 +28,25 @@ internal fun NSDictionary.getXcTestRunVersion(): Int =
?.get(FORMAT_VERSION)?.toJavaObject(Int::class.java)
?: throw FlankGeneralError("Given NSDictionary doesn't contains $FORMAT_VERSION")

fun NSDictionary.getTestConfigurations(): Map<String, NSDictionary> =
internal fun NSDictionary.getTestConfigurations(): Map<String, NSDictionary> =
testConfigurationsNSArray().array.map { it as NSDictionary }.associateBy {
it.getName()
}

private fun NSDictionary.testConfigurationsNSArray(): NSArray =
get(TEST_CONFIGURATION) as NSArray
get(TEST_CONFIGURATIONS) as NSArray

internal fun NSDictionary.getTestTargets(): List<NSDictionary> =
(get(TEST_TARGETS) as NSArray).array.map { it as NSDictionary }

internal fun NSDictionary.getOnlyTestIdentifiers() =
(get(ONLY_TEST_IDENTIFIERS) as NSArray).array.map { it.toString() }

private fun NSDictionary.getName(): String = get(NAME)
?.toJavaObject(String::class.java)
?: throw FlankConfigurationError("Cannot get Name key from NSDictionary:\n ${toXMLPropertyList()}")

fun NSDictionary.getBlueprintName() = get(BLUEPRINT_NAME).toString()
internal fun NSDictionary.getBlueprintName() = get(BLUEPRINT_NAME).toString()

internal fun NSDictionary.toByteArray(): ByteArray {
val out = ByteArrayOutputStream()
Expand Down Expand Up @@ -74,7 +80,7 @@ internal fun validateIsFile(path: String) = File(path).run {

// https://github.com/google/xctestrunner/blob/51dbb6b7eb35f2ed55439459ca49e06992bc4da0/xctestrunner/test_runner/xctestrun.py#L129
// Rewrites tests so that only the listed tests execute
fun NSDictionary.setOnlyTestIdentifiers(methods: Collection<String>) = apply {
internal fun NSDictionary.setOnlyTestIdentifiers(methods: Collection<String>) = apply {
while (containsKey(ONLY_TEST_IDENTIFIERS)) remove(ONLY_TEST_IDENTIFIERS)
this[ONLY_TEST_IDENTIFIERS] = NSArray(methods.size).also { methods.forEachIndexed(it::setValue) }
}
2 changes: 1 addition & 1 deletion test_runner/src/test/kotlin/ftl/gc/GcIosTestMatrixTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.dd.plist.NSDictionary
import com.google.api.services.testing.model.IosDeviceList
import ftl.args.IosArgs
import ftl.config.FtlConstants.isWindows
import ftl.ios.FIXTURES_PATH
import ftl.ios.xctest.FIXTURES_PATH
import ftl.shard.Chunk
import ftl.shard.TestMethod
import ftl.test.util.FlankTestRunner
Expand Down
3 changes: 0 additions & 3 deletions test_runner/src/test/kotlin/ftl/ios/Constants.kt

This file was deleted.

114 changes: 0 additions & 114 deletions test_runner/src/test/kotlin/ftl/ios/ParseTest.kt

This file was deleted.

Loading

0 comments on commit 390f9c7

Please sign in to comment.