Skip to content

Commit b3870e6

Browse files
sbuggayfacebook-github-bot
authored andcommitted
Add JSMode pragma option (facebook#52822)
Summary: Adds an additional pragma allowing tests to specify which mode JS should run in. By default this new JS mode will match the regular selected mode, and only shows up in the title if it differs. ### View ### | (index) | Task name | Latency average (ns) | Latency median (ns) | Throughput average (ops/s) | Throughput median (ops/s) | Samples | | ------- | --------------------------------------------------------- | ---------------------- | -------------------------- | -------------------------- | ------------------------- | ------- | | 0 | 'render 100 uncollapsable views' | '22196658.83 ± 0.55%' | '22105506.50 ± 14452.50' | '45 ± 0.52%' | '45' | 64 | | 1 | 'render 1000 uncollapsable views' | '261264120.72 ± 0.51%' | '260129906.50 ± 4932.50' | '4 ± 0.47%' | '4' | 64 | | 2 | 'render 100 views with large amount of props and styles' | '46221879.73 ± 1.32%' | '45766943.00 ± 175.00' | '22 ± 0.96%' | '22' | 64 | | 3 | 'render 1000 views with large amount of props and styles' | '511129295.53 ± 1.11%' | '507136026.50 ± 110.50' | '2 ± 0.85%' | '2' | 64 | | 4 | 'render 1500 views with large amount of props and styles' | '809121466.03 ± 0.98%' | '805250386.00 ± 124858.00' | '1 ± 0.75%' | '1' | 64 | ### View (mode 🚀, jsMode 🐛) ### | (index) | Task name | Latency average (ns) | Latency median (ns) | Throughput average (ops/s) | Throughput median (ops/s) | Samples | | ------- | --------------------------------------------------------- | ---------------------- | -------------------------- | -------------------------- | ------------------------- | ------- | | 0 | 'render 100 uncollapsable views' | '10159906.01 ± 1.31%' | '9852036.00' | '99 ± 1.17%' | '102' | 99 | | 1 | 'render 1000 uncollapsable views' | '140887334.83 ± 1.46%' | '139692094.50 ± 95652.50' | '7 ± 1.14%' | '7' | 64 | | 2 | 'render 100 views with large amount of props and styles' | '23331150.55 ± 1.60%' | '22600244.50 ± 24962.50' | '43 ± 1.34%' | '44' | 64 | | 3 | 'render 1000 views with large amount of props and styles' | '273211225.98 ± 1.41%' | '272005374.00 ± 115394.00' | '4 ± 1.20%' | '4' | 64 | | 4 | 'render 1500 views with large amount of props and styles' | '442607142.55 ± 1.20%' | '434820116.00 ± 455811.00' | '2 ± 1.04%' | '2' | 64 | ### View (mode 🚀) ### | (index) | Task name | Latency average (ns) | Latency median (ns) | Throughput average (ops/s) | Throughput median (ops/s) | Samples | | ------- | --------------------------------------------------------- | ---------------------- | -------------------------- | -------------------------- | ------------------------- | ------- | | 0 | 'render 100 uncollapsable views' | '4104493.33 ± 2.08%' | '3923198.00 ± 110.00' | '248 ± 1.32%' | '255' | 244 | | 1 | 'render 1000 uncollapsable views' | '87679050.92 ± 1.28%' | '87123912.50 ± 5743.50' | '11 ± 1.26%' | '11' | 64 | | 2 | 'render 100 views with large amount of props and styles' | '14064648.78 ± 1.90%' | '13587137.00 ± 6355.00' | '71 ± 1.50%' | '74' | 72 | | 3 | 'render 1000 views with large amount of props and styles' | '184107829.77 ± 0.77%' | '183228851.00 ± 53144.00' | '5 ± 0.77%' | '5' | 64 | | 4 | 'render 1500 views with large amount of props and styles' | '317639710.20 ± 1.17%' | '310442132.00 ± 366431.00' | '3 ± 1.11%' | '3' | 64 | Changelog: [Internal] Differential Revision: D78912257
1 parent 154b177 commit b3870e6

File tree

3 files changed

+75
-3
lines changed

3 files changed

+75
-3
lines changed

private/react-native-fantom/runner/formatFantomConfig.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type {HermesVariant} from '../runner/utils';
1414

1515
import {
1616
FantomTestConfigHermesVariant,
17+
FantomTestConfigJsMode,
1718
FantomTestConfigMode,
1819
} from '../runner/getFantomTestConfigs';
1920
import {getOverrides} from './getFantomTestConfigs';
@@ -29,6 +30,15 @@ function formatFantomMode(mode: FantomTestConfigMode): string {
2930
}
3031
}
3132

