Skip to content

Commit c3bbcab

Browse files
committed
Add downloadOverlayBaseDatabaseFromCache tests
1 parent e37b293 commit c3bbcab

File tree

1 file changed

+183
-1
lines changed

1 file changed

+183
-1
lines changed

src/overlay-database-utils.test.ts

Lines changed: 183 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
11
import * as fs from "fs";
22
import * as path from "path";
33

4+
import * as actionsCache from "@actions/cache";
45
import test from "ava";
56
import * as sinon from "sinon";
67

78
import * as actionsUtil from "./actions-util";
89
import * as gitUtils from "./git-utils";
910
import { getRunnerLogger } from "./logging";
1011
import {
12+
downloadOverlayBaseDatabaseFromCache,
13+
OverlayDatabaseMode,
1114
writeBaseDatabaseOidsFile,
1215
writeOverlayChangesFile,
1316
} from "./overlay-database-utils";
14-
import { createTestConfig, setupTests } from "./testing-utils";
17+
import {
18+
createTestConfig,
19+
mockCodeQLVersion,
20+
setupTests,
21+
} from "./testing-utils";
22+
import * as utils from "./util";
1523
import { withTmpDir } from "./util";
1624

1725
setupTests(test);
@@ -75,3 +83,177 @@ test("writeOverlayChangesFile generates correct changes file", async (t) => {
7583
);
7684
});
7785
});
86+
87+
interface DownloadOverlayBaseDatabaseTestCase {
88+
overlayDatabaseMode: OverlayDatabaseMode;
89+
useOverlayDatabaseCaching: boolean;
90+
isInTestMode: boolean;
91+
restoreCacheResult: string | undefined | Error;
92+
hasBaseDatabaseOidsFile: boolean;
93+
tryGetFolderBytesSucceeds: boolean;
94+
codeQLVersion: string;
95+
}
96+
97+
const defaultDownloadTestCase: DownloadOverlayBaseDatabaseTestCase = {
98+
overlayDatabaseMode: OverlayDatabaseMode.Overlay,
99+
useOverlayDatabaseCaching: true,
100+
isInTestMode: false,
101+
restoreCacheResult: "cache-key",
102+
hasBaseDatabaseOidsFile: true,
103+
tryGetFolderBytesSucceeds: true,
104+
codeQLVersion: "2.20.5",
105+
};
106+
107+
const testDownloadOverlayBaseDatabaseFromCache = test.macro({
108+
exec: async (
109+
t,
110+
_title: string,
111+
partialTestCase: Partial<DownloadOverlayBaseDatabaseTestCase>,
112+
expectDownloadSuccess: boolean,
113+
) => {
114+
await withTmpDir(async (tmpDir) => {
115+
const dbLocation = path.join(tmpDir, "db");
116+
await fs.promises.mkdir(dbLocation, { recursive: true });
117+
118+
const logger = getRunnerLogger(true);
119+
const config = createTestConfig({ dbLocation });
120+
121+
const testCase = { ...defaultDownloadTestCase, ...partialTestCase };
122+
123+
config.augmentationProperties.overlayDatabaseMode =
124+
testCase.overlayDatabaseMode;
125+
config.augmentationProperties.useOverlayDatabaseCaching =
126+
testCase.useOverlayDatabaseCaching;
127+
128+
if (testCase.hasBaseDatabaseOidsFile) {
129+
const baseDatabaseOidsFile = path.join(
130+
dbLocation,
131+
"base-database-oids.json",
132+
);
133+
await fs.promises.writeFile(baseDatabaseOidsFile, JSON.stringify({}));
134+
}
135+
136+
const stubs: sinon.SinonStub[] = [];
137+
138+
const isInTestModeStub = sinon
139+
.stub(utils, "isInTestMode")
140+
.returns(testCase.isInTestMode);
141+
stubs.push(isInTestModeStub);
142+
143+
if (testCase.restoreCacheResult instanceof Error) {
144+
const restoreCacheStub = sinon
145+
.stub(actionsCache, "restoreCache")
146+
.rejects(testCase.restoreCacheResult);
147+
stubs.push(restoreCacheStub);
148+
} else {
149+
const restoreCacheStub = sinon
150+
.stub(actionsCache, "restoreCache")
151+
.resolves(testCase.restoreCacheResult);
152+
stubs.push(restoreCacheStub);
153+
}
154+
155+
const tryGetFolderBytesStub = sinon
156+
.stub(utils, "tryGetFolderBytes")
157+
.resolves(testCase.tryGetFolderBytesSucceeds ? 1024 * 1024 : undefined);
158+
stubs.push(tryGetFolderBytesStub);
159+
160+
try {
161+
const result = await downloadOverlayBaseDatabaseFromCache(
162+
mockCodeQLVersion(testCase.codeQLVersion),
163+
config,
164+
logger,
165+
);
166+
167+
if (expectDownloadSuccess) {
168+
t.truthy(result);
169+
} else {
170+
t.is(result, undefined);
171+
}
172+
} finally {
173+
for (const stub of stubs) {
174+
stub.restore();
175+
}
176+
}
177+
});
178+
},
179+
title: (_, title) => `downloadOverlayBaseDatabaseFromCache: ${title}`,
180+
});
181+
182+
test(
183+
testDownloadOverlayBaseDatabaseFromCache,
184+
"returns stats when successful",
185+
{},
186+
true,
187+
);
188+
189+
test(
190+
testDownloadOverlayBaseDatabaseFromCache,
191+
"returns undefined when mode is OverlayDatabaseMode.OverlayBase",
192+
{
193+
overlayDatabaseMode: OverlayDatabaseMode.OverlayBase,
194+
},
195+
false,
196+
);
197+
198+
test(
199+
testDownloadOverlayBaseDatabaseFromCache,
200+
"returns undefined when mode is OverlayDatabaseMode.None",
201+
{
202+
overlayDatabaseMode: OverlayDatabaseMode.None,
203+
},
204+
false,
205+
);
206+
207+
test(
208+
testDownloadOverlayBaseDatabaseFromCache,
209+
"returns undefined when caching is disabled",
210+
{
211+
useOverlayDatabaseCaching: false,
212+
},
213+
false,
214+
);
215+
216+
test(
217+
testDownloadOverlayBaseDatabaseFromCache,
218+
"returns undefined in test mode",
219+
{
220+
isInTestMode: true,
221+
},
222+
false,
223+
);
224+
225+
test(
226+
testDownloadOverlayBaseDatabaseFromCache,
227+
"returns undefined when cache miss",
228+
{
229+
restoreCacheResult: undefined,
230+
},
231+
false,
232+
);
233+
234+
test(
235+
testDownloadOverlayBaseDatabaseFromCache,
236+
"returns undefined when download fails",
237+
{
238+
restoreCacheResult: new Error("Download failed"),
239+
},
240+
false,
241+
);
242+
243+
test(
244+
testDownloadOverlayBaseDatabaseFromCache,
245+
"returns undefined when downloaded database is invalid",
246+
{
247+
hasBaseDatabaseOidsFile: false,
248+
},
249+
false,
250+
);
251+
252+
test(
253+
testDownloadOverlayBaseDatabaseFromCache,
254+
"returns undefined when filesystem error occurs",
255+
{
256+
tryGetFolderBytesSucceeds: false,
257+
},
258+
false,
259+
);

0 commit comments

Comments
 (0)