Files
codeql-action/lib/analyze.test.js
T

213 lines
9.3 KiB
JavaScript
Raw Permalink Normal View History

2020-09-10 18:02:33 +01:00
"use strict";
2021-07-27 17:59:59 +01:00
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
2020-09-10 18:02:33 +01:00
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
2021-07-27 17:59:59 +01:00
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
2020-09-10 18:02:33 +01:00
return result;
};
2020-09-29 14:43:37 +01:00
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
2020-09-10 18:02:33 +01:00
Object.defineProperty(exports, "__esModule", { value: true });
const fs = __importStar(require("fs"));
2021-04-16 14:52:39 -07:00
const path = __importStar(require("path"));
2020-09-29 14:43:37 +01:00
const ava_1 = __importDefault(require("ava"));
2021-06-03 09:32:44 -07:00
const yaml = __importStar(require("js-yaml"));
2021-08-11 13:14:56 +01:00
const sinon = __importStar(require("sinon"));
2020-09-29 14:43:37 +01:00
const analyze_1 = require("./analyze");
const codeql_1 = require("./codeql");
2021-04-16 14:52:39 -07:00
const count = __importStar(require("./count-loc"));
const languages_1 = require("./languages");
const logging_1 = require("./logging");
2020-09-10 18:02:33 +01:00
const testing_utils_1 = require("./testing-utils");
const util = __importStar(require("./util"));
(0, testing_utils_1.setupTests)(ava_1.default);
2020-09-10 18:02:33 +01:00
// Checks that the duration fields are populated for the correct language
// and correct case of builtin or custom. Also checks the correct search
// paths are set in the database analyze invocation.
(0, ava_1.default)("status report fields and search path setting", async (t) => {
const mockLinesOfCode = Object.values(languages_1.Language).reduce((obj, lang, i) => {
// use a different line count for each language
2021-04-16 14:52:39 -07:00
obj[lang] = i + 1;
return obj;
}, {});
2021-08-11 13:14:56 +01:00
sinon.stub(count, "countLoc").resolves(mockLinesOfCode);
let searchPathsUsed = [];
2020-09-10 18:02:33 +01:00
return await util.withTmpDir(async (tmpDir) => {
(0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir);
const memoryFlag = "";
const addSnippetsFlag = "";
const threadsFlag = "";
2021-06-03 09:32:44 -07:00
const packs = {
2022-04-26 19:47:59 -07:00
[languages_1.Language.cpp]: ["a/b@1.0.0"],
[languages_1.Language.java]: ["c/d@2.0.0"],
2021-06-03 09:32:44 -07:00
};
2020-09-10 18:02:33 +01:00
for (const language of Object.values(languages_1.Language)) {
(0, codeql_1.setCodeQL)({
2021-06-07 16:05:32 -07:00
packDownload: async () => ({ packs: [] }),
databaseRunQueries: async (_db, searchPath) => {
searchPathsUsed.push(searchPath);
},
databaseInterpretResults: async (_db, _queriesRun, sarifFile) => {
2021-04-16 14:52:39 -07:00
fs.writeFileSync(sarifFile, JSON.stringify({
runs: [
2021-08-26 13:46:22 +01:00
// references a rule with the lines-of-code tag, so baseline should be injected
{
tool: {
extensions: [
{
rules: [
{
properties: {
tags: ["lines-of-code"],
},
},
],
},
],
},
properties: {
metricResults: [
{
rule: {
index: 0,
toolComponent: {
index: 0,
},
},
value: 123,
},
],
},
},
2021-04-16 14:52:39 -07:00
{},
],
}));
return "";
2021-04-16 14:52:39 -07:00
},
});
searchPathsUsed = [];
2020-09-10 18:02:33 +01:00
const config = {
languages: [language],
queries: {},
pathsIgnore: [],
paths: [],
originalUserInput: {},
tempDir: tmpDir,
toolCacheDir: tmpDir,
codeQLCmd: "",
2021-02-15 09:29:10 +00:00
gitHubVersion: {
type: util.GitHubVariant.DOTCOM,
},
dbLocation: path.resolve(tmpDir, "codeql_databases"),
2021-06-03 09:32:44 -07:00
packs,
debugMode: false,
debugArtifactName: util.DEFAULT_DEBUG_ARTIFACT_NAME,
debugDatabaseName: util.DEFAULT_DEBUG_DATABASE_NAME,
2022-03-25 15:41:44 +00:00
injectedMlQueries: false,
2020-09-10 18:02:33 +01:00
};
fs.mkdirSync(util.getCodeQLDatabasePath(config, language), {
recursive: true,
});
2020-09-10 18:02:33 +01:00
config.queries[language] = {
builtin: ["foo.ql"],
2020-09-10 18:02:33 +01:00
custom: [],
};
const builtinStatusReport = await (0, analyze_1.runQueries)(tmpDir, memoryFlag, addSnippetsFlag, threadsFlag, undefined, config, (0, logging_1.getRunnerLogger)(true));
2021-06-03 09:32:44 -07:00
const hasPacks = language in packs;
2021-06-09 13:19:49 -07:00
const statusReportKeys = Object.keys(builtinStatusReport).sort();
if (hasPacks) {
t.deepEqual(statusReportKeys.length, 3, statusReportKeys.toString());
t.deepEqual(statusReportKeys[0], `analyze_builtin_queries_${language}_duration_ms`);
t.deepEqual(statusReportKeys[1], `analyze_custom_queries_${language}_duration_ms`);
t.deepEqual(statusReportKeys[2], `interpret_results_${language}_duration_ms`);
}
else {
t.deepEqual(statusReportKeys[0], `analyze_builtin_queries_${language}_duration_ms`);
t.deepEqual(statusReportKeys[1], `interpret_results_${language}_duration_ms`);
}
2020-09-10 18:02:33 +01:00
config.queries[language] = {
builtin: [],
custom: [
{
queries: ["foo.ql"],
searchPath: "/1",
},
{
queries: ["bar.ql"],
searchPath: "/2",
},
],
2020-09-10 18:02:33 +01:00
};
const customStatusReport = await (0, analyze_1.runQueries)(tmpDir, memoryFlag, addSnippetsFlag, threadsFlag, undefined, config, (0, logging_1.getRunnerLogger)(true));
t.deepEqual(Object.keys(customStatusReport).length, 2);
2020-09-10 18:02:33 +01:00
t.true(`analyze_custom_queries_${language}_duration_ms` in customStatusReport);
2021-06-03 09:32:44 -07:00
const expectedSearchPathsUsed = hasPacks
? [undefined, undefined, "/1", "/2", undefined]
: [undefined, "/1", "/2"];
t.deepEqual(searchPathsUsed, expectedSearchPathsUsed);
t.true(`interpret_results_${language}_duration_ms` in customStatusReport);
2020-09-10 18:02:33 +01:00
}
2021-04-16 14:52:39 -07:00
verifyLineCounts(tmpDir);
2021-06-03 09:32:44 -07:00
verifyQuerySuites(tmpDir);
2020-09-10 18:02:33 +01:00
});
2021-04-16 14:52:39 -07:00
function verifyLineCounts(tmpDir) {
// eslint-disable-next-line github/array-foreach
Object.keys(languages_1.Language).forEach((lang, i) => {
2021-08-26 13:46:22 +01:00
verifyLineCountForFile(path.join(tmpDir, `${lang}.sarif`), i + 1);
2021-04-16 14:52:39 -07:00
});
}
2021-08-26 13:46:22 +01:00
function verifyLineCountForFile(filePath, lineCount) {
2021-04-16 14:52:39 -07:00
const sarif = JSON.parse(fs.readFileSync(filePath, "utf8"));
t.deepEqual(sarif.runs[0].properties.metricResults, [
{
rule: {
index: 0,
toolComponent: {
index: 0,
},
},
value: 123,
baseline: lineCount,
},
]);
2021-06-03 09:32:44 -07:00
// when the rule doesn't exist, it should not be added
2021-08-26 13:46:22 +01:00
t.deepEqual(sarif.runs[1].properties.metricResults, []);
2021-04-16 14:52:39 -07:00
}
2021-06-03 09:32:44 -07:00
function verifyQuerySuites(tmpDir) {
const qlsContent = [
{
query: "foo.ql",
},
];
const qlsContent2 = [
{
query: "bar.ql",
},
];
for (const lang of Object.values(languages_1.Language)) {
t.deepEqual(readContents(`${lang}-queries-builtin.qls`), qlsContent);
t.deepEqual(readContents(`${lang}-queries-custom-0.qls`), qlsContent);
t.deepEqual(readContents(`${lang}-queries-custom-1.qls`), qlsContent2);
}
function readContents(name) {
const x = fs.readFileSync(path.join(tmpDir, "codeql_databases", name), "utf8");
console.log(x);
2021-07-27 22:12:26 +01:00
return yaml.load(fs.readFileSync(path.join(tmpDir, "codeql_databases", name), "utf8"));
2021-06-03 09:32:44 -07:00
}
}
2020-09-10 18:02:33 +01:00
});
//# sourceMappingURL=analyze.test.js.map