update cataloger tests to use pkgtest utils (#1287)

Signed-off-by: Alex Goodman <alex.goodman@anchore.com>

Signed-off-by: Alex Goodman <alex.goodman@anchore.com>
This commit is contained in:
Alex Goodman 2022-10-25 11:20:02 -04:00 committed by GitHub
parent c7a653060d
commit bd5adbc9b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 182 additions and 254 deletions

View File

@ -6,7 +6,8 @@ import (
"testing" "testing"
"time" "time"
"github.com/go-test/deep" "github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/require"
"github.com/anchore/syft/syft/file" "github.com/anchore/syft/syft/file"
"github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/pkg"
@ -89,33 +90,21 @@ func TestDatabaseParser(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
file, err := os.Open("test-fixtures/files") f, err := os.Open("test-fixtures/files")
if err != nil { require.NoError(t, err)
t.Fatal("Unable to read test-fixtures/file: ", err) t.Cleanup(func() { require.NoError(t, f.Close()) })
}
defer func() {
err := file.Close()
if err != nil {
t.Fatal("closing file failed:", err)
}
}()
reader := bufio.NewReader(file) reader := bufio.NewReader(f)
entry, err := parseAlpmDBEntry(reader) entry, err := parseAlpmDBEntry(reader)
if err != nil { require.NoError(t, err)
t.Fatal("Unable to read file contents: ", err)
if diff := cmp.Diff(entry.Files, test.expected.Files); diff != "" {
t.Errorf("Files mismatch (-want +got):\n%s", diff)
} }
if diff := deep.Equal(entry.Files, test.expected.Files); diff != nil { if diff := cmp.Diff(entry.Backup, test.expected.Backup); diff != "" {
for _, d := range diff { t.Errorf("Backup mismatch (-want +got):\n%s", diff)
t.Errorf("files diff: %+v", d)
}
}
if diff := deep.Equal(entry.Backup, test.expected.Backup); diff != nil {
for _, d := range diff {
t.Errorf("backup diff: %+v", d)
}
} }
}) })
} }
@ -167,28 +156,17 @@ func TestMtreeParse(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
file, err := os.Open("test-fixtures/mtree") f, err := os.Open("test-fixtures/mtree")
if err != nil { require.NoError(t, err)
t.Fatal("Unable to read test-fixtures/mtree: ", err) t.Cleanup(func() { require.NoError(t, f.Close()) })
}
defer func() {
err := file.Close()
if err != nil {
t.Fatal("closing file failed:", err)
}
}()
reader := bufio.NewReader(file) reader := bufio.NewReader(f)
entry, err := parseMtree(reader) entry, err := parseMtree(reader)
if err != nil { require.NoError(t, err)
t.Fatal("Unable to read file contents: ", err)
}
if diff := deep.Equal(entry, test.expected); diff != nil { if diff := cmp.Diff(entry, test.expected); diff != "" {
for _, d := range diff { t.Errorf("Files mismatch (-want +got):\n%s", diff)
t.Errorf("files diff: %+v", d)
}
} }
}) })
} }

View File

