Files
directus/tests-blackbox/common/test-logger.ts
ian e7cf4e09c8 Add cookie logger tests (#17932)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
2023-04-03 16:47:56 +02:00

62 lines
1.5 KiB
TypeScript

import { ChildProcess } from 'child_process';
export class TestLogger {
private logs: string;
private server: ChildProcess;
private stopCondition: string;
private filterCondition?: string;
private stopped?: boolean;
private resolve?: (log: string) => void;
/**
*
* @param server Process running a Directus instance
* @param stopCondition Finish as soon as the specified string appears in the logs.
* @param filter Only capture log chunks containing the specified string, if `true` uses the same string as defined for `stopCondition`
*/
constructor(server: ChildProcess, stopCondition: string, filterCondition?: boolean | string) {
this.logs = '';
this.server = server;
this.stopCondition = stopCondition;
if (filterCondition) {
this.filterCondition = filterCondition === true ? stopCondition : filterCondition;
}
// Discard data up to this point
server.stdout?.read();
server.stdout?.on('data', this.processChunks);
}
private processChunks = (chunk: any) => {
const logLine = String(chunk);
if (!this.stopped && (!this.filterCondition || logLine.includes(this.filterCondition))) {
this.logs += logLine;
}
if (this.logs.includes(this.stopCondition)) {
this.stopped = true;
this.cleanup();
if (this.resolve) {
this.resolve(this.logs);
}
}
};
getLogs = () => {
return new Promise<string>((resolve) => {
if (this.stopped) {
resolve(this.logs);
} else {
this.resolve = resolve;
}
});
};
cleanup = () => {
this.server.stdout?.off('data', this.processChunks);
};
}