Skip to content

Commit 3fda352

Browse files
committed
test_runner: preserve original property descriptor
1 parent df16705 commit 3fda352

File tree

1 file changed

+137
-35
lines changed

1 file changed

+137
-35
lines changed

lib/internal/test_runner/mock/mock_timers.js

Lines changed: 137 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ const {
1111
DateNow,
1212
FunctionPrototypeApply,
1313
FunctionPrototypeBind,
14+
ObjectDefineProperty,
15+
ObjectGetOwnPropertyDescriptor,
1416
Promise,
1517
SymbolAsyncIterator,
1618
SymbolDispose,
@@ -239,11 +241,26 @@ class MockTimers {
239241
toFake: {
240242
__proto__: null,
241243
setTimeout: () => {
242-
this.#realSetTimeout = globalThis.setTimeout;
243-
this.#realClearTimeout = globalThis.clearTimeout;
244-
this.#realTimersSetTimeout = nodeTimers.setTimeout;
245-
this.#realTimersClearTimeout = nodeTimers.clearTimeout;
246-
this.#realPromisifiedSetTimeout = nodeTimersPromises.setTimeout;
244+
this.#realSetTimeout = ObjectGetOwnPropertyDescriptor(
245+
globalThis,
246+
'setTimeout',
247+
);
248+
this.#realClearTimeout = ObjectGetOwnPropertyDescriptor(
249+
globalThis,
250+
'clearTimeout',
251+
);
252+
this.#realTimersSetTimeout = ObjectGetOwnPropertyDescriptor(
253+
nodeTimers,
254+
'setTimeout',
255+
);
256+
this.#realTimersClearTimeout = ObjectGetOwnPropertyDescriptor(
257+
nodeTimers,
258+
'clearTimeout',
259+
);
260+
this.#realPromisifiedSetTimeout = ObjectGetOwnPropertyDescriptor(
261+
nodeTimersPromises,
262+
'setTimeout',
263+
);
247264

248265
globalThis.setTimeout = this.#setTimeout;
249266
globalThis.clearTimeout = this.#clearTimeout;
@@ -257,11 +274,26 @@ class MockTimers {
257274
);
258275
},
259276
setInterval: () => {
260-
this.#realSetInterval = globalThis.setInterval;
261-
this.#realClearInterval = globalThis.clearInterval;
262-
this.#realTimersSetInterval = nodeTimers.setInterval;
263-
this.#realTimersClearInterval = nodeTimers.clearInterval;
264-
this.#realPromisifiedSetInterval = nodeTimersPromises.setInterval;
277+
this.#realSetInterval = ObjectGetOwnPropertyDescriptor(
278+
globalThis,
279+
'setInterval',
280+
);
281+
this.#realClearInterval = ObjectGetOwnPropertyDescriptor(
282+
globalThis,
283+
'clearInterval',
284+
);
285+
this.#realTimersSetInterval = ObjectGetOwnPropertyDescriptor(
286+
nodeTimers,
287+
'setInterval',
288+
);
289+
this.#realTimersClearInterval = ObjectGetOwnPropertyDescriptor(
290+
nodeTimers,
291+
'clearInterval',
292+
);
293+
this.#realPromisifiedSetInterval = ObjectGetOwnPropertyDescriptor(
294+
nodeTimersPromises,
295+
'setInterval',
296+
);
265297

266298
globalThis.setInterval = this.#setInterval;
267299
globalThis.clearInterval = this.#clearInterval;
@@ -275,10 +307,26 @@ class MockTimers {
275307
);
276308
},
277309
setImmediate: () => {
278-
this.#realSetImmediate = globalThis.setImmediate;
279-
this.#realClearImmediate = globalThis.clearImmediate;
280-
this.#realTimersSetImmediate = nodeTimers.setImmediate;
281-
this.#realTimersClearImmediate = nodeTimers.clearImmediate;
310+
this.#realSetImmediate = ObjectGetOwnPropertyDescriptor(
311+
globalThis,
312+
'setImmediate',
313+
);
314+
this.#realClearImmediate = ObjectGetOwnPropertyDescriptor(
315+
globalThis,
316+
'clearImmediate',
317+
);
318+
this.#realTimersSetImmediate = ObjectGetOwnPropertyDescriptor(
319+
nodeTimers,
320+
'setImmediate',
321+
);
322+
this.#realTimersClearImmediate = ObjectGetOwnPropertyDescriptor(
323+
nodeTimers,
324+
'clearImmediate',
325+
);
326+
this.#realPromisifiedSetImmediate = ObjectGetOwnPropertyDescriptor(
327+
nodeTimersPromises,
328+
'setImmediate',
329+
);
282330

