diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e667604e..53be970a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,10 +6,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Use Node.js 12 + - name: Use Node.js 10 uses: actions/setup-node@v2 with: - node-version: 12 + node-version: 10 registry-url: https://npm.pkg.github.com/ - run: npm ci - run: npm run build --if-present diff --git a/jest.setup.js b/jest.setup.js index 852be1b4..560bf18d 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -1 +1 @@ -jest.setTimeout(3600000);// in milliseconds +jest.setTimeout(36000000);// in milliseconds diff --git a/src/main/wrapper/ExecutionService.ts b/src/main/wrapper/ExecutionService.ts index dde07494..a3a5db8f 100644 --- a/src/main/wrapper/ExecutionService.ts +++ b/src/main/wrapper/ExecutionService.ts @@ -33,49 +33,60 @@ function transform(n:string) { export class ExecutionService { executeCommands(pathToExecutable: string, commands: string[], output? : string ): Promise { return new Promise(function (resolve, reject) { - let stderr = ''; - let cxCommandOutput = new CxCommandOutput(); - let output_string =""; - commands = transformation(commands); - const cp = spawn(pathToExecutable, commands); - cp.stderr.on('data', function (chunk: string) { - stderr += chunk; + let stderr = ""; + let stdout =""; + + let cp = spawn(pathToExecutable, transformation(commands)); + cp.on('error', reject); + cp.on('exit',(code: number, signal: any) => { + logger.info("Exit code received from AST-CLI: " + code); + resolve(ExecutionService.onCloseCommand(code, stderr, stdout, output )); }); - cp.on('error', reject) - .on('close', function (code: number) { - cxCommandOutput.exitCode = code; - cxCommandOutput.status = stderr; - logger.info("Exit code received from AST-CLI: " + code); - logger.info(stderr); - resolve(cxCommandOutput); - }); - cp.stdout.on('data', (data: any) => { + cp.stdout.on('data', (data: { toString: () => string; }) => { if (data) { - output_string+=data; + logger.info(data.toString().replace('\n', '')); + stdout += data.toString(); } }); - cp.stdout.on('close', (data: any) => { - logger.info(`${output_string.toString().trim()}`); - // Check if the json is valid - if (isJsonString(output_string.toString())) { - let resultObject = JSON.parse(output_string.toString().split('\n')[0]); - switch(output){ - case 'CxScan': - let scans = CxScan.parseProject(resultObject) - cxCommandOutput.payload = scans; - break; - case 'CxProject': - let projects = CxProject.parseProject(resultObject) - cxCommandOutput.payload = projects; - break; - default: - cxCommandOutput.payload = resultObject; - } - } + cp.stderr.on('data', (data: { toString: () => string; }) => { + if (data) { + logger.error(data.toString().replace('\n', '')); + stderr += data.toString(); + } }); }); } + private static onCloseCommand(code: number, stderr: string, stdout: string, output: string) : CxCommandOutput { + const cxCommandOutput = new CxCommandOutput(); + cxCommandOutput.exitCode = code; + if (stderr) { + cxCommandOutput.status = stderr; + } + if (stdout) { + const stdoutSplit = stdout.split('\n'); + const data = stdoutSplit.find(isJsonString); + + if (data) { + let resultObject = JSON.parse(data); + switch(output){ + case 'CxScan': + let scans = CxScan.parseProject(resultObject) + cxCommandOutput.payload = scans; + break; + case 'CxProject': + let projects = CxProject.parseProject(resultObject) + cxCommandOutput.payload = projects; + break; + default: + cxCommandOutput.payload = resultObject; + } + } + } + + return cxCommandOutput; + } + executeResultsCommands(pathToExecutable: string, commands: string[]): Promise { return new Promise(function (resolve, reject) { let stderr = ''; diff --git a/src/tests/ProjectTest.test.ts b/src/tests/ProjectTest.test.ts index 6bf72d6e..40e45039 100644 --- a/src/tests/ProjectTest.test.ts +++ b/src/tests/ProjectTest.test.ts @@ -2,6 +2,7 @@ import {CxWrapper} from '../main/wrapper/CxWrapper'; import {CxCommandOutput} from "../main/wrapper/CxCommandOutput"; import {BaseTest} from "./BaseTest"; import {CxParamType} from "../main/wrapper/CxParamType"; +import CxScan from "../main/scan/CxScan"; describe("ProjectList cases",() => { const cxScanConfig = new BaseTest(); @@ -18,13 +19,13 @@ describe("ProjectList cases",() => { params.set(CxParamType.S, "./src"); params.set(CxParamType.FILTER, "*.ts,!**/node_modules/**/*"); params.set(CxParamType.BRANCH, "master"); - let auth = new CxWrapper(cxScanConfig); - let data = await auth.scanCreate(params); - let cxCommandOutput: CxCommandOutput = data; - let ScanObject = cxCommandOutput.payload.pop(); - cxCommandOutput = await auth.projectShow(ScanObject.projectID); - console.log(" Json object from ProjectShow Successful case: " + JSON.stringify(cxCommandOutput)); - expect(cxCommandOutput.payload.length).toBeGreaterThan(0); + const auth = new CxWrapper(cxScanConfig); + const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); + const scan: CxScan = cxCommandOutput.payload.pop(); + + const cxProjectCommandOutput: CxCommandOutput = await auth.projectShow(scan.projectID); + console.log(" Json object from ProjectShow Successful case: " + JSON.stringify(cxProjectCommandOutput)); + expect(cxProjectCommandOutput.payload.length).toBeGreaterThan(0); }); it('ProjectBranches Successful case',async () =>{ @@ -33,12 +34,12 @@ describe("ProjectList cases",() => { params.set(CxParamType.S, "./src"); params.set(CxParamType.FILTER, "*.ts,!**/node_modules/**/*"); params.set(CxParamType.BRANCH, "master"); - let auth = new CxWrapper(cxScanConfig); - let data = await auth.scanCreate(params); - let cxCommandOutput: CxCommandOutput = data; - let ScanObject = cxCommandOutput.payload.pop(); - cxCommandOutput = await auth.projectBranches(ScanObject.projectID,""); - console.log("Json object from projectBranches Successful case: " + JSON.stringify(cxCommandOutput)) - expect(cxCommandOutput.payload.length).toBeGreaterThan(0); + const auth = new CxWrapper(cxScanConfig); + const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); + const scan: CxScan = cxCommandOutput.payload.pop(); + + const cxProjectCommandOutput: CxCommandOutput = await auth.projectBranches(scan.projectID,""); + console.log("Json object from projectBranches Successful case: " + JSON.stringify(cxProjectCommandOutput)) + expect(cxProjectCommandOutput.payload.length).toBeGreaterThan(0); }); }); \ No newline at end of file diff --git a/src/tests/ScanTest.test.ts b/src/tests/ScanTest.test.ts index 904e8376..ea5461a8 100644 --- a/src/tests/ScanTest.test.ts +++ b/src/tests/ScanTest.test.ts @@ -9,6 +9,7 @@ describe("ScanCreate cases",() => { const auth = new CxWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanList(""); console.log(" Json object from scanList successful case: " + JSON.stringify(cxCommandOutput)); + expect(cxCommandOutput.payload.length).toBeGreaterThan(1); expect(cxCommandOutput.exitCode).toBe(0); }); @@ -46,6 +47,7 @@ describe("ScanCreate cases",() => { params.set(CxParamType.S, "./src"); params.set(CxParamType.FILTER, "*.ts,!**/node_modules/**/*"); params.set(CxParamType.BRANCH, "master"); + params.set(CxParamType.ADDITIONAL_PARAMETERS, "--scan-types sast"); const auth = new CxWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); const scanObject = cxCommandOutput.payload.pop();