mirror of
https://github.com/anchore/syft.git
synced 2025-11-17 08:23:15 +01:00
173 lines
4.3 KiB
Go
173 lines
4.3 KiB
Go
package poweruser
|
|
|
|
import (
|
|
"bytes"
|
|
"flag"
|
|
"testing"
|
|
|
|
"github.com/sergi/go-diff/diffmatchpatch"
|
|
|
|
"github.com/anchore/syft/syft/file"
|
|
|
|
"github.com/anchore/go-testutils"
|
|
"github.com/anchore/syft/internal/config"
|
|
"github.com/anchore/syft/syft/distro"
|
|
"github.com/anchore/syft/syft/pkg"
|
|
"github.com/anchore/syft/syft/source"
|
|
)
|
|
|
|
var updateJSONGoldenFiles = flag.Bool("update-json", false, "update the *.golden files for json presenters")
|
|
|
|
func must(c pkg.CPE, e error) pkg.CPE {
|
|
if e != nil {
|
|
panic(e)
|
|
}
|
|
return c
|
|
}
|
|
|
|
func TestJSONPresenter(t *testing.T) {
|
|
var buffer bytes.Buffer
|
|
|
|
catalog := pkg.NewCatalog()
|
|
|
|
catalog.Add(pkg.Package{
|
|
ID: "package-1-id",
|
|
Name: "package-1",
|
|
Version: "1.0.1",
|
|
Locations: []source.Location{
|
|
{
|
|
RealPath: "/a/place/a",
|
|
},
|
|
},
|
|
Type: pkg.PythonPkg,
|
|
FoundBy: "the-cataloger-1",
|
|
Language: pkg.Python,
|
|
MetadataType: pkg.PythonPackageMetadataType,
|
|
Licenses: []string{"MIT"},
|
|
Metadata: pkg.PythonPackageMetadata{
|
|
Name: "package-1",
|
|
Version: "1.0.1",
|
|
},
|
|
PURL: "a-purl-1",
|
|
CPEs: []pkg.CPE{
|
|
must(pkg.NewCPE("cpe:2.3:*:some:package:1:*:*:*:*:*:*:*")),
|
|
},
|
|
})
|
|
catalog.Add(pkg.Package{
|
|
ID: "package-2-id",
|
|
Name: "package-2",
|
|
Version: "2.0.1",
|
|
Locations: []source.Location{
|
|
{
|
|
RealPath: "/b/place/b",
|
|
},
|
|
},
|
|
Type: pkg.DebPkg,
|
|
FoundBy: "the-cataloger-2",
|
|
MetadataType: pkg.DpkgMetadataType,
|
|
Metadata: pkg.DpkgMetadata{
|
|
Package: "package-2",
|
|
Version: "2.0.1",
|
|
},
|
|
PURL: "a-purl-2",
|
|
CPEs: []pkg.CPE{
|
|
must(pkg.NewCPE("cpe:2.3:*:some:package:2:*:*:*:*:*:*:*")),
|
|
},
|
|
})
|
|
|
|
cfg := JSONDocumentConfig{
|
|
ApplicationConfig: config.Application{},
|
|
PackageCatalog: catalog,
|
|
FileMetadata: map[source.Location]source.FileMetadata{
|
|
source.NewLocation("/a/place"): {
|
|
Mode: 0775,
|
|
Type: "directory",
|
|
UserID: 0,
|
|
GroupID: 0,
|
|
},
|
|
source.NewLocation("/a/place/a"): {
|
|
Mode: 0775,
|
|
Type: "regularFile",
|
|
UserID: 0,
|
|
GroupID: 0,
|
|
},
|
|
source.NewLocation("/b"): {
|
|
Mode: 0775,
|
|
Type: "symbolicLink",
|
|
LinkDestination: "/c",
|
|
UserID: 0,
|
|
GroupID: 0,
|
|
},
|
|
source.NewLocation("/b/place/b"): {
|
|
Mode: 0644,
|
|
Type: "regularFile",
|
|
UserID: 1,
|
|
GroupID: 2,
|
|
},
|
|
},
|
|
FileDigests: map[source.Location][]file.Digest{
|
|
source.NewLocation("/a/place/a"): {
|
|
{
|
|
Algorithm: "sha256",
|
|
Value: "366a3f5653e34673b875891b021647440d0127c2ef041e3b1a22da2a7d4f3703",
|
|
},
|
|
},
|
|
source.NewLocation("/b/place/b"): {
|
|
{
|
|
Algorithm: "sha256",
|
|
Value: "1b3722da2a7d90d033b87581a2a3f12021647445653e34666ef041e3b4f3707c",
|
|
},
|
|
},
|
|
},
|
|
Distro: &distro.Distro{
|
|
Type: distro.RedHat,
|
|
RawVersion: "7",
|
|
IDLike: "rhel",
|
|
},
|
|
SourceMetadata: source.Metadata{
|
|
Scheme: source.ImageScheme,
|
|
ImageMetadata: source.ImageMetadata{
|
|
UserInput: "user-image-input",
|
|
ID: "sha256:c2b46b4eb06296933b7cf0722683964e9ecbd93265b9ef6ae9642e3952afbba0",
|
|
ManifestDigest: "sha256:2731251dc34951c0e50fcc643b4c5f74922dad1a5d98f302b504cf46cd5d9368",
|
|
MediaType: "application/vnd.docker.distribution.manifest.v2+json",
|
|
Tags: []string{
|
|
"stereoscope-fixture-image-simple:85066c51088bdd274f7a89e99e00490f666c49e72ffc955707cd6e18f0e22c5b",
|
|
},
|
|
Size: 38,
|
|
Layers: []source.LayerMetadata{
|
|
{
|
|
MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip",
|
|
Digest: "sha256:3de16c5b8659a2e8d888b8ded8427be7a5686a3c8c4e4dd30de20f362827285b",
|
|
Size: 22,
|
|
},
|
|
{
|
|
MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip",
|
|
Digest: "sha256:366a3f5653e34673b875891b021647440d0127c2ef041e3b1a22da2a7d4f3703",
|
|
Size: 16,
|
|
},
|
|
},
|
|
RawManifest: []byte("eyJzY2hlbWFWZXJzaW9uIjoyLCJtZWRpYVR5cGUiOiJh..."),
|
|
RawConfig: []byte("eyJhcmNoaXRlY3R1cmUiOiJhbWQ2NCIsImNvbmZp..."),
|
|
},
|
|
},
|
|
}
|
|
|
|
if err := NewJSONPresenter(cfg).Present(&buffer); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
actual := buffer.Bytes()
|
|
|
|
if *updateJSONGoldenFiles {
|
|
testutils.UpdateGoldenFileContents(t, actual)
|
|
}
|
|
|
|
var expected = testutils.GetGoldenFileContents(t)
|
|
|
|
if !bytes.Equal(expected, actual) {
|
|
dmp := diffmatchpatch.New()
|
|
diffs := dmp.DiffMain(string(expected), string(actual), true)
|
|
t.Errorf("mismatched output:\n%s", dmp.DiffPrettyText(diffs))
|
|
}
|
|
}
|