mirror of
https://github.com/github/codeql-action.git
synced 2026-10-30 01:27:22 +00:00
93 lines
3.0 KiB
TypeScript
93 lines
3.0 KiB
TypeScript
import fs from "fs";
|
|
|
|
import * as core from "@actions/core";
|
|
|
|
import * as sarif from "../src/sarif";
|
|
|
|
const DIAGNOSTIC_ID =
|
|
process.env["DIAGNOSTIC_ID"] ?? "lang/diagnostics/example";
|
|
const DIAGNOSTIC_NAME = process.env["DIAGNOSTIC_NAME"] ?? "Diagnostic name";
|
|
const EXPECTED_MESSAGE = process.env["EXPECTED_MESSAGE"] ?? "Plaintext message";
|
|
const EXPECTED_LOCATIONS = Number.parseInt(
|
|
process.env["EXPECTED_LOCATIONS"] ?? "1",
|
|
);
|
|
|
|
function checkStatusPageNotification(n: sarif.Notification) {
|
|
const expectedMessage = EXPECTED_MESSAGE.trim();
|
|
if (!n.message.text?.includes(expectedMessage)) {
|
|
if (n.message.text !== undefined) {
|
|
core.setFailed(
|
|
`Expected the status page diagnostic to contain the message '${expectedMessage}', but found '${n.message.text.replaceAll("\n", "\\n")}'.`,
|
|
);
|
|
} else {
|
|
core.setFailed(
|
|
`Expected the status page diagnostic to contain the message '${expectedMessage}', but found nothing.`,
|
|
);
|
|
}
|
|
}
|
|
|
|
const locationCount = n.locations?.length ?? 0;
|
|
if (locationCount !== EXPECTED_LOCATIONS) {
|
|
core.setFailed(
|
|
`Expected the status page diagnostic to have exactly ${EXPECTED_LOCATIONS} location(s), but found ${locationCount}.`,
|
|
);
|
|
}
|
|
}
|
|
|
|
const sarifPath = process.env["SARIF_PATH"];
|
|
|
|
if (sarifPath === undefined) {
|
|
throw new Error("The path to a SARIF file must be set in 'SARIF_PATH'.");
|
|
}
|
|
|
|
const log = JSON.parse(fs.readFileSync(sarifPath, "utf8")) as sarif.Log;
|
|
const run = log.runs[0];
|
|
|
|
if (run.invocations === undefined) {
|
|
throw new Error("run.invocations is undefined");
|
|
}
|
|
|
|
const toolExecutionNotifications =
|
|
run.invocations[0].toolExecutionNotifications;
|
|
|
|
if (toolExecutionNotifications === undefined) {
|
|
throw new Error("toolExecutionNotifications is undefined");
|
|
}
|
|
|
|
const statusPageNotifications = toolExecutionNotifications.filter(
|
|
(n) =>
|
|
n.descriptor?.id === DIAGNOSTIC_ID && n.properties?.visibility?.statusPage,
|
|
);
|
|
if (statusPageNotifications.length !== 1) {
|
|
core.setFailed(
|
|
"Expected exactly one status page reporting descriptor for this diagnostic in the " +
|
|
`'runs[].invocations[].toolExecutionNotifications[]' SARIF property, but found ` +
|
|
`${statusPageNotifications.length}. All notification reporting descriptors: ` +
|
|
`${JSON.stringify(toolExecutionNotifications)}.`,
|
|
);
|
|
}
|
|
checkStatusPageNotification(statusPageNotifications[0]);
|
|
|
|
const notifications = run.tool.driver.notifications;
|
|
|
|
if (notifications === undefined) {
|
|
throw new Error("notifications is undefined");
|
|
}
|
|
|
|
const diagnosticNotification = notifications.filter(
|
|
(n) =>
|
|
n.id === DIAGNOSTIC_ID &&
|
|
n.name === DIAGNOSTIC_ID &&
|
|
n.fullDescription?.text === DIAGNOSTIC_NAME,
|
|
);
|
|
if (diagnosticNotification.length !== 1) {
|
|
core.setFailed(
|
|
"Expected exactly one notification for this diagnostic in the " +
|
|
`'runs[].tool.driver.notifications[]' SARIF property, but found ` +
|
|
`${diagnosticNotification.length}. All notifications: ` +
|
|
`${JSON.stringify(notifications)}.`,
|
|
);
|
|
}
|
|
|
|
core.info("Finished diagnostic export test");
|