55 lines
3.1 KiB
Go
55 lines
3.1 KiB
Go
package main
|
|
|
|
import "testing"
|
|
|
|
func inventoryFixture() *securityData {
|
|
return &securityData{
|
|
Layer: &securityLayer{Name: testDigest, Features: &[]securityFeature{{Name: "busybox", Version: "1.37.0-r30", AddedBy: testDigest}}},
|
|
Inventory: &scanInventory{Hash: testDigest,
|
|
Packages: map[string]*scanPackage{"p": {ID: "p", Name: "busybox", Version: "1.37.0-r30", Kind: "binary", Source: &scanPackage{Name: "busybox", Kind: "source"}}},
|
|
Distributions: map[string]*scanDistribution{"d": {ID: "d", DID: "alpine", Version: "3.23", Name: "Alpine Linux", PrettyName: "Alpine Linux v3.23"}},
|
|
Environments: map[string][]*scanEnvironment{"p": {{PackageDB: "lib/apk/db/installed", IntroducedIn: testDigest, DistributionID: "d"}}},
|
|
},
|
|
}
|
|
}
|
|
|
|
func TestInventory(t *testing.T) {
|
|
for _, test := range []struct {
|
|
name string
|
|
mutate func(*securityData)
|
|
}{
|
|
{"qualified", func(*securityData) {}},
|
|
{"missing", func(d *securityData) { d.Inventory = nil }},
|
|
{"identity", func(d *securityData) { d.Inventory.Hash = childDigest }},
|
|
{"layer identity", func(d *securityData) { d.Layer.Name = childDigest }},
|
|
{"empty", func(d *securityData) { d.Inventory.Packages = nil }},
|
|
{"no distribution", func(d *securityData) { d.Inventory.Distributions = nil }},
|
|
{"Amazon Linux", func(d *securityData) { d.Inventory.Distributions["d"].DID = "amzn" }},
|
|
{"RHEL", func(d *securityData) { d.Inventory.Distributions["d"].DID = "rhel" }},
|
|
{"unknown", func(d *securityData) { d.Inventory.Distributions["d"].DID = "unknown" }},
|
|
{"unqualified release", func(d *securityData) { d.Inventory.Distributions["d"].Version = "3.2" }},
|
|
{"missing package", func(d *securityData) { d.Inventory.Packages["p"] = nil }},
|
|
{"invalid version", func(d *securityData) { d.Inventory.Packages["p"].Version = "invalid" }},
|
|
{"missing source", func(d *securityData) { d.Inventory.Packages["p"].Source = nil }},
|
|
{"empty source", func(d *securityData) { d.Inventory.Packages["p"].Source.Name = "" }},
|
|
{"foreign package", func(d *securityData) { d.Inventory.Packages["p"].Kind = "python" }},
|
|
{"missing environment", func(d *securityData) { d.Inventory.Environments["p"] = nil }},
|
|
{"foreign layer", func(d *securityData) { d.Inventory.Environments["p"][0].IntroducedIn = childDigest }},
|
|
{"foreign database", func(d *securityData) { d.Inventory.Environments["p"][0].PackageDB = "var/lib/rpm" }},
|
|
{"second environment", func(d *securityData) {
|
|
d.Inventory.Environments["p"] = append(d.Inventory.Environments["p"], &scanEnvironment{PackageDB: "var/lib/rpm"})
|
|
}},
|
|
{"missing features", func(d *securityData) { *d.Layer.Features = nil }},
|
|
{"wrong feature", func(d *securityData) { (*d.Layer.Features)[0].Version = "1-r1" }},
|
|
{"duplicate feature", func(d *securityData) { *d.Layer.Features = append(*d.Layer.Features, (*d.Layer.Features)[0]) }},
|
|
} {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
data := inventoryFixture()
|
|
test.mutate(data)
|
|
err := checkInventory(data, testDigest, map[string]bool{testDigest: true})
|
|
if (err == nil) != (test.name == "qualified") {
|
|
t.Fatalf("unexpected inventory verdict: %v", err)
|
|
}
|
|
})
|
|
}
|
|
}
|