@ -5,14 +5,16 @@ import (
"os" "os"
"testing" "testing"
"github.com/go-test/deep" "github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/anchore/syft/syft/artifact"
"github.com/anchore/syft/syft/file" "github.com/anchore/syft/syft/file"
"github.com/anchore/syft/syft/linux" "github.com/anchore/syft/syft/linux"
"github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/pkg"
"github.com/anchore/syft/syft/pkg/cataloger/generic" "github.com/anchore/syft/syft/pkg/cataloger/generic"
"github.com/anchore/syft/syft/pkg/cataloger/internal/pkgtest"
"github.com/anchore/syft/syft/source" "github.com/anchore/syft/syft/source"
) )
@ -57,28 +59,17 @@ func TestExtraFileAttributes(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
file, err := os.Open("test-fixtures/extra-file-attributes") f, err := os.Open("test-fixtures/extra-file-attributes")
if err != nil { require.NoError(t, err)
t.Fatal("Unable to read test-fixtures/extra-file-attributes: ", err) t.Cleanup(func() { require.NoError(t, f.Close()) })
}
defer func() {
err := file.Close()
if err != nil {
t.Fatal("closing file failed:", err)
}
}()
reader := bufio.NewReader(file) reader := bufio.NewReader(f)
entry, err := parseApkDBEntry(reader) entry, err := parseApkDBEntry(reader)
if err != nil { require.NoError(t, err)
t.Fatal("Unable to read file contents: ", err)
}
if diff := deep.Equal(entry.Files, test.expected.Files); diff != nil { if diff := cmp.Diff(entry.Files, test.expected.Files); diff != "" {
for _, d := range diff { t.Errorf("Files mismatch (-want +got):\n%s", diff)
t.Errorf("diff: %+v", d)
}
} }
}) })
} }
@ -623,36 +614,33 @@ func TestSinglePackageDetails(t *testing.T) {
t.Run(test.fixture, func(t *testing.T) { t.Run(test.fixture, func(t *testing.T) {
f, err := os.Open(test.fixture) f, err := os.Open(test.fixture)
require.NoError(t, err) require.NoError(t, err)
t.Cleanup(func() { f.Close() }) t.Cleanup(func() { require.NoError(t, f.Close()) })
reader := bufio.NewReader(f) reader := bufio.NewReader(f)
entry, err := parseApkDBEntry(reader) entry, err := parseApkDBEntry(reader)
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, entry)
if diff := deep.Equal(*entry, test.expected); diff != nil { if diff := cmp.Diff(*entry, test.expected); diff != "" {
for _, d := range diff { t.Errorf("Entry mismatch (-want +got):\n%s", diff)
t.Errorf("diff: %+v", d)
}
} }
}) })
} }
} }
func TestMultiplePackages(t *testing.T) { func TestMultiplePackages(t *testing.T) {
tests := []struct {
fixture string fixture := "test-fixtures/multiple"
expected []pkg.Package fixtureLocationSet := source.NewLocationSet(source.NewLocation(fixture))
}{ expected := []pkg.Package{
{
fixture: "test-fixtures/multiple",
expected: []pkg.Package{
{ {
Name: "libc-utils", Name: "libc-utils",
Version: "0.7.2-r0", Version: "0.7.2-r0",
Licenses: []string{"BSD"}, Licenses: []string{"BSD"},
Type: pkg.ApkPkg, Type: pkg.ApkPkg,
PURL: "pkg:alpine/libc-utils@0.7.2-r0?arch=x86_64&upstream=libc-dev&distro=alpine", PURL: "pkg:alpine/libc-utils@0.7.2-r0?arch=x86_64&upstream=libc-dev&distro=alpine-3.12",
Locations: fixtureLocationSet,
MetadataType: pkg.ApkMetadataType, MetadataType: pkg.ApkMetadataType,
Metadata: pkg.ApkMetadata{ Metadata: pkg.ApkMetadata{
Package: "libc-utils", Package: "libc-utils",
@ -676,7 +664,8 @@ func TestMultiplePackages(t *testing.T) {
Version: "1.1.24-r2", Version: "1.1.24-r2",
Licenses: []string{"MIT", "BSD", "GPL2+"}, Licenses: []string{"MIT", "BSD", "GPL2+"},
Type: pkg.ApkPkg, Type: pkg.ApkPkg,
PURL: "pkg:alpine/musl-utils@1.1.24-r2?arch=x86_64&upstream=musl&distro=alpine", PURL: "pkg:alpine/musl-utils@1.1.24-r2?arch=x86_64&upstream=musl&distro=alpine-3.12",
Locations: fixtureLocationSet,
MetadataType: pkg.ApkMetadataType, MetadataType: pkg.ApkMetadataType,
Metadata: pkg.ApkMetadata{ Metadata: pkg.ApkMetadata{
Package: "musl-utils", Package: "musl-utils",
@ -755,41 +744,18 @@ func TestMultiplePackages(t *testing.T) {
}, },
}, },
}, },
},
},
} }
for _, test := range tests { // TODO: relationships are not under test
t.Run(test.fixture, func(t *testing.T) { var expectedRelationships []artifact.Relationship
f, err := os.Open(test.fixture)
require.NoError(t, err)
t.Cleanup(func() { f.Close() })
// TODO: no relationships are under test yet env := generic.Environment{LinuxRelease: &linux.Release{
pkgs, _, err := parseApkDB(nil, &generic.Environment{
LinuxRelease: &linux.Release{
ID: "alpine", ID: "alpine",
}, VersionID: "3.12",
}, source.LocationReadCloser{ }}
Location: source.NewLocation(f.Name()),
ReadCloser: f,
})
require.NoError(t, err)
if len(pkgs) != 2 { pkgtest.TestGenericParserWithEnv(t, fixture, parseApkDB, &env, expected, expectedRelationships)
t.Fatalf("unexpected number of entries: %d", len(pkgs))
}
for idx, entry := range pkgs {
if diff := deep.Equal(entry, test.expected[idx]); diff != nil {
for _, d := range diff {
t.Errorf("diff: %+v", d)
}
}
}
})
}
} }
func Test_processChecksum(t *testing.T) { func Test_processChecksum(t *testing.T) {

View File

@ -1,22 +1,23 @@
package cpp package cpp
import ( import (
"os"
"testing" "testing"
"github.com/go-test/deep" "github.com/anchore/syft/syft/artifact"
"github.com/stretchr/testify/require"
"github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/pkg"
"github.com/anchore/syft/syft/pkg/cataloger/internal/pkgtest"
"github.com/anchore/syft/syft/source" "github.com/anchore/syft/syft/source"
) )
func TestParseConanfile(t *testing.T) { func TestParseConanfile(t *testing.T) {
fixture := "test-fixtures/conanfile.txt"
fixtureLocationSet := source.NewLocationSet(source.NewLocation(fixture))
expected := []pkg.Package{ expected := []pkg.Package{
{ {
Name: "catch2", Name: "catch2",
Version: "2.13.8", Version: "2.13.8",
PURL: "pkg:conan/catch2@2.13.8", PURL: "pkg:conan/catch2@2.13.8",
Locations: fixtureLocationSet,
Language: pkg.CPP, Language: pkg.CPP,
Type: pkg.ConanPkg, Type: pkg.ConanPkg,
MetadataType: pkg.ConanMetadataType, MetadataType: pkg.ConanMetadataType,
@ -28,6 +29,7 @@ func TestParseConanfile(t *testing.T) {
Name: "docopt.cpp", Name: "docopt.cpp",
Version: "0.6.3", Version: "0.6.3",
PURL: "pkg:conan/docopt.cpp@0.6.3", PURL: "pkg:conan/docopt.cpp@0.6.3",
Locations: fixtureLocationSet,
Language: pkg.CPP, Language: pkg.CPP,
Type: pkg.ConanPkg, Type: pkg.ConanPkg,
MetadataType: pkg.ConanMetadataType, MetadataType: pkg.ConanMetadataType,
@ -39,6 +41,7 @@ func TestParseConanfile(t *testing.T) {
Name: "fmt", Name: "fmt",
Version: "8.1.1", Version: "8.1.1",
PURL: "pkg:conan/fmt@8.1.1", PURL: "pkg:conan/fmt@8.1.1",
Locations: fixtureLocationSet,
Language: pkg.CPP, Language: pkg.CPP,
Type: pkg.ConanPkg, Type: pkg.ConanPkg,
MetadataType: pkg.ConanMetadataType, MetadataType: pkg.ConanMetadataType,
@ -50,6 +53,7 @@ func TestParseConanfile(t *testing.T) {
Name: "spdlog", Name: "spdlog",
Version: "1.9.2", Version: "1.9.2",
PURL: "pkg:conan/spdlog@1.9.2", PURL: "pkg:conan/spdlog@1.9.2",
Locations: fixtureLocationSet,
Language: pkg.CPP, Language: pkg.CPP,
Type: pkg.ConanPkg, Type: pkg.ConanPkg,
MetadataType: pkg.ConanMetadataType, MetadataType: pkg.ConanMetadataType,
@ -61,6 +65,7 @@ func TestParseConanfile(t *testing.T) {
Name: "sdl", Name: "sdl",
Version: "2.0.20", Version: "2.0.20",
PURL: "pkg:conan/sdl@2.0.20", PURL: "pkg:conan/sdl@2.0.20",
Locations: fixtureLocationSet,
Language: pkg.CPP, Language: pkg.CPP,
Type: pkg.ConanPkg, Type: pkg.ConanPkg,
MetadataType: pkg.ConanMetadataType, MetadataType: pkg.ConanMetadataType,
@ -72,6 +77,7 @@ func TestParseConanfile(t *testing.T) {
Name: "fltk", Name: "fltk",
Version: "1.3.8", Version: "1.3.8",
PURL: "pkg:conan/fltk@1.3.8", PURL: "pkg:conan/fltk@1.3.8",
Locations: fixtureLocationSet,
Language: pkg.CPP, Language: pkg.CPP,
Type: pkg.ConanPkg, Type: pkg.ConanPkg,
MetadataType: pkg.ConanMetadataType, MetadataType: pkg.ConanMetadataType,
@ -81,18 +87,8 @@ func TestParseConanfile(t *testing.T) {
}, },
} }
fixture, err := os.Open("test-fixtures/conanfile.txt") // TODO: relationships are not under test
require.NoError(t, err) var expectedRelationships []artifact.Relationship
// TODO: no relationships are under test yet pkgtest.TestGenericParser(t, fixture, parseConanfile, expected, expectedRelationships)
actual, _, err := parseConanfile(nil, nil, source.LocationReadCloser{
Location: source.NewLocation(fixture.Name()),
ReadCloser: fixture,
})
require.NoError(t, err)
differences := deep.Equal(expected, actual)
if differences != nil {
t.Errorf("returned package list differed from expectation: %+v", differences)
}
} }

View File

@ -1,22 +1,22 @@
package cpp package cpp
import ( import (
"os"
"testing" "testing"
"github.com/go-test/deep" "github.com/anchore/syft/syft/artifact"
"github.com/stretchr/testify/require"
"github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/pkg"
"github.com/anchore/syft/syft/pkg/cataloger/internal/pkgtest"
"github.com/anchore/syft/syft/source" "github.com/anchore/syft/syft/source"
) )
func TestParseConanlock(t *testing.T) { func TestParseConanlock(t *testing.T) {
fixture := "test-fixtures/conan.lock"
expected := []pkg.Package{ expected := []pkg.Package{
{ {
Name: "zlib", Name: "zlib",
Version: "1.2.12", Version: "1.2.12",
PURL: "pkg:conan/zlib@1.2.12", PURL: "pkg:conan/zlib@1.2.12",
Locations: source.NewLocationSet(source.NewLocation(fixture)),
Language: pkg.CPP, Language: pkg.CPP,
Type: pkg.ConanPkg, Type: pkg.ConanPkg,
MetadataType: pkg.ConanLockMetadataType, MetadataType: pkg.ConanLockMetadataType,
@ -32,18 +32,8 @@ func TestParseConanlock(t *testing.T) {
}, },
} }
fixture, err := os.Open("test-fixtures/conan.lock") // TODO: relationships are not under test
require.NoError(t, err) var expectedRelationships []artifact.Relationship
// TODO: no relationships are under test yet pkgtest.TestGenericParser(t, fixture, parseConanlock, expected, expectedRelationships)
actual, _, err := parseConanlock(nil, nil, source.LocationReadCloser{
Location: source.NewLocation(fixture.Name()),
ReadCloser: fixture,
})
require.NoError(t, err)
differences := deep.Equal(expected, actual)
if differences != nil {
t.Errorf("returned package list differed from expectation: %+v", differences)
}
} }

View File

@ -1,22 +1,23 @@
package dart package dart
import ( import (
"os"
"testing" "testing"
"github.com/go-test/deep" "github.com/anchore/syft/syft/artifact"
"github.com/stretchr/testify/require"
"github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/pkg"
"github.com/anchore/syft/syft/pkg/cataloger/internal/pkgtest"
"github.com/anchore/syft/syft/source" "github.com/anchore/syft/syft/source"
) )
func TestParsePubspecLock(t *testing.T) { func TestParsePubspecLock(t *testing.T) {
fixture := "test-fixtures/pubspec.lock"
fixtureLocationSet := source.NewLocationSet(source.NewLocation(fixture))
expected := []pkg.Package{ expected := []pkg.Package{
{ {
Name: "ale", Name: "ale",
Version: "3.3.0", Version: "3.3.0",
PURL: "pkg:pub/ale@3.3.0?hosted_url=pub.hosted.org", PURL: "pkg:pub/ale@3.3.0?hosted_url=pub.hosted.org",
Locations: fixtureLocationSet,
Language: pkg.Dart, Language: pkg.Dart,
Type: pkg.DartPubPkg, Type: pkg.DartPubPkg,
MetadataType: pkg.DartPubMetadataType, MetadataType: pkg.DartPubMetadataType,
@ -30,6 +31,7 @@ func TestParsePubspecLock(t *testing.T) {
Name: "analyzer", Name: "analyzer",
Version: "0.40.7", Version: "0.40.7",
PURL: "pkg:pub/analyzer@0.40.7", PURL: "pkg:pub/analyzer@0.40.7",
Locations: fixtureLocationSet,
Language: pkg.Dart, Language: pkg.Dart,
Type: pkg.DartPubPkg, Type: pkg.DartPubPkg,
MetadataType: pkg.DartPubMetadataType, MetadataType: pkg.DartPubMetadataType,
@ -42,6 +44,7 @@ func TestParsePubspecLock(t *testing.T) {
Name: "ansicolor", Name: "ansicolor",
Version: "1.1.1", Version: "1.1.1",
PURL: "pkg:pub/ansicolor@1.1.1", PURL: "pkg:pub/ansicolor@1.1.1",
Locations: fixtureLocationSet,
Language: pkg.Dart, Language: pkg.Dart,
Type: pkg.DartPubPkg, Type: pkg.DartPubPkg,
MetadataType: pkg.DartPubMetadataType, MetadataType: pkg.DartPubMetadataType,
@ -54,6 +57,7 @@ func TestParsePubspecLock(t *testing.T) {
Name: "archive", Name: "archive",
Version: "2.0.13", Version: "2.0.13",
PURL: "pkg:pub/archive@2.0.13", PURL: "pkg:pub/archive@2.0.13",
Locations: fixtureLocationSet,
Language: pkg.Dart, Language: pkg.Dart,
Type: pkg.DartPubPkg, Type: pkg.DartPubPkg,
MetadataType: pkg.DartPubMetadataType, MetadataType: pkg.DartPubMetadataType,
@ -66,6 +70,7 @@ func TestParsePubspecLock(t *testing.T) {
Name: "args", Name: "args",
Version: "1.6.0", Version: "1.6.0",
PURL: "pkg:pub/args@1.6.0", PURL: "pkg:pub/args@1.6.0",
Locations: fixtureLocationSet,
Language: pkg.Dart, Language: pkg.Dart,
Type: pkg.DartPubPkg, Type: pkg.DartPubPkg,
MetadataType: pkg.DartPubMetadataType, MetadataType: pkg.DartPubMetadataType,
@ -78,6 +83,7 @@ func TestParsePubspecLock(t *testing.T) {
Name: "key_binder", Name: "key_binder",
Version: "1.11.20", Version: "1.11.20",
PURL: "pkg:pub/key_binder@1.11.20?vcs_url=git%40github.com:Workiva/key_binder.git%403f7b3a6350e73c7dcac45301c0e18fbd42af02f7", PURL: "pkg:pub/key_binder@1.11.20?vcs_url=git%40github.com:Workiva/key_binder.git%403f7b3a6350e73c7dcac45301c0e18fbd42af02f7",
Locations: fixtureLocationSet,
Language: pkg.Dart, Language: pkg.Dart,
Type: pkg.DartPubPkg, Type: pkg.DartPubPkg,
MetadataType: pkg.DartPubMetadataType, MetadataType: pkg.DartPubMetadataType,
@ -89,18 +95,8 @@ func TestParsePubspecLock(t *testing.T) {
}, },
} }
fixture, err := os.Open("test-fixtures/pubspec.lock") // TODO: relationships are not under test
require.NoError(t, err) var expectedRelationships []artifact.Relationship
// TODO: no relationships are under test yet pkgtest.TestGenericParser(t, fixture, parsePubspecLock, expected, expectedRelationships)
actual, _, err := parsePubspecLock(nil, nil, source.LocationReadCloser{
Location: source.NewLocation(fixture.Name()),
ReadCloser: fixture,
})
require.NoError(t, err)
differences := deep.Equal(expected, actual)
if differences != nil {
t.Errorf("returned package list differed from expectation: %+v", differences)
}
} }

View File

@ -14,10 +14,12 @@ import (
) )
func TestGenericParser(t *testing.T, fixturePath string, parser generic.Parser, expectedPkgs []pkg.Package, expectedRelationships []artifact.Relationship) { func TestGenericParser(t *testing.T, fixturePath string, parser generic.Parser, expectedPkgs []pkg.Package, expectedRelationships []artifact.Relationship) {
t.Helper()
TestGenericParserWithEnv(t, fixturePath, parser, nil, expectedPkgs, expectedRelationships) TestGenericParserWithEnv(t, fixturePath, parser, nil, expectedPkgs, expectedRelationships)
} }
func TestGenericParserWithEnv(t *testing.T, fixturePath string, parser generic.Parser, env *generic.Environment, expectedPkgs []pkg.Package, expectedRelationships []artifact.Relationship) { func TestGenericParserWithEnv(t *testing.T, fixturePath string, parser generic.Parser, env *generic.Environment, expectedPkgs []pkg.Package, expectedRelationships []artifact.Relationship) {
t.Helper()
fixture, err := os.Open(fixturePath) fixture, err := os.Open(fixturePath)
require.NoError(t, err) require.NoError(t, err)