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) } }) } }