Skip to content

Commit fee8c92

Browse files
committed
fix(apple): properly detect apple binaries via header magic
1 parent b11a1f4 commit fee8c92

File tree

1 file changed

+27
-6
lines changed
  • vendor/vendor-apple/base/src/main/kotlin/com/malinskiy/marathon/apple/model

1 file changed

+27
-6
lines changed

vendor/vendor-apple/base/src/main/kotlin/com/malinskiy/marathon/apple/model/AppleTestBundle.kt

+27-6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,18 @@ import com.malinskiy.marathon.log.MarathonLogging
99
import java.io.File
1010
import java.nio.file.Paths
1111

12+
private val File.isAppleBinary: Boolean
13+
get() {
14+
inputStream().use {
15+
if (length() < 4) return false
16+
17+
val header = UByteArray(4)
18+
it.read(header.asByteArray())
19+
20+
return header.contentEquals(AppleTestBundle.FAT_MAGIC) || header.contentEquals(AppleTestBundle.MH_MAGIC) || header.contentEquals(AppleTestBundle.MH_MAGIC_64)
21+
}
22+
}
23+
1224
class AppleTestBundle(
1325
val application: File?,
1426
val testApplication: File?,
@@ -53,11 +65,11 @@ class AppleTestBundle(
5365
val testBinary: File by lazy {
5466
val possibleTestBinaries = when (sdk) {
5567
Sdk.IPHONEOS, Sdk.IPHONESIMULATOR, Sdk.TV, Sdk.TV_SIMULATOR, Sdk.WATCH, Sdk.WATCH_SIMULATOR, Sdk.VISION, Sdk.VISION_SIMULATOR -> xctestBundle.listFiles()
56-
?.filter { it.isFile && it.extension == "" }
68+
?.filter { it.isFile && it.extension == "" && it.isAppleBinary }
5769
?: throw ConfigurationException("missing test binaries in xctest folder at $xctestBundle")
5870

5971
Sdk.MACOS -> Paths.get(xctestBundle.absolutePath, *relativeBinaryPath).toFile().listFiles()
60-
?.filter { it.isFile && it.extension == "" }
72+
?.filter { it.isFile && it.extension == "" && it.isAppleBinary }
6173
?: throw ConfigurationException("missing test binaries in xctest folder at $xctestBundle")
6274
}
6375
when (possibleTestBinaries.size) {
@@ -77,11 +89,11 @@ class AppleTestBundle(
7789

7890
val possibleTestRunnerBinaries = when (sdk) {
7991
Sdk.IPHONEOS, Sdk.IPHONESIMULATOR, Sdk.TV, Sdk.TV_SIMULATOR, Sdk.WATCH, Sdk.WATCH_SIMULATOR, Sdk.VISION, Sdk.VISION_SIMULATOR -> testApplication.listFiles()
80-
?.filter { it.isFile && it.extension == "" }
92+
?.filter { it.isFile && it.extension == "" && it.isAppleBinary }
8193
?: throw ConfigurationException("missing test binaries in test runner folder at $testApplication")
8294

8395
Sdk.MACOS -> Paths.get(testApplication.absolutePath, *relativeBinaryPath).toFile().listFiles()
84-
?.filter { it.isFile && it.extension == "" }
96+
?.filter { it.isFile && it.extension == "" && it.isAppleBinary }
8597
?: throw ConfigurationException("missing test binaries in test runner folder at $testApplication")
8698
}
8799
when (possibleTestRunnerBinaries.size) {
@@ -98,10 +110,10 @@ class AppleTestBundle(
98110
application?.let { application ->
99111
when (sdk) {
100112
Sdk.IPHONEOS, Sdk.IPHONESIMULATOR, Sdk.TV, Sdk.TV_SIMULATOR, Sdk.WATCH, Sdk.WATCH_SIMULATOR, Sdk.VISION, Sdk.VISION_SIMULATOR -> application.listFiles()
101-
?.filter { it.isFile && it.extension == "" }
113+
?.filter { it.isFile && it.extension == "" && it.isAppleBinary }
102114

103115
Sdk.MACOS -> Paths.get(application.absolutePath, *relativeBinaryPath).toFile().listFiles()
104-
?.filter { it.isFile && it.extension == "" }
116+
?.filter { it.isFile && it.extension == "" && it.isAppleBinary }
105117
}?.let { possibleBinaries ->
106118
when (possibleBinaries.size) {
107119
0 -> null
@@ -124,4 +136,13 @@ class AppleTestBundle(
124136
Sdk.MACOS -> arrayOf("Contents", "MacOS")
125137
}
126138
}
139+
140+
/**
141+
* See mach-o specification for these
142+
*/
143+
companion object {
144+
val FAT_MAGIC: UByteArray = ubyteArrayOf(0xca.toUByte(), 0xfe.toUByte(), 0xba.toUByte(), 0xbe.toUByte()).reversedArray()
145+
val MH_MAGIC: UByteArray = ubyteArrayOf(0xfe.toUByte(), 0xed.toUByte(), 0xfa.toUByte(), 0xce.toUByte()).reversedArray()
146+
val MH_MAGIC_64: UByteArray = ubyteArrayOf(0xfe.toUByte(), 0xed.toUByte(), 0xfa.toUByte(), 0xcf.toUByte()).reversedArray()
147+
}
127148
}

0 commit comments

Comments
 (0)