283331
globalThis.setImmediate = this.#setImmediate;
284332
globalThis.clearImmediate = this.#clearImmediate;
@@ -295,31 +343,85 @@ class MockTimers {
295343
toReal: {
296344
__proto__: null,
297345
setTimeout: () => {
298-
globalThis.setTimeout = this.#realSetTimeout;
299-
globalThis.clearTimeout = this.#realClearTimeout;
300-
301-
nodeTimers.setTimeout = this.#realTimersSetTimeout;
302-
nodeTimers.clearTimeout = this.#realTimersClearTimeout;
303-
304-
nodeTimersPromises.setTimeout = this.#realPromisifiedSetTimeout;
346+
ObjectDefineProperty(
347+
globalThis,
348+
'setTimeout',
349+
this.#realSetTimeout,
350+
);
351+
ObjectDefineProperty(
352+
globalThis,
353+
'clearTimeout',
354+
this.#realClearTimeout,
355+
);
356+
ObjectDefineProperty(
357+
nodeTimers,
358+
'setTimeout',
359+
this.#realSetTimeout,
360+
);
361+
ObjectDefineProperty(
362+
nodeTimers,
363+
'clearTimeout',
364+
this.#realTimersClearTimeout,
365+
);
366+
ObjectDefineProperty(
367+
nodeTimersPromises,
368+
'setTimeout',
369+
this.#realPromisifiedSetTimeout,
370+
);
305371
},
306372
setInterval: () => {
307-
globalThis.setInterval = this.#realSetInterval;
308-
globalThis.clearInterval = this.#realClearInterval;
309-
310-
nodeTimers.setInterval = this.#realTimersSetInterval;
311-
nodeTimers.clearInterval = this.#realTimersClearInterval;
312-
313-
nodeTimersPromises.setInterval = this.#realPromisifiedSetInterval;
373+
ObjectDefineProperty(
374+
globalThis,
375+
'setInterval',
376+
this.#realSetInterval,
377+
);
378+
ObjectDefineProperty(
379+
globalThis,
380+
'clearInterval',
381+
this.#realClearInterval,
382+
);
383+
ObjectDefineProperty(
384+
nodeTimers,
385+
'setInterval',
386+
this.#realTimersSetInterval,
387+
);
388+
ObjectDefineProperty(
389+
nodeTimers,
390+
'clearInterval',
391+
this.#realTimersClearInterval,
392+
);
393+
ObjectDefineProperty(
394+
nodeTimersPromises,
395+
'setInterval',
396+
this.#realPromisifiedSetInterval,
397+
);
314398
},
315399
setImmediate: () => {
316-
globalThis.setImmediate = this.#realSetImmediate;
317-
globalThis.clearImmediate = this.#realClearImmediate;
318-
319-
nodeTimers.setImmediate = this.#realTimersSetImmediate;
320-
nodeTimers.clearImmediate = this.#realTimersClearImmediate;
321-
322-
nodeTimersPromises.setImmediate = this.#realPromisifiedSetImmediate;
400+
ObjectDefineProperty(
401+
globalThis,
402+
'setImmediate',
403+
this.#realSetImmediate,
404+
);
405+
ObjectDefineProperty(
406+
globalThis,
407+
'clearImmediate',
408+
this.#realClearImmediate,
409+
);
410+
ObjectDefineProperty(
411+
nodeTimers,
412+
'setImmediate',
413+
this.#realTimersSetImmediate,
414+
);
415+
ObjectDefineProperty(
416+
nodeTimers,
417+
'clearImmediate',
418+
this.#realTimersClearImmediate,
419+
);
420+
ObjectDefineProperty(
421+
nodeTimersPromises,
422+
'setImmediate',
423+
this.#realPromisifiedSetImmediate,
424+
);
323425
},
324426
},
325427
};

0 commit comments

Comments
 (0)