-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy patherrors.ts
More file actions
121 lines (105 loc) · 3.27 KB
/
errors.ts
File metadata and controls
121 lines (105 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { HarnessError } from '@react-native-harness/tools';
import type { AppCrashDetails } from '@react-native-harness/platforms';
export {
StartupStallError,
type StartupStallCode,
type StartupStallDetails,
} from '@react-native-harness/bundler-metro';
export class NoRunnerSpecifiedError extends HarnessError {
constructor() {
super('No runner specified');
this.name = 'NoRunnerSpecifiedError';
}
}
export class RunnerNotFoundError extends HarnessError {
constructor(public readonly runnerName: string) {
super(`Runner "${runnerName}" not found`);
this.name = 'RunnerNotFoundError';
}
}
export class InitializationTimeoutError extends HarnessError {
constructor() {
super('The Harness did not become ready within the timeout period.');
this.name = 'InitializationTimeoutError';
}
}
export class PlatformReadyTimeoutError extends HarnessError {
constructor(public readonly timeout: number) {
super(
`The platform did not become ready within ${timeout}ms. Increase "platformReadyTimeout" if your device, simulator, or emulator needs more time to start.`
);
this.name = 'PlatformReadyTimeoutError';
}
}
export class MetroPortRangeExhaustedError extends HarnessError {
constructor(
public readonly initialPort: number,
public readonly attempts: number
) {
const finalPort = initialPort + attempts - 1;
super(
`Harness could not find an available Metro port in the range ${initialPort}-${finalPort}.`
);
this.name = 'MetroPortRangeExhaustedError';
}
}
export type NativeCrashPhase = 'startup' | 'execution';
export type NativeCrashDetails = AppCrashDetails & {
phase: NativeCrashPhase;
};
const buildNativeCrashMessage = ({
phase,
summary,
signal,
exceptionType,
processName,
pid,
stackTrace,
artifactType,
}: NativeCrashDetails) => {
const lines = [
phase === 'startup'
? 'The native app crashed while preparing to run this test file.'
: 'The native app crashed during test execution.',
];
const hasCrashBlock = summary?.includes('\n') ?? false;
const shouldRenderSummary =
Boolean(summary) &&
!(!hasCrashBlock && artifactType === 'ios-crash-report');
if (shouldRenderSummary && summary) {
lines.push('');
lines.push(summary);
}
if (!hasCrashBlock && signal) {
lines.push(`Signal: ${signal}`);
}
if (!hasCrashBlock && exceptionType) {
lines.push(`Exception: ${exceptionType}`);
}
if (!hasCrashBlock && processName && pid !== undefined) {
lines.push(`Process: ${processName} (pid ${pid})`);
} else if (!hasCrashBlock && processName) {
lines.push(`Process: ${processName}`);
} else if (!hasCrashBlock && pid !== undefined) {
lines.push(`PID: ${pid}`);
}
if (!hasCrashBlock && stackTrace && stackTrace.length > 0) {
lines.push('');
lines.push(...stackTrace.map((line) => ` ${line}`));
}
return lines.join('\n');
};
export class NativeCrashError extends HarnessError {
constructor(
public readonly testFilePath: string,
public readonly details: NativeCrashDetails,
public readonly lastKnownTest?: string
) {
super(buildNativeCrashMessage(details));
this.name = 'NativeCrashError';
this.stack = `${this.name}: ${this.message.split('\n')[0]}`;
}
get phase() {
return this.details.phase;
}
}