@@ -8,10 +8,18 @@ import * as actionsUtil from "./actions-util";
88import * as gitUtils from "./git-utils" ;
99import { getRunnerLogger } from "./logging" ;
1010import {
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" ;
1523import { withTmpDir } from "./util" ;
1624
1725setupTests ( 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