@tamagui/native-ci 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +38 -4
- package/dist/cli.mjs.map +1 -1
- package/dist/detox.mjs +113 -11
- package/dist/detox.mjs.map +1 -1
- package/package.json +2 -2
- package/src/cli.ts +41 -3
- package/src/detox.ts +180 -18
- package/src/ios.ts +81 -19
- package/types/detox.d.ts +24 -1
- package/types/detox.d.ts.map +1 -1
- package/types/ios.d.ts.map +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -7,6 +7,9 @@ import { withMetro } from "./metro.mjs";
|
|
|
7
7
|
import { runDetoxTests } from "./detox.mjs";
|
|
8
8
|
import { ensureIOSFolder, ensureIOSApp, ensureBootedSimulator, ensureAppInstalled, getBootedSimulatorUDID, getMaestroBundleId } from "./ios";
|
|
9
9
|
import { setupAndroidDevice, ensureAndroidFolder } from "./android";
|
|
10
|
+
import { chmodSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
10
13
|
const HELP = `
|
|
11
14
|
native-ci - Native CI/CD helpers for Expo apps
|
|
12
15
|
|
|
@@ -59,6 +62,20 @@ EXAMPLES:
|
|
|
59
62
|
native-ci fingerprint ios
|
|
60
63
|
native-ci fingerprint-test
|
|
61
64
|
`;
|
|
65
|
+
function createMaestroXcrunShim() {
|
|
66
|
+
const binDir = mkdtempSync(join(tmpdir(), "native-ci-maestro-"));
|
|
67
|
+
const xcrunPath = join(binDir, "xcrun");
|
|
68
|
+
writeFileSync(xcrunPath, `#!/bin/sh
|
|
69
|
+
if [ "$1" = "devicectl" ] && [ "$2" = "--json-output" ] && [ "$4" = "list" ] && [ "$5" = "devices" ]; then
|
|
70
|
+
printf '{"result":{"devices":[]}}\\n' > "$3"
|
|
71
|
+
exit 0
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
exec /usr/bin/xcrun "$@"
|
|
75
|
+
`);
|
|
76
|
+
chmodSync(xcrunPath, 493);
|
|
77
|
+
return binDir;
|
|
78
|
+
}
|
|
62
79
|
function parseArgs(argv) {
|
|
63
80
|
const args2 = [];
|
|
64
81
|
const options2 = {
|
|
@@ -163,7 +180,8 @@ try {
|
|
|
163
180
|
config,
|
|
164
181
|
projectRoot: options.projectRoot,
|
|
165
182
|
recordLogs: options.recordLogs,
|
|
166
|
-
retries: options.retries
|
|
183
|
+
retries: options.retries,
|
|
184
|
+
testFiles: args.length > 0 ? args : void 0
|
|
167
185
|
});
|
|
168
186
|
});
|
|
169
187
|
process.exit(exitCode);
|
|
@@ -183,7 +201,8 @@ try {
|
|
|
183
201
|
projectRoot: options.projectRoot,
|
|
184
202
|
recordLogs: options.recordLogs,
|
|
185
203
|
retries: options.retries,
|
|
186
|
-
headless: options.headless
|
|
204
|
+
headless: options.headless,
|
|
205
|
+
testFiles: args.length > 0 ? args : void 0
|
|
187
206
|
});
|
|
188
207
|
});
|
|
189
208
|
process.exit(exitCode);
|
|
@@ -209,8 +228,23 @@ try {
|
|
|
209
228
|
const flowArg = flow ? `./flows/${flow}` : "./flows";
|
|
210
229
|
const udidArgs = ["--udid", udid];
|
|
211
230
|
const debugDir = `${options.projectRoot}/.maestro-debug`;
|
|
212
|
-
const
|
|
213
|
-
|
|
231
|
+
const xcrunShimDir = createMaestroXcrunShim();
|
|
232
|
+
const previousPath = process.env.PATH;
|
|
233
|
+
try {
|
|
234
|
+
process.env.PATH = `${xcrunShimDir}:${previousPath ?? ""}`;
|
|
235
|
+
const result = await $`maestro test ${flowArg} --exclude-tags=util --no-ansi --debug-output=${debugDir} ${udidArgs}`.nothrow();
|
|
236
|
+
return result.exitCode;
|
|
237
|
+
} finally {
|
|
238
|
+
if (previousPath === void 0) {
|
|
239
|
+
delete process.env.PATH;
|
|
240
|
+
} else {
|
|
241
|
+
process.env.PATH = previousPath;
|
|
242
|
+
}
|
|
243
|
+
rmSync(xcrunShimDir, {
|
|
244
|
+
recursive: true,
|
|
245
|
+
force: true
|
|
246
|
+
});
|
|
247
|
+
}
|
|
214
248
|
});
|
|
215
249
|
process.exit(exitCode);
|
|
216
250
|
} else if (platform === "all") {
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["generateFingerprint","generatePreFingerprintHash","createCacheKey","saveFingerprintToKV","getFingerprintFromKV","saveCache","loadCache","setGitHubOutput","isGitHubActions","isCI","ensureIosDeps","ensureAndroidDeps","ensureMaestro","printDepsStatus","withMetro","runDetoxTests","ensureIOSFolder","ensureIOSApp","ensureBootedSimulator","ensureAppInstalled","getBootedSimulatorUDID","getMaestroBundleId","setupAndroidDevice","ensureAndroidFolder","HELP","parseArgs","argv","args2","options2","projectRoot","process","cwd","config","recordLogs","retries","headless","prefix","githubOutput","json","help","i","length","arg","val","Number","parseInt","isNaN","startsWith","push","command","subcommand","args","slice","options","validatePlatform","value","console","error","exit","getKVCredentials","url","env","KV_STORE_REDIS_REST_URL","token","KV_STORE_REDIS_REST_TOKEN","info","NATIVE_CI_FORCE_RUN","platform","chdir","exitCode","flow","udid","bundleId","$","flowArg","udidArgs","debugDir","result","nothrow","iosExit","err","androidExit","success","hash","fingerprint","JSON","stringify","CACHE_FILE","iosResult","androidResult","iosFingerprint","androidFingerprint","cache","ios","android","iosChanged","androidChanged","timestamp","Date","toISOString","files","filter","Boolean","cacheKey","key","kv","message"],"sources":["../src/cli.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["generateFingerprint","generatePreFingerprintHash","createCacheKey","saveFingerprintToKV","getFingerprintFromKV","saveCache","loadCache","setGitHubOutput","isGitHubActions","isCI","ensureIosDeps","ensureAndroidDeps","ensureMaestro","printDepsStatus","withMetro","runDetoxTests","ensureIOSFolder","ensureIOSApp","ensureBootedSimulator","ensureAppInstalled","getBootedSimulatorUDID","getMaestroBundleId","setupAndroidDevice","ensureAndroidFolder","chmodSync","mkdtempSync","rmSync","writeFileSync","tmpdir","join","HELP","createMaestroXcrunShim","binDir","xcrunPath","parseArgs","argv","args2","options2","projectRoot","process","cwd","config","recordLogs","retries","headless","prefix","githubOutput","json","help","i","length","arg","val","Number","parseInt","isNaN","startsWith","push","command","subcommand","args","slice","options","validatePlatform","value","console","error","exit","getKVCredentials","url","env","KV_STORE_REDIS_REST_URL","token","KV_STORE_REDIS_REST_TOKEN","info","NATIVE_CI_FORCE_RUN","platform","chdir","exitCode","testFiles","flow","udid","bundleId","$","flowArg","udidArgs","debugDir","xcrunShimDir","previousPath","PATH","result","nothrow","recursive","force","iosExit","err","androidExit","success","hash","fingerprint","JSON","stringify","CACHE_FILE","iosResult","androidResult","iosFingerprint","androidFingerprint","cache","ios","android","iosChanged","androidChanged","timestamp","Date","toISOString","files","filter","Boolean","cacheKey","key","kv","message"],"sources":["../src/cli.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/detox.mjs
CHANGED
|
@@ -70,6 +70,43 @@ function buildDetoxArgs(options) {
|
|
|
70
70
|
return args;
|
|
71
71
|
}
|
|
72
72
|
const DETOX_TIMEOUT_MS = 60 * 60 * 1e3;
|
|
73
|
+
const MAX_CONNECT_FLAKE_RETRIES = 1;
|
|
74
|
+
const CONNECT_FLAKE_SIGNATURES = [/Exceeded timeout of \d+ ms for a hook/, /\btimed out after \d+ms/, /could not connect to Detox/, /launch recovery deadline exceeded/, /skipping launchApp:/, /skipping reload:/];
|
|
75
|
+
const ANSI_PATTERN = /\[[0-9;]*m/g;
|
|
76
|
+
function classifyDetoxFailures(rawOutput) {
|
|
77
|
+
const output = rawOutput.replace(ANSI_PATTERN, "");
|
|
78
|
+
const delimiter = /(PASS|FAIL) (e2e\/[^\s):]+\.test\.ts)/g;
|
|
79
|
+
const marks = [];
|
|
80
|
+
for (const m of output.matchAll(delimiter)) {
|
|
81
|
+
marks.push({
|
|
82
|
+
kind: m[1],
|
|
83
|
+
file: m[2],
|
|
84
|
+
index: m.index ?? 0
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const failedFiles = [];
|
|
88
|
+
const flakeFiles = [];
|
|
89
|
+
const realFiles = [];
|
|
90
|
+
for (let i = 0; i < marks.length; i++) {
|
|
91
|
+
const mark = marks[i];
|
|
92
|
+
if (mark.kind !== "FAIL") continue;
|
|
93
|
+
const blockEnd = i + 1 < marks.length ? marks[i + 1].index : output.length;
|
|
94
|
+
const block = output.slice(mark.index, blockEnd);
|
|
95
|
+
if (failedFiles.includes(mark.file)) continue;
|
|
96
|
+
failedFiles.push(mark.file);
|
|
97
|
+
const isFlake = CONNECT_FLAKE_SIGNATURES.some(sig => sig.test(block));
|
|
98
|
+
if (isFlake) {
|
|
99
|
+
flakeFiles.push(mark.file);
|
|
100
|
+
} else {
|
|
101
|
+
realFiles.push(mark.file);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
failedFiles,
|
|
106
|
+
flakeFiles,
|
|
107
|
+
realFiles
|
|
108
|
+
};
|
|
109
|
+
}
|
|
73
110
|
async function resetDetoxLockFile() {
|
|
74
111
|
console.info("Resetting Detox lock file...");
|
|
75
112
|
const proc = Bun.spawn(["npx", "detox", "reset-lock-file"], {
|
|
@@ -78,9 +115,7 @@ async function resetDetoxLockFile() {
|
|
|
78
115
|
});
|
|
79
116
|
await proc.exited;
|
|
80
117
|
}
|
|
81
|
-
async function
|
|
82
|
-
await resetDetoxLockFile();
|
|
83
|
-
const detoxArgs = buildDetoxArgs(options);
|
|
118
|
+
async function spawnDetoxOnce(detoxArgs) {
|
|
84
119
|
console.info("\n--- Running Detox tests ---");
|
|
85
120
|
console.info(`Using fixed Detox server port: ${DETOX_SERVER_PORT}`);
|
|
86
121
|
console.info(`Command: npx ${detoxArgs.join(" ")}`);
|
|
@@ -89,9 +124,26 @@ async function runDetoxTests(options) {
|
|
|
89
124
|
...process.env,
|
|
90
125
|
DETOX_SERVER_PORT: String(DETOX_SERVER_PORT)
|
|
91
126
|
},
|
|
92
|
-
stdout: "
|
|
93
|
-
stderr: "
|
|
127
|
+
stdout: "pipe",
|
|
128
|
+
stderr: "pipe"
|
|
94
129
|
});
|
|
130
|
+
const decoder = new TextDecoder();
|
|
131
|
+
let output = "";
|
|
132
|
+
const tee = async (stream, sink) => {
|
|
133
|
+
const reader = stream.getReader();
|
|
134
|
+
while (true) {
|
|
135
|
+
const {
|
|
136
|
+
done,
|
|
137
|
+
value
|
|
138
|
+
} = await reader.read();
|
|
139
|
+
if (done) break;
|
|
140
|
+
sink.write(value);
|
|
141
|
+
output += decoder.decode(value, {
|
|
142
|
+
stream: true
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
const pumps = Promise.all([tee(proc.stdout, process.stdout), tee(proc.stderr, process.stderr)]);
|
|
95
147
|
const timeoutPromise = new Promise(resolve => {
|
|
96
148
|
setTimeout(() => resolve("timeout"), DETOX_TIMEOUT_MS);
|
|
97
149
|
});
|
|
@@ -99,16 +151,66 @@ async function runDetoxTests(options) {
|
|
|
99
151
|
if (result === "timeout") {
|
|
100
152
|
console.info("\nDetox timed out, killing process...");
|
|
101
153
|
proc.kill("SIGKILL");
|
|
102
|
-
return
|
|
154
|
+
return {
|
|
155
|
+
exitCode: 1,
|
|
156
|
+
output
|
|
157
|
+
};
|
|
103
158
|
}
|
|
104
|
-
|
|
159
|
+
await pumps;
|
|
160
|
+
return {
|
|
161
|
+
exitCode: result,
|
|
162
|
+
output
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async function runDetoxTests(options) {
|
|
166
|
+
await resetDetoxLockFile();
|
|
167
|
+
const detoxArgs = buildDetoxArgs(options);
|
|
168
|
+
const {
|
|
169
|
+
exitCode,
|
|
170
|
+
output
|
|
171
|
+
} = await spawnDetoxOnce(detoxArgs);
|
|
105
172
|
if (exitCode === 0) {
|
|
106
173
|
console.info("\nAll tests passed!");
|
|
107
|
-
|
|
108
|
-
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
console.info(`
|
|
109
177
|
Tests failed with exit code: ${exitCode}`);
|
|
178
|
+
const {
|
|
179
|
+
flakeFiles,
|
|
180
|
+
realFiles
|
|
181
|
+
} = classifyDetoxFailures(output);
|
|
182
|
+
if (flakeFiles.length === 0) {
|
|
183
|
+
return exitCode;
|
|
184
|
+
}
|
|
185
|
+
if (realFiles.length > 0) {
|
|
186
|
+
console.info(`
|
|
187
|
+
Real test failure(s) present (${realFiles.join(", ")}); not retrying the connect-flaked file(s).`);
|
|
188
|
+
return exitCode;
|
|
189
|
+
}
|
|
190
|
+
for (let attempt = 1; attempt <= MAX_CONNECT_FLAKE_RETRIES; attempt++) {
|
|
191
|
+
console.info(`
|
|
192
|
+
::warning::Detox launch-connect flake detected (beforeAll could not connect to Detox). Retry ${attempt}/${MAX_CONNECT_FLAKE_RETRIES} of: ${flakeFiles.join(", ")}`);
|
|
193
|
+
await resetDetoxLockFile();
|
|
194
|
+
const retryArgs = buildDetoxArgs({
|
|
195
|
+
...options,
|
|
196
|
+
testFiles: flakeFiles
|
|
197
|
+
});
|
|
198
|
+
const retry = await spawnDetoxOnce(retryArgs);
|
|
199
|
+
if (retry.exitCode === 0) {
|
|
200
|
+
console.info(`
|
|
201
|
+
\u2713 Recovered ${flakeFiles.length} connect-flaked file(s) on retry ${attempt}.`);
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
const retryClass = classifyDetoxFailures(retry.output);
|
|
205
|
+
if (retryClass.realFiles.length > 0 || retryClass.flakeFiles.length === 0) {
|
|
206
|
+
console.info("\nRetry surfaced a non-flake failure; surfacing it.");
|
|
207
|
+
return retry.exitCode;
|
|
208
|
+
}
|
|
209
|
+
flakeFiles.length = 0;
|
|
210
|
+
flakeFiles.push(...retryClass.flakeFiles);
|
|
110
211
|
}
|
|
111
|
-
|
|
212
|
+
console.info("\nConnect-flake retries exhausted; tests still failing.");
|
|
213
|
+
return 1;
|
|
112
214
|
}
|
|
113
|
-
export { buildDetoxArgs, parseDetoxArgs, resetDetoxLockFile, runDetoxTests };
|
|
215
|
+
export { buildDetoxArgs, classifyDetoxFailures, parseDetoxArgs, resetDetoxLockFile, runDetoxTests };
|
|
114
216
|
//# sourceMappingURL=detox.mjs.map
|
package/dist/detox.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["parseArgs","DETOX_SERVER_PORT","parseDetoxArgs","platform","defaultConfig","values","positionals","options","config","type","default","process","cwd","headless","retries","workers","allowPositionals","retriesNum","Number","parseInt","isNaN","console","error","exit","workersNum","projectRoot","recordLogs","testFiles","length","buildDetoxArgs","args","String","push","DETOX_TIMEOUT_MS","resetDetoxLockFile","info","proc","Bun","spawn","stdout","stderr","exited","
|
|
1
|
+
{"version":3,"names":["parseArgs","DETOX_SERVER_PORT","parseDetoxArgs","platform","defaultConfig","values","positionals","options","config","type","default","process","cwd","headless","retries","workers","allowPositionals","retriesNum","Number","parseInt","isNaN","console","error","exit","workersNum","projectRoot","recordLogs","testFiles","length","buildDetoxArgs","args","String","push","DETOX_TIMEOUT_MS","MAX_CONNECT_FLAKE_RETRIES","CONNECT_FLAKE_SIGNATURES","ANSI_PATTERN","classifyDetoxFailures","rawOutput","output","replace","delimiter","marks","m","matchAll","kind","file","index","failedFiles","flakeFiles","realFiles","i","mark","blockEnd","block","slice","includes","isFlake","some","sig","test","resetDetoxLockFile","info","proc","Bun","spawn","stdout","stderr","exited","spawnDetoxOnce","detoxArgs","join","env","decoder","TextDecoder","tee","stream","sink","reader","getReader","done","value","read","write","decode","pumps","Promise","all","timeoutPromise","resolve","setTimeout","result","race","kill","exitCode","runDetoxTests","attempt","retryArgs","retry","retryClass"],"sources":["../src/detox.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/native-ci",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Native CI/CD helpers for React Native apps with Expo - fingerprinting, caching, and build optimization",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"@expo/fingerprint": "~0.16.6"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@tamagui/build": "2.
|
|
45
|
+
"@tamagui/build": "2.2.0",
|
|
46
46
|
"@types/bun": "^1.1.0",
|
|
47
47
|
"@types/node": "^22.1.0"
|
|
48
48
|
},
|
package/src/cli.ts
CHANGED
|
@@ -36,6 +36,9 @@ import {
|
|
|
36
36
|
} from './ios'
|
|
37
37
|
import { setupAndroidDevice, ensureAndroidFolder } from './android'
|
|
38
38
|
import type { Platform } from './constants'
|
|
39
|
+
import { chmodSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
40
|
+
import { tmpdir } from 'node:os'
|
|
41
|
+
import { join } from 'node:path'
|
|
39
42
|
|
|
40
43
|
const HELP = `
|
|
41
44
|
native-ci - Native CI/CD helpers for Expo apps
|
|
@@ -90,6 +93,26 @@ EXAMPLES:
|
|
|
90
93
|
native-ci fingerprint-test
|
|
91
94
|
`
|
|
92
95
|
|
|
96
|
+
function createMaestroXcrunShim() {
|
|
97
|
+
const binDir = mkdtempSync(join(tmpdir(), 'native-ci-maestro-'))
|
|
98
|
+
const xcrunPath = join(binDir, 'xcrun')
|
|
99
|
+
|
|
100
|
+
writeFileSync(
|
|
101
|
+
xcrunPath,
|
|
102
|
+
`#!/bin/sh
|
|
103
|
+
if [ "$1" = "devicectl" ] && [ "$2" = "--json-output" ] && [ "$4" = "list" ] && [ "$5" = "devices" ]; then
|
|
104
|
+
printf '{"result":{"devices":[]}}\\n' > "$3"
|
|
105
|
+
exit 0
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
exec /usr/bin/xcrun "$@"
|
|
109
|
+
`
|
|
110
|
+
)
|
|
111
|
+
chmodSync(xcrunPath, 0o755)
|
|
112
|
+
|
|
113
|
+
return binDir
|
|
114
|
+
}
|
|
115
|
+
|
|
93
116
|
interface ParsedArgs {
|
|
94
117
|
command: string
|
|
95
118
|
subcommand: string
|
|
@@ -223,6 +246,7 @@ try {
|
|
|
223
246
|
projectRoot: options.projectRoot,
|
|
224
247
|
recordLogs: options.recordLogs,
|
|
225
248
|
retries: options.retries,
|
|
249
|
+
testFiles: args.length > 0 ? args : undefined,
|
|
226
250
|
})
|
|
227
251
|
})
|
|
228
252
|
process.exit(exitCode)
|
|
@@ -249,6 +273,7 @@ try {
|
|
|
249
273
|
recordLogs: options.recordLogs,
|
|
250
274
|
retries: options.retries,
|
|
251
275
|
headless: options.headless,
|
|
276
|
+
testFiles: args.length > 0 ? args : undefined,
|
|
252
277
|
})
|
|
253
278
|
})
|
|
254
279
|
process.exit(exitCode)
|
|
@@ -279,9 +304,22 @@ try {
|
|
|
279
304
|
const flowArg = flow ? `./flows/${flow}` : './flows'
|
|
280
305
|
const udidArgs = ['--udid', udid]
|
|
281
306
|
const debugDir = `${options.projectRoot}/.maestro-debug`
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
|
|
307
|
+
const xcrunShimDir = createMaestroXcrunShim()
|
|
308
|
+
const previousPath = process.env.PATH
|
|
309
|
+
|
|
310
|
+
try {
|
|
311
|
+
process.env.PATH = `${xcrunShimDir}:${previousPath ?? ''}`
|
|
312
|
+
const result =
|
|
313
|
+
await $`maestro test ${flowArg} --exclude-tags=util --no-ansi --debug-output=${debugDir} ${udidArgs}`.nothrow()
|
|
314
|
+
return result.exitCode
|
|
315
|
+
} finally {
|
|
316
|
+
if (previousPath === undefined) {
|
|
317
|
+
delete process.env.PATH
|
|
318
|
+
} else {
|
|
319
|
+
process.env.PATH = previousPath
|
|
320
|
+
}
|
|
321
|
+
rmSync(xcrunShimDir, { recursive: true, force: true })
|
|
322
|
+
}
|
|
285
323
|
})
|
|
286
324
|
process.exit(exitCode)
|
|
287
325
|
} else if (platform === 'all') {
|
package/src/detox.ts
CHANGED
|
@@ -107,6 +107,84 @@ export function buildDetoxArgs(options: DetoxRunnerOptions): string[] {
|
|
|
107
107
|
// workflow job timeout is 90min, leaving room for setup + this run.
|
|
108
108
|
const DETOX_TIMEOUT_MS = 60 * 60 * 1000
|
|
109
109
|
|
|
110
|
+
// Connect-flake retry: a single beforeAll launchApp that can't connect to Detox on a
|
|
111
|
+
// degraded runner fails the whole spec file (all its tests fail off the one hook), and
|
|
112
|
+
// nothing retries beforeAll (jest.retryTimes only re-runs individual tests; detox
|
|
113
|
+
// --retries is held at 0 to avoid blanket whole-file retry wall-time). So we retry the
|
|
114
|
+
// failed files ONCE, but ONLY when every failed file's failure carries the launch/connect
|
|
115
|
+
// flake signature - never on a real assertion failure. This is safe by construction: a
|
|
116
|
+
// real failure fails again on retry, so a misclassification can only cost one extra file
|
|
117
|
+
// run, never mask a genuine bug. See memory project_detox_app_connect_runaway.
|
|
118
|
+
const MAX_CONNECT_FLAKE_RETRIES = 1
|
|
119
|
+
|
|
120
|
+
// Signatures that mark a spec file's failure as the launch/connect flake rather than a
|
|
121
|
+
// real test failure. Matched against the ANSI-stripped per-file FAIL block.
|
|
122
|
+
// - "for a hook" - jest hook (beforeAll/beforeEach) timeout; real test timeouts say
|
|
123
|
+
// "for a test", so this never matches an assertion failure.
|
|
124
|
+
// - "timed out after <n>ms" - lowercase message thrown by our withTimeout() wrapper,
|
|
125
|
+
// used ONLY by safeLaunchApp/safeReloadApp/safeTerminate; detox's own waitFor emits
|
|
126
|
+
// capital "Timed out after <n>ms waiting for", so the lowercase form is launch-only.
|
|
127
|
+
// - the safeLaunchApp/safeReloadApp breaker messages.
|
|
128
|
+
const CONNECT_FLAKE_SIGNATURES: RegExp[] = [
|
|
129
|
+
/Exceeded timeout of \d+ ms for a hook/,
|
|
130
|
+
/\btimed out after \d+ms/,
|
|
131
|
+
/could not connect to Detox/,
|
|
132
|
+
/launch recovery deadline exceeded/,
|
|
133
|
+
/skipping launchApp:/,
|
|
134
|
+
/skipping reload:/,
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
const ANSI_PATTERN = /\[[0-9;]*m/g
|
|
138
|
+
|
|
139
|
+
interface DetoxFailureClassification {
|
|
140
|
+
/** every spec file with a FAIL line */
|
|
141
|
+
failedFiles: string[]
|
|
142
|
+
/** failed files whose failure matches a connect-flake signature (retry candidates) */
|
|
143
|
+
flakeFiles: string[]
|
|
144
|
+
/** failed files whose failure looks real (assertion/logic) - never retried */
|
|
145
|
+
realFiles: string[]
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Classify a detox/jest run's combined output into connect-flake vs real failures,
|
|
150
|
+
* per spec file. jest prints each file's `FAIL e2e/X.test.ts` line followed by that
|
|
151
|
+
* file's failure detail (the ● blocks) before the next PASS/FAIL line, so the text
|
|
152
|
+
* between one FAIL line and the next delimiter is that file's failure block.
|
|
153
|
+
*
|
|
154
|
+
* Exported for unit testing against real CI logs.
|
|
155
|
+
*/
|
|
156
|
+
export function classifyDetoxFailures(rawOutput: string): DetoxFailureClassification {
|
|
157
|
+
const output = rawOutput.replace(ANSI_PATTERN, '')
|
|
158
|
+
// delimiter = any "PASS e2e/..." or "FAIL e2e/..." occurrence (not anchored: real CI
|
|
159
|
+
// logs may carry a leading timestamp/prefix on the line).
|
|
160
|
+
const delimiter = /(PASS|FAIL) (e2e\/[^\s):]+\.test\.ts)/g
|
|
161
|
+
const marks: { kind: string; file: string; index: number }[] = []
|
|
162
|
+
for (const m of output.matchAll(delimiter)) {
|
|
163
|
+
marks.push({ kind: m[1], file: m[2], index: m.index ?? 0 })
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const failedFiles: string[] = []
|
|
167
|
+
const flakeFiles: string[] = []
|
|
168
|
+
const realFiles: string[] = []
|
|
169
|
+
|
|
170
|
+
for (let i = 0; i < marks.length; i++) {
|
|
171
|
+
const mark = marks[i]
|
|
172
|
+
if (mark.kind !== 'FAIL') continue
|
|
173
|
+
const blockEnd = i + 1 < marks.length ? marks[i + 1].index : output.length
|
|
174
|
+
const block = output.slice(mark.index, blockEnd)
|
|
175
|
+
if (failedFiles.includes(mark.file)) continue
|
|
176
|
+
failedFiles.push(mark.file)
|
|
177
|
+
const isFlake = CONNECT_FLAKE_SIGNATURES.some((sig) => sig.test(block))
|
|
178
|
+
if (isFlake) {
|
|
179
|
+
flakeFiles.push(mark.file)
|
|
180
|
+
} else {
|
|
181
|
+
realFiles.push(mark.file)
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return { failedFiles, flakeFiles, realFiles }
|
|
186
|
+
}
|
|
187
|
+
|
|
110
188
|
/**
|
|
111
189
|
* Reset Detox lock file to prevent ECOMPROMISED errors in CI
|
|
112
190
|
* See: https://github.com/wix/Detox/issues/4210
|
|
@@ -121,29 +199,46 @@ export async function resetDetoxLockFile(): Promise<void> {
|
|
|
121
199
|
}
|
|
122
200
|
|
|
123
201
|
/**
|
|
124
|
-
*
|
|
202
|
+
* Spawn one `npx detox test ...` invocation, streaming its output live to the CI log
|
|
203
|
+
* while also capturing it (ANSI included) so we can classify failures afterwards.
|
|
125
204
|
*
|
|
126
|
-
* @returns
|
|
205
|
+
* @returns the process exit code and the full combined stdout+stderr text.
|
|
127
206
|
*/
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
await resetDetoxLockFile()
|
|
132
|
-
|
|
133
|
-
const detoxArgs = buildDetoxArgs(options)
|
|
134
|
-
|
|
207
|
+
async function spawnDetoxOnce(
|
|
208
|
+
detoxArgs: string[]
|
|
209
|
+
): Promise<{ exitCode: number; output: string }> {
|
|
135
210
|
console.info('\n--- Running Detox tests ---')
|
|
136
211
|
console.info(`Using fixed Detox server port: ${DETOX_SERVER_PORT}`)
|
|
137
212
|
console.info(`Command: npx ${detoxArgs.join(' ')}`)
|
|
138
213
|
|
|
139
|
-
//
|
|
214
|
+
// pipe (not inherit) so we can capture output for flake classification; tee each
|
|
215
|
+
// chunk straight back to our stdout/stderr so the live CI log is unchanged.
|
|
140
216
|
const proc = Bun.spawn(['npx', ...detoxArgs], {
|
|
141
217
|
env: { ...process.env, DETOX_SERVER_PORT: String(DETOX_SERVER_PORT) },
|
|
142
|
-
stdout: '
|
|
143
|
-
stderr: '
|
|
218
|
+
stdout: 'pipe',
|
|
219
|
+
stderr: 'pipe',
|
|
144
220
|
})
|
|
145
221
|
|
|
146
|
-
|
|
222
|
+
const decoder = new TextDecoder()
|
|
223
|
+
let output = ''
|
|
224
|
+
const tee = async (
|
|
225
|
+
stream: ReadableStream<Uint8Array>,
|
|
226
|
+
sink: NodeJS.WriteStream
|
|
227
|
+
): Promise<void> => {
|
|
228
|
+
const reader = stream.getReader()
|
|
229
|
+
while (true) {
|
|
230
|
+
const { done, value } = await reader.read()
|
|
231
|
+
if (done) break
|
|
232
|
+
sink.write(value)
|
|
233
|
+
output += decoder.decode(value, { stream: true })
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const pumps = Promise.all([
|
|
238
|
+
tee(proc.stdout, process.stdout),
|
|
239
|
+
tee(proc.stderr, process.stderr),
|
|
240
|
+
])
|
|
241
|
+
|
|
147
242
|
const timeoutPromise = new Promise<'timeout'>((resolve) => {
|
|
148
243
|
setTimeout(() => resolve('timeout'), DETOX_TIMEOUT_MS)
|
|
149
244
|
})
|
|
@@ -153,16 +248,83 @@ export async function runDetoxTests(options: DetoxRunnerOptions): Promise<number
|
|
|
153
248
|
if (result === 'timeout') {
|
|
154
249
|
console.info('\nDetox timed out, killing process...')
|
|
155
250
|
proc.kill('SIGKILL')
|
|
156
|
-
return 1
|
|
251
|
+
return { exitCode: 1, output }
|
|
157
252
|
}
|
|
158
253
|
|
|
159
|
-
|
|
254
|
+
// drain any buffered output the process emitted right before exit
|
|
255
|
+
await pumps
|
|
256
|
+
return { exitCode: result, output }
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Run Detox tests with the given options.
|
|
261
|
+
*
|
|
262
|
+
* On failure, retries the failed spec files ONCE when (and only when) every failed
|
|
263
|
+
* file's failure carries the launch/connect flake signature - this recovers the
|
|
264
|
+
* beforeAll-launch flake that jest.retryTimes can't, without reintroducing blanket
|
|
265
|
+
* whole-file retries. Real failures are never retried (and would fail again anyway).
|
|
266
|
+
*
|
|
267
|
+
* @returns Exit code from Detox
|
|
268
|
+
*/
|
|
269
|
+
export async function runDetoxTests(options: DetoxRunnerOptions): Promise<number> {
|
|
270
|
+
// Reset lock file to prevent ECOMPROMISED errors in CI
|
|
271
|
+
// This clears stale locks from previous runs that can cause "Unable to update lock within the stale threshold" errors
|
|
272
|
+
await resetDetoxLockFile()
|
|
273
|
+
|
|
274
|
+
const detoxArgs = buildDetoxArgs(options)
|
|
275
|
+
const { exitCode, output } = await spawnDetoxOnce(detoxArgs)
|
|
160
276
|
|
|
161
277
|
if (exitCode === 0) {
|
|
162
278
|
console.info('\nAll tests passed!')
|
|
163
|
-
|
|
164
|
-
|
|
279
|
+
return 0
|
|
280
|
+
}
|
|
281
|
+
console.info(`\nTests failed with exit code: ${exitCode}`)
|
|
282
|
+
|
|
283
|
+
const { flakeFiles, realFiles } = classifyDetoxFailures(output)
|
|
284
|
+
|
|
285
|
+
// nothing to retry: either we couldn't attribute the failure to specific files, or a
|
|
286
|
+
// real (non-flake) failure is present - in both cases surface the original result.
|
|
287
|
+
if (flakeFiles.length === 0) {
|
|
288
|
+
return exitCode
|
|
289
|
+
}
|
|
290
|
+
if (realFiles.length > 0) {
|
|
291
|
+
console.info(
|
|
292
|
+
`\nReal test failure(s) present (${realFiles.join(', ')}); not retrying the ` +
|
|
293
|
+
`connect-flaked file(s).`
|
|
294
|
+
)
|
|
295
|
+
return exitCode
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
for (let attempt = 1; attempt <= MAX_CONNECT_FLAKE_RETRIES; attempt++) {
|
|
299
|
+
console.info(
|
|
300
|
+
`\n::warning::Detox launch-connect flake detected (beforeAll could not connect to ` +
|
|
301
|
+
`Detox). Retry ${attempt}/${MAX_CONNECT_FLAKE_RETRIES} of: ${flakeFiles.join(', ')}`
|
|
302
|
+
)
|
|
303
|
+
// fresh lock file before the retry so a stale lock from the wedged run can't
|
|
304
|
+
// immediately re-trip the same connect failure.
|
|
305
|
+
await resetDetoxLockFile()
|
|
306
|
+
|
|
307
|
+
const retryArgs = buildDetoxArgs({ ...options, testFiles: flakeFiles })
|
|
308
|
+
const retry = await spawnDetoxOnce(retryArgs)
|
|
309
|
+
if (retry.exitCode === 0) {
|
|
310
|
+
console.info(
|
|
311
|
+
`\n✓ Recovered ${flakeFiles.length} connect-flaked file(s) on retry ${attempt}.`
|
|
312
|
+
)
|
|
313
|
+
return 0
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// if the retry surfaced a real failure (the flake cleared but a genuine bug is
|
|
317
|
+
// underneath), stop retrying and surface it.
|
|
318
|
+
const retryClass = classifyDetoxFailures(retry.output)
|
|
319
|
+
if (retryClass.realFiles.length > 0 || retryClass.flakeFiles.length === 0) {
|
|
320
|
+
console.info('\nRetry surfaced a non-flake failure; surfacing it.')
|
|
321
|
+
return retry.exitCode
|
|
322
|
+
}
|
|
323
|
+
// still a pure connect-flake - loop will retry again if budget remains.
|
|
324
|
+
flakeFiles.length = 0
|
|
325
|
+
flakeFiles.push(...retryClass.flakeFiles)
|
|
165
326
|
}
|
|
166
327
|
|
|
167
|
-
|
|
328
|
+
console.info('\nConnect-flake retries exhausted; tests still failing.')
|
|
329
|
+
return 1
|
|
168
330
|
}
|
package/src/ios.ts
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* iOS-specific utilities for Detox test runners
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs'
|
|
6
|
-
import { dirname, join } from 'node:path'
|
|
7
|
-
import { execSync } from 'node:child_process'
|
|
5
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync } from 'node:fs'
|
|
6
|
+
import { dirname, isAbsolute, join } from 'node:path'
|
|
7
|
+
import { execFileSync, execSync } from 'node:child_process'
|
|
8
8
|
import { $ } from 'bun'
|
|
9
9
|
import { isCI } from './runner'
|
|
10
10
|
import { generateFingerprint } from './fingerprint'
|
|
@@ -75,6 +75,67 @@ function isAppInstalled(bundleId: string, udid: string): boolean {
|
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
+
function getIOSProjectName(projectRoot: string): string {
|
|
79
|
+
const iosDir = join(projectRoot, 'ios')
|
|
80
|
+
const iosEntries = readdirSync(iosDir)
|
|
81
|
+
const workspace = iosEntries.find((entry) => entry.endsWith('.xcworkspace'))
|
|
82
|
+
if (workspace) return workspace.replace(/\.xcworkspace$/, '')
|
|
83
|
+
|
|
84
|
+
const project = iosEntries.find((entry) => entry.endsWith('.xcodeproj'))
|
|
85
|
+
if (project) return project.replace(/\.xcodeproj$/, '')
|
|
86
|
+
|
|
87
|
+
throw new Error(`No iOS workspace or project found in ${iosDir}`)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function getIOSBuildConfiguration(config: string): 'Debug' | 'Release' {
|
|
91
|
+
return config.toLowerCase().includes('release') ? 'Release' : 'Debug'
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function getIOSAppPath(projectRoot: string, config: string): string {
|
|
95
|
+
if (process.env.DETOX_IOS_APP_PATH) return process.env.DETOX_IOS_APP_PATH
|
|
96
|
+
|
|
97
|
+
const appName = getIOSProjectName(projectRoot)
|
|
98
|
+
const buildConfiguration = getIOSBuildConfiguration(config)
|
|
99
|
+
return `ios/build/Build/Products/${buildConfiguration}-iphonesimulator/${appName}.app`
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function getIOSFullAppPath(projectRoot: string, config: string): string {
|
|
103
|
+
const appPath = getIOSAppPath(projectRoot, config)
|
|
104
|
+
return isAbsolute(appPath) ? appPath : join(projectRoot, appPath)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function getIOSPodTargetName(projectRoot: string): string {
|
|
108
|
+
const podfile = readFileSync(join(projectRoot, 'ios', 'Podfile'), 'utf-8')
|
|
109
|
+
const match = podfile.match(/^\s*target ['"]([^'"]+)['"] do/m)
|
|
110
|
+
if (!match) {
|
|
111
|
+
throw new Error(`No CocoaPods target found in ${join(projectRoot, 'ios', 'Podfile')}`)
|
|
112
|
+
}
|
|
113
|
+
return match[1]
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function getIOSAppBundleId(fullAppPath: string): string | null {
|
|
117
|
+
const infoPlist = join(fullAppPath, 'Info.plist')
|
|
118
|
+
if (!existsSync(infoPlist)) return null
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const bundleId = execFileSync(
|
|
122
|
+
'/usr/bin/plutil',
|
|
123
|
+
['-extract', 'CFBundleIdentifier', 'raw', '-o', '-', infoPlist],
|
|
124
|
+
{
|
|
125
|
+
encoding: 'utf-8',
|
|
126
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
127
|
+
}
|
|
128
|
+
).trim()
|
|
129
|
+
return bundleId || null
|
|
130
|
+
} catch {
|
|
131
|
+
return null
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function isIOSAppBundleReady(fullAppPath: string): boolean {
|
|
136
|
+
return existsSync(fullAppPath) && !!getIOSAppBundleId(fullAppPath)
|
|
137
|
+
}
|
|
138
|
+
|
|
78
139
|
/**
|
|
79
140
|
* Ensure the app is installed on a specific simulator.
|
|
80
141
|
* For dev client apps, builds if needed then installs.
|
|
@@ -103,12 +164,10 @@ export async function ensureAppInstalled(opts: {
|
|
|
103
164
|
console.info(`App ${bundleId} not installed, building...`)
|
|
104
165
|
await ensureIOSFolder()
|
|
105
166
|
|
|
106
|
-
const appPath =
|
|
107
|
-
|
|
108
|
-
'ios/build/Build/Products/Debug-iphonesimulator/tamaguikitchensink.app'
|
|
109
|
-
const fullAppPath = join(projectRoot, appPath)
|
|
167
|
+
const appPath = getIOSAppPath(projectRoot, 'ios.sim.debug')
|
|
168
|
+
const fullAppPath = getIOSFullAppPath(projectRoot, 'ios.sim.debug')
|
|
110
169
|
|
|
111
|
-
if (!
|
|
170
|
+
if (!isIOSAppBundleReady(fullAppPath)) {
|
|
112
171
|
await ensureIOSApp('ios.sim.debug')
|
|
113
172
|
}
|
|
114
173
|
|
|
@@ -299,12 +358,10 @@ export async function ensureIOSApp(config: string = 'ios.sim.debug'): Promise<vo
|
|
|
299
358
|
|
|
300
359
|
const projectRoot = process.cwd()
|
|
301
360
|
|
|
302
|
-
//
|
|
303
|
-
const appPath =
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
const fullAppPath = join(projectRoot, appPath)
|
|
307
|
-
const appExists = existsSync(fullAppPath)
|
|
361
|
+
// check if a complete app bundle exists
|
|
362
|
+
const appPath = getIOSAppPath(projectRoot, config)
|
|
363
|
+
const fullAppPath = getIOSFullAppPath(projectRoot, config)
|
|
364
|
+
const appExists = isIOSAppBundleReady(fullAppPath)
|
|
308
365
|
|
|
309
366
|
// If app doesn't exist, we must build regardless of fingerprint
|
|
310
367
|
if (!appExists) {
|
|
@@ -366,7 +423,7 @@ export async function ensureIOSApp(config: string = 'ios.sim.debug'): Promise<vo
|
|
|
366
423
|
}
|
|
367
424
|
|
|
368
425
|
/**
|
|
369
|
-
* Build the iOS app using
|
|
426
|
+
* Build the iOS app using the generated Xcode workspace.
|
|
370
427
|
*/
|
|
371
428
|
async function buildIOSApp(
|
|
372
429
|
config: string,
|
|
@@ -381,18 +438,23 @@ async function buildIOSApp(
|
|
|
381
438
|
'ios',
|
|
382
439
|
'Pods',
|
|
383
440
|
'Target Support Files',
|
|
384
|
-
|
|
385
|
-
|
|
441
|
+
`Pods-${getIOSPodTargetName(projectRoot)}`,
|
|
442
|
+
`Pods-${getIOSPodTargetName(projectRoot)}.debug.xcconfig`
|
|
386
443
|
)
|
|
387
444
|
if (!existsSync(podConfigPath)) {
|
|
388
445
|
console.info('Installing CocoaPods dependencies...')
|
|
389
446
|
await $`pod install --project-directory=ios`
|
|
390
447
|
}
|
|
391
448
|
|
|
392
|
-
|
|
449
|
+
const scheme = getIOSProjectName(projectRoot)
|
|
450
|
+
const buildConfiguration = getIOSBuildConfiguration(config)
|
|
451
|
+
const workspace = join('ios', `${scheme}.xcworkspace`)
|
|
452
|
+
const symroot = join(projectRoot, 'ios', 'build', 'Build', 'Products')
|
|
453
|
+
const objroot = join(projectRoot, 'ios', 'build', 'Build', 'Intermediates.noindex')
|
|
454
|
+
|
|
393
455
|
console.info(`Building iOS app (config: ${config})...`)
|
|
394
456
|
console.info('This may take a few minutes on first run.')
|
|
395
|
-
await $`
|
|
457
|
+
await $`xcodebuild -workspace ${workspace} -scheme ${scheme} -configuration ${buildConfiguration} -sdk iphonesimulator SYMROOT=${symroot} OBJROOT=${objroot}`
|
|
396
458
|
|
|
397
459
|
// Save the fingerprint cache
|
|
398
460
|
if (fingerprint) {
|
package/types/detox.d.ts
CHANGED
|
@@ -36,15 +36,38 @@ export declare function parseDetoxArgs(platform: Platform): {
|
|
|
36
36
|
* Build Detox CLI command arguments
|
|
37
37
|
*/
|
|
38
38
|
export declare function buildDetoxArgs(options: DetoxRunnerOptions): string[];
|
|
39
|
+
interface DetoxFailureClassification {
|
|
40
|
+
/** every spec file with a FAIL line */
|
|
41
|
+
failedFiles: string[];
|
|
42
|
+
/** failed files whose failure matches a connect-flake signature (retry candidates) */
|
|
43
|
+
flakeFiles: string[];
|
|
44
|
+
/** failed files whose failure looks real (assertion/logic) - never retried */
|
|
45
|
+
realFiles: string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Classify a detox/jest run's combined output into connect-flake vs real failures,
|
|
49
|
+
* per spec file. jest prints each file's `FAIL e2e/X.test.ts` line followed by that
|
|
50
|
+
* file's failure detail (the ● blocks) before the next PASS/FAIL line, so the text
|
|
51
|
+
* between one FAIL line and the next delimiter is that file's failure block.
|
|
52
|
+
*
|
|
53
|
+
* Exported for unit testing against real CI logs.
|
|
54
|
+
*/
|
|
55
|
+
export declare function classifyDetoxFailures(rawOutput: string): DetoxFailureClassification;
|
|
39
56
|
/**
|
|
40
57
|
* Reset Detox lock file to prevent ECOMPROMISED errors in CI
|
|
41
58
|
* See: https://github.com/wix/Detox/issues/4210
|
|
42
59
|
*/
|
|
43
60
|
export declare function resetDetoxLockFile(): Promise<void>;
|
|
44
61
|
/**
|
|
45
|
-
* Run Detox tests with the given options
|
|
62
|
+
* Run Detox tests with the given options.
|
|
63
|
+
*
|
|
64
|
+
* On failure, retries the failed spec files ONCE when (and only when) every failed
|
|
65
|
+
* file's failure carries the launch/connect flake signature - this recovers the
|
|
66
|
+
* beforeAll-launch flake that jest.retryTimes can't, without reintroducing blanket
|
|
67
|
+
* whole-file retries. Real failures are never retried (and would fail again anyway).
|
|
46
68
|
*
|
|
47
69
|
* @returns Exit code from Detox
|
|
48
70
|
*/
|
|
49
71
|
export declare function runDetoxTests(options: DetoxRunnerOptions): Promise<number>;
|
|
72
|
+
export {};
|
|
50
73
|
//# sourceMappingURL=detox.d.ts.map
|
package/types/detox.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detox.d.ts","sourceRoot":"","sources":["../src/detox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;EAsChD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE,CA6BpE;
|
|
1
|
+
{"version":3,"file":"detox.d.ts","sourceRoot":"","sources":["../src/detox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;EAsChD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE,CA6BpE;AAoCD,UAAU,0BAA0B;IAClC,uCAAuC;IACvC,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,sFAAsF;IACtF,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,0BAA0B,CA8BnF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOxD;AA4DD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DhF"}
|
package/types/ios.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../src/ios.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAWtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAuB5C;
|
|
1
|
+
{"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../src/ios.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAWtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAuB5C;AA6ED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAsB9D;AA+CD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBrD;AAkCD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAE,MAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuElF"}
|