|
1 | 1 | import * as fs from "fs";
|
2 | 2 | import * as path from "path";
|
3 | 3 |
|
| 4 | +import * as actionsCache from "@actions/cache"; |
4 | 5 | import test from "ava";
|
5 | 6 | import * as sinon from "sinon";
|
6 | 7 |
|
7 | 8 | import * as actionsUtil from "./actions-util";
|
8 | 9 | import * as gitUtils from "./git-utils";
|
9 | 10 | import { getRunnerLogger } from "./logging";
|
10 | 11 | import {
|
| 12 | + downloadOverlayBaseDatabaseFromCache, |
| 13 | + OverlayDatabaseMode, |
11 | 14 | writeBaseDatabaseOidsFile,
|
12 | 15 | writeOverlayChangesFile,
|
13 | 16 | } 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"; |
15 | 23 | import { withTmpDir } from "./util";
|
16 | 24 |
|
17 | 25 | setupTests(test);
|
@@ -75,3 +83,177 @@ test("writeOverlayChangesFile generates correct changes file", async (t) => {
|
75 | 83 | );
|
76 | 84 | });
|
77 | 85 | });
|
| 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