diff --git a/lib/analyze-action-env.test.js b/lib/analyze-action-env.test.js index 7cdff3e329..632b16c90d 100644 --- a/lib/analyze-action-env.test.js +++ b/lib/analyze-action-env.test.js @@ -45,6 +45,7 @@ const util = __importStar(require("./util")); .resolves({}); sinon.stub(actionsUtil, "sendStatusReport").resolves(true); sinon.stub(configUtils, "getConfig").resolves({ + gitHubVersion: { type: util.GitHubVariant.DOTCOM }, languages: [], }); const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput"); @@ -53,6 +54,7 @@ const util = __importStar(require("./util")); const optionalInputStub = sinon.stub(actionsUtil, "getOptionalInput"); optionalInputStub.withArgs("cleanup-level").returns("none"); (0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir); + (0, testing_utils_1.mockFeatureFlagApiEndpoint)(200, {}); // When there are no action inputs for RAM and threads, the action uses // environment variables (passed down from the init action) to set RAM and // threads usage. diff --git a/lib/analyze-action-env.test.js.map b/lib/analyze-action-env.test.js.map index 6869b4ff59..93df215e22 100644 --- a/lib/analyze-action-env.test.js.map +++ b/lib/analyze-action-env.test.js.map @@ -1 +1 @@ -{"version":3,"file":"analyze-action-env.test.js","sourceRoot":"","sources":["../src/analyze-action-env.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAuB;AACvB,6CAA+B;AAE/B,4DAA8C;AAC9C,mDAAqC;AACrC,4DAA8C;AAC9C,mDAA+D;AAC/D,6CAA+B;AAE/B,IAAA,0BAAU,EAAC,aAAI,CAAC,CAAC;AAEjB,4EAA4E;AAC5E,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,iCAAiC;AAEjC,IAAA,aAAI,EAAC,8DAA8D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC/E,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,iBAAiB,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,iBAAiB,CAAC;QACrD,KAAK;aACF,IAAI,CAAC,WAAW,EAAE,wBAAwB,CAAC;aAC3C,QAAQ,CAAC,EAAkC,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC;YAC5C,SAAS,EAAE,EAAE;SACmB,CAAC,CAAC;QACpC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACtE,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC1D,iBAAiB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACtE,iBAAiB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAA,gCAAgB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEjC,uEAAuE;QACvE,0EAA0E;QAC1E,iBAAiB;QACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;QAEnC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAElD,uEAAuE;QACvE,oEAAoE;QACpE,4EAA4E;QAC5E,wEAAwE;QACxE,MAAM,aAAa,CAAC,UAAU,CAAC;QAE/B,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QAC/D,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAC7D,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QAC9D,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"analyze-action-env.test.js","sourceRoot":"","sources":["../src/analyze-action-env.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/analyze-action-input.test.js b/lib/analyze-action-input.test.js index f3293a2c0b..9ef8da9b72 100644 --- a/lib/analyze-action-input.test.js +++ b/lib/analyze-action-input.test.js @@ -45,6 +45,7 @@ const util = __importStar(require("./util")); .resolves({}); sinon.stub(actionsUtil, "sendStatusReport").resolves(true); sinon.stub(configUtils, "getConfig").resolves({ + gitHubVersion: { type: util.GitHubVariant.DOTCOM }, languages: [], }); const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput"); @@ -53,6 +54,7 @@ const util = __importStar(require("./util")); const optionalInputStub = sinon.stub(actionsUtil, "getOptionalInput"); optionalInputStub.withArgs("cleanup-level").returns("none"); (0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir); + (0, testing_utils_1.mockFeatureFlagApiEndpoint)(200, {}); process.env["CODEQL_THREADS"] = "1"; process.env["CODEQL_RAM"] = "4992"; // Action inputs have precedence over environment variables. diff --git a/lib/analyze-action-input.test.js.map b/lib/analyze-action-input.test.js.map index b3b01c0e20..f645ab425c 100644 --- a/lib/analyze-action-input.test.js.map +++ b/lib/analyze-action-input.test.js.map @@ -1 +1 @@ -{"version":3,"file":"analyze-action-input.test.js","sourceRoot":"","sources":["../src/analyze-action-input.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"analyze-action-input.test.js","sourceRoot":"","sources":["../src/analyze-action-input.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/analyze-action.js b/lib/analyze-action.js index 010249d859..2ee5b3b412 100644 --- a/lib/analyze-action.js +++ b/lib/analyze-action.js @@ -29,6 +29,7 @@ const analyze_1 = require("./analyze"); const codeql_1 = require("./codeql"); const config_utils_1 = require("./config-utils"); const database_upload_1 = require("./database-upload"); +const feature_flags_1 = require("./feature-flags"); const logging_1 = require("./logging"); const repository_1 = require("./repository"); const upload_lib = __importStar(require("./upload-lib")); @@ -71,6 +72,9 @@ async function run() { const outputDir = actionsUtil.getRequiredInput("output"); const threads = util.getThreadsFlag(actionsUtil.getOptionalInput("threads") || process.env["CODEQL_THREADS"], logger); const memory = util.getMemoryFlag(actionsUtil.getOptionalInput("ram") || process.env["CODEQL_RAM"]); + const repositoryNwo = (0, repository_1.parseRepositoryNwo)(util.getRequiredEnvParam("GITHUB_REPOSITORY")); + const featureFlags = new feature_flags_1.GitHubFeatureFlags(config.gitHubVersion, apiDetails, repositoryNwo, logger); + void featureFlags.preloadFeatureFlags(); await (0, analyze_1.runFinalize)(outputDir, threads, memory, config, logger); if (actionsUtil.getRequiredInput("skip-queries") !== "true") { runStats = await (0, analyze_1.runQueries)(outputDir, memory, util.getAddSnippetsFlag(actionsUtil.getRequiredInput("add-snippets")), threads, actionsUtil.getOptionalInput("category"), config, logger); @@ -110,8 +114,8 @@ async function run() { else { logger.info("Not uploading results"); } - const repositoryNwo = (0, repository_1.parseRepositoryNwo)(util.getRequiredEnvParam("GITHUB_REPOSITORY")); - await (0, database_upload_1.uploadDatabases)(repositoryNwo, config, apiDetails, logger); // Possibly upload the database bundles for remote queries + // Possibly upload the database bundles for remote queries + await (0, database_upload_1.uploadDatabases)(repositoryNwo, config, featureFlags, apiDetails, logger); if (uploadResult !== undefined && actionsUtil.getRequiredInput("wait-for-processing") === "true") { await upload_lib.waitForProcessing((0, repository_1.parseRepositoryNwo)(util.getRequiredEnvParam("GITHUB_REPOSITORY")), uploadResult.sarifID, apiDetails, (0, logging_1.getActionsLogger)()); diff --git a/lib/analyze-action.js.map b/lib/analyze-action.js.map index fec7ddc759..7ac033e50b 100644 --- a/lib/analyze-action.js.map +++ b/lib/analyze-action.js.map @@ -1 +1 @@ -{"version":3,"file":"analyze-action.js","sourceRoot":"","sources":["../src/analyze-action.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"analyze-action.js","sourceRoot":"","sources":["../src/analyze-action.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/database-upload.js b/lib/database-upload.js index b85e51c574..28f1ec5910 100644 --- a/lib/database-upload.js +++ b/lib/database-upload.js @@ -24,9 +24,10 @@ const fs = __importStar(require("fs")); const actionsUtil = __importStar(require("./actions-util")); const api_client_1 = require("./api-client"); const codeql_1 = require("./codeql"); +const feature_flags_1 = require("./feature-flags"); const util = __importStar(require("./util")); const util_1 = require("./util"); -async function uploadDatabases(repositoryNwo, config, apiDetails, logger) { +async function uploadDatabases(repositoryNwo, config, featureFlags, apiDetails, logger) { if (actionsUtil.getRequiredInput("upload-database") !== "true") { logger.debug("Database upload disabled in workflow. Skipping upload."); return; @@ -41,26 +42,13 @@ async function uploadDatabases(repositoryNwo, config, apiDetails, logger) { logger.debug("Not analyzing default branch. Skipping upload."); return; } - const client = (0, api_client_1.getApiClient)(apiDetails); - let useUploadDomain; - try { - const response = await client.request("GET /repos/:owner/:repo/code-scanning/codeql/databases", { - owner: repositoryNwo.owner, - repo: repositoryNwo.repo, - }); - useUploadDomain = response.data["uploads_domain_enabled"]; - } - catch (e) { - if (util.isHTTPError(e) && e.status === 404) { - logger.debug("Repository is not opted in to database uploads. Skipping upload."); - } - else { - console.log(e); - logger.info(`Skipping database upload due to unknown error: ${e}`); - } + if (!(await featureFlags.getValue(feature_flags_1.FeatureFlag.DatabaseUploadsEnabled))) { + logger.debug("Repository is not opted in to database uploads. Skipping upload."); return; } + const client = (0, api_client_1.getApiClient)(apiDetails); const codeql = await (0, codeql_1.getCodeQL)(config.codeQLCmd); + const useUploadDomain = await featureFlags.getValue(feature_flags_1.FeatureFlag.UploadsDomainEnabled); for (const language of config.languages) { // Upload the database bundle. // Although we are uploading arbitrary file contents to the API, it's worth diff --git a/lib/database-upload.js.map b/lib/database-upload.js.map index 220c258edb..dde3afaaed 100644 --- a/lib/database-upload.js.map +++ b/lib/database-upload.js.map @@ -1 +1 @@ -{"version":3,"file":"database-upload.js","sourceRoot":"","sources":["../src/database-upload.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"database-upload.js","sourceRoot":"","sources":["../src/database-upload.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AAEzB,4DAA8C;AAC9C,6CAA8D;AAC9D,qCAAqC;AAErC,mDAA4D;AAG5D,6CAA+B;AAC/B,iCAAkC;AAE3B,KAAK,UAAU,eAAe,CACnC,aAA4B,EAC5B,MAAc,EACd,YAA0B,EAC1B,UAA4B,EAC5B,MAAc;IAEd,IAAI,WAAW,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,MAAM,EAAE;QAC9D,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACvE,OAAO;KACR;IAED,iDAAiD;IACjD,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;QAC3D,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACjE,OAAO;KACR;IAED,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,wBAAwB,EAAE,CAAC,EAAE;QACnD,4EAA4E;QAC5E,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO;KACR;IAED,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,2BAAW,CAAC,sBAAsB,CAAC,CAAC,EAAE;QACtE,MAAM,CAAC,KAAK,CACV,kEAAkE,CACnE,CAAC;QACF,OAAO;KACR;IAED,MAAM,MAAM,GAAG,IAAA,yBAAY,EAAC,UAAU,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,IAAA,kBAAS,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,QAAQ,CACjD,2BAAW,CAAC,oBAAoB,CACjC,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE;QACvC,8BAA8B;QAC9B,2EAA2E;QAC3E,8EAA8E;QAC9E,wEAAwE;QACxE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,IAAA,eAAQ,EAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1E,IAAI;YACF,IAAI,eAAe,EAAE;gBACnB,MAAM,MAAM,CAAC,OAAO,CAClB,wGAAwG,EACxG;oBACE,KAAK,EAAE,aAAa,CAAC,KAAK;oBAC1B,IAAI,EAAE,aAAa,CAAC,IAAI;oBACxB,QAAQ;oBACR,IAAI,EAAE,GAAG,QAAQ,WAAW;oBAC5B,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE;wBACP,aAAa,EAAE,SAAS,UAAU,CAAC,IAAI,EAAE;qBAC1C;iBACF,CACF,CAAC;aACH;iBAAM;gBACL,MAAM,MAAM,CAAC,OAAO,CAClB,kEAAkE,EAClE;oBACE,KAAK,EAAE,aAAa,CAAC,KAAK;oBAC1B,IAAI,EAAE,aAAa,CAAC,IAAI;oBACxB,QAAQ;oBACR,IAAI,EAAE,OAAO;iBACd,CACF,CAAC;aACH;YACD,MAAM,CAAC,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;SAChE;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,4CAA4C;YAC5C,MAAM,CAAC,OAAO,CAAC,iCAAiC,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC;SACnE;KACF;AACH,CAAC;AA5ED,0CA4EC"} \ No newline at end of file diff --git a/lib/database-upload.test.js b/lib/database-upload.test.js index 458a1199af..7dcede53c4 100644 --- a/lib/database-upload.test.js +++ b/lib/database-upload.test.js @@ -30,6 +30,7 @@ const actionsUtil = __importStar(require("./actions-util")); const apiClient = __importStar(require("./api-client")); const codeql_1 = require("./codeql"); const database_upload_1 = require("./database-upload"); +const feature_flags_1 = require("./feature-flags"); const languages_1 = require("./languages"); const testing_utils_1 = require("./testing-utils"); const util_1 = require("./util"); @@ -37,6 +38,10 @@ const util_1 = require("./util"); ava_1.default.beforeEach(() => { (0, util_1.initializeEnvironment)(util_1.Mode.actions, "1.2.3"); }); +const uploadToUploadsDomainFlags = (0, feature_flags_1.createFeatureFlags)([ + feature_flags_1.FeatureFlag.DatabaseUploadsEnabled, + feature_flags_1.FeatureFlag.UploadsDomainEnabled, +]); const testRepoName = { owner: "github", repo: "example" }; const testApiDetails = { auth: "1234", @@ -58,58 +63,19 @@ function getTestConfig(tmpDir) { debugMode: false, }; } -function getRecordingLogger(messages) { - return { - debug: (message) => { - messages.push({ type: "debug", message }); - console.debug(message); - }, - info: (message) => { - messages.push({ type: "info", message }); - console.info(message); - }, - warning: (message) => { - messages.push({ type: "warning", message }); - console.warn(message); - }, - error: (message) => { - messages.push({ type: "error", message }); - console.error(message); - }, - isDebug: () => true, - startGroup: () => undefined, - endGroup: () => undefined, - }; -} -function mockHttpRequests(optInStatusCode, useUploadDomain, databaseUploadStatusCode) { +async function mockHttpRequests(featureFlags, databaseUploadStatusCode) { // Passing an auth token is required, so we just use a dummy value const client = github.getOctokit("123"); const requestSpy = sinon.stub(client, "request"); - const optInSpy = requestSpy.withArgs("GET /repos/:owner/:repo/code-scanning/codeql/databases"); - if (optInStatusCode < 300) { - optInSpy.resolves({ - status: optInStatusCode, - data: { - useUploadDomain, - }, - headers: {}, - url: "GET /repos/:owner/:repo/code-scanning/codeql/databases", - }); + const url = (await featureFlags.getValue(feature_flags_1.FeatureFlag.UploadsDomainEnabled)) + ? "POST https://uploads.github.com/repos/:owner/:repo/code-scanning/codeql/databases/:language?name=:name" + : "PUT /repos/:owner/:repo/code-scanning/codeql/databases/:language"; + const databaseUploadSpy = requestSpy.withArgs(url); + if (databaseUploadStatusCode < 300) { + databaseUploadSpy.resolves(undefined); } else { - optInSpy.throws(new util_1.HTTPError("some error message", optInStatusCode)); - } - if (databaseUploadStatusCode !== undefined) { - const url = useUploadDomain - ? "POST https://uploads.github.com/repos/:owner/:repo/code-scanning/codeql/databases/:language?name=:name" - : "PUT /repos/:owner/:repo/code-scanning/codeql/databases/:language"; - const databaseUploadSpy = requestSpy.withArgs(url); - if (databaseUploadStatusCode < 300) { - databaseUploadSpy.resolves(undefined); - } - else { - databaseUploadSpy.throws(new util_1.HTTPError("some error message", databaseUploadStatusCode)); - } + databaseUploadSpy.throws(new util_1.HTTPError("some error message", databaseUploadStatusCode)); } sinon.stub(apiClient, "getApiClient").value(() => client); } @@ -122,7 +88,7 @@ function mockHttpRequests(optInStatusCode, useUploadDomain, databaseUploadStatus .returns("false"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); const loggedMessages = []; - await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), testApiDetails, getRecordingLogger(loggedMessages)); + await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), uploadToUploadsDomainFlags, testApiDetails, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); t.assert(loggedMessages.find((v) => v.type === "debug" && v.message === "Database upload disabled in workflow. Skipping upload.") !== undefined); }); @@ -138,7 +104,7 @@ function mockHttpRequests(optInStatusCode, useUploadDomain, databaseUploadStatus const config = getTestConfig(tmpDir); config.gitHubVersion = { type: util_1.GitHubVariant.GHES, version: "3.0" }; const loggedMessages = []; - await (0, database_upload_1.uploadDatabases)(testRepoName, config, testApiDetails, getRecordingLogger(loggedMessages)); + await (0, database_upload_1.uploadDatabases)(testRepoName, config, (0, feature_flags_1.createFeatureFlags)([]), testApiDetails, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); t.assert(loggedMessages.find((v) => v.type === "debug" && v.message === "Not running against github.com. Skipping upload.") !== undefined); }); @@ -154,7 +120,7 @@ function mockHttpRequests(optInStatusCode, useUploadDomain, databaseUploadStatus const config = getTestConfig(tmpDir); config.gitHubVersion = { type: util_1.GitHubVariant.GHAE }; const loggedMessages = []; - await (0, database_upload_1.uploadDatabases)(testRepoName, config, testApiDetails, getRecordingLogger(loggedMessages)); + await (0, database_upload_1.uploadDatabases)(testRepoName, config, (0, feature_flags_1.createFeatureFlags)([]), testApiDetails, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); t.assert(loggedMessages.find((v) => v.type === "debug" && v.message === "Not running against github.com. Skipping upload.") !== undefined); }); @@ -168,12 +134,12 @@ function mockHttpRequests(optInStatusCode, useUploadDomain, databaseUploadStatus .returns("true"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(false); const loggedMessages = []; - await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), testApiDetails, getRecordingLogger(loggedMessages)); + await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), uploadToUploadsDomainFlags, testApiDetails, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); t.assert(loggedMessages.find((v) => v.type === "debug" && v.message === "Not analyzing default branch. Skipping upload.") !== undefined); }); }); -(0, ava_1.default)("Abort database upload if opt-in request returns 404", async (t) => { +(0, ava_1.default)("Abort database upload if feature flag is disabled", async (t) => { await (0, util_1.withTmpDir)(async (tmpDir) => { (0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir); sinon @@ -181,40 +147,18 @@ function mockHttpRequests(optInStatusCode, useUploadDomain, databaseUploadStatus .withArgs("upload-database") .returns("true"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - mockHttpRequests(404); (0, codeql_1.setCodeQL)({ async databaseBundle() { return; }, }); const loggedMessages = []; - await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), testApiDetails, getRecordingLogger(loggedMessages)); + await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), (0, feature_flags_1.createFeatureFlags)([feature_flags_1.FeatureFlag.UploadsDomainEnabled]), testApiDetails, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); t.assert(loggedMessages.find((v) => v.type === "debug" && v.message === "Repository is not opted in to database uploads. Skipping upload.") !== undefined); }); }); -(0, ava_1.default)("Abort database upload if opt-in request fails with something other than 404", async (t) => { - await (0, util_1.withTmpDir)(async (tmpDir) => { - (0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir); - sinon - .stub(actionsUtil, "getRequiredInput") - .withArgs("upload-database") - .returns("true"); - sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - mockHttpRequests(500); - (0, codeql_1.setCodeQL)({ - async databaseBundle() { - return; - }, - }); - const loggedMessages = []; - await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), testApiDetails, getRecordingLogger(loggedMessages)); - t.assert(loggedMessages.find((v) => v.type === "info" && - v.message === - "Skipping database upload due to unknown error: Error: some error message") !== undefined); - }); -}); (0, ava_1.default)("Don't crash if uploading a database fails", async (t) => { await (0, util_1.withTmpDir)(async (tmpDir) => { (0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir); @@ -223,14 +167,17 @@ function mockHttpRequests(optInStatusCode, useUploadDomain, databaseUploadStatus .withArgs("upload-database") .returns("true"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - mockHttpRequests(200, false, 500); + const featureFlags = (0, feature_flags_1.createFeatureFlags)([ + feature_flags_1.FeatureFlag.DatabaseUploadsEnabled, + ]); + await mockHttpRequests(featureFlags, 500); (0, codeql_1.setCodeQL)({ async databaseBundle(_, outputFilePath) { fs.writeFileSync(outputFilePath, ""); }, }); const loggedMessages = []; - await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), testApiDetails, getRecordingLogger(loggedMessages)); + await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), featureFlags, testApiDetails, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); t.assert(loggedMessages.find((v) => v.type === "warning" && v.message === "Failed to upload database for javascript: Error: some error message") !== undefined); @@ -244,14 +191,14 @@ function mockHttpRequests(optInStatusCode, useUploadDomain, databaseUploadStatus .withArgs("upload-database") .returns("true"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - mockHttpRequests(200, false, 201); + await mockHttpRequests(uploadToUploadsDomainFlags, 201); (0, codeql_1.setCodeQL)({ async databaseBundle(_, outputFilePath) { fs.writeFileSync(outputFilePath, ""); }, }); const loggedMessages = []; - await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), testApiDetails, getRecordingLogger(loggedMessages)); + await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), uploadToUploadsDomainFlags, testApiDetails, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); t.assert(loggedMessages.find((v) => v.type === "debug" && v.message === "Successfully uploaded database for javascript") !== undefined); }); @@ -264,14 +211,14 @@ function mockHttpRequests(optInStatusCode, useUploadDomain, databaseUploadStatus .withArgs("upload-database") .returns("true"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - mockHttpRequests(200, true, 201); + await mockHttpRequests(uploadToUploadsDomainFlags, 201); (0, codeql_1.setCodeQL)({ async databaseBundle(_, outputFilePath) { fs.writeFileSync(outputFilePath, ""); }, }); const loggedMessages = []; - await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), testApiDetails, getRecordingLogger(loggedMessages)); + await (0, database_upload_1.uploadDatabases)(testRepoName, getTestConfig(tmpDir), uploadToUploadsDomainFlags, testApiDetails, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); t.assert(loggedMessages.find((v) => v.type === "debug" && v.message === "Successfully uploaded database for javascript") !== undefined); }); diff --git a/lib/database-upload.test.js.map b/lib/database-upload.test.js.map index 6b53e069a4..475b42afbd 100644 --- a/lib/database-upload.test.js.map +++ b/lib/database-upload.test.js.map @@ -1 +1 @@ -{"version":3,"file":"database-upload.test.js","sourceRoot":"","sources":["../src/database-upload.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"database-upload.test.js","sourceRoot":"","sources":["../src/database-upload.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/feature-flags.js b/lib/feature-flags.js new file mode 100644 index 0000000000..84e7145462 --- /dev/null +++ b/lib/feature-flags.js @@ -0,0 +1,91 @@ +"use strict"; +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; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createFeatureFlags = exports.GitHubFeatureFlags = exports.FeatureFlag = void 0; +const api_client_1 = require("./api-client"); +const util = __importStar(require("./util")); +var FeatureFlag; +(function (FeatureFlag) { + FeatureFlag["DatabaseUploadsEnabled"] = "database_uploads_enabled"; + FeatureFlag["MlPoweredQueriesEnabled"] = "ml_powered_queries_enabled"; + FeatureFlag["UploadsDomainEnabled"] = "uploads_domain_enabled"; +})(FeatureFlag = exports.FeatureFlag || (exports.FeatureFlag = {})); +class GitHubFeatureFlags { + constructor(gitHubVersion, apiDetails, repositoryNwo, logger) { + this.gitHubVersion = gitHubVersion; + this.apiDetails = apiDetails; + this.repositoryNwo = repositoryNwo; + this.logger = logger; + } + async getValue(flag) { + const response = (await this.getApiResponse())[flag]; + if (response === undefined) { + this.logger.debug(`Feature flag '${flag}' undefined in API response, considering it disabled.`); + return false; + } + return response; + } + async preloadFeatureFlags() { + await this.getApiResponse(); + } + async getApiResponse() { + const loadApiResponse = async () => { + // Do nothing when not running against github.com + if (this.gitHubVersion.type !== util.GitHubVariant.DOTCOM) { + this.logger.debug("Not running against github.com. Disabling all feature flags."); + return {}; + } + const client = (0, api_client_1.getApiClient)(this.apiDetails); + try { + const response = await client.request("GET /repos/:owner/:repo/code-scanning/codeql-action/features", { + owner: this.repositoryNwo.owner, + repo: this.repositoryNwo.repo, + }); + return response.data; + } + catch (e) { + // Some feature flags, such as `ml_powered_queries_enabled` affect the produced alerts. + // Considering these feature flags disabled in the event of a transient error could + // therefore lead to alert churn. As a result, we crash if we cannot determine the value of + // the feature flags. + throw new Error(`Encountered an error while trying to load feature flags: ${e}`); + } + }; + const apiResponse = this.cachedApiResponse || (await loadApiResponse()); + this.cachedApiResponse = apiResponse; + return apiResponse; + } +} +exports.GitHubFeatureFlags = GitHubFeatureFlags; +/** + * Create a feature flags instance with the specified set of enabled flags. + * + * This should be only used within tests. + */ +function createFeatureFlags(enabledFlags) { + return { + getValue: async (flag) => { + return enabledFlags.includes(flag); + }, + }; +} +exports.createFeatureFlags = createFeatureFlags; +//# sourceMappingURL=feature-flags.js.map \ No newline at end of file diff --git a/lib/feature-flags.js.map b/lib/feature-flags.js.map new file mode 100644 index 0000000000..c31c310064 --- /dev/null +++ b/lib/feature-flags.js.map @@ -0,0 +1 @@ +{"version":3,"file":"feature-flags.js","sourceRoot":"","sources":["../src/feature-flags.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA8D;AAG9D,6CAA+B;AAM/B,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,kEAAmD,CAAA;IACnD,qEAAsD,CAAA;IACtD,8DAA+C,CAAA;AACjD,CAAC,EAJW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAItB;AAUD,MAAa,kBAAkB;IAG7B,YACU,aAAiC,EACjC,UAA4B,EAC5B,aAA4B,EAC5B,MAAc;QAHd,kBAAa,GAAb,aAAa,CAAoB;QACjC,eAAU,GAAV,UAAU,CAAkB;QAC5B,kBAAa,GAAb,aAAa,CAAe;QAC5B,WAAM,GAAN,MAAM,CAAQ;IACrB,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,IAAiB;QAC9B,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,iBAAiB,IAAI,uDAAuD,CAC7E,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;YACjC,iDAAiD;YACjD,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;gBACzD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8DAA8D,CAC/D,CAAC;gBACF,OAAO,EAAE,CAAC;aACX;YACD,MAAM,MAAM,GAAG,IAAA,yBAAY,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,8DAA8D,EAC9D;oBACE,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK;oBAC/B,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI;iBAC9B,CACF,CAAC;gBACF,OAAO,QAAQ,CAAC,IAAI,CAAC;aACtB;YAAC,OAAO,CAAC,EAAE;gBACV,uFAAuF;gBACvF,mFAAmF;gBACnF,2FAA2F;gBAC3F,qBAAqB;gBACrB,MAAM,IAAI,KAAK,CACb,4DAA4D,CAAC,EAAE,CAChE,CAAC;aACH;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC;QACrC,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AA3DD,gDA2DC;AAED;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,YAA2B;IAC5D,OAAO;QACL,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,OAAO,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;AACJ,CAAC;AAND,gDAMC"} \ No newline at end of file diff --git a/lib/feature-flags.test.js b/lib/feature-flags.test.js new file mode 100644 index 0000000000..cae14f83fa --- /dev/null +++ b/lib/feature-flags.test.js @@ -0,0 +1,98 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const ava_1 = __importDefault(require("ava")); +const feature_flags_1 = require("./feature-flags"); +const logging_1 = require("./logging"); +const repository_1 = require("./repository"); +const testing_utils_1 = require("./testing-utils"); +const util_1 = require("./util"); +(0, testing_utils_1.setupTests)(ava_1.default); +ava_1.default.beforeEach(() => { + (0, util_1.initializeEnvironment)(util_1.Mode.actions, "1.2.3"); +}); +const testApiDetails = { + auth: "1234", + url: "https://github.com", +}; +const testRepositoryNwo = (0, repository_1.parseRepositoryNwo)("github/example"); +const ALL_FEATURE_FLAGS_DISABLED_VARIANTS = [ + { + description: "GHES", + gitHubVersion: { type: util_1.GitHubVariant.GHES, version: "3.0.0" }, + }, + { description: "GHAE", gitHubVersion: { type: util_1.GitHubVariant.GHAE } }, +]; +for (const variant of ALL_FEATURE_FLAGS_DISABLED_VARIANTS) { + (0, ava_1.default)(`All feature flags are disabled if running against ${variant.description}`, async (t) => { + await (0, util_1.withTmpDir)(async (tmpDir) => { + (0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir); + const loggedMessages = []; + const featureFlags = new feature_flags_1.GitHubFeatureFlags(variant.gitHubVersion, testApiDetails, testRepositoryNwo, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); + for (const flag of Object.values(feature_flags_1.FeatureFlag)) { + t.assert((await featureFlags.getValue(flag)) === false); + } + t.assert(loggedMessages.find((v) => v.type === "debug" && + v.message === + "Not running against github.com. Disabling all feature flags.") !== undefined); + }); + }); +} +(0, ava_1.default)("Feature flags are disabled if they're not returned in API response", async (t) => { + await (0, util_1.withTmpDir)(async (tmpDir) => { + (0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir); + const loggedMessages = []; + const featureFlags = new feature_flags_1.GitHubFeatureFlags({ type: util_1.GitHubVariant.DOTCOM }, testApiDetails, testRepositoryNwo, (0, testing_utils_1.getRecordingLogger)(loggedMessages)); + (0, testing_utils_1.mockFeatureFlagApiEndpoint)(200, {}); + for (const flag of Object.values(feature_flags_1.FeatureFlag)) { + t.assert((await featureFlags.getValue(flag)) === false); + } + for (const featureFlag of [ + "database_uploads_enabled", + "ml_powered_queries_enabled", + "uploads_domain_enabled", + ]) { + t.assert(loggedMessages.find((v) => v.type === "debug" && + v.message === + `Feature flag '${featureFlag}' undefined in API response, considering it disabled.`) !== undefined); + } + }); +}); +(0, ava_1.default)("Feature flags exception is propagated if the API request errors", async (t) => { + await (0, util_1.withTmpDir)(async (tmpDir) => { + (0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir); + const featureFlags = new feature_flags_1.GitHubFeatureFlags({ type: util_1.GitHubVariant.DOTCOM }, testApiDetails, testRepositoryNwo, (0, logging_1.getRunnerLogger)(true)); + (0, testing_utils_1.mockFeatureFlagApiEndpoint)(500, {}); + await t.throwsAsync(async () => featureFlags.preloadFeatureFlags(), { + message: "Encountered an error while trying to load feature flags: Error: some error message", + }); + }); +}); +const FEATURE_FLAGS = [ + "database_uploads_enabled", + "ml_powered_queries_enabled", + "uploads_domain_enabled", +]; +for (const featureFlag of FEATURE_FLAGS) { + (0, ava_1.default)(`Feature flag '${featureFlag}' is enabled if enabled in the API response`, async (t) => { + await (0, util_1.withTmpDir)(async (tmpDir) => { + (0, testing_utils_1.setupActionsVars)(tmpDir, tmpDir); + const featureFlags = new feature_flags_1.GitHubFeatureFlags({ type: util_1.GitHubVariant.DOTCOM }, testApiDetails, testRepositoryNwo, (0, logging_1.getRunnerLogger)(true)); + const expectedFeatureFlags = {}; + for (const f of FEATURE_FLAGS) { + expectedFeatureFlags[f] = false; + } + expectedFeatureFlags[featureFlag] = true; + (0, testing_utils_1.mockFeatureFlagApiEndpoint)(200, expectedFeatureFlags); + const actualFeatureFlags = { + database_uploads_enabled: await featureFlags.getValue(feature_flags_1.FeatureFlag.DatabaseUploadsEnabled), + ml_powered_queries_enabled: await featureFlags.getValue(feature_flags_1.FeatureFlag.MlPoweredQueriesEnabled), + uploads_domain_enabled: await featureFlags.getValue(feature_flags_1.FeatureFlag.UploadsDomainEnabled), + }; + t.deepEqual(actualFeatureFlags, expectedFeatureFlags); + }); + }); +} +//# sourceMappingURL=feature-flags.test.js.map \ No newline at end of file diff --git a/lib/feature-flags.test.js.map b/lib/feature-flags.test.js.map new file mode 100644 index 0000000000..b6c744b008 --- /dev/null +++ b/lib/feature-flags.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"feature-flags.test.js","sourceRoot":"","sources":["../src/feature-flags.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/testing-utils.js b/lib/testing-utils.js index 7be20be048..8997af1aef 100644 --- a/lib/testing-utils.js +++ b/lib/testing-utils.js @@ -19,9 +19,12 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.setupActionsVars = exports.setupTests = void 0; +exports.mockFeatureFlagApiEndpoint = exports.getRecordingLogger = exports.setupActionsVars = exports.setupTests = void 0; +const github = __importStar(require("@actions/github")); const sinon = __importStar(require("sinon")); +const apiClient = __importStar(require("./api-client")); const CodeQL = __importStar(require("./codeql")); +const util_1 = require("./util"); function wrapOutput(context) { // Function signature taken from Socket.write. // Note there are two overloads: @@ -89,4 +92,48 @@ function setupActionsVars(tempDir, toolsDir) { process.env["RUNNER_TOOL_CACHE"] = toolsDir; } exports.setupActionsVars = setupActionsVars; +function getRecordingLogger(messages) { + return { + debug: (message) => { + messages.push({ type: "debug", message }); + console.debug(message); + }, + info: (message) => { + messages.push({ type: "info", message }); + console.info(message); + }, + warning: (message) => { + messages.push({ type: "warning", message }); + console.warn(message); + }, + error: (message) => { + messages.push({ type: "error", message }); + console.error(message); + }, + isDebug: () => true, + startGroup: () => undefined, + endGroup: () => undefined, + }; +} +exports.getRecordingLogger = getRecordingLogger; +/** Mock the HTTP request to the feature flags enablement API endpoint. */ +function mockFeatureFlagApiEndpoint(responseStatusCode, response) { + // Passing an auth token is required, so we just use a dummy value + const client = github.getOctokit("123"); + const requestSpy = sinon.stub(client, "request"); + const optInSpy = requestSpy.withArgs("GET /repos/:owner/:repo/code-scanning/codeql-action/features"); + if (responseStatusCode < 300) { + optInSpy.resolves({ + status: responseStatusCode, + data: response, + headers: {}, + url: "GET /repos/:owner/:repo/code-scanning/codeql-action/features", + }); + } + else { + optInSpy.throws(new util_1.HTTPError("some error message", responseStatusCode)); + } + sinon.stub(apiClient, "getApiClient").value(() => client); +} +exports.mockFeatureFlagApiEndpoint = mockFeatureFlagApiEndpoint; //# sourceMappingURL=testing-utils.js.map \ No newline at end of file diff --git a/lib/testing-utils.js.map b/lib/testing-utils.js.map index 208fd6fe8e..3d68152948 100644 --- a/lib/testing-utils.js.map +++ b/lib/testing-utils.js.map @@ -1 +1 @@ -{"version":3,"file":"testing-utils.js","sourceRoot":"","sources":["../src/testing-utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"testing-utils.js","sourceRoot":"","sources":["../src/testing-utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/analyze-action-env.test.ts b/src/analyze-action-env.test.ts index 01d0aa251e..7ac0cc4ac1 100644 --- a/src/analyze-action-env.test.ts +++ b/src/analyze-action-env.test.ts @@ -4,7 +4,11 @@ import * as sinon from "sinon"; import * as actionsUtil from "./actions-util"; import * as analyze from "./analyze"; import * as configUtils from "./config-utils"; -import { setupTests, setupActionsVars } from "./testing-utils"; +import { + setupTests, + setupActionsVars, + mockFeatureFlagApiEndpoint, +} from "./testing-utils"; import * as util from "./util"; setupTests(test); @@ -25,6 +29,7 @@ test("analyze action with RAM & threads from environment variables", async (t) = .resolves({} as actionsUtil.StatusReportBase); sinon.stub(actionsUtil, "sendStatusReport").resolves(true); sinon.stub(configUtils, "getConfig").resolves({ + gitHubVersion: { type: util.GitHubVariant.DOTCOM }, languages: [], } as unknown as configUtils.Config); const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput"); @@ -33,6 +38,7 @@ test("analyze action with RAM & threads from environment variables", async (t) = const optionalInputStub = sinon.stub(actionsUtil, "getOptionalInput"); optionalInputStub.withArgs("cleanup-level").returns("none"); setupActionsVars(tmpDir, tmpDir); + mockFeatureFlagApiEndpoint(200, {}); // When there are no action inputs for RAM and threads, the action uses // environment variables (passed down from the init action) to set RAM and diff --git a/src/analyze-action-input.test.ts b/src/analyze-action-input.test.ts index 9455f76a0b..638ca99962 100644 --- a/src/analyze-action-input.test.ts +++ b/src/analyze-action-input.test.ts @@ -4,7 +4,11 @@ import * as sinon from "sinon"; import * as actionsUtil from "./actions-util"; import * as analyze from "./analyze"; import * as configUtils from "./config-utils"; -import { setupTests, setupActionsVars } from "./testing-utils"; +import { + setupTests, + setupActionsVars, + mockFeatureFlagApiEndpoint, +} from "./testing-utils"; import * as util from "./util"; setupTests(test); @@ -25,6 +29,7 @@ test("analyze action with RAM & threads from action inputs", async (t) => { .resolves({} as actionsUtil.StatusReportBase); sinon.stub(actionsUtil, "sendStatusReport").resolves(true); sinon.stub(configUtils, "getConfig").resolves({ + gitHubVersion: { type: util.GitHubVariant.DOTCOM }, languages: [], } as unknown as configUtils.Config); const requiredInputStub = sinon.stub(actionsUtil, "getRequiredInput"); @@ -33,6 +38,7 @@ test("analyze action with RAM & threads from action inputs", async (t) => { const optionalInputStub = sinon.stub(actionsUtil, "getOptionalInput"); optionalInputStub.withArgs("cleanup-level").returns("none"); setupActionsVars(tmpDir, tmpDir); + mockFeatureFlagApiEndpoint(200, {}); process.env["CODEQL_THREADS"] = "1"; process.env["CODEQL_RAM"] = "4992"; diff --git a/src/analyze-action.ts b/src/analyze-action.ts index 25d103068c..07b9200779 100644 --- a/src/analyze-action.ts +++ b/src/analyze-action.ts @@ -15,6 +15,7 @@ import { import { CODEQL_VERSION_NEW_TRACING, getCodeQL } from "./codeql"; import { Config, getConfig } from "./config-utils"; import { uploadDatabases } from "./database-upload"; +import { GitHubFeatureFlags } from "./feature-flags"; import { getActionsLogger } from "./logging"; import { parseRepositoryNwo } from "./repository"; import * as upload_lib from "./upload-lib"; @@ -99,6 +100,19 @@ async function run() { const memory = util.getMemoryFlag( actionsUtil.getOptionalInput("ram") || process.env["CODEQL_RAM"] ); + + const repositoryNwo = parseRepositoryNwo( + util.getRequiredEnvParam("GITHUB_REPOSITORY") + ); + + const featureFlags = new GitHubFeatureFlags( + config.gitHubVersion, + apiDetails, + repositoryNwo, + logger + ); + void featureFlags.preloadFeatureFlags(); + await runFinalize(outputDir, threads, memory, config, logger); if (actionsUtil.getRequiredInput("skip-queries") !== "true") { runStats = await runQueries( @@ -173,10 +187,14 @@ async function run() { logger.info("Not uploading results"); } - const repositoryNwo = parseRepositoryNwo( - util.getRequiredEnvParam("GITHUB_REPOSITORY") + // Possibly upload the database bundles for remote queries + await uploadDatabases( + repositoryNwo, + config, + featureFlags, + apiDetails, + logger ); - await uploadDatabases(repositoryNwo, config, apiDetails, logger); // Possibly upload the database bundles for remote queries if ( uploadResult !== undefined && diff --git a/src/database-upload.test.ts b/src/database-upload.test.ts index 16548f2823..05255450cb 100644 --- a/src/database-upload.test.ts +++ b/src/database-upload.test.ts @@ -10,10 +10,15 @@ import * as apiClient from "./api-client"; import { setCodeQL } from "./codeql"; import { Config } from "./config-utils"; import { uploadDatabases } from "./database-upload"; +import { createFeatureFlags, FeatureFlag, FeatureFlags } from "./feature-flags"; import { Language } from "./languages"; -import { Logger } from "./logging"; import { RepositoryNwo } from "./repository"; -import { setupActionsVars, setupTests } from "./testing-utils"; +import { + getRecordingLogger, + LoggedMessage, + setupActionsVars, + setupTests, +} from "./testing-utils"; import { GitHubVariant, HTTPError, @@ -28,6 +33,11 @@ test.beforeEach(() => { initializeEnvironment(Mode.actions, "1.2.3"); }); +const uploadToUploadsDomainFlags = createFeatureFlags([ + FeatureFlag.DatabaseUploadsEnabled, + FeatureFlag.UploadsDomainEnabled, +]); + const testRepoName: RepositoryNwo = { owner: "github", repo: "example" }; const testApiDetails: GitHubApiDetails = { auth: "1234", @@ -51,73 +61,25 @@ function getTestConfig(tmpDir: string): Config { }; } -interface LoggedMessage { - type: "debug" | "info" | "warning" | "error"; - message: string | Error; -} - -function getRecordingLogger(messages: LoggedMessage[]): Logger { - return { - debug: (message: string) => { - messages.push({ type: "debug", message }); - console.debug(message); - }, - info: (message: string) => { - messages.push({ type: "info", message }); - console.info(message); - }, - warning: (message: string | Error) => { - messages.push({ type: "warning", message }); - console.warn(message); - }, - error: (message: string | Error) => { - messages.push({ type: "error", message }); - console.error(message); - }, - isDebug: () => true, - startGroup: () => undefined, - endGroup: () => undefined, - }; -} - -function mockHttpRequests( - optInStatusCode: number, - useUploadDomain?: boolean, - databaseUploadStatusCode?: number +async function mockHttpRequests( + featureFlags: FeatureFlags, + databaseUploadStatusCode: number ) { // Passing an auth token is required, so we just use a dummy value const client = github.getOctokit("123"); const requestSpy = sinon.stub(client, "request"); - const optInSpy = requestSpy.withArgs( - "GET /repos/:owner/:repo/code-scanning/codeql/databases" - ); - if (optInStatusCode < 300) { - optInSpy.resolves({ - status: optInStatusCode, - data: { - useUploadDomain, - }, - headers: {}, - url: "GET /repos/:owner/:repo/code-scanning/codeql/databases", - }); + const url = (await featureFlags.getValue(FeatureFlag.UploadsDomainEnabled)) + ? "POST https://uploads.github.com/repos/:owner/:repo/code-scanning/codeql/databases/:language?name=:name" + : "PUT /repos/:owner/:repo/code-scanning/codeql/databases/:language"; + const databaseUploadSpy = requestSpy.withArgs(url); + if (databaseUploadStatusCode < 300) { + databaseUploadSpy.resolves(undefined); } else { - optInSpy.throws(new HTTPError("some error message", optInStatusCode)); - } - - if (databaseUploadStatusCode !== undefined) { - const url = useUploadDomain - ? "POST https://uploads.github.com/repos/:owner/:repo/code-scanning/codeql/databases/:language?name=:name" - : "PUT /repos/:owner/:repo/code-scanning/codeql/databases/:language"; - const databaseUploadSpy = requestSpy.withArgs(url); - if (databaseUploadStatusCode < 300) { - databaseUploadSpy.resolves(undefined); - } else { - databaseUploadSpy.throws( - new HTTPError("some error message", databaseUploadStatusCode) - ); - } + databaseUploadSpy.throws( + new HTTPError("some error message", databaseUploadStatusCode) + ); } sinon.stub(apiClient, "getApiClient").value(() => client); @@ -136,6 +98,7 @@ test("Abort database upload if 'upload-database' input set to false", async (t) await uploadDatabases( testRepoName, getTestConfig(tmpDir), + uploadToUploadsDomainFlags, testApiDetails, getRecordingLogger(loggedMessages) ); @@ -165,6 +128,7 @@ test("Abort database upload if running against GHES", async (t) => { await uploadDatabases( testRepoName, config, + createFeatureFlags([]), testApiDetails, getRecordingLogger(loggedMessages) ); @@ -194,6 +158,7 @@ test("Abort database upload if running against GHAE", async (t) => { await uploadDatabases( testRepoName, config, + createFeatureFlags([]), testApiDetails, getRecordingLogger(loggedMessages) ); @@ -220,6 +185,7 @@ test("Abort database upload if not analyzing default branch", async (t) => { await uploadDatabases( testRepoName, getTestConfig(tmpDir), + uploadToUploadsDomainFlags, testApiDetails, getRecordingLogger(loggedMessages) ); @@ -233,7 +199,7 @@ test("Abort database upload if not analyzing default branch", async (t) => { }); }); -test("Abort database upload if opt-in request returns 404", async (t) => { +test("Abort database upload if feature flag is disabled", async (t) => { await withTmpDir(async (tmpDir) => { setupActionsVars(tmpDir, tmpDir); sinon @@ -242,8 +208,6 @@ test("Abort database upload if opt-in request returns 404", async (t) => { .returns("true"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - mockHttpRequests(404); - setCodeQL({ async databaseBundle() { return; @@ -254,6 +218,7 @@ test("Abort database upload if opt-in request returns 404", async (t) => { await uploadDatabases( testRepoName, getTestConfig(tmpDir), + createFeatureFlags([FeatureFlag.UploadsDomainEnabled]), testApiDetails, getRecordingLogger(loggedMessages) ); @@ -268,41 +233,6 @@ test("Abort database upload if opt-in request returns 404", async (t) => { }); }); -test("Abort database upload if opt-in request fails with something other than 404", async (t) => { - await withTmpDir(async (tmpDir) => { - setupActionsVars(tmpDir, tmpDir); - sinon - .stub(actionsUtil, "getRequiredInput") - .withArgs("upload-database") - .returns("true"); - sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - - mockHttpRequests(500); - - setCodeQL({ - async databaseBundle() { - return; - }, - }); - - const loggedMessages = [] as LoggedMessage[]; - await uploadDatabases( - testRepoName, - getTestConfig(tmpDir), - testApiDetails, - getRecordingLogger(loggedMessages) - ); - t.assert( - loggedMessages.find( - (v) => - v.type === "info" && - v.message === - "Skipping database upload due to unknown error: Error: some error message" - ) !== undefined - ); - }); -}); - test("Don't crash if uploading a database fails", async (t) => { await withTmpDir(async (tmpDir) => { setupActionsVars(tmpDir, tmpDir); @@ -312,7 +242,11 @@ test("Don't crash if uploading a database fails", async (t) => { .returns("true"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - mockHttpRequests(200, false, 500); + const featureFlags = createFeatureFlags([ + FeatureFlag.DatabaseUploadsEnabled, + ]); + + await mockHttpRequests(featureFlags, 500); setCodeQL({ async databaseBundle(_: string, outputFilePath: string) { @@ -324,9 +258,11 @@ test("Don't crash if uploading a database fails", async (t) => { await uploadDatabases( testRepoName, getTestConfig(tmpDir), + featureFlags, testApiDetails, getRecordingLogger(loggedMessages) ); + t.assert( loggedMessages.find( (v) => @@ -347,7 +283,7 @@ test("Successfully uploading a database to api.github.com", async (t) => { .returns("true"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - mockHttpRequests(200, false, 201); + await mockHttpRequests(uploadToUploadsDomainFlags, 201); setCodeQL({ async databaseBundle(_: string, outputFilePath: string) { @@ -359,6 +295,7 @@ test("Successfully uploading a database to api.github.com", async (t) => { await uploadDatabases( testRepoName, getTestConfig(tmpDir), + uploadToUploadsDomainFlags, testApiDetails, getRecordingLogger(loggedMessages) ); @@ -381,7 +318,7 @@ test("Successfully uploading a database to uploads.github.com", async (t) => { .returns("true"); sinon.stub(actionsUtil, "isAnalyzingDefaultBranch").resolves(true); - mockHttpRequests(200, true, 201); + await mockHttpRequests(uploadToUploadsDomainFlags, 201); setCodeQL({ async databaseBundle(_: string, outputFilePath: string) { @@ -393,6 +330,7 @@ test("Successfully uploading a database to uploads.github.com", async (t) => { await uploadDatabases( testRepoName, getTestConfig(tmpDir), + uploadToUploadsDomainFlags, testApiDetails, getRecordingLogger(loggedMessages) ); diff --git a/src/database-upload.ts b/src/database-upload.ts index c8ab0693e7..5e143d72aa 100644 --- a/src/database-upload.ts +++ b/src/database-upload.ts @@ -4,6 +4,7 @@ import * as actionsUtil from "./actions-util"; import { getApiClient, GitHubApiDetails } from "./api-client"; import { getCodeQL } from "./codeql"; import { Config } from "./config-utils"; +import { FeatureFlag, FeatureFlags } from "./feature-flags"; import { Logger } from "./logging"; import { RepositoryNwo } from "./repository"; import * as util from "./util"; @@ -12,6 +13,7 @@ import { bundleDb } from "./util"; export async function uploadDatabases( repositoryNwo: RepositoryNwo, config: Config, + featureFlags: FeatureFlags, apiDetails: GitHubApiDetails, logger: Logger ): Promise { @@ -32,30 +34,19 @@ export async function uploadDatabases( return; } - const client = getApiClient(apiDetails); - let useUploadDomain: boolean; - try { - const response = await client.request( - "GET /repos/:owner/:repo/code-scanning/codeql/databases", - { - owner: repositoryNwo.owner, - repo: repositoryNwo.repo, - } + if (!(await featureFlags.getValue(FeatureFlag.DatabaseUploadsEnabled))) { + logger.debug( + "Repository is not opted in to database uploads. Skipping upload." ); - useUploadDomain = response.data["uploads_domain_enabled"]; - } catch (e) { - if (util.isHTTPError(e) && e.status === 404) { - logger.debug( - "Repository is not opted in to database uploads. Skipping upload." - ); - } else { - console.log(e); - logger.info(`Skipping database upload due to unknown error: ${e}`); - } return; } + const client = getApiClient(apiDetails); const codeql = await getCodeQL(config.codeQLCmd); + const useUploadDomain = await featureFlags.getValue( + FeatureFlag.UploadsDomainEnabled + ); + for (const language of config.languages) { // Upload the database bundle. // Although we are uploading arbitrary file contents to the API, it's worth diff --git a/src/feature-flags.test.ts b/src/feature-flags.test.ts new file mode 100644 index 0000000000..49ece6b043 --- /dev/null +++ b/src/feature-flags.test.ts @@ -0,0 +1,165 @@ +import test from "ava"; + +import { GitHubApiDetails } from "./api-client"; +import { FeatureFlag, GitHubFeatureFlags } from "./feature-flags"; +import { getRunnerLogger } from "./logging"; +import { parseRepositoryNwo } from "./repository"; +import { + getRecordingLogger, + LoggedMessage, + mockFeatureFlagApiEndpoint, + setupActionsVars, + setupTests, +} from "./testing-utils"; +import * as util from "./util"; +import { GitHubVariant, initializeEnvironment, Mode, withTmpDir } from "./util"; + +setupTests(test); + +test.beforeEach(() => { + initializeEnvironment(Mode.actions, "1.2.3"); +}); + +const testApiDetails: GitHubApiDetails = { + auth: "1234", + url: "https://github.com", +}; + +const testRepositoryNwo = parseRepositoryNwo("github/example"); + +const ALL_FEATURE_FLAGS_DISABLED_VARIANTS: Array<{ + description: string; + gitHubVersion: util.GitHubVersion; +}> = [ + { + description: "GHES", + gitHubVersion: { type: GitHubVariant.GHES, version: "3.0.0" }, + }, + { description: "GHAE", gitHubVersion: { type: GitHubVariant.GHAE } }, +]; + +for (const variant of ALL_FEATURE_FLAGS_DISABLED_VARIANTS) { + test(`All feature flags are disabled if running against ${variant.description}`, async (t) => { + await withTmpDir(async (tmpDir) => { + setupActionsVars(tmpDir, tmpDir); + + const loggedMessages = []; + const featureFlags = new GitHubFeatureFlags( + variant.gitHubVersion, + testApiDetails, + testRepositoryNwo, + getRecordingLogger(loggedMessages) + ); + + for (const flag of Object.values(FeatureFlag)) { + t.assert((await featureFlags.getValue(flag)) === false); + } + + t.assert( + loggedMessages.find( + (v: LoggedMessage) => + v.type === "debug" && + v.message === + "Not running against github.com. Disabling all feature flags." + ) !== undefined + ); + }); + }); +} + +test("Feature flags are disabled if they're not returned in API response", async (t) => { + await withTmpDir(async (tmpDir) => { + setupActionsVars(tmpDir, tmpDir); + + const loggedMessages = []; + const featureFlags = new GitHubFeatureFlags( + { type: GitHubVariant.DOTCOM }, + testApiDetails, + testRepositoryNwo, + getRecordingLogger(loggedMessages) + ); + + mockFeatureFlagApiEndpoint(200, {}); + + for (const flag of Object.values(FeatureFlag)) { + t.assert((await featureFlags.getValue(flag)) === false); + } + + for (const featureFlag of [ + "database_uploads_enabled", + "ml_powered_queries_enabled", + "uploads_domain_enabled", + ]) { + t.assert( + loggedMessages.find( + (v: LoggedMessage) => + v.type === "debug" && + v.message === + `Feature flag '${featureFlag}' undefined in API response, considering it disabled.` + ) !== undefined + ); + } + }); +}); + +test("Feature flags exception is propagated if the API request errors", async (t) => { + await withTmpDir(async (tmpDir) => { + setupActionsVars(tmpDir, tmpDir); + + const featureFlags = new GitHubFeatureFlags( + { type: GitHubVariant.DOTCOM }, + testApiDetails, + testRepositoryNwo, + getRunnerLogger(true) + ); + + mockFeatureFlagApiEndpoint(500, {}); + + await t.throwsAsync(async () => featureFlags.preloadFeatureFlags(), { + message: + "Encountered an error while trying to load feature flags: Error: some error message", + }); + }); +}); + +const FEATURE_FLAGS = [ + "database_uploads_enabled", + "ml_powered_queries_enabled", + "uploads_domain_enabled", +]; + +for (const featureFlag of FEATURE_FLAGS) { + test(`Feature flag '${featureFlag}' is enabled if enabled in the API response`, async (t) => { + await withTmpDir(async (tmpDir) => { + setupActionsVars(tmpDir, tmpDir); + + const featureFlags = new GitHubFeatureFlags( + { type: GitHubVariant.DOTCOM }, + testApiDetails, + testRepositoryNwo, + getRunnerLogger(true) + ); + + const expectedFeatureFlags = {}; + for (const f of FEATURE_FLAGS) { + expectedFeatureFlags[f] = false; + } + expectedFeatureFlags[featureFlag] = true; + mockFeatureFlagApiEndpoint(200, expectedFeatureFlags); + + const actualFeatureFlags = { + database_uploads_enabled: await featureFlags.getValue( + FeatureFlag.DatabaseUploadsEnabled + ), + ml_powered_queries_enabled: await featureFlags.getValue( + FeatureFlag.MlPoweredQueriesEnabled + ), + uploads_domain_enabled: await featureFlags.getValue( + FeatureFlag.UploadsDomainEnabled + ), + }; + + t.deepEqual(actualFeatureFlags, expectedFeatureFlags); + }); + }); +} diff --git a/src/feature-flags.ts b/src/feature-flags.ts new file mode 100644 index 0000000000..e49bbf754e --- /dev/null +++ b/src/feature-flags.ts @@ -0,0 +1,96 @@ +import { getApiClient, GitHubApiDetails } from "./api-client"; +import { Logger } from "./logging"; +import { RepositoryNwo } from "./repository"; +import * as util from "./util"; + +export interface FeatureFlags { + getValue(flag: FeatureFlag): Promise; +} + +export enum FeatureFlag { + DatabaseUploadsEnabled = "database_uploads_enabled", + MlPoweredQueriesEnabled = "ml_powered_queries_enabled", + UploadsDomainEnabled = "uploads_domain_enabled", +} + +/** + * A response from the GitHub API that contains feature flag enablement information for the CodeQL + * Action. + * + * It maps feature flags to whether they are enabled or not. + */ +type FeatureFlagsApiResponse = Partial>; + +export class GitHubFeatureFlags implements FeatureFlags { + private cachedApiResponse: FeatureFlagsApiResponse | undefined; + + constructor( + private gitHubVersion: util.GitHubVersion, + private apiDetails: GitHubApiDetails, + private repositoryNwo: RepositoryNwo, + private logger: Logger + ) {} + + async getValue(flag: FeatureFlag): Promise { + const response = (await this.getApiResponse())[flag]; + if (response === undefined) { + this.logger.debug( + `Feature flag '${flag}' undefined in API response, considering it disabled.` + ); + return false; + } + return response; + } + + async preloadFeatureFlags(): Promise { + await this.getApiResponse(); + } + + private async getApiResponse(): Promise { + const loadApiResponse = async () => { + // Do nothing when not running against github.com + if (this.gitHubVersion.type !== util.GitHubVariant.DOTCOM) { + this.logger.debug( + "Not running against github.com. Disabling all feature flags." + ); + return {}; + } + const client = getApiClient(this.apiDetails); + try { + const response = await client.request( + "GET /repos/:owner/:repo/code-scanning/codeql-action/features", + { + owner: this.repositoryNwo.owner, + repo: this.repositoryNwo.repo, + } + ); + return response.data; + } catch (e) { + // Some feature flags, such as `ml_powered_queries_enabled` affect the produced alerts. + // Considering these feature flags disabled in the event of a transient error could + // therefore lead to alert churn. As a result, we crash if we cannot determine the value of + // the feature flags. + throw new Error( + `Encountered an error while trying to load feature flags: ${e}` + ); + } + }; + + const apiResponse = this.cachedApiResponse || (await loadApiResponse()); + this.cachedApiResponse = apiResponse; + return apiResponse; + } +} + +/** + * Create a feature flags instance with the specified set of enabled flags. + * + * This should be only used within tests. + */ +export function createFeatureFlags(enabledFlags: FeatureFlag[]): FeatureFlags { + return { + getValue: async (flag) => { + return enabledFlags.includes(flag); + }, + }; +} diff --git a/src/testing-utils.ts b/src/testing-utils.ts index 867a128944..0a33f5c8bc 100644 --- a/src/testing-utils.ts +++ b/src/testing-utils.ts @@ -1,7 +1,11 @@ +import * as github from "@actions/github"; import { TestInterface } from "ava"; import * as sinon from "sinon"; +import * as apiClient from "./api-client"; import * as CodeQL from "./codeql"; +import { Logger } from "./logging"; +import { HTTPError } from "./util"; type TestContext = { stdoutWrite: any; @@ -89,3 +93,59 @@ export function setupActionsVars(tempDir: string, toolsDir: string) { process.env["RUNNER_TEMP"] = tempDir; process.env["RUNNER_TOOL_CACHE"] = toolsDir; } + +export interface LoggedMessage { + type: "debug" | "info" | "warning" | "error"; + message: string | Error; +} + +export function getRecordingLogger(messages: LoggedMessage[]): Logger { + return { + debug: (message: string) => { + messages.push({ type: "debug", message }); + console.debug(message); + }, + info: (message: string) => { + messages.push({ type: "info", message }); + console.info(message); + }, + warning: (message: string | Error) => { + messages.push({ type: "warning", message }); + console.warn(message); + }, + error: (message: string | Error) => { + messages.push({ type: "error", message }); + console.error(message); + }, + isDebug: () => true, + startGroup: () => undefined, + endGroup: () => undefined, + }; +} + +/** Mock the HTTP request to the feature flags enablement API endpoint. */ +export function mockFeatureFlagApiEndpoint( + responseStatusCode: number, + response: { [flagName: string]: boolean } +) { + // Passing an auth token is required, so we just use a dummy value + const client = github.getOctokit("123"); + + const requestSpy = sinon.stub(client, "request"); + + const optInSpy = requestSpy.withArgs( + "GET /repos/:owner/:repo/code-scanning/codeql-action/features" + ); + if (responseStatusCode < 300) { + optInSpy.resolves({ + status: responseStatusCode, + data: response, + headers: {}, + url: "GET /repos/:owner/:repo/code-scanning/codeql-action/features", + }); + } else { + optInSpy.throws(new HTTPError("some error message", responseStatusCode)); + } + + sinon.stub(apiClient, "getApiClient").value(() => client); +} pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy