Skip to content

Commit 505fdd0

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

File tree

4 files changed

+112
-11
lines changed

4 files changed

+112
-11
lines changed

lib/analyze-action.js

Lines changed: 20 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: 20 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: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ 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";
12+
import { KnownLanguage } from "./languages";
1113
import { getRunnerLogger } from "./logging";
1214
import {
1315
downloadOverlayBaseDatabaseFromCache,
@@ -95,6 +97,7 @@ interface DownloadOverlayBaseDatabaseTestCase {
9597
hasBaseDatabaseOidsFile: boolean;
9698
tryGetFolderBytesSucceeds: boolean;
9799
codeQLVersion: string;
100+
resolveDatabaseOutput: ResolveDatabaseOutput | Error;
98101
}
99102

100103
const defaultDownloadTestCase: DownloadOverlayBaseDatabaseTestCase = {
@@ -105,6 +108,7 @@ const defaultDownloadTestCase: DownloadOverlayBaseDatabaseTestCase = {
105108
hasBaseDatabaseOidsFile: true,
106109
tryGetFolderBytesSucceeds: true,
107110
codeQLVersion: "2.20.5",
111+
resolveDatabaseOutput: { overlayBaseSpecifier: "20250626:XXX" },
108112
};
109113

110114
const testDownloadOverlayBaseDatabaseFromCache = test.macro({
@@ -119,9 +123,11 @@ const testDownloadOverlayBaseDatabaseFromCache = test.macro({
119123
await fs.promises.mkdir(dbLocation, { recursive: true });
120124

121125
const logger = getRunnerLogger(true);
122-
const config = createTestConfig({ dbLocation });
123-
124126
const testCase = { ...defaultDownloadTestCase, ...partialTestCase };
127+
const config = createTestConfig({
128+
dbLocation,
129+
languages: [KnownLanguage.java],
130+
});
125131

126132
config.overlayDatabaseMode = testCase.overlayDatabaseMode;
127133
config.useOverlayDatabaseCaching = testCase.useOverlayDatabaseCaching;
@@ -163,9 +169,23 @@ const testDownloadOverlayBaseDatabaseFromCache = test.macro({
163169
.resolves(testCase.tryGetFolderBytesSucceeds ? 1024 * 1024 : undefined);
164170
stubs.push(tryGetFolderBytesStub);
165171

172+
const codeql = mockCodeQLVersion(testCase.codeQLVersion);
173+
174+
if (testCase.resolveDatabaseOutput instanceof Error) {
175+
const resolveDatabaseStub = sinon
176+
.stub(codeql, "resolveDatabase")
177+
.rejects(testCase.resolveDatabaseOutput);
178+
stubs.push(resolveDatabaseStub);
179+
} else {
180+
const resolveDatabaseStub = sinon
181+
.stub(codeql, "resolveDatabase")
182+
.resolves(testCase.resolveDatabaseOutput);
183+
stubs.push(resolveDatabaseStub);
184+
}
185+
166186
try {
167187
const result = await downloadOverlayBaseDatabaseFromCache(
168-
mockCodeQLVersion(testCase.codeQLVersion),
188+
codeql,
169189
config,
170190
logger,
171191
);
@@ -255,6 +275,24 @@ test(
255275
false,
256276
);
257277

278+
test(
279+
testDownloadOverlayBaseDatabaseFromCache,
280+
"returns undefined when downloaded database doesn't have an overlayBaseSpecifier",
281+
{
282+
resolveDatabaseOutput: {},
283+
},
284+
false,
285+
);
286+
287+
test(
288+
testDownloadOverlayBaseDatabaseFromCache,
289+
"returns undefined when resolving database metadata fails",
290+
{
291+
resolveDatabaseOutput: new Error("Failed to resolve database metadata"),
292+
},
293+
false,
294+
);
295+
258296
test(
259297
testDownloadOverlayBaseDatabaseFromCache,
260298
"returns undefined when filesystem error occurs",

src/overlay-database-utils.ts

Lines changed: 31 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,29 @@ function checkOverlayBaseDatabase(
189191
);
190192
return false;
191193
}
194+
195+
for (const language of config.languages) {
196+
const dbPath = getCodeQLDatabasePath(config, language);
197+
try {
198+
const resolveDatabaseOutput = await codeql.resolveDatabase(dbPath);
199+
if (
200+
resolveDatabaseOutput === undefined ||
201+
!("overlayBaseSpecifier" in resolveDatabaseOutput)
202+
) {
203+
logger.info(`${warningPrefix}: no overlayBaseSpecifier defined`);
204+
return false;
205+
} else {
206+
logger.info(
207+
`Overlay base specifier for ${language} overlay-base database found: ` +
208+
`${resolveDatabaseOutput.overlayBaseSpecifier}`,
209+
);
210+
}
211+
} catch (e) {
212+
logger.warning(`${warningPrefix}: failed to resolve database: ${e}`);
213+
return false;
214+
}
215+
}
216+
192217
return true;
193218
}
194219

@@ -232,7 +257,8 @@ export async function cleanupAndUploadOverlayBaseDatabaseToCache(
232257
return false;
233258
}
234259

235-
const databaseIsValid = checkOverlayBaseDatabase(
260+
const databaseIsValid = await checkOverlayBaseDatabase(
261+
codeql,
236262
config,
237263
logger,
238264
"Abort uploading overlay-base database to cache",
@@ -415,7 +441,8 @@ export async function downloadOverlayBaseDatabaseFromCache(
415441
return undefined;
416442
}
417443

418-
const databaseIsValid = checkOverlayBaseDatabase(
444+
const databaseIsValid = await checkOverlayBaseDatabase(
445+
codeql,
419446
config,
420447
logger,
421448
"Downloaded overlay-base database is invalid",

0 commit comments

Comments
 (0)