Skip to content

Commit fd0d09f

Browse files
committed
Overlay: Check database metadata for overlayBaseSpecifier
1 parent 24569f2 commit fd0d09f

File tree

5 files changed

+78
-10
lines changed

5 files changed

+78
-10
lines changed

lib/analyze-action.js

Lines changed: 15 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/init-action.js

Lines changed: 15 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/overlay-database-utils.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as sinon from "sinon";
77

88
import * as actionsUtil from "./actions-util";
99
import * as apiClient from "./api-client";
10+
import { ResolveDatabaseOutput } from "./codeql";
1011
import * as gitUtils from "./git-utils";
1112
import { getRunnerLogger } from "./logging";
1213
import {
@@ -95,6 +96,7 @@ interface DownloadOverlayBaseDatabaseTestCase {
9596
hasBaseDatabaseOidsFile: boolean;
9697
tryGetFolderBytesSucceeds: boolean;
9798
codeQLVersion: string;
99+
resolveDatabaseOutput: ResolveDatabaseOutput;
98100
}
99101

100102
const defaultDownloadTestCase: DownloadOverlayBaseDatabaseTestCase = {
@@ -105,6 +107,7 @@ const defaultDownloadTestCase: DownloadOverlayBaseDatabaseTestCase = {
105107
hasBaseDatabaseOidsFile: true,
106108
tryGetFolderBytesSucceeds: true,
107109
codeQLVersion: "2.20.5",
110+
resolveDatabaseOutput: { overlayBaseSpecifier: "20250626:XXX" },
108111
};
109112

110113
const testDownloadOverlayBaseDatabaseFromCache = test.macro({
@@ -163,9 +166,16 @@ const testDownloadOverlayBaseDatabaseFromCache = test.macro({
163166
.resolves(testCase.tryGetFolderBytesSucceeds ? 1024 * 1024 : undefined);
164167
stubs.push(tryGetFolderBytesStub);
165168

169+
const codeql = mockCodeQLVersion(testCase.codeQLVersion);
170+
171+
const resolveDatabaseStub = sinon
172+
.stub(codeql, "resolveDatabase")
173+
.resolves(testCase.resolveDatabaseOutput);
174+
stubs.push(resolveDatabaseStub);
175+
166176
try {
167177
const result = await downloadOverlayBaseDatabaseFromCache(
168-
mockCodeQLVersion(testCase.codeQLVersion),
178+
codeql,
169179
config,
170180
logger,
171181
);
@@ -255,6 +265,15 @@ test(
255265
false,
256266
);
257267

268+
test(
269+
testDownloadOverlayBaseDatabaseFromCache,
270+
"returns undefined when downloaded database doesn't have an overlayBaseSpecifier",
271+
{
272+
resolveDatabaseOutput: {},
273+
},
274+
false,
275+
);
276+
258277
test(
259278
testDownloadOverlayBaseDatabaseFromCache,
260279
"returns undefined when filesystem error occurs",

src/overlay-database-utils.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { getCommitOid, getFileOidsUnderPath } from "./git-utils";
1717
import { Logger, withGroupAsync } from "./logging";
1818
import {
1919
CleanupLevel,
20+
getCodeQLDatabasePath,
2021
getErrorMessage,
2122
isInTestMode,
2223
tryGetFolderBytes,
@@ -176,11 +177,12 @@ const MAX_CACHE_OPERATION_MS = 600_000;
176177
* @param warningPrefix Prefix for the check failure warning message
177178
* @returns True if the verification succeeded, false otherwise
178179
*/
179-
function checkOverlayBaseDatabase(
180+
async function checkOverlayBaseDatabase(
181+
codeql: CodeQL,
180182
config: Config,
181183
logger: Logger,
182184
warningPrefix: string,
183-
): boolean {
185+
): Promise<boolean> {
184186
// An overlay-base database should contain the base database OIDs file.
185187
const baseDatabaseOidsFilePath = getBaseDatabaseOidsFilePath(config);
186188
if (!fs.existsSync(baseDatabaseOidsFilePath)) {
@@ -189,6 +191,24 @@ function checkOverlayBaseDatabase(
189191
);
190192
return false;
191193
}
194+
195+
for (const language of config.languages) {
196+
const dbPath = getCodeQLDatabasePath(config, language);
197+
const resolveDatabaseOutput = await codeql.resolveDatabase(dbPath);
198+
if (
199+
resolveDatabaseOutput === undefined ||
200+
!("overlayBaseSpecifier" in resolveDatabaseOutput)
201+
) {
202+
logger.info(`${warningPrefix}: no overlayBaseSpecifier defined`);
203+
return false;
204+
} else {
205+
logger.info(
206+
`Overlay base specifier for ${language} overlay-base found: ` +
207+
`${resolveDatabaseOutput.overlayBaseSpecifier}`,
208+
);
209+
}
210+
}
211+
192212
return true;
193213
}
194214

@@ -232,7 +252,8 @@ export async function cleanupAndUploadOverlayBaseDatabaseToCache(
232252
return false;
233253
}
234254

235-
const databaseIsValid = checkOverlayBaseDatabase(
255+
const databaseIsValid = await checkOverlayBaseDatabase(
256+
codeql,
236257
config,
237258
logger,
238259
"Abort uploading overlay-base database to cache",
@@ -415,7 +436,8 @@ export async function downloadOverlayBaseDatabaseFromCache(
415436
return undefined;
416437
}
417438

418-
const databaseIsValid = checkOverlayBaseDatabase(
439+
const databaseIsValid = await checkOverlayBaseDatabase(
440+
codeql,
419441
config,
420442
logger,
421443
"Downloaded overlay-base database is invalid",

src/testing-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
featureConfig,
2121
FeatureEnablement,
2222
} from "./feature-flags";
23+
import { KnownLanguage } from "./languages";
2324
import { Logger } from "./logging";
2425
import { OverlayDatabaseMode } from "./overlay-database-utils";
2526
import {
@@ -376,7 +377,7 @@ export function createTestConfig(overrides: Partial<Config>): Config {
376377
{
377378
version: getActionVersion(),
378379
analysisKinds: [AnalysisKind.CodeScanning],
379-
languages: [],
380+
languages: [KnownLanguage.java],
380381
buildMode: undefined,
381382
originalUserInput: {},
382383
computedConfig: {},

0 commit comments

Comments
 (0)