Skip to content

Commit a91c965

Browse files
committed
Add downloadOverlayBaseDatabaseFromCache tests
1 parent f772c70 commit a91c965

File tree

1 file changed

+181
-1
lines changed

1 file changed

+181
-1
lines changed

src/overlay-database-utils.test.ts

Lines changed: 181 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,18 @@ import * as actionsUtil from "./actions-util";
88
import * as gitUtils from "./git-utils";
99
import { getRunnerLogger } from "./logging";
1010
import {
11+
downloadOverlayBaseDatabaseFromCache,
12+
OverlayDatabaseMode,
1113
writeBaseDatabaseOidsFile,
1214
writeOverlayChangesFile,
1315
} from "./overlay-database-utils";
14-
import { createTestConfig, setupTests } from "./testing-utils";
16+
import {
17+
createTestConfig,
18+
mockCodeQLVersion,
19+
setupTests,
20+
} from "./testing-utils";
21+
import * as utils from "./util";
22+
import * as actionsCache from "@actions/cache";
1523
import { withTmpDir } from "./util";
1624

1725
setupTests(test);
@@ -75,3 +83,175 @@ 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+
stubs.forEach((stub) => stub.restore());
174+
}
175+
});
176+
},
177+
title: (_, title) => `downloadOverlayBaseDatabaseFromCache: ${title}`,
178+
});
179+
180+
test(
181+
testDownloadOverlayBaseDatabaseFromCache,
182+
"returns stats when successful",
183+
{},
184+
true,
185+
);
186+
187+
test(
188+
testDownloadOverlayBaseDatabaseFromCache,
189+
"returns undefined when mode is OverlayDatabaseMode.OverlayBase",
190+
{
191+
overlayDatabaseMode: OverlayDatabaseMode.OverlayBase,
192+
},
193+
false,
194+
);
195+
196+
test(
197+
testDownloadOverlayBaseDatabaseFromCache,
198+
"returns undefined when mode is OverlayDatabaseMode.None",
199+
{
200+
overlayDatabaseMode: OverlayDatabaseMode.None,
201+
},
202+
false,
203+
);
204+
205+
test(
206+
testDownloadOverlayBaseDatabaseFromCache,
207+
"returns undefined when caching is disabled",
208+
{
209+
useOverlayDatabaseCaching: false,
210+
},
211+
false,
212+
);
213+
214+
test(
215+
testDownloadOverlayBaseDatabaseFromCache,
216+
"returns undefined in test mode",
217+
{
218+
isInTestMode: true,
219+
},
220+
false,
221+
);
222+
223+
test(
224+
testDownloadOverlayBaseDatabaseFromCache,
225+
"returns undefined when cache miss",
226+
{
227+
restoreCacheResult: undefined,
228+
},
229+
false,
230+
);
231+
232+
test(
233+
testDownloadOverlayBaseDatabaseFromCache,
234+
"returns undefined when download fails",
235+
{
236+
restoreCacheResult: new Error("Download failed"),
237+
},
238+
false,
239+
);
240+
241+
test(
242+
testDownloadOverlayBaseDatabaseFromCache,
243+
"returns undefined when downloaded database is invalid",
244+
{
245+
hasBaseDatabaseOidsFile: false,
246+
},
247+
false,
248+
);
249+
250+
test(
251+
testDownloadOverlayBaseDatabaseFromCache,
252+
"returns undefined when filesystem error occurs",
253+
{
254+
tryGetFolderBytesSucceeds: false,
255+
},
256+
false,
257+
);

0 commit comments

Comments
 (0)