@@ -9,6 +9,18 @@ import com.malinskiy.marathon.log.MarathonLogging
9
9
import java.io.File
10
10
import java.nio.file.Paths
11
11
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
+
12
24
class AppleTestBundle (
13
25
val application : File ? ,
14
26
val testApplication : File ? ,
@@ -53,11 +65,11 @@ class AppleTestBundle(
53
65
val testBinary: File by lazy {
54
66
val possibleTestBinaries = when (sdk) {
55
67
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 }
57
69
? : throw ConfigurationException (" missing test binaries in xctest folder at $xctestBundle " )
58
70
59
71
Sdk .MACOS -> Paths .get(xctestBundle.absolutePath, * relativeBinaryPath).toFile().listFiles()
60
- ?.filter { it.isFile && it.extension == " " }
72
+ ?.filter { it.isFile && it.extension == " " && it.isAppleBinary }
61
73
? : throw ConfigurationException (" missing test binaries in xctest folder at $xctestBundle " )
62
74
}
63
75
when (possibleTestBinaries.size) {
@@ -77,11 +89,11 @@ class AppleTestBundle(
77
89
78
90
val possibleTestRunnerBinaries = when (sdk) {
79
91
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 }
81
93
? : throw ConfigurationException (" missing test binaries in test runner folder at $testApplication " )
82
94
83
95
Sdk .MACOS -> Paths .get(testApplication.absolutePath, * relativeBinaryPath).toFile().listFiles()
84
- ?.filter { it.isFile && it.extension == " " }
96
+ ?.filter { it.isFile && it.extension == " " && it.isAppleBinary }
85
97
? : throw ConfigurationException (" missing test binaries in test runner folder at $testApplication " )
86
98
}
87
99
when (possibleTestRunnerBinaries.size) {
@@ -98,10 +110,10 @@ class AppleTestBundle(
98
110
application?.let { application ->
99
111
when (sdk) {
100
112
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 }
102
114
103
115
Sdk .MACOS -> Paths .get(application.absolutePath, * relativeBinaryPath).toFile().listFiles()
104
- ?.filter { it.isFile && it.extension == " " }
116
+ ?.filter { it.isFile && it.extension == " " && it.isAppleBinary }
105
117
}?.let { possibleBinaries ->
106
118
when (possibleBinaries.size) {
107
119
0 -> null
@@ -124,4 +136,13 @@ class AppleTestBundle(
124
136
Sdk .MACOS -> arrayOf(" Contents" , " MacOS" )
125
137
}
126
138
}
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
+ }
127
148
}
0 commit comments