microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
0.5.2

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/common/outputVerifier.ts

73lines · modeblame

7cc67271digeff10 years ago1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import * as Q from "q";
5import {ISpawnResult} from "./node/childProcess";
6
ef902673Vladimir Kotikov9 years ago7export type PatternToFailure = {
8pattern: string | RegExp,
9message: string
10};
7cc67271digeff10 years ago11
e4c8f7d4digeff10 years ago12/* This class transforms a spawn process to only succeed if all defined success patterns
7cc67271digeff10 years ago13are found on stdout, and none of the failure patterns were found on stderr */
f8b7022ddigeff10 years ago14export class OutputVerifier {
7cc67271digeff10 years ago15private generatePatternsForSuccess: () => Q.Promise<string[]>;
ef902673Vladimir Kotikov9 years ago16private generatePatternToFailure: () => Q.Promise<PatternToFailure[]>;
7cc67271digeff10 years ago17
18private output = "";
19private errors = "";
20
ef902673Vladimir Kotikov9 years ago21constructor(generatePatternsForSuccess: () => Q.Promise<string[]>, generatePatternToFailure: () => Q.Promise<PatternToFailure[]>) {
7cc67271digeff10 years ago22this.generatePatternsForSuccess = generatePatternsForSuccess;
23this.generatePatternToFailure = generatePatternToFailure;
24}
25
26public process(spawnResult: ISpawnResult): Q.Promise<void> {
27// Store all output
aab2095edigeff10 years ago28this.store(spawnResult.stdout, new_content =>
29this.output += new_content);
30this.store(spawnResult.stderr, new_content =>
31this.errors += new_content);
7cc67271digeff10 years ago32
33return spawnResult.outcome // Wait for the process to finish
34.then(this.generatePatternToFailure) // Generate the failure patterns to check
ef902673Vladimir Kotikov9 years ago35.then(patterns => {
36const failureMessage = this.findAnyFailurePattern(patterns);
7cc67271digeff10 years ago37if (failureMessage) {
38return Q.reject<string[]>(new Error(failureMessage)); // If at least one failure happened, we fail
39} else {
40return this.generatePatternsForSuccess(); // If not we generate the success patterns
41}
42}).then(successPatterns => {
43if (!this.areAllSuccessPatternsPresent(successPatterns)) { // If we don't find all the success patterns, we also fail
44return Q.reject<void>(new Error("Unknown error"));
45} // else we found all the success patterns, so we succeed
5c8365a6Artem Egorov8 years ago46return Q.resolve(void 0);
7cc67271digeff10 years ago47});
48}
49
50private store(stream: NodeJS.ReadableStream, append: (new_content: string) => void) {
51stream.on("data", (data: Buffer) => {
52append(data.toString());
53});
54}
55
56// We check the failure patterns one by one, to see if any of those appeared on the errors. If they did, we return the associated error
5c8365a6Artem Egorov8 years ago57private findAnyFailurePattern(patterns: PatternToFailure[]): string | null {
9ce5a776digeff10 years ago58const errorsAndOutput = this.errors + this.output;
ef902673Vladimir Kotikov9 years ago59const patternThatAppeared = patterns.find(pattern => {
60return pattern.pattern instanceof RegExp ?
61(pattern.pattern as RegExp).test(errorsAndOutput) :
62errorsAndOutput.indexOf(pattern.pattern as string) !== -1;
63});
64
65return patternThatAppeared ? patternThatAppeared.message : null;
7cc67271digeff10 years ago66}
67
68// We check that all the patterns appeared on the output
69private areAllSuccessPatternsPresent(successPatterns: string[]): boolean {
70return successPatterns.every(pattern =>
71this.output.indexOf(pattern) !== -1);
72}
73}