From 89a7238acd44cffa0010bd44c94c497d3c6c6eba Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Sun, 17 Nov 2024 03:30:31 -0800 Subject: [PATCH] introduce ability to flush messege queue from tests (#47646) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/47646 changelog: [internal] In order to control scheduling of tests, test setup must be separated from test running. This is because of how internal scheduling of React Native is restricted until bundle is loaded via BufferedRuntimeExecutor. This is the reason for executing tests by calling global function `$$RunTests$$`. This is not a pretty solution but it is hidden within testing infrastructure and users of our test infra are not exposed to this. There is a new method exposed to JavaScript: flushMessageQueue. This will flush everything that is inside of message queue. This is the queue where tasks are queued whenever RuntimeScheduler enqueues something by calling `runtimeExecutor_`. Reviewed By: christophpurrer Differential Revision: D65951894 fbshipit-source-id: 2e8e0c10fbeb998f4a51ee6d01ef229eb5f70448 --- jest/integration/runtime/setup.js | 5 +- .../private/__tests__/ReactNativeTester.js | 46 ------------------- 2 files changed, 4 insertions(+), 47 deletions(-) delete mode 100644 packages/react-native/src/private/__tests__/ReactNativeTester.js diff --git a/jest/integration/runtime/setup.js b/jest/integration/runtime/setup.js index 36bee8346f0..9dda572b621 100644 --- a/jest/integration/runtime/setup.js +++ b/jest/integration/runtime/setup.js @@ -248,9 +248,12 @@ function reportTestSuiteResult(testSuiteResult: TestSuiteResult): void { console.log(JSON.stringify(testSuiteResult)); } +global.$$RunTests$$ = () => { + executeTests(); +}; + export function registerTest(setUpTest: () => void) { runWithGuard(() => { setUpTest(); - executeTests(); }); } diff --git a/packages/react-native/src/private/__tests__/ReactNativeTester.js b/packages/react-native/src/private/__tests__/ReactNativeTester.js deleted file mode 100644 index 121f057f3fb..00000000000 --- a/packages/react-native/src/private/__tests__/ReactNativeTester.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow strict-local - * @format - */ - -import type {MixedElement} from 'react'; - -import ReactFabric from '../../../Libraries/Renderer/shims/ReactFabric'; - -let globalSurfaceIdCounter = 1; - -class Root { - #surfaceId: number; - #hasRendered: boolean = false; - - constructor() { - this.#surfaceId = globalSurfaceIdCounter; - globalSurfaceIdCounter += 10; - } - - render(element: MixedElement) { - if (!this.#hasRendered) { - global.$$JSTesterModuleName$$.startSurface(this.#surfaceId); - this.#hasRendered = true; - } - ReactFabric.render(element, this.#surfaceId); - } - - destroy() { - // TODO: check for leaks. - global.$$JSTesterModuleName$$.stopSurface(this.#surfaceId); - } - - // TODO: add an API to check if all surfaces were deallocated when tests are finished. -} - -// TODO: Add option to define surface props and pass it to startSurface -// Surfacep rops: concurrentRoot, surfaceWidth, surfaceHeight, layoutDirection, pointScaleFactor. -export function createRoot(): Root { - return new Root(); -}