Headless tests - Include flipper logs in test output

Summary: Useful for debugging test failures.

Reviewed By: bnelo12

Differential Revision: D16419182

fbshipit-source-id: 651eaded54aa001765aadcf966a2ce93e89f2854
This commit is contained in:
John Knox
2019-07-23 02:21:55 -07:00
committed by Facebook Github Bot
parent 7efe94a58f
commit 71784b1d64

View File

@@ -48,42 +48,48 @@ const basicArgs = [
params.insecurePort, params.insecurePort,
]; ];
const runHeadless = memoize((args: Array<string>) => { const runHeadless = memoize(
return new Promise((resolve, reject) => { (args: Array<string>): Promise<{output: Object, stderr: string}> => {
const stdoutChunks = []; return new Promise((resolve, reject) => {
const stderrChunks = []; const stdoutChunks = [];
console.info(`Running ${params.bin} ${args.join(' ')}`); const stderrChunks = [];
const process = spawn(params.bin, args, {}); console.info(`Running ${params.bin} ${args.join(' ')}`);
process.stdout.setEncoding('utf8'); const process = spawn(params.bin, args, {});
process.stdout.on('data', chunk => { process.stdout.setEncoding('utf8');
stdoutChunks.push(chunk); process.stdout.on('data', chunk => {
}); stdoutChunks.push(chunk);
process.stderr.on('data', chunk => { });
stderrChunks.push(chunk); process.stderr.on('data', chunk => {
}); stderrChunks.push(chunk);
process.stdout.on('end', chunk => { });
const stdout = stdoutChunks.join(''); process.stdout.on('end', chunk => {
try { const stdout = stdoutChunks.join('');
resolve(JSON.parse(stdout)); const stderr = stderrChunks.join('');
} catch (e) { try {
console.warn(stderrChunks.join('')); console.log(stderr);
reject( resolve({output: JSON.parse(stdout), stderr: stderr});
new Error( } catch (e) {
`Failed to parse headless output as JSON (${e.message}): ${stdout}`, console.warn(stderr);
), reject(
); new Error(
} `Failed to parse headless output as JSON (${
}); e.message
}): ${stdout}`,
),
);
}
});
setTimeout(() => { setTimeout(() => {
process.kill('SIGINT'); process.kill('SIGINT');
}, 20000); }, 20000);
}); });
}); },
);
function getPluginState(app: string, plugin: string): Promise<Object> { function getPluginState(app: string, plugin: string): Promise<Object> {
return runHeadless(basicArgs).then(result => { return runHeadless(basicArgs).then(result => {
const pluginStates = result.store.pluginStates; const pluginStates = result.output.store.pluginStates;
for (const pluginId of Object.keys(pluginStates)) { for (const pluginId of Object.keys(pluginStates)) {
const matches = /([^#]+)#([^#]+)#([^#]+)#([^#]+)#([^#]+)/.exec(pluginId); const matches = /([^#]+)#([^#]+)#([^#]+)#([^#]+)#([^#]+)/.exec(pluginId);
if ( if (
@@ -104,7 +110,7 @@ test(
'Flipper app appears in exported clients', 'Flipper app appears in exported clients',
() => { () => {
return runHeadless(basicArgs).then(result => { return runHeadless(basicArgs).then(result => {
expect(result.clients.map(c => c.query.app)).toContain('Flipper'); expect(result.output.clients.map(c => c.query.app)).toContain('Flipper');
}); });
}, },
TEST_TIMEOUT_MS, TEST_TIMEOUT_MS,
@@ -114,7 +120,7 @@ test(
'Output includes fileVersion', 'Output includes fileVersion',
() => { () => {
return runHeadless(basicArgs).then(result => { return runHeadless(basicArgs).then(result => {
expect(result.fileVersion).toMatch(/[0-9]+\.[0-9]+\.[0-9]+/); expect(result.output.fileVersion).toMatch(/[0-9]+\.[0-9]+\.[0-9]+/);
}); });
}, },
TEST_TIMEOUT_MS, TEST_TIMEOUT_MS,
@@ -124,7 +130,7 @@ test(
'Output includes device', 'Output includes device',
() => { () => {
return runHeadless(basicArgs).then(result => { return runHeadless(basicArgs).then(result => {
expect(result.device).toBeTruthy(); expect(result.output.device).toBeTruthy();
}); });
}, },
TEST_TIMEOUT_MS, TEST_TIMEOUT_MS,
@@ -134,7 +140,7 @@ test(
'Output includes flipperReleaseRevision', 'Output includes flipperReleaseRevision',
() => { () => {
return runHeadless(basicArgs).then(result => { return runHeadless(basicArgs).then(result => {
expect(result.flipperReleaseRevision).toBeTruthy(); expect(result.output.flipperReleaseRevision).toBeTruthy();
}); });
}, },
TEST_TIMEOUT_MS, TEST_TIMEOUT_MS,
@@ -144,7 +150,7 @@ test(
'Output includes store', 'Output includes store',
() => { () => {
return runHeadless(basicArgs).then(result => { return runHeadless(basicArgs).then(result => {
expect(result.store).toBeTruthy(); expect(result.output.store).toBeTruthy();
}); });
}, },
TEST_TIMEOUT_MS, TEST_TIMEOUT_MS,