7
7
"testing"
8
8
9
9
"github.com/stackrox/scanner/database"
10
+ "github.com/stackrox/scanner/pkg/env"
10
11
"github.com/stretchr/testify/assert"
11
12
"github.com/stretchr/testify/require"
12
13
)
@@ -199,31 +200,12 @@ func TestGetRHELv2Layers(t *testing.T) {
199
200
// TestRHELv2LayerLineage verifies that data for duplicate layers with different parent
200
201
// layers (lineage) is pulled correctly.
201
202
func TestRHELv2LayerLineage (t * testing.T ) {
202
- datastore , err := openDatabaseForTest ("RHELv2LayerLineage" , false )
203
- if err != nil {
204
- t .Error (err )
205
- return
206
- }
207
- defer datastore .Close ()
208
-
209
- // Two 'fake' images will be created, each with 3 layers, the DB will resemble:
210
- // id | hash | parent_hash | dist | cpes | lineage | parent_lineage
211
- // ----+-----------------+-----------------+--------+----------------+-----------+----------------
212
- // 1 | sha256:base | | rhel:8 | | |
213
- // 2 | sha256:layer1-a | sha256:base | rhel:8 | {cpe-a,cpe2-a} | lineage |
214
- // 3 | sha256:layer1-b | sha256:base | rhel:8 | {cpe-b,cpe2-b} | lineage |
215
- // 4 | sha256:leaf | sha256:layer1-a | rhel:8 | | lineage-a | lineage
216
- // 5 | sha256:leaf | sha256:layer1-b | rhel:8 | | lineage-b | lineage
217
-
218
203
// base layers
219
204
base := & database.RHELv2Layer {
220
205
Hash : "sha256:base" ,
221
206
Dist : "rhel:8" ,
222
207
}
223
208
224
- err = datastore .InsertRHELv2Layer (base )
225
- require .NoError (t , err )
226
-
227
209
layer1a := & database.RHELv2Layer {
228
210
Hash : "sha256:layer1-a" ,
229
211
Lineage : "lineage" ,
@@ -250,11 +232,6 @@ func TestRHELv2LayerLineage(t *testing.T) {
250
232
CPEs : []string {"cpe-b" , "cpe2-b" },
251
233
}
252
234
253
- err = datastore .InsertRHELv2Layer (layer1a )
254
- require .NoError (t , err )
255
- err = datastore .InsertRHELv2Layer (layer1b )
256
- require .NoError (t , err )
257
-
258
235
leafa := & database.RHELv2Layer {
259
236
Hash : "sha256:leaf" , // for this test all leafs should have same digest
260
237
Lineage : "lineage-a" , // lineage is specific to layer A
@@ -268,34 +245,103 @@ func TestRHELv2LayerLineage(t *testing.T) {
268
245
leafb .Lineage = "lineage-b"
269
246
leafb .ParentHash = "sha256:layer1-b"
270
247
271
- err = datastore .InsertRHELv2Layer (leafa )
272
- require .NoError (t , err )
273
- err = datastore .InsertRHELv2Layer (leafb )
274
- require .NoError (t , err )
248
+ prepDataStore := func (t * testing.T , name string ) * pgSQL {
249
+ datastore , err := openDatabaseForTest ("RHELv2LayerLineage_enabled" , false )
250
+ require .NoError (t , err )
251
+
252
+ err = datastore .InsertRHELv2Layer (base )
253
+ require .NoError (t , err )
254
+ err = datastore .InsertRHELv2Layer (layer1a )
255
+ require .NoError (t , err )
256
+ err = datastore .InsertRHELv2Layer (layer1b )
257
+ require .NoError (t , err )
258
+ err = datastore .InsertRHELv2Layer (leafa )
259
+ require .NoError (t , err )
260
+ err = datastore .InsertRHELv2Layer (leafb )
261
+ require .NoError (t , err )
262
+
263
+ return datastore
264
+ }
275
265
276
- assertLayersEqual := func (t * testing.T , expected , actual * database.RHELv2Layer ) {
266
+ assertLayersEqual := func (t * testing.T , expected , actual * database.RHELv2Layer , skipLineage bool ) {
277
267
resetPackageIDs (actual )
278
268
assert .Equal (t , expected .Hash , actual .Hash , "Hash mismatch" )
279
- assert .Equal (t , expected .Lineage , actual .Lineage , "Lineage mismatch" )
280
269
assert .Equal (t , expected .CPEs , actual .CPEs , "CPEs mistmatch" )
281
270
assert .Equal (t , expected .Pkgs , actual .Pkgs , "Pkgs mismatch" )
282
- }
283
-
284
- layers , err := datastore .GetRHELv2Layers ("sha256:leaf" , "lineage-a" )
285
- require .NoError (t , err )
286
- require .Len (t , layers , 3 )
287
271
288
- assertLayersEqual (t , base , layers [0 ])
289
- assertLayersEqual (t , layer1a , layers [1 ])
290
- assertLayersEqual (t , leafa , layers [2 ])
272
+ expectedLineage := expected .Lineage
273
+ if skipLineage {
274
+ expectedLineage = ""
275
+ }
276
+ assert .Equal (t , expectedLineage , actual .Lineage , "Lineage mismatch" )
277
+ }
291
278
292
- layers , err = datastore .GetRHELv2Layers ("sha256:leaf" , "lineage-b" )
293
- require .NoError (t , err )
294
- require .Len (t , layers , 3 )
279
+ t .Run ("enabled" , func (t * testing.T ) {
280
+ t .Setenv (env .RHLineage .EnvVar (), "true" )
281
+
282
+ datastore := prepDataStore (t , "RHELv2LayerLineage_enabled" )
283
+ defer datastore .Close ()
284
+
285
+ // The DB will resemble:
286
+ // id | hash | parent_hash | dist | cpes | lineage | parent_lineage
287
+ // ----+-----------------+-----------------+--------+----------------+-----------+----------------
288
+ // 1 | sha256:base | | rhel:8 | | |
289
+ // 2 | sha256:layer1-a | sha256:base | rhel:8 | {cpe-a,cpe2-a} | lineage |
290
+ // 3 | sha256:layer1-b | sha256:base | rhel:8 | {cpe-b,cpe2-b} | lineage |
291
+ // 4 | sha256:leaf | sha256:layer1-a | rhel:8 | | lineage-a | lineage
292
+ // 5 | sha256:leaf | sha256:layer1-b | rhel:8 | | lineage-b | lineage
293
+
294
+ layers , err := datastore .GetRHELv2Layers ("sha256:leaf" , "lineage-a" )
295
+ require .NoError (t , err )
296
+ require .Len (t , layers , 3 )
297
+
298
+ assertLayersEqual (t , base , layers [0 ], false )
299
+ assertLayersEqual (t , layer1a , layers [1 ], false )
300
+ assertLayersEqual (t , leafa , layers [2 ], false )
301
+
302
+ layers , err = datastore .GetRHELv2Layers ("sha256:leaf" , "lineage-b" )
303
+ require .NoError (t , err )
304
+ require .Len (t , layers , 3 )
305
+
306
+ assertLayersEqual (t , base , layers [0 ], false )
307
+ assertLayersEqual (t , layer1b , layers [1 ], false )
308
+ assertLayersEqual (t , leafb , layers [2 ], false )
309
+ })
310
+
311
+ t .Run ("disable" , func (t * testing.T ) {
312
+ t .Setenv (env .RHLineage .EnvVar (), "false" )
313
+
314
+ datastore := prepDataStore (t , "RHELv2LayerLineage_disabled" )
315
+ defer datastore .Close ()
316
+
317
+ // The DB will resemble:
318
+ // id | hash | parent_hash | dist | cpes | lineage | parent_lineage
319
+ // ----+-----------------+-----------------+--------+----------------+---------+----------------
320
+ // 1 | sha256:base | | rhel:8 | | |
321
+ // 2 | sha256:layer1-a | sha256:base | rhel:8 | {cpe-a,cpe2-a} | |
322
+ // 3 | sha256:layer1-b | sha256:base | rhel:8 | {cpe-b,cpe2-b} | |
323
+ // 4 | sha256:leaf | sha256:layer1-a | rhel:8 | | |
324
+ //
325
+ // Note: only the first leaf layer will be inserted (due to the insert
326
+ // query 'ON CONFLICT DO NOTHING' clause)
327
+
328
+ layers , err := datastore .GetRHELv2Layers ("sha256:leaf" , "lineage-a" )
329
+ require .NoError (t , err )
330
+ require .Len (t , layers , 3 )
331
+
332
+ assertLayersEqual (t , base , layers [0 ], true )
333
+ assertLayersEqual (t , layer1a , layers [1 ], true )
334
+ assertLayersEqual (t , leafa , layers [2 ], true )
335
+
336
+ layers , err = datastore .GetRHELv2Layers ("sha256:leaf" , "lineage-b" )
337
+ require .NoError (t , err )
338
+ require .Len (t , layers , 3 )
339
+
340
+ assertLayersEqual (t , base , layers [0 ], true )
341
+ assertLayersEqual (t , layer1a , layers [1 ], true ) // the bug, would expect layer1b to be here
342
+ assertLayersEqual (t , leafb , layers [2 ], true )
343
+ })
295
344
296
- assertLayersEqual (t , base , layers [0 ])
297
- assertLayersEqual (t , layer1b , layers [1 ])
298
- assertLayersEqual (t , leafb , layers [2 ])
299
345
}
300
346
301
347
// resetPackageIDs sets all package IDs to 0. Package IDs are DB sequence numbers
0 commit comments