diff --git a/.github/workflows/ast-scan.yml b/.github/workflows/ast-scan.yml new file mode 100644 index 00000000..82aa28c5 --- /dev/null +++ b/.github/workflows/ast-scan.yml @@ -0,0 +1,25 @@ +name: Checkmarx One Scan +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + schedule: + - cron: '00 7 * * *' # Every day at 07:00 + +jobs: + cx-scan: + name: Checkmarx One Scan + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Checkmarx One CLI Action + uses: checkmarx/ast-github-action@03a90e7253dadd7e2fff55f5dfbce647b39040a1 # v.2.0.37 + with: + base_uri: ${{ secrets.AST_RND_SCANS_BASE_URI }} + cx_tenant: ${{ secrets.AST_RND_SCANS_TENANT }} + cx_client_id: ${{ secrets.AST_RND_SCANS_CLIENT_ID }} + cx_client_secret: ${{ secrets.AST_RND_SCANS_CLIENT_SECRET }} + additional_params: --tags phoenix --threshold "sca-critical=1;sca-high=1;sca-medium=1;sca-low=1;sast-critical=1;sast-high=1;sast-medium=1;sast-low=1;iac-security-critical=1;iac-security-high=1;iac-security-medium=1;iac-security-low=1" \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e810ac4..6772f267 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Use Node.js 22.11.0 uses: actions/setup-node@v4.0.2 with: diff --git a/.github/workflows/update-cli.yml b/.github/workflows/update-cli.yml index 983fad96..c61d0210 100644 --- a/.github/workflows/update-cli.yml +++ b/.github/workflows/update-cli.yml @@ -1,53 +1,29 @@ -name: Update Checkmarx AST CLI - +name: Update checkmarx ast cli on: workflow_dispatch: - inputs: - new_cli_version: - description: 'New CLI version (optional)' - required: false schedule: - cron: '0 0 * * *' jobs: update-checkmarx-cli: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - # Fetch the latest Checkmarx AST CLI version - name: Get Latest Checkmarx API version id: checkmarx-ast-cli run: | - if [ "${{ github.event.inputs.new_cli_version }}" ]; then - LATEST_VERSION=${{ github.event.inputs.new_cli_version }} - else - LATEST_VERSION=$(curl -sL https://api.github.com/repos/Checkmarx/ast-cli/releases/latest | jq -r ".tag_name") - fi - CURRENT_VERSION=$( checkmarx-ast-cli.version - # Update the TypeScript file's cliDefaultVersion field - - name: Update cliDefaultVersion in CxInstaller.ts - if: steps.checkmarx-ast-cli.outputs.current_tag != steps.checkmarx-ast-cli.outputs.release_tag - env: - NEW_CLI_VERSION: ${{ steps.checkmarx-ast-cli.outputs.release_tag }} - run: | - FILE_PATH="src/main/osinstaller/CxInstaller.ts" - # Ensure that 'cliDefaultVersion' is updated correctly - sed -i "s/\(cliDefaultVersion = '\)[^']*\(';\)/\1${NEW_CLI_VERSION}\2/" $FILE_PATH - - # Create a Pull Request with the version changes - name: Create Pull Request if: steps.checkmarx-ast-cli.outputs.current_tag != steps.checkmarx-ast-cli.outputs.release_tag uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c #v6 diff --git a/checkmarx-ast-cli.version b/checkmarx-ast-cli.version index cc6c9a49..21bb5e15 100644 --- a/checkmarx-ast-cli.version +++ b/checkmarx-ast-cli.version @@ -1 +1 @@ -2.3.5 +2.2.5 diff --git a/package-lock.json b/package-lock.json index 68785dac..f1adab80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@CheckmarxDev/ast-cli-javascript-wrapper-runtime-cli", - "version": "1.0.6", + "version": "1.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@CheckmarxDev/ast-cli-javascript-wrapper-runtime-cli", - "version": "1.0.6", + "version": "1.0.2", "license": "ISC", "dependencies": { "async-mutex": "^0.5.0", diff --git a/package.json b/package.json index 48cb5ec2..cba310cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@CheckmarxDev/ast-cli-javascript-wrapper-runtime-cli", - "version": "1.0.6", + "version": "1.0.1", "description": "AST CLI Javascript wrapper runtime CLI", "main": "dist/main/wrapper/CxWrapper.js", "typings": "dist/main/wrapper/CxWrapper.d.ts", @@ -22,7 +22,7 @@ "postbuild": "copyfiles -u 1 src/tests/data/* dist/;", "lint": "eslint . --ext .ts", "lint-and-fix": "eslint . --ext .ts --fix", - "test": "copyfiles -u 1 src/tests/data/* dist/; tsc && jest --runInBand" + "test": "copyfiles -u 1 src/tests/data/* dist/; tsc && jest" }, "repository": "https://github.com/CheckmarxDev/ast-cli-javascript-wrapper-runtime-cli.git", "author": "Jay Nanduri", diff --git a/src/main/vorpal/VorpalScanDetail.ts b/src/main/asca/AscaScanDetail.ts similarity index 93% rename from src/main/vorpal/VorpalScanDetail.ts rename to src/main/asca/AscaScanDetail.ts index bc8bf61c..5796fc82 100644 --- a/src/main/vorpal/VorpalScanDetail.ts +++ b/src/main/asca/AscaScanDetail.ts @@ -1,4 +1,4 @@ -export default class VorpalScanDetail { +export default class AscaScanDetail { ruleId: number; language: string; ruleName: string; diff --git a/src/main/vorpal/CxVorpal.ts b/src/main/asca/CxAsca.ts similarity index 82% rename from src/main/vorpal/CxVorpal.ts rename to src/main/asca/CxAsca.ts index af03c5fc..4248d46d 100644 --- a/src/main/vorpal/CxVorpal.ts +++ b/src/main/asca/CxAsca.ts @@ -1,10 +1,10 @@ -import VorpalScanDetail from "./VorpalScanDetail"; +import AscaScanDetail from "./AscaScanDetail"; -export default class CxVorpal { +export default class CxAsca { requestId: string; status: boolean; message: string; - scanDetails: VorpalScanDetail[]; + scanDetails: AscaScanDetail[]; error: any; constructor() { @@ -15,8 +15,8 @@ export default class CxVorpal { this.error = null; } - static parseScan(resultObject: any): CxVorpal { - const scan = new CxVorpal(); + static parseScan(resultObject: any): CxAsca { + const scan = new CxAsca(); scan.requestId = resultObject.request_id; scan.status = resultObject.status; scan.message = resultObject.message; @@ -24,7 +24,7 @@ export default class CxVorpal { if (resultObject.scan_details instanceof Array) { scan.scanDetails = resultObject.scan_details.map((detail: any) => { - const scanDetail = new VorpalScanDetail(); + const scanDetail = new AscaScanDetail(); scanDetail.ruleId = detail.rule_id; scanDetail.language = detail.language; scanDetail.ruleName = detail.rule_name; diff --git a/src/main/client/AstClient.ts b/src/main/client/AstClient.ts index 133ddab2..b2501673 100644 --- a/src/main/client/AstClient.ts +++ b/src/main/client/AstClient.ts @@ -27,3 +27,4 @@ export class AstClient { } } } + diff --git a/src/main/osinstaller/CxInstaller.ts b/src/main/osinstaller/CxInstaller.ts index 9087b873..492fbc12 100644 --- a/src/main/osinstaller/CxInstaller.ts +++ b/src/main/osinstaller/CxInstaller.ts @@ -1,202 +1,223 @@ -import * as fsPromises from 'fs/promises'; -import * as fs from 'fs'; +import * as fs from 'fs/promises'; import * as path from 'path'; +import AdmZip from 'adm-zip'; // For extracting ZIP files import * as tar from 'tar'; -import * as unzipper from 'unzipper'; -import {logger} from "../wrapper/loggerConfig"; -import {AstClient} from "../client/AstClient"; - -const linuxOS = 'linux'; -const macOS = 'darwin'; -const winOS = 'win32'; -type SupportedPlatforms = 'win32' | 'darwin' | 'linux'; - -interface PlatformData { - platform: string; - extension: string; -} +import axios from 'axios'; +import {createWriteStream} from "node:fs"; + export class CxInstaller { - private readonly platform: SupportedPlatforms; + private readonly platform: string; private cliVersion: string; - private readonly resourceDirPath: string; - private readonly installedCLIVersionFileName = 'cli-version'; - private readonly cliDefaultVersion = '2.3.5'; // Update this with the latest version. - private readonly client: AstClient; - - private static readonly PLATFORMS: Record = { - win32: { platform: 'windows', extension: 'zip' }, - darwin: { platform: macOS, extension: 'tar.gz' }, - linux: { platform: linuxOS, extension: 'tar.gz' } - }; - - constructor(platform: string, client: AstClient) { - this.platform = platform as SupportedPlatforms; - this.resourceDirPath = path.join(__dirname, '../wrapper/resources'); - this.client = client; + + constructor(platform: string) { + this.platform = platform; } + // Method to get the download URL based on OS and architecture async getDownloadURL(): Promise { const cliVersion = await this.readASTCLIVersion(); - const platformData = CxInstaller.PLATFORMS[this.platform]; - - if (!platformData) { - throw new Error('Unsupported platform or architecture'); + let platformString: string; + let archiveExtension: string; + + switch (this.platform) { + case 'win32': + platformString = 'windows'; + archiveExtension = 'zip'; + break; + case 'darwin': + archiveExtension = 'tar.gz'; + platformString = 'darwin'; + break; + case 'linux': + archiveExtension = 'tar.gz'; + platformString = 'linux'; + break; + default: + throw new Error('Unsupported platform or architecture'); } - const architecture = this.getArchitecture(); - - return `https://download.checkmarx.com/CxOne/CLI/${cliVersion}/ast-cli_${cliVersion}_${platformData.platform}_${architecture}.${platformData.extension}`; + return `https://download.checkmarx.com/CxOne/CLI/${cliVersion}/ast-cli_${cliVersion}_${platformString}_x64.${archiveExtension}`; } - - private getArchitecture(): string { - // For non-linux platforms we default to x64. - if (this.platform !== linuxOS) { - return 'x64'; + + getExecutablePath(): string { + let executablePath; + const dirExecutablePath = path.join(__dirname, `../wrapper/resources`); + if (this.platform === 'win32') { + executablePath = path.join(dirExecutablePath, 'cx.exe'); + } else { + executablePath = path.join(dirExecutablePath, 'cx'); } - - const archMap: Record = { - 'arm64': 'arm64', - 'arm': 'armv6' - }; - - // Default to 'x64' if the current architecture is not found in the map. - return archMap[process.arch] || 'x64'; + return executablePath; } - public getExecutablePath(): string { - const executableName = this.platform === winOS ? 'cx.exe' : 'cx'; - return path.join(this.resourceDirPath, executableName); + getZipPath(): string { + let executablePath; + const dirExecutablePath = path.join(__dirname, `../wrapper/resources/`); + if (this.platform === 'win32') { + executablePath = path.join(dirExecutablePath, 'cx.zip'); + } else { + executablePath = path.join(dirExecutablePath, 'cx.tar.gz'); + } + return executablePath; } - public async downloadIfNotInstalledCLI(): Promise { - try { - await fs.promises.mkdir(this.resourceDirPath, {recursive: true}); - const cliVersion = await this.readASTCLIVersion(); - - if (this.checkExecutableExists()) { - const installedVersion = await this.readInstalledVersionFile(this.resourceDirPath); - if (installedVersion === cliVersion) { - logger.info('Executable already installed.'); - return; - } - } + async getCLIExecutableName(): Promise { + let platformString: string; + let archiveExtension: string; + this.cliVersion = await this.readASTCLIVersion(); + + switch (this.platform) { + case 'win32': + platformString = 'windows'; + archiveExtension = 'zip'; + break; + case 'darwin': + archiveExtension = 'tar.gz'; + platformString = 'darwin'; + break; + case 'linux': + archiveExtension = 'tar.gz'; + platformString = 'linux'; + break; + default: + throw new Error('Unsupported platform or architecture'); + } - await this.cleanDirectoryContents(this.resourceDirPath); - const url = await this.getDownloadURL(); - const zipPath = path.join(this.resourceDirPath, this.getCompressFolderName()); + return `ast-cli_${this.cliVersion}_${platformString}_x64.${archiveExtension}`; + } - await this.client.downloadFile(url, zipPath); + removeExtension(fileName: string): string { + if (fileName.endsWith('.tar.gz')) { + return fileName.slice(0, -7); // Remove '.tar.gz' + } + return fileName.replace(/\.[^/.]+$/, ''); // Remove other extensions like '.zip' + } - await this.extractArchive(zipPath, this.resourceDirPath); - await this.saveVersionFile(this.resourceDirPath, cliVersion); + - fs.unlink(zipPath, (err) => { - if (err) { - logger.warn('Error deleting the file:', err); - } else { - logger.info(`File ${zipPath} deleted.`); - } + // Method to extract the file (ZIP or tar.gz) + async extractFile(filePath: string, outputDir: string): Promise { + if (filePath.endsWith('.zip')) { + // Extract ZIP file + const zip = new AdmZip(filePath); + zip.extractAllTo(outputDir, true); // Extract to outputDir + console.log(`Extracted ZIP to ${outputDir}`); + } else if (filePath.endsWith('.tar.gz')) { + // Extract tar.gz file + await tar.extract({ + file: filePath, + cwd: outputDir, // Extract to the outputDir }); - - fs.chmodSync(this.getExecutablePath(), 0o755); - logger.info('Extracted CLI to:', this.resourceDirPath); - } catch (error) { - logger.error('Error during installation:', error); + console.log(`Extracted tar.gz to ${outputDir}`); + } else { + throw new Error('Unsupported archive format'); } } - private async cleanDirectoryContents(directoryPath: string): Promise { - try { - const files = await fsPromises.readdir(directoryPath); - - await Promise.all(files.map(async (file) => { - const filePath = path.join(directoryPath, file); - const fileStat = await fsPromises.stat(filePath); - - if (fileStat.isDirectory()) { - await fsPromises.rm(filePath, {recursive: true, force: true}); - logger.info(`Directory ${filePath} deleted.`); - } else { - await fsPromises.unlink(filePath); - logger.info(`File ${filePath} deleted.`); - } - })); - - logger.info(`All contents in ${directoryPath} have been cleaned.`); - } catch (error) { - if (error.code === 'ENOENT') { - logger.info(`Directory at ${directoryPath} does not exist.`); - } else { - logger.error(`Failed to clean directory contents: ${error.message}`); - } + // Method to execute the installation + async install(outputPath: string): Promise { + const exists = await this.checkExecutableExists(); + if (exists) { + console.log('Executable already exists. Skipping installation.'); + return; } - } - private async extractArchive(zipPath: string, extractPath: string): Promise { - if (zipPath.endsWith('.zip')) { - await unzipper.Open.file(zipPath) - .then(d => d.extract({path: extractPath})); - } else if (zipPath.endsWith('.tar.gz')) { - await tar.extract({file: zipPath, cwd: extractPath}); - } else { - logger.error('Unsupported file type. Only .zip and .tar.gz are supported.'); + const url = await this.getDownloadURL(); + if (!url) { + console.error('No valid download URL available for this platform.'); + return; } - } - - private async saveVersionFile(resourcePath: string, version: string): Promise { - const versionFilePath = path.join(resourcePath, this.installedCLIVersionFileName); + try { - await fsPromises.writeFile(versionFilePath, `${version}`, 'utf8'); - logger.info(`Version file created at ${versionFilePath} with version ${version}`); + console.log(`Downloading from: ${url}`); + await downloadFile(url, outputPath); + console.log(`Downloaded to: ${outputPath}`); + + // Now extract the downloaded archive } catch (error) { - logger.error(`Failed to create version file: ${error.message}`); + console.error(`Error during installation: ${error.message}`); } } - private async readInstalledVersionFile(resourcePath: string): Promise { - const versionFilePath = path.join(resourcePath, this.installedCLIVersionFileName); + // Check if the executable exists + async checkExecutableExists(): Promise { + let executablePath; + const dirExecutablePath = path.join(__dirname, `../../wrapper/resources/`); + if (this.platform === 'win32') { + executablePath = path.join(dirExecutablePath, 'cx.exe'); + } else { + executablePath = path.join(dirExecutablePath, 'cx'); + } try { - const content = await fsPromises.readFile(versionFilePath, 'utf8'); - logger.info(`Version file content: ${content}`); - return content; + await fs.access(executablePath); + console.log(`Executable exists at: ${executablePath}`); + return true; } catch (error) { - if (error.code === 'ENOENT') { - logger.warn(`Version file not found at ${versionFilePath}.`); - } else { - logger.error(`Failed to read version file: ${error.message}`); - } - return null; + console.error(`Executable does not exist at: ${executablePath}`); + return false; } } - public checkExecutableExists(): boolean { - return fs.existsSync(this.getExecutablePath()); - } - + // Method to read the AST CLI version from the file async readASTCLIVersion(): Promise { if (this.cliVersion) { return this.cliVersion; } try { - const versionFilePath = this.getVersionFilePath(); - const versionContent = await fsPromises.readFile(versionFilePath, 'utf-8'); + const versionFilePath = path.join(process.cwd(), 'checkmarx-ast-cli.version'); + const versionContent = await fs.readFile(versionFilePath, 'utf-8'); return versionContent.trim(); } catch (error) { - logger.warn('Error reading AST CLI version: ' + error.message); - return this.cliDefaultVersion; + console.error('Error reading AST CLI version:', error); + throw error; } } +} - private getVersionFilePath(): string { - return path.join(__dirname, '../../../checkmarx-ast-cli.version'); - } +async function downloadFile(downloadURLPath: string, filePath: string): Promise { + const fileName = "cx"; + console.log(`Downloading ${fileName} from: ${downloadURLPath}`); - private getCompressFolderName(): string { - return `ast-cli.${this.platform === winOS ? 'zip' : 'tar.gz'}`; - } - - public getPlatform(): SupportedPlatforms { - return this.platform; + try { + // Ensure the directory exists + await fs.mkdir(path.dirname(downloadURLPath), { recursive: true }); + + // Check if filePath is a directory + try { + const stats = await fs.stat(filePath); + if (stats.isDirectory()) { + // If it's a directory, append the filename from the URL + filePath = path.join(filePath, path.basename(downloadURLPath)); + } + } catch (error) { + // If the path doesn't exist, assume it's meant to be a file + // The directory has already been created above + } + + // Perform HTTP GET request + const response = await axios({ + method: 'GET', + url: downloadURLPath, + responseType: 'stream' + }); + // Create the file stream at the specified filePath + const fileStream = createWriteStream(process.cwd()+"/src/main/wrapper/resources/cx"); + + // Pipe the response data to the file + response.data.pipe(fileStream); + + // Wait for the file to finish writing + await new Promise((resolve, reject) => { + fileStream.on('finish', resolve); + fileStream.on('error', reject); + }); + + console.log(`File downloaded successfully to ${filePath}`); + + } catch (error) { + console.log(`Error during file download:` + error.message); + throw new Error(`Invoking HTTP request to download file failed - ${error.message}`); } } + diff --git a/src/main/wrapper/CxConstants.ts b/src/main/wrapper/CxConstants.ts index 72288d9c..479cb5e4 100644 --- a/src/main/wrapper/CxConstants.ts +++ b/src/main/wrapper/CxConstants.ts @@ -65,9 +65,9 @@ export enum CxConstants { FORMAT_HTML_CLI = "summaryHTML", FILTER = "--filter", SCAN_ID = "--scan-id", - CMD_VORPAL = "vorpal", + CMD_ASCA = "asca", SOURCE_FILE = "--file-source", - VORPAL_UPDATE_VERSION = "--vorpal-latest-version", + ASCA_UPDATE_VERSION = "--asca-latest-version", PROJECT_ID = "--project-id", SIMILARITY_ID = "--similarity-id", QUERY_ID = "--query-id", @@ -81,7 +81,7 @@ export enum CxConstants { ADDITONAL_PARAMS = "--additional-params", ENGINE = "--engine", SCAN_TYPE = "CxScan", - SCAN_VORPAL = "CxVorpal", + SCAN_ASCA = "CxAsca", PROJECT_TYPE = "CxProject", PREDICATE_TYPE = "CxPredicate", CODE_BASHING_TYPE = "CxCodeBashing", diff --git a/src/main/wrapper/CxWrapper.ts b/src/main/wrapper/CxWrapper.ts index a94c23c3..8625f628 100644 --- a/src/main/wrapper/CxWrapper.ts +++ b/src/main/wrapper/CxWrapper.ts @@ -8,19 +8,17 @@ import * as os from "os"; import CxBFL from "../bfl/CxBFL"; import {CxInstaller} from "../osinstaller/CxInstaller"; import {Semaphore} from "async-mutex"; -import {HttpClient} from "../client/HttpClient"; -import {AstClient} from "../client/AstClient"; type ParamTypeMap = Map; export class CxWrapper { - private static instances =new Map(); // Multiton pattern + private static instance: CxWrapper; private static semaphore = new Semaphore(1); // Semaphore with 1 slot config: CxConfig; cxInstaller: CxInstaller; - private constructor(cxScanConfig: CxConfig, logFilePath?: string) { - this.cxInstaller = new CxInstaller(process.platform, new AstClient(new HttpClient())); + constructor(cxScanConfig: CxConfig, logFilePath?: string) { + this.cxInstaller = new CxInstaller(process.platform); this.config = new CxConfig(); getLoggerWithFilePath(logFilePath) if (cxScanConfig.apiKey) { @@ -52,29 +50,51 @@ export class CxWrapper { } static async getInstance(cxScanConfig: CxConfig, logFilePath: string): Promise { - const [, release] = await this.semaphore.acquire(); - const key = this.generateKey(cxScanConfig, logFilePath); - let wrapper = CxWrapper.instances.get(key); - if (!wrapper) { - wrapper = new CxWrapper(cxScanConfig, logFilePath); - CxWrapper.instances.set(key, wrapper); + const [_, release] = await this.semaphore.acquire(); + if (!CxWrapper.instance) { + CxWrapper.instance = new CxWrapper(cxScanConfig, logFilePath); } release(); - return wrapper; + return CxWrapper.instance; } - static generateKey(config:CxConfig,logFilePath:string): string { - return `${config.baseUri}${config.baseAuthUri}${config.clientId}${config.clientSecret}${config.apiKey}${config.tenant}${config.additionalParameters}${config.pathToExecutable}${logFilePath}`.toLowerCase(); + setScanConfig(cxScanConfig: CxConfig) { + if (cxScanConfig.apiKey) { + this.config.apiKey = cxScanConfig.apiKey; + } else if (cxScanConfig.clientId && cxScanConfig.clientSecret) { + logger.info("Received clientId and clientSecret"); + this.config.clientId = cxScanConfig.clientId; + this.config.clientSecret = cxScanConfig.clientSecret; + } else { + logger.info("Did not receive ClientId/Secret or ApiKey from cli arguments"); + } + if (cxScanConfig.pathToExecutable) { + this.config.pathToExecutable = cxScanConfig.pathToExecutable; + } else { + this.config.pathToExecutable = this.cxInstaller.getExecutablePath(); + } + if (cxScanConfig.baseUri) { + this.config.baseUri = cxScanConfig.baseUri; + } + if (cxScanConfig.baseAuthUri) { + this.config.baseAuthUri = cxScanConfig.baseAuthUri; + } + if (cxScanConfig.tenant) { + this.config.tenant = cxScanConfig.tenant; + } + if (cxScanConfig.additionalParameters) { + this.config.additionalParameters = cxScanConfig.additionalParameters; + } + } + + GetScanConfig(): CxConfig { + return this.config; } async init(): Promise { return await this.cxInstaller.downloadIfNotInstalledCLI(); } - - public cloneWithNewConfig(scanConfig: CxConfig): CxWrapper { - return new CxWrapper(scanConfig); - } initializeCommands(formatRequired: boolean): string[] { this.config.pathToExecutable = this.cxInstaller.getExecutablePath(); @@ -147,11 +167,11 @@ export class CxWrapper { return await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.SCAN_TYPE); } - async scanVorpal(sourceFile: string, updateVersion = false, agent?: string | null): Promise { - const commands: string[] = [CxConstants.CMD_SCAN, CxConstants.CMD_VORPAL, CxConstants.SOURCE_FILE, sourceFile]; + async scanAsca(sourceFile: string, updateVersion = false, agent?: string | null): Promise { + const commands: string[] = [CxConstants.CMD_SCAN, CxConstants.CMD_ASCA, CxConstants.SOURCE_FILE, sourceFile]; if (updateVersion) { - commands.push(CxConstants.VORPAL_UPDATE_VERSION); + commands.push(CxConstants.ASCA_UPDATE_VERSION); } if (agent) { commands.push(CxConstants.AGENT); @@ -165,7 +185,7 @@ export class CxWrapper { commands.push(...this.initializeCommands(false)); const exec = new ExecutionService(); - return await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.SCAN_VORPAL); + return await exec.executeCommands(this.config.pathToExecutable, commands, CxConstants.SCAN_ASCA); } async scanCancel(id: string): Promise { diff --git a/src/main/wrapper/CxWrapperFactory.ts b/src/main/wrapper/CxWrapperFactory.ts index dd7a9e84..1c24690f 100644 --- a/src/main/wrapper/CxWrapperFactory.ts +++ b/src/main/wrapper/CxWrapperFactory.ts @@ -1,17 +1,19 @@ -// ICxWrapperFactory.ts -import { CxWrapper } from "./CxWrapper"; -import { CxConfig } from "./CxConfig"; +import {CxWrapper} from "./CxWrapper"; +import {CxConfig} from "./CxConfig"; -export interface ICxWrapperFactory { - createWrapper(cxScanConfig: CxConfig, logFilePath?: string): Promise; -} +class CxWrapperFactory { + static async createWrapper(cxScanConfig: CxConfig, type?: string, logFilePath?: string) { + let wrapper: CxWrapper; -class CxWrapperFactory implements ICxWrapperFactory { - async createWrapper(cxScanConfig: CxConfig, logFilePath?: string): Promise { - const wrapper = await CxWrapper.getInstance(cxScanConfig, logFilePath); + if (type === 'mock') { + wrapper = new CxWrapper(cxScanConfig, logFilePath); + } + else { + wrapper = await CxWrapper.getInstance(cxScanConfig, logFilePath); + } await wrapper.init(); return wrapper; } } -export default CxWrapperFactory; +export default CxWrapperFactory; \ No newline at end of file diff --git a/src/main/wrapper/ExecutionService.ts b/src/main/wrapper/ExecutionService.ts index 6311d5b6..20123524 100644 --- a/src/main/wrapper/ExecutionService.ts +++ b/src/main/wrapper/ExecutionService.ts @@ -22,7 +22,7 @@ import CxKicsRemediation from "../remediation/CxKicsRemediation"; import CxScaRealTime from "../scaRealtime/CxScaRealTime"; import CxChat from "../chat/CxChat"; import CxMask from "../mask/CxMask"; -import CxVorpal from "../vorpal/CxVorpal"; +import CxAsca from "../asca/CxAsca"; let skipValue = false; const fileSourceFlag = "--file-source" @@ -200,9 +200,9 @@ export class ExecutionService { const scans = CxScan.parseProject(resultObject); cxCommandOutput.payload = scans; break; - case CxConstants.SCAN_VORPAL: - const vorpal = CxVorpal.parseScan(resultObject); - cxCommandOutput.payload = [vorpal]; + case CxConstants.SCAN_ASCA: + const asca = CxAsca.parseScan(resultObject); + cxCommandOutput.payload = [asca]; break; case CxConstants.PROJECT_TYPE: const projects = CxProject.parseProject(resultObject); diff --git a/src/tests/AuthTest.test.ts b/src/tests/AuthTest.test.ts index adf22aed..351171b4 100644 --- a/src/tests/AuthTest.test.ts +++ b/src/tests/AuthTest.test.ts @@ -3,12 +3,10 @@ import {CxConfig} from "../main/wrapper/CxConfig"; import {BaseTest} from "./BaseTest"; import CxWrapperFactory from "../main/wrapper/CxWrapperFactory"; -const cxWrapperFactory = new CxWrapperFactory(); - -describe("Authentication validation", () => { +describe("Authentication validation",() => { const cxScanConfig = new BaseTest(); it('Result authentication successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.authValidate(); expect(cxCommandOutput.exitCode).toBe(0); }); @@ -20,7 +18,7 @@ describe("Authentication validation", () => { cxScanConfig_fail.clientSecret = "error"; cxScanConfig_fail.tenant = process.env["CX_TENANT"]; cxScanConfig_fail.apiKey = "error"; - const auth = await cxWrapperFactory.createWrapper(cxScanConfig_fail); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig_fail,'mock'); const cxCommandOutput: CxCommandOutput = await auth.authValidate(); expect(cxCommandOutput.exitCode).toBe(1); }); diff --git a/src/tests/ChatTest.test.ts b/src/tests/ChatTest.test.ts index bc553785..de487bb0 100644 --- a/src/tests/ChatTest.test.ts +++ b/src/tests/ChatTest.test.ts @@ -13,8 +13,6 @@ function createOutput(exitCode:number,payload:CxChat):CxCommandOutput { return output; } -const cxWrapperFactory = new CxWrapperFactory(); - describe("Gpt Chat Cases", () => { // tests preparation const cxScanConfig = new BaseTest(); @@ -41,7 +39,7 @@ describe("Gpt Chat Cases", () => { }); it('KICS Gpt Chat Failed case', async () => { - const originalWrapper: CxWrapper = await cxWrapperFactory.createWrapper(cxScanConfig); + const originalWrapper: CxWrapper = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput = await originalWrapper.kicsChat( "APIKEY", "FILE", @@ -57,7 +55,7 @@ describe("Gpt Chat Cases", () => { }); it('Sast Gpt Chat Failed case', async () => { - const originalWrapper: CxWrapper = await cxWrapperFactory.createWrapper(cxScanConfig); + const originalWrapper: CxWrapper = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput = await originalWrapper.sastChat( "APIKEY", "SOURCE_FILE", diff --git a/src/tests/LearnMoreDescriptions.test.ts b/src/tests/LearnMoreDescriptions.test.ts index 7429a5e3..4be295ac 100644 --- a/src/tests/LearnMoreDescriptions.test.ts +++ b/src/tests/LearnMoreDescriptions.test.ts @@ -2,12 +2,10 @@ import {BaseTest} from "./BaseTest"; import {CxCommandOutput} from "../main/wrapper/CxCommandOutput"; import CxWrapperFactory from "../main/wrapper/CxWrapperFactory"; -const cxWrapperFactory = new CxWrapperFactory(); - describe("LearnMoreDescriptions cases",() => { const cxScanConfig = new BaseTest(); it('LearnMoreDescriptions Successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const queryId = process.env.CX_TEST_QUERY_ID; const data = await auth.learnMore(queryId !== undefined? queryId : "16772998409937314312") const cxCommandOutput: CxCommandOutput = data; @@ -15,7 +13,7 @@ describe("LearnMoreDescriptions cases",() => { }) it('LearnMoreDescriptions Failure case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const data = await auth.learnMore("") const cxCommandOutput: CxCommandOutput = data; expect(cxCommandOutput.status).toBe("Value of query-id is invalid\n"); diff --git a/src/tests/MaskTest.test.ts b/src/tests/MaskTest.test.ts index 7ecee882..4b7b6778 100644 --- a/src/tests/MaskTest.test.ts +++ b/src/tests/MaskTest.test.ts @@ -2,12 +2,10 @@ import {CxCommandOutput} from "../main/wrapper/CxCommandOutput"; import {BaseTest} from "./BaseTest"; import CxWrapperFactory from "../main/wrapper/CxWrapperFactory"; -const cxWrapperFactory = new CxWrapperFactory(); - describe("Mask cases",() => { const cxScanConfig = new BaseTest(); it('Mask Successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const data = await auth.maskSecrets("dist/tests/data/package.json") const cxCommandOutput: CxCommandOutput = data; expect(cxCommandOutput.payload.length).toEqual(1); diff --git a/src/tests/PredicateTest.test.ts b/src/tests/PredicateTest.test.ts index df319a33..82a1f3f6 100644 --- a/src/tests/PredicateTest.test.ts +++ b/src/tests/PredicateTest.test.ts @@ -4,13 +4,11 @@ import CxResult from '../main/results/CxResult'; import {CxConstants} from '../main/wrapper/CxConstants'; import CxWrapperFactory from "../main/wrapper/CxWrapperFactory"; -const cxWrapperFactory = new CxWrapperFactory(); - describe("Triage cases", () => { const cxScanConfig = new BaseTest(); it('Triage Successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const scanList: CxCommandOutput = await auth.scanList("statuses=Completed,limit=100"); let result: CxResult; diff --git a/src/tests/ProjectTest.test.ts b/src/tests/ProjectTest.test.ts index 3e2c9afa..36f7c4ac 100644 --- a/src/tests/ProjectTest.test.ts +++ b/src/tests/ProjectTest.test.ts @@ -4,12 +4,10 @@ import {CxParamType} from "../main/wrapper/CxParamType"; import CxScan from "../main/scan/CxScan"; import CxWrapperFactory from "../main/wrapper/CxWrapperFactory"; -const cxWrapperFactory = new CxWrapperFactory(); - describe("ProjectList cases",() => { const cxScanConfig = new BaseTest(); it('ProjectList Successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const data = await auth.projectList(""); const cxCommandOutput: CxCommandOutput = data; expect(cxCommandOutput.payload.length).toBeGreaterThan(0); @@ -21,7 +19,7 @@ describe("ProjectList cases",() => { params.set(CxParamType.S, "./src"); params.set(CxParamType.FILTER, "*.ts,!**/node_modules/**/*"); params.set(CxParamType.BRANCH, "master"); - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); const scan: CxScan = cxCommandOutput.payload.pop(); @@ -36,7 +34,7 @@ describe("ProjectList cases",() => { params.set(CxParamType.S, "./src"); params.set(CxParamType.FILTER, "*.ts,!**/node_modules/**/*"); params.set(CxParamType.BRANCH, "master"); - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); const scan: CxScan = cxCommandOutput.payload.pop(); diff --git a/src/tests/RemediationTest.test.ts b/src/tests/RemediationTest.test.ts index ecfff6c7..064486a1 100644 --- a/src/tests/RemediationTest.test.ts +++ b/src/tests/RemediationTest.test.ts @@ -3,12 +3,10 @@ import {CxCommandOutput} from "../main/wrapper/CxCommandOutput"; import CxKicsRemediation from "../main/remediation/CxKicsRemediation"; import CxWrapperFactory from "../main/wrapper/CxWrapperFactory"; -const cxWrapperFactory = new CxWrapperFactory(); - describe("SCA Remediation cases",() => { const cxScanConfig = new BaseTest(); it('SCA Remediation Successful case ', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const e:CxCommandOutput = await auth.scaRemediation("dist/tests/data/package.json","copyfiles","1.2") expect(e.exitCode).toBe(0); }); @@ -17,7 +15,7 @@ describe("SCA Remediation cases",() => { describe("Kics Remediation cases",() => { const cxScanConfig = new BaseTest(); it('Kics Remediation Successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const e:[Promise,any] = await auth.kicsRemediation("dist/tests/data/results.json",__dirname+"/data","docker") const output = await e[0]; const remediation: CxKicsRemediation = output.payload[0]; @@ -26,7 +24,7 @@ describe("Kics Remediation cases",() => { }); it('Kics Remediation Successful case with filter', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const e:[Promise,any] = await auth.kicsRemediation("dist/tests/data/results.json",__dirname+"/data/","","9574288c118e8c87eea31b6f0b011295a39ec5e70d83fb70e839b8db4a99eba8") const output = await e[0]; const remediation: CxKicsRemediation = output.payload[0]; diff --git a/src/tests/ResultTest.test.ts b/src/tests/ResultTest.test.ts index dd341d2d..b1164e13 100644 --- a/src/tests/ResultTest.test.ts +++ b/src/tests/ResultTest.test.ts @@ -3,12 +3,10 @@ import {BaseTest} from "./BaseTest"; import * as fs from "fs"; import CxWrapperFactory from "../main/wrapper/CxWrapperFactory"; -const cxWrapperFactory = new CxWrapperFactory(); - describe("Results cases",() => { const cxScanConfig = new BaseTest(); it('Result Test Successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanList("statuses=Completed"); const sampleId = cxCommandOutput.payload.pop().id; @@ -18,7 +16,7 @@ describe("Results cases",() => { }); it('Result Test With Agent Flug Successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanList("statuses=Completed"); const sampleId = cxCommandOutput.payload.pop().id; @@ -28,7 +26,7 @@ describe("Results cases",() => { }); it('Result List Successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const scanList: CxCommandOutput = await auth.scanList("statuses=Completed"); let output; while (!output && scanList && scanList.payload && scanList.payload.length > 0) { @@ -44,7 +42,7 @@ describe("Results cases",() => { }); it('Result summary html file generation successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanList("statuses=Completed"); const sampleId = cxCommandOutput.payload.pop().id; await auth.getResults(sampleId,"summaryHTML","test", "."); @@ -53,7 +51,7 @@ describe("Results cases",() => { }); it('Result summary html string successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanList("statuses=Completed"); const sampleId = cxCommandOutput.payload.pop().id; const written = await auth.getResultsSummary(sampleId); @@ -61,7 +59,7 @@ describe("Results cases",() => { }); it('Result codebashing successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.codeBashingList("79","PHP","Reflected XSS All Clients"); expect(cxCommandOutput.payload.length).toBeGreaterThan(0); }); diff --git a/src/tests/ScanTest.test.ts b/src/tests/ScanTest.test.ts index 2e17e0e3..8a704780 100644 --- a/src/tests/ScanTest.test.ts +++ b/src/tests/ScanTest.test.ts @@ -3,12 +3,10 @@ import { CxParamType } from "../main/wrapper/CxParamType"; import { BaseTest } from "./BaseTest"; import CxWrapperFactory from "../main/wrapper/CxWrapperFactory"; -const cxWrapperFactory = new CxWrapperFactory(); - describe("ScanCreate cases", () => { const cxScanConfig = new BaseTest(); it('ScanList Successful case', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanList(""); console.log(" Json object from scanList successful case: " + JSON.stringify(cxCommandOutput)); expect(cxCommandOutput.payload.length).toBeGreaterThan(1); @@ -22,7 +20,7 @@ describe("ScanCreate cases", () => { params.set(CxParamType.FILTER, "*.ts,!**/node_modules/**/*"); params.set(CxParamType.BRANCH, "master"); params.set(CxParamType.SCAN_TYPES,"kics"); - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); const scanObject = cxCommandOutput.payload.pop(); const scanShowObject = await auth.scanShow(scanObject.id); @@ -37,7 +35,7 @@ describe("ScanCreate cases", () => { params.set(CxParamType.SAST_PRESET_NAME, "Checkmarx Default Fake"); params.set(CxParamType.BRANCH, "master"); params.set(CxParamType.SCAN_TYPES, "sast"); - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); const scanObject = cxCommandOutput.payload.pop(); const scanShowObject = await auth.scanShow(scanObject.id); @@ -52,7 +50,7 @@ describe("ScanCreate cases", () => { params.set(CxParamType.FILTER, "*.ts,!**/node_modules/**/*"); params.set(CxParamType.BRANCH, "master"); params.set(CxParamType.ADDITIONAL_PARAMETERS, "--scan-types sast"); - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); const scanObject = cxCommandOutput.payload.pop(); const scanShowObject = await auth.scanShow(scanObject.id); @@ -68,7 +66,7 @@ describe("ScanCreate cases", () => { params.set(CxParamType.SAST_PRESET_NAME, "Checkmarx Default Fake"); params.set(CxParamType.ADDITIONAL_PARAMETERS, "--async"); params.set(CxParamType.BRANCH, "master"); - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); const scanObject = cxCommandOutput.payload.pop(); const scanShowObject = await auth.scanShow(scanObject.id); @@ -83,7 +81,7 @@ describe("ScanCreate cases", () => { params.set(CxParamType.BRANCH, "master"); params.set(CxParamType.FILTER, "*.ts,!**/node_modules/**/*"); params.set(CxParamType.ADDITIONAL_PARAMETERS, "--async"); - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await auth.scanCreate(params); const scanObject = cxCommandOutput.payload.pop(); await auth.scanCancel(scanObject.id) @@ -92,7 +90,7 @@ describe("ScanCreate cases", () => { }) it('KicsRealtime Successful case ', async () => { - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const [outputProcess,pid] = await auth.kicsRealtimeScan("dist/tests/data/Dockerfile","docker","-v"); const cxCommandOutput: CxCommandOutput = await outputProcess; console.log(" Json object from successful no wait mode case: " + JSON.stringify( cxCommandOutput.payload)); @@ -103,7 +101,7 @@ describe("ScanCreate cases", () => { }) it('ScaRealtime Successful case', async () => { - const wrapper = await cxWrapperFactory.createWrapper(cxScanConfig); + const wrapper = await CxWrapperFactory.createWrapper(cxScanConfig); const cxCommandOutput: CxCommandOutput = await wrapper.runScaRealtimeScan(process.cwd()); if(cxCommandOutput.exitCode == 1) { expect(cxCommandOutput.payload).toBeUndefined(); @@ -115,58 +113,58 @@ describe("ScanCreate cases", () => { it("Should check if scan create is possible", async() => { const cxScanConfig = new BaseTest(); - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const tenantSettings: boolean = await auth.ideScansEnabled(); expect(tenantSettings).toBeDefined(); }) it("Should check if AI guided remediation is active", async() => { const cxScanConfig = new BaseTest(); - const auth = await cxWrapperFactory.createWrapper(cxScanConfig); + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); const aiEnabled: boolean = await auth.guidedRemediationEnabled(); expect(aiEnabled).toBeDefined(); }) - // it('ScanVorpal fail case Without extensions', async () => { - // const auth = await cxWrapperFactory.createWrapper(cxScanConfig); - // const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/python-file"); - // console.log(" Json object from failure case: " + JSON.stringify(cxCommandOutput)); - // - // expect(cxCommandOutput.payload[0].error.description).toEqual("The file name must have an extension."); - // expect(cxCommandOutput.exitCode).toBe(0); - // expect(cxCommandOutput.payload[0].status).toBeUndefined(); - // }); - - // it('ScanVorpal Successful case', async () => { - // const auth = await cxWrapperFactory.createWrapper(cxScanConfig); - // const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/python-vul-file.py"); - // console.log("Json object from scanVorpal successful case: " + JSON.stringify(cxCommandOutput)); - // const scanObject = cxCommandOutput.payload.pop(); - // expect(cxCommandOutput.payload).toBeDefined(); - // expect(cxCommandOutput.exitCode).toBe(0); - // expect(scanObject.status).toEqual(true); - // }); - // - // it('ScanVorpal with complex name Successful case', async () => { - // const auth = await cxWrapperFactory.createWrapper(cxScanConfig); - // const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/var express = require('express';.js"); - // console.log("Json object from scanVorpal successful case: " + JSON.stringify(cxCommandOutput)); - // const scanObject = cxCommandOutput.payload.pop(); - // expect(cxCommandOutput.payload).toBeDefined(); - // expect(cxCommandOutput.exitCode).toBe(0); - // expect(scanObject.status).toEqual(true); - // }); - // - // it('ScanVorpal Successful case with update version', async () => { - // const auth = await cxWrapperFactory.createWrapper(cxScanConfig); - // const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/python-vul-file.py", true); - // console.log("Json object from scanVorpal successful case with update version: " + JSON.stringify(cxCommandOutput)); - // const scanObject = cxCommandOutput.payload.pop(); - // expect(cxCommandOutput.payload).toBeDefined(); - // expect(cxCommandOutput.exitCode).toBe(0); - // expect(scanObject.status).toEqual(true); - // expect(Number.isInteger(scanObject.scanDetails[0].line)).toBe(true); - // expect(typeof scanObject.scanDetails[0].description).toBe('string'); - // }); + it('ScanVorpal fail case Without extensions', async () => { + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); + const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/python-file"); + console.log(" Json object from failure case: " + JSON.stringify(cxCommandOutput)); + + expect(cxCommandOutput.payload[0].error.description).toEqual("The file name must have an extension."); + expect(cxCommandOutput.exitCode).toBe(0); + expect(cxCommandOutput.payload[0].status).toBeUndefined(); + }); + + it('ScanVorpal Successful case', async () => { + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); + const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/python-vul-file.py"); + console.log("Json object from scanVorpal successful case: " + JSON.stringify(cxCommandOutput)); + const scanObject = cxCommandOutput.payload.pop(); + expect(cxCommandOutput.payload).toBeDefined(); + expect(cxCommandOutput.exitCode).toBe(0); + expect(scanObject.status).toEqual(true); + }); + + it('ScanVorpal with complex name Successful case', async () => { + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); + const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/var express = require('express';.js"); + console.log("Json object from scanVorpal successful case: " + JSON.stringify(cxCommandOutput)); + const scanObject = cxCommandOutput.payload.pop(); + expect(cxCommandOutput.payload).toBeDefined(); + expect(cxCommandOutput.exitCode).toBe(0); + expect(scanObject.status).toEqual(true); + }); + + it('ScanVorpal Successful case with update version', async () => { + const auth = await CxWrapperFactory.createWrapper(cxScanConfig); + const cxCommandOutput: CxCommandOutput = await auth.scanVorpal("tsc/tests/data/python-vul-file.py", true); + console.log("Json object from scanVorpal successful case with update version: " + JSON.stringify(cxCommandOutput)); + const scanObject = cxCommandOutput.payload.pop(); + expect(cxCommandOutput.payload).toBeDefined(); + expect(cxCommandOutput.exitCode).toBe(0); + expect(scanObject.status).toEqual(true); + expect(Number.isInteger(scanObject.scanDetails[0].line)).toBe(true); + expect(typeof scanObject.scanDetails[0].description).toBe('string'); + }); });