diff --git a/jest/integration/runner/runner.js b/jest/integration/runner/runner.js index b8da6171a26..2baaaceb849 100644 --- a/jest/integration/runner/runner.js +++ b/jest/integration/runner/runner.js @@ -15,6 +15,7 @@ import entrypointTemplate from './entrypoint-template'; import { getBuckModeForPlatform, getDebugInfoFromCommandResult, + getFantomTestConfig, getShortHash, runBuck2, symbolicateStackTrace, @@ -28,7 +29,6 @@ import path from 'path'; const BUILD_OUTPUT_PATH = path.resolve(__dirname, '..', 'build'); -const ENABLE_OPTIMIZED_MODE: false = false; const PRINT_FANTOM_OUTPUT: false = false; function parseRNTesterCommandResult(result: ReturnType): { @@ -95,7 +95,9 @@ module.exports = async function runTest( ): mixed { const startTime = Date.now(); - const isOptimizedMode = ENABLE_OPTIMIZED_MODE; + const testConfig = getFantomTestConfig(testPath); + + const isOptimizedMode = testConfig.mode === 'opt'; const metroConfig = await Metro.loadConfig({ config: path.resolve(__dirname, '..', 'config', 'metro.config.js'), diff --git a/jest/integration/runner/utils.js b/jest/integration/runner/utils.js index 3671f636afb..9e43a68f16d 100644 --- a/jest/integration/runner/utils.js +++ b/jest/integration/runner/utils.js @@ -12,10 +12,60 @@ import {spawnSync} from 'child_process'; import crypto from 'crypto'; import fs from 'fs'; +// $FlowExpectedError[untyped-import] +import {extract, parse} from 'jest-docblock'; import os from 'os'; // $FlowExpectedError[untyped-import] import {SourceMapConsumer} from 'source-map'; +type DocblockPragmas = {[key: string]: string | string[]}; +type FantomTestMode = 'dev' | 'opt'; +type FantomTestConfig = { + mode: FantomTestMode, +}; + +const DEFAULT_MODE: FantomTestMode = 'dev'; + +/** + * Extracts the Fantom configuration from the test file, specified as part of + * the docblock comment. E.g.: + * + * ``` + * /** + * * @flow strict-local + * * @fantom mode:opt + * * + * ``` + * + * So far the only supported option is `mode`, which can be 'dev' or 'opt'. + */ +export function getFantomTestConfig(testPath: string): FantomTestConfig { + const docblock = extract(fs.readFileSync(testPath, 'utf8')); + const pragmas = parse(docblock) as DocblockPragmas; + + const config = { + mode: DEFAULT_MODE, + }; + + const maybeMode = pragmas.fantom_mode; + + if (maybeMode != null) { + if (Array.isArray(maybeMode)) { + throw new Error('Expected a single value for @fantom_mode'); + } + + const mode = maybeMode; + + if (mode === 'dev' || mode === 'opt') { + config.mode = mode; + } else { + throw new Error(`Invalid Fantom mode: ${mode}`); + } + } + + return config; +} + export function getBuckModeForPlatform(enableRelease: boolean = false): string { const mode = enableRelease ? 'opt' : 'dev';