From 82abba99366edaaf082bbb04e37ebade6b2ac864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Mon, 9 Dec 2024 05:43:27 -0800 Subject: [PATCH] Implement warmup for optimized mode (#48150) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/48150 Changelog: [internal] We're starting to have some Fantom tests that run in optimized mode, but we're not currently prewarming for that case. This adds that capability to do proper attribution of run time for tests. Reviewed By: javache Differential Revision: D66877991 fbshipit-source-id: dccb80cd6a4f664de7df0661456bad78d960826d --- .../runner/warmup/warmup.js | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/packages/react-native-fantom/runner/warmup/warmup.js b/packages/react-native-fantom/runner/warmup/warmup.js index e78dc321127..ece60df0dc2 100644 --- a/packages/react-native-fantom/runner/warmup/warmup.js +++ b/packages/react-native-fantom/runner/warmup/warmup.js @@ -20,26 +20,49 @@ import Metro from 'metro'; import os from 'os'; import path from 'path'; -export default async function warmUp( - globalConfig: {...}, - projectConfig: {...}, +async function tryOrLog( + fn: () => void | Promise, + message: string, ): Promise { try { - warmUpHermesCompiler(); - warmUpRNTesterCLI(); - await warmUpMetro(); + await fn(); } catch (e) { // Sandcastle fails to parse the test output if we log stuff to stdout/stderr. if ((process.env.SANDCASTLE ?? '') !== '') { console.error( 'Global warmup failed. Tests will continue to run but will likely fail. Details:\n', + message, e, ); } } } -async function warmUpMetro(): Promise { +export default async function warmUp( + globalConfig: {...}, + projectConfig: {...}, +): Promise { + await tryOrLog( + () => warmUpHermesCompiler(false), + 'Error warming up Hermes compiler (dev)', + ); + await tryOrLog( + () => warmUpHermesCompiler(true), + 'Error warming up Hermes compiler (opt)', + ); + await tryOrLog( + () => warmUpRNTesterCLI(false), + 'Error warming up RN Tester CLI (dev)', + ); + await tryOrLog( + () => warmUpRNTesterCLI(true), + 'Error warming up RN Tester CLI (opt)', + ); + await tryOrLog(() => warmUpMetro(false), 'Error warming up Metro (dev)'); + await tryOrLog(() => warmUpMetro(true), 'Error warming up Metro (opt)'); +} + +async function warmUpMetro(isOptimizedMode: boolean): Promise { const metroConfig = await Metro.loadConfig({ config: path.resolve(__dirname, '..', '..', 'config', 'metro.config.js'), }); @@ -61,8 +84,8 @@ async function warmUpMetro(): Promise { entry: entrypointPath, out: bundlePath, platform: 'android', - minify: false, - dev: true, + minify: isOptimizedMode, + dev: !isOptimizedMode, }); try { @@ -70,10 +93,10 @@ async function warmUpMetro(): Promise { } catch {} } -function warmUpHermesCompiler(): void { +function warmUpHermesCompiler(isOptimizedMode: boolean): void { const buildHermesCompilerCommandResult = runBuck2([ 'build', - getBuckModeForPlatform(), + getBuckModeForPlatform(isOptimizedMode), '//xplat/hermes/tools/hermesc:hermesc', ]); @@ -84,10 +107,10 @@ function warmUpHermesCompiler(): void { } } -function warmUpRNTesterCLI(): void { +function warmUpRNTesterCLI(isOptimizedMode: boolean): void { const buildRNTesterCommandResult = runBuck2([ 'build', - getBuckModeForPlatform(), + getBuckModeForPlatform(isOptimizedMode), '//xplat/ReactNative/react-native-cxx/samples/tester:tester', ]);