Skip to content

Commit 4d2ca3b

Browse files
committed
e2e: handle process id has changed
1 parent b0f810d commit 4d2ca3b

6 files changed

+99
-11
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
diff --git a/node_modules/@perf-profiler/android/dist/src/commands/platforms/UnixProfiler.js b/node_modules/@perf-profiler/android/dist/src/commands/platforms/UnixProfiler.js
2+
index 657c3b0..c97e363 100644
3+
--- a/node_modules/@perf-profiler/android/dist/src/commands/platforms/UnixProfiler.js
4+
+++ b/node_modules/@perf-profiler/android/dist/src/commands/platforms/UnixProfiler.js
5+
@@ -113,7 +113,7 @@ class UnixProfiler {
6+
}
7+
pollPerformanceMeasures(bundleId, { onMeasure, onStartMeasuring = () => {
8+
// noop by default
9+
- }, }) {
10+
+ }, onPidChanged = () => {}}) {
11+
let initialTime = null;
12+
let previousTime = null;
13+
let cpuMeasuresAggregator = new CpuMeasureAggregator_1.CpuMeasureAggregator(this.getCpuClockTick());
14+
@@ -170,6 +170,7 @@ class UnixProfiler {
15+
previousTime = timestamp;
16+
}, () => {
17+
logger_1.Logger.warn("Process id has changed, ignoring measures until now");
18+
+ onPidChanged();
19+
reset();
20+
});
21+
}
22+
diff --git a/node_modules/@perf-profiler/android/src/commands/platforms/UnixProfiler.ts b/node_modules/@perf-profiler/android/src/commands/platforms/UnixProfiler.ts
23+
index be26fe6..0473f78 100644
24+
--- a/node_modules/@perf-profiler/android/src/commands/platforms/UnixProfiler.ts
25+
+++ b/node_modules/@perf-profiler/android/src/commands/platforms/UnixProfiler.ts
26+
@@ -105,9 +105,11 @@ export abstract class UnixProfiler implements Profiler {
27+
onStartMeasuring = () => {
28+
// noop by default
29+
},
30+
+ onPidChanged = () => {},
31+
}: {
32+
onMeasure: (measure: Measure) => void;
33+
onStartMeasuring?: () => void;
34+
+ onPidChanged?: () => void;
35+
}
36+
) {
37+
let initialTime: number | null = null;
38+
@@ -187,6 +189,7 @@ export abstract class UnixProfiler implements Profiler {
39+
},
40+
() => {
41+
Logger.warn("Process id has changed, ignoring measures until now");
42+
+ onPidChanged();
43+
reset();
44+
}
45+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
diff --git a/node_modules/@perf-profiler/types/dist/index.d.ts b/node_modules/@perf-profiler/types/dist/index.d.ts
2+
index 0d0f55f..ef7f864 100644
3+
--- a/node_modules/@perf-profiler/types/dist/index.d.ts
4+
+++ b/node_modules/@perf-profiler/types/dist/index.d.ts
5+
@@ -80,6 +80,7 @@ export interface ScreenRecorder {
6+
export interface ProfilerPollingOptions {
7+
onMeasure: (measure: Measure) => void;
8+
onStartMeasuring?: () => void;
9+
+ onPidChanged?: () => void;
10+
}
11+
export interface Profiler {
12+
pollPerformanceMeasures: (bundleId: string, options: ProfilerPollingOptions) => {

tests/e2e/server/index.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,15 @@ type TestResultListener = (testResult: TestResult) => void;
2222

2323
type AddListener<TListener> = (listener: TListener) => () => void;
2424

25+
type ClearAllListeners = () => void;
26+
2527
type ServerInstance = {
2628
setTestConfig: (testConfig: TestConfig) => void;
2729
getTestConfig: () => TestConfig;
2830
addTestStartedListener: AddListener<TestStartedListener>;
2931
addTestResultListener: AddListener<TestResultListener>;
3032
addTestDoneListener: AddListener<TestDoneListener>;
33+
clearAllTestDoneListeners: ClearAllListeners;
3134
forceTestCompletion: () => void;
3235
setReadyToAcceptTestResults: (isReady: boolean) => void;
3336
isReadyToAcceptTestResults: boolean;
@@ -70,7 +73,7 @@ const getPostJSONRequestData = <TRequestData extends RequestData>(req: IncomingM
7073
});
7174
};
7275

73-
const createListenerState = <TListener>(): [TListener[], AddListener<TListener>] => {
76+
const createListenerState = <TListener>(): [TListener[], AddListener<TListener>, ClearAllListeners] => {
7477
const listeners: TListener[] = [];
7578
const addListener = (listener: TListener) => {
7679
listeners.push(listener);
@@ -81,8 +84,11 @@ const createListenerState = <TListener>(): [TListener[], AddListener<TListener>]
8184
}
8285
};
8386
};
87+
const clearAllListeners = () => {
88+
listeners.splice(0, listeners.length);
89+
};
8490

85-
return [listeners, addListener];
91+
return [listeners, addListener, clearAllListeners];
8692
};
8793

8894
/**
@@ -98,7 +104,7 @@ const createListenerState = <TListener>(): [TListener[], AddListener<TListener>]
98104
const createServerInstance = (): ServerInstance => {
99105
const [testStartedListeners, addTestStartedListener] = createListenerState<TestStartedListener>();
100106
const [testResultListeners, addTestResultListener] = createListenerState<TestResultListener>();
101-
const [testDoneListeners, addTestDoneListener] = createListenerState<TestDoneListener>();
107+
const [testDoneListeners, addTestDoneListener, clearAllTestDoneListeners] = createListenerState<TestDoneListener>();
102108
let isReadyToAcceptTestResults = true;
103109

104110
const setReadyToAcceptTestResults = (isReady: boolean) => {
@@ -229,6 +235,7 @@ const createServerInstance = (): ServerInstance => {
229235
addTestStartedListener,
230236
addTestResultListener,
231237
addTestDoneListener,
238+
clearAllTestDoneListeners,
232239
forceTestCompletion,
233240
start: () =>
234241
new Promise<void>((resolve) => {

tests/e2e/testRunner.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const setConfigPath = (configPathParam: string | undefined) => {
5252
if (!configPath?.startsWith('.')) {
5353
configPath = `./${configPath}`;
5454
}
55-
const customConfig = require<CustomConfig>(configPath).default;
55+
const customConfig = (require(configPath) as CustomConfig).default;
5656
config = Object.assign(defaultConfig, customConfig);
5757
};
5858

@@ -150,8 +150,7 @@ const runTests = async (): Promise<void> => {
150150
Logger.log('Launching', appPackage);
151151
await launchApp('android', appPackage, config.ACTIVITY_PATH, launchArgs);
152152

153-
MeasureUtils.start(appPackage);
154-
await withFailTimeout(
153+
const {promise, resetTimeout} = withFailTimeout(
155154
new Promise<void>((resolve) => {
156155
const removeListener = server.addTestDoneListener(() => {
157156
Logger.success(iterationText);
@@ -194,9 +193,22 @@ const runTests = async (): Promise<void> => {
194193
removeListener();
195194
resolve();
196195
});
196+
MeasureUtils.start(appPackage, {
197+
onAttachFailed: async () => {
198+
MeasureUtils.stop();
199+
resetTimeout();
200+
removeListener();
201+
// something went wrong, let's wait a little bit and try again
202+
await sleep(5000);
203+
// simply restart the test
204+
await runTestIteration(appPackage, iterationText, branch, launchArgs);
205+
resolve();
206+
},
207+
});
197208
}),
198209
iterationText,
199210
);
211+
await promise;
200212

201213
Logger.log('Killing', appPackage);
202214
await killApp('android', appPackage);
@@ -256,6 +268,8 @@ const runTests = async (): Promise<void> => {
256268
// We run each test multiple time to average out the results
257269
for (let testIteration = 0; testIteration < config.RUNS; testIteration++) {
258270
const onError = (e: Error) => {
271+
MeasureUtils.stop();
272+
server.clearAllTestDoneListeners();
259273
errorCountRef.errorCount += 1;
260274
if (testIteration === 0 || errorCountRef.errorCount === errorCountRef.allowedExceptions) {
261275
Logger.error("There was an error running the test and we've reached the maximum number of allowed exceptions. Stopping the test run.");

tests/e2e/utils/measure.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ const POLLING_STOPPED = {
1111
};
1212
let polling = POLLING_STOPPED;
1313

14-
const start = (bundleId: string) => {
14+
const start = (bundleId: string, {onAttachFailed}: {onAttachFailed: () => Promise<void>}) => {
1515
// clear our measurements results
1616
measures = [];
1717

1818
polling = profiler.pollPerformanceMeasures(bundleId, {
1919
onMeasure: (measure: Measure) => {
2020
measures.push(measure);
2121
},
22+
onPidChanged: () => {
23+
onAttachFailed();
24+
},
2225
});
2326
};
2427

tests/e2e/utils/withFailTimeout.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@ import CONFIG from '../config';
33
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- nullish coalescing doesn't achieve the same result in this case
44
const TIMEOUT = Number(process.env.INTERACTION_TIMEOUT || CONFIG.INTERACTION_TIMEOUT);
55

6-
const withFailTimeout = (promise: Promise<void>, name: string): Promise<void> =>
7-
new Promise((resolve, reject) => {
8-
const timeoutId = setTimeout(() => {
6+
const withFailTimeout = (promise: Promise<void>, name: string): {promise: Promise<unknown>; resetTimeout: () => void} => {
7+
let timeoutId: NodeJS.Timeout;
8+
const resetTimeout = () => {
9+
clearTimeout(timeoutId);
10+
};
11+
const race = new Promise((resolve, reject) => {
12+
timeoutId = setTimeout(() => {
913
reject(new Error(`"${name}": Interaction timed out after ${(TIMEOUT / 1000).toFixed(0)}s`));
1014
}, TIMEOUT);
1115

@@ -17,8 +21,11 @@ const withFailTimeout = (promise: Promise<void>, name: string): Promise<void> =>
1721
reject(e);
1822
})
1923
.finally(() => {
20-
clearTimeout(timeoutId);
24+
resetTimeout();
2125
});
2226
});
2327

28+
return {promise: race, resetTimeout};
29+
};
30+
2431
export default withFailTimeout;

0 commit comments

Comments
 (0)