33+
function formatFantomJsMode(mode: FantomTestConfigJsMode): string {
34+
switch (mode) {
35+
case FantomTestConfigJsMode.Development:
36+
return 'jsMode 🐛';
37+
case FantomTestConfigJsMode.Optimized:
38+
return 'jsMode 🚀';
39+
}
40+
}
41+
3242
function formatFantomHermesVariant(hermesVariant: HermesVariant): string {
3343
switch (hermesVariant) {
3444
case FantomTestConfigHermesVariant.Hermes:
@@ -61,6 +71,16 @@ export default function formatFantomConfig(config: FantomTestConfig): string {
6171
parts.push(formatFantomMode(overrides.mode));
6272
}
6373

74+
// Show if the jsMode is different from the mode
75+
if (
76+
(config.jsMode === FantomTestConfigJsMode.Optimized &&
77+
config.mode !== FantomTestConfigMode.Optimized) ||
78+
(config.jsMode === FantomTestConfigJsMode.Development &&
79+
config.mode === FantomTestConfigMode.Optimized)
80+
) {
81+
parts.push(formatFantomJsMode(config.jsMode));
82+
}
83+
6484
if (overrides.hermesVariant) {
6585
parts.push(formatFantomHermesVariant(overrides.hermesVariant));
6686
}

private/react-native-fantom/runner/getFantomTestConfigs.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ export enum FantomTestConfigMode {
2626
Optimized,
2727
}
2828

29+
export enum FantomTestConfigJsMode {
30+
Development,
31+
Optimized,
32+
}
33+
2934
export type FantomTestConfigCommonFeatureFlags = Partial<{
3035
[key in keyof CommonFeatureFlags]: CommonFeatureFlags[key]['defaultValue'],
3136
}>;
@@ -46,12 +51,14 @@ export type FantomTestConfigFeatureFlags = {
4651

4752
export type FantomTestConfig = {
4853
mode: FantomTestConfigMode,
54+
jsMode: FantomTestConfigJsMode,
4955
hermesVariant: HermesVariant,
5056
flags: FantomTestConfigFeatureFlags,
5157
};
5258

5359
export type PartialFantomTestConfig = {
5460
mode?: FantomTestConfigMode,
61+
jsMode?: FantomTestConfigJsMode,
5562
hermesVariant?: HermesVariant,
5663
flags?: Partial<FantomTestConfigFeatureFlags>,
5764
};
@@ -61,6 +68,9 @@ export const FantomTestConfigHermesVariant = HermesVariant;
6168
export const DEFAULT_MODE: FantomTestConfigMode =
6269
FantomTestConfigMode.DevelopmentWithSource;
6370

71+
export const DEFAULT_JS_MODE: FantomTestConfigJsMode =
72+
FantomTestConfigJsMode.Development;
73+
6474
export const DEFAULT_HERMES_VARIANT: HermesVariant = HermesVariant.Hermes;
6575

6676
export const DEFAULT_FEATURE_FLAGS: FantomTestConfigFeatureFlags = {
@@ -84,6 +94,7 @@ const MAX_FANTOM_CONFIGURATION_VARIATIONS = 12;
8494

8595
const VALID_FANTOM_PRAGMAS = [
8696
'fantom_mode',
97+
'fantom_js_mode',
8798
'fantom_flags',
8899
'fantom_hermes_variant',
89100
'fantom_react_fb_flags',
@@ -131,6 +142,7 @@ export function getOverrides(
131142
* /**
132143
* * @flow strict-local
133144
* * @fantom_mode opt
145+
* * @fantom_js_mode dev
134146
* * @fantom_hermes_variant static_hermes_stable
135147
* * @fantom_flags commonTestFlag:true
136148
* * @fantom_flags jsOnlyTestFlag:true
@@ -163,6 +175,7 @@ export default function getFantomTestConfigs(
163175

164176
const config: FantomTestConfig = {
165177
mode: DEFAULT_MODE,
178+
jsMode: DEFAULT_JS_MODE,
166179
hermesVariant: DEFAULT_HERMES_VARIANT,
167180
flags: {
168181
common: {
@@ -217,6 +230,39 @@ export default function getFantomTestConfigs(
217230
}
218231
}
219232

233+
const maybeJsMode = pragmas.fantom_js_mode;
234+
235+
if (maybeJsMode != null) {
236+
if (Array.isArray(maybeJsMode)) {
237+
throw new Error('Expected a single value for @fantom_js_mode');
238+
}
239+
240+
const jsMode = maybeJsMode;
241+
242+
switch (jsMode) {
243+
case 'dev':
244+
config.jsMode = FantomTestConfigJsMode.Development;
245+
break;
246+
case 'opt':
247+
config.jsMode = FantomTestConfigJsMode.Optimized;
248+
break;
249+
case '*':
250+
configVariations.push([
251+
{jsMode: FantomTestConfigJsMode.Development},
252+
{jsMode: FantomTestConfigJsMode.Optimized},
253+
]);
254+
break;
255+
default:
256+
throw new Error(`Invalid Fantom jsMode: ${jsMode}`);
257+
}
258+
} else {
259+
// If not set, match the native mode
260+
config.jsMode =
261+
config.mode === FantomTestConfigMode.Optimized
262+
? FantomTestConfigJsMode.Optimized
263+
: FantomTestConfigJsMode.Development;
264+
}
265+
220266
const maybeHermesVariant = pragmas.fantom_hermes_variant;
221267

222268
if (maybeHermesVariant != null) {
@@ -378,6 +424,7 @@ function getConfigurationVariations(
378424
for (const currentConfigVariation of currentConfigVariations) {
379425
const currentConfigWithVariation = {
380426
mode: currentConfigVariation.mode ?? config.mode,
427+
jsMode: currentConfigVariation.jsMode ?? config.jsMode,
381428
hermesVariant:
382429
currentConfigVariation.hermesVariant ?? config.hermesVariant,
383430
flags: {

private/react-native-fantom/runner/runner.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ import entrypointTemplate from './entrypoint-template';
2424
import * as EnvironmentOptions from './EnvironmentOptions';
2525
import formatFantomConfig from './formatFantomConfig';
2626
import getFantomTestConfigs from './getFantomTestConfigs';
27-
import {FantomTestConfigMode} from './getFantomTestConfigs';
27+
import {
28+
FantomTestConfigJsMode,
29+
FantomTestConfigMode,
30+
} from './getFantomTestConfigs';
2831
import {
2932
getInitialSnapshotData,
3033
updateSnapshotsAndGetJestSnapshotResult,
@@ -317,12 +320,14 @@ module.exports = async function runTest(
317320
path.basename(testJSBundlePath, '.js') + '.map',
318321
);
319322

323+
const devMode = testConfig.jsMode !== FantomTestConfigJsMode.Optimized;
324+
320325
await Metro.runBuild(metroConfig, {
321326
entry: entrypointPath,
322327
out: testJSBundlePath,
323328
platform: 'android',
324-
minify: testConfig.mode === FantomTestConfigMode.Optimized,
325-
dev: testConfig.mode !== FantomTestConfigMode.Optimized,
329+
minify: !devMode,
330+
dev: devMode,
326331
sourceMap: true,
327332
sourceMapUrl: sourceMapPath,
328333
});

0 commit comments

Comments
 (0)