microsoft/vscode-react-native

Public

mirrored fromhttps://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
0.5.1

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/common/outputVerifier.ts

73lines · modecode

1// 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
7export type PatternToFailure = {
8 pattern: string | RegExp,
9 message: string
10};
11
12/* This class transforms a spawn process to only succeed if all defined success patterns
13 are found on stdout, and none of the failure patterns were found on stderr */
14export class OutputVerifier {
15 private generatePatternsForSuccess: () => Q.Promise<string[]>;
16 private generatePatternToFailure: () => Q.Promise<PatternToFailure[]>;
17
18 private output = "";
19 private errors = "";
20
21 constructor(generatePatternsForSuccess: () => Q.Promise<string[]>, generatePatternToFailure: () => Q.Promise<PatternToFailure[]>) {
22 this.generatePatternsForSuccess = generatePatternsForSuccess;
23 this.generatePatternToFailure = generatePatternToFailure;
24 }
25
26 public process(spawnResult: ISpawnResult): Q.Promise<void> {
27 // Store all output
28 this.store(spawnResult.stdout, new_content =>
29 this.output += new_content);
30 this.store(spawnResult.stderr, new_content =>
31 this.errors += new_content);
32
33 return spawnResult.outcome // Wait for the process to finish
34 .then(this.generatePatternToFailure) // Generate the failure patterns to check
35 .then(patterns => {
36 const failureMessage = this.findAnyFailurePattern(patterns);
37 if (failureMessage) {
38 return Q.reject<string[]>(new Error(failureMessage)); // If at least one failure happened, we fail
39 } else {
40 return this.generatePatternsForSuccess(); // If not we generate the success patterns
41 }
42 }).then(successPatterns => {
43 if (!this.areAllSuccessPatternsPresent(successPatterns)) { // If we don't find all the success patterns, we also fail
44 return Q.reject<void>(new Error("Unknown error"));
45 } // else we found all the success patterns, so we succeed
46 return Q.resolve(void 0);
47 });
48 }
49
50 private store(stream: NodeJS.ReadableStream, append: (new_content: string) => void) {
51 stream.on("data", (data: Buffer) => {
52 append(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
57 private findAnyFailurePattern(patterns: PatternToFailure[]): string | null {
58 const errorsAndOutput = this.errors + this.output;
59 const patternThatAppeared = patterns.find(pattern => {
60 return pattern.pattern instanceof RegExp ?
61 (pattern.pattern as RegExp).test(errorsAndOutput) :
62 errorsAndOutput.indexOf(pattern.pattern as string) !== -1;
63 });
64
65 return patternThatAppeared ? patternThatAppeared.message : null;
66 }
67
68 // We check that all the patterns appeared on the output
69 private areAllSuccessPatternsPresent(successPatterns: string[]): boolean {
70 return successPatterns.every(pattern =>
71 this.output.indexOf(pattern) !== -1);
72 }
73}
74