Skip to content

Commit e145a5c

Browse files
committed
add more tests
1 parent c79d9cf commit e145a5c

File tree

2 files changed

+158
-6
lines changed

2 files changed

+158
-6
lines changed

database/pgsql/rhelv2_layer_test.go

Lines changed: 115 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/stackrox/scanner/database"
1010
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
1112
)
1213

1314
func TestInsertRHELv2Layer(t *testing.T) {
@@ -181,20 +182,128 @@ func TestGetRHELv2Layers(t *testing.T) {
181182
assert.Len(t, layers, 3)
182183
layer = layers[2]
183184
assert.Equal(t, "sha256:howdyhowdyhowdy", layer.Hash)
184-
for _, pkg := range layer.Pkgs {
185-
pkg.ID = 0
186-
}
185+
resetPackageIDs(layer)
187186
assert.Equal(t, layer2Pkgs, layer.Pkgs)
188187
assert.Equal(t, layer2CPEs, layer.CPEs)
189188
layer = layers[1]
190189
assert.Equal(t, "sha256:howdyhowdy", layer.Hash)
191-
for _, pkg := range layer.Pkgs {
192-
pkg.ID = 0
193-
}
190+
resetPackageIDs(layer)
194191
assert.Equal(t, layer1Pkgs, layer.Pkgs)
195192
assert.Equal(t, layer1CPEs, layer.CPEs)
196193
layer = layers[0]
197194
assert.Equal(t, "sha256:howdy", layer.Hash)
198195
assert.Empty(t, layer.Pkgs)
199196
assert.Empty(t, layer.CPEs)
200197
}
198+
199+
// TestRHELv2LayerLineage verifies that data for duplicate layers with different parent
200+
// layers (lineage) is pulled correctly.
201+
func TestRHELv2LayerLineage(t *testing.T) {
202+
203+
datastore, err := openDatabaseForTest("RHELv2LayerLineage", false)
204+
if err != nil {
205+
t.Error(err)
206+
return
207+
}
208+
defer datastore.Close()
209+
210+
// Two 'fake' images will be created, each with 3 layers, the DB will resemble:
211+
// id | hash | parent_hash | dist | cpes | lineage | parent_lineage
212+
// ----+-----------------+-----------------+--------+----------------+-----------+----------------
213+
// 1 | sha256:base | | rhel:8 | | |
214+
// 2 | sha256:layer1-a | sha256:base | rhel:8 | {cpe-a,cpe2-a} | lineage |
215+
// 3 | sha256:layer1-b | sha256:base | rhel:8 | {cpe-b,cpe2-b} | lineage |
216+
// 4 | sha256:leaf | sha256:layer1-a | rhel:8 | | lineage-a | lineage
217+
// 5 | sha256:leaf | sha256:layer1-b | rhel:8 | | lineage-b | lineage
218+
219+
// base layers
220+
base := &database.RHELv2Layer{
221+
Hash: "sha256:base",
222+
Dist: "rhel:8",
223+
}
224+
225+
err = datastore.InsertRHELv2Layer(base)
226+
require.NoError(t, err)
227+
228+
layer1a := &database.RHELv2Layer{
229+
Hash: "sha256:layer1-a",
230+
Lineage: "lineage",
231+
ParentHash: "sha256:base",
232+
ParentLineage: "",
233+
Dist: "rhel:8",
234+
Pkgs: []*database.RHELv2Package{
235+
{Name: "pkg", Version: "v1-a", Arch: "x86_64"},
236+
{Name: "pkg2", Version: "v2-a", Module: "module", Arch: "i686"},
237+
},
238+
CPEs: []string{"cpe-a", "cpe2-a"},
239+
}
240+
241+
layer1b := &database.RHELv2Layer{
242+
Hash: "sha256:layer1-b",
243+
Lineage: "lineage",
244+
ParentHash: "sha256:base",
245+
ParentLineage: "",
246+
Dist: "rhel:8",
247+
Pkgs: []*database.RHELv2Package{
248+
{Name: "pkg", Version: "v1-b", Arch: "x86_64"},
249+
{Name: "pkg2", Version: "v2-b", Module: "module", Arch: "i686"},
250+
},
251+
CPEs: []string{"cpe-b", "cpe2-b"},
252+
}
253+
254+
err = datastore.InsertRHELv2Layer(layer1a)
255+
require.NoError(t, err)
256+
err = datastore.InsertRHELv2Layer(layer1b)
257+
require.NoError(t, err)
258+
259+
leafa := &database.RHELv2Layer{
260+
Hash: "sha256:leaf", // for this test all leafs should have same digest
261+
Lineage: "lineage-a", // lineage is specific to layer A
262+
ParentHash: "sha256:layer1-a",
263+
ParentLineage: "lineage",
264+
Dist: "rhel:8",
265+
}
266+
267+
var leafb = new(database.RHELv2Layer)
268+
*leafb = *leafa
269+
leafb.Lineage = "lineage-b"
270+
leafb.ParentHash = "sha256:layer1-b"
271+
272+
err = datastore.InsertRHELv2Layer(leafa)
273+
require.NoError(t, err)
274+
err = datastore.InsertRHELv2Layer(leafb)
275+
require.NoError(t, err)
276+
277+
assertLayersEqual := func(t *testing.T, expected, actual *database.RHELv2Layer) {
278+
resetPackageIDs(actual)
279+
assert.Equal(t, expected.Hash, actual.Hash, "Hash mismatch")
280+
assert.Equal(t, expected.Lineage, actual.Lineage, "Lineage mismatch")
281+
assert.Equal(t, expected.CPEs, actual.CPEs, "CPEs mistmatch")
282+
assert.Equal(t, expected.Pkgs, actual.Pkgs, "Pkgs mismatch")
283+
}
284+
285+
layers, err := datastore.GetRHELv2Layers("sha256:leaf", "lineage-a")
286+
require.NoError(t, err)
287+
require.Len(t, layers, 3)
288+
289+
assertLayersEqual(t, base, layers[0])
290+
assertLayersEqual(t, layer1a, layers[1])
291+
assertLayersEqual(t, leafa, layers[2])
292+
293+
layers, err = datastore.GetRHELv2Layers("sha256:leaf", "lineage-b")
294+
require.NoError(t, err)
295+
require.Len(t, layers, 3)
296+
297+
assertLayersEqual(t, base, layers[0])
298+
assertLayersEqual(t, layer1b, layers[1])
299+
assertLayersEqual(t, leafb, layers[2])
300+
}
301+
302+
// resetPackageIDs sets all package IDs to 0. Package IDs are DB sequence numbers
303+
// that will not be deterministic (depending on how tests are written), therefore
304+
// set the IDs to 0 to allow tests pass.
305+
func resetPackageIDs(layer *database.RHELv2Layer) {
306+
for _, pkg := range layer.Pkgs {
307+
pkg.ID = 0
308+
}
309+
}

e2etests/testcase_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4773,4 +4773,47 @@ All OpenShift Container Platform 4.10 users are advised to upgrade to these upda
47734773
},
47744774
},
47754775
},
4776+
// START: Lineage Tests
4777+
// The order of the next tests is important, the intent is to reproduce the conditions described in ROX-26604
4778+
// in which differing parent layers were not properly handled leading to inaccuracies. These images share top
4779+
// and bottom layers, middle layers differ.
4780+
// Dockerfiles at: github.com/stackrox/stackrox/qa-tests-backend/test-images/lineage
4781+
{
4782+
image: "quay.io/rhacs-eng/qa:lineage-jdk-17.0.11",
4783+
registry: "https://quay.io",
4784+
source: "Red Hat",
4785+
username: os.Getenv("QUAY_RHACS_ENG_RO_USERNAME"),
4786+
password: os.Getenv("QUAY_RHACS_ENG_RO_PASSWORD"),
4787+
onlyCheckSpecifiedVulns: true,
4788+
namespace: "rhel:8",
4789+
expectedFeatures: []apiV1.Feature{
4790+
{
4791+
Name: "java-17-openjdk-headless",
4792+
NamespaceName: "rhel:8",
4793+
VersionFormat: "rpm",
4794+
Version: "1:17.0.11.0.9-2.el8.x86_64",
4795+
FixedBy: "1:17.0.13.0.11-3.el8",
4796+
AddedBy: "sha256:06c7a3d491f551a56296ccb9bee8a68c83776991e73a9005e8b5ebb533002097",
4797+
},
4798+
},
4799+
},
4800+
{
4801+
image: "quay.io/rhacs-eng/qa:lineage-jdk-17.0.13",
4802+
registry: "https://quay.io",
4803+
source: "Red Hat",
4804+
username: os.Getenv("QUAY_RHACS_ENG_RO_USERNAME"),
4805+
password: os.Getenv("QUAY_RHACS_ENG_RO_PASSWORD"),
4806+
onlyCheckSpecifiedVulns: true,
4807+
namespace: "rhel:8",
4808+
expectedFeatures: []apiV1.Feature{
4809+
{
4810+
Name: "java-17-openjdk-headless",
4811+
NamespaceName: "rhel:8",
4812+
VersionFormat: "rpm",
4813+
Version: "1:17.0.13.0.11-3.el8.x86_64",
4814+
AddedBy: "sha256:2f7b9495af5ddc85b0be7ca9411fddb54f37999ea73b03cbf1115dd0c5bd4f95",
4815+
},
4816+
},
4817+
},
4818+
// END: Lineage Tests
47764819
}

0 commit comments

Comments
 (0)