mirror of
https://github.com/anchore/syft.git
synced 2025-11-17 16:33:21 +01:00
234 lines
4.4 KiB
Go
234 lines
4.4 KiB
Go
package relationship
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/anchore/syft/syft/artifact"
|
|
"github.com/anchore/syft/syft/file"
|
|
"github.com/anchore/syft/syft/pkg"
|
|
)
|
|
|
|
func Test_Index(t *testing.T) {
|
|
p1 := pkg.Package{
|
|
Name: "pkg-1",
|
|
}
|
|
p2 := pkg.Package{
|
|
Name: "pkg-2",
|
|
}
|
|
p3 := pkg.Package{
|
|
Name: "pkg-3",
|
|
}
|
|
c1 := file.Coordinates{
|
|
RealPath: "/coords/1",
|
|
}
|
|
c2 := file.Coordinates{
|
|
RealPath: "/coords/2",
|
|
}
|
|
|
|
for _, p := range []*pkg.Package{&p1, &p2, &p3} {
|
|
p.SetID()
|
|
}
|
|
|
|
r1 := artifact.Relationship{
|
|
From: p1,
|
|
To: p2,
|
|
Type: artifact.DependencyOfRelationship,
|
|
}
|
|
r2 := artifact.Relationship{
|
|
From: p1,
|
|
To: p3,
|
|
Type: artifact.DependencyOfRelationship,
|
|
}
|
|
r3 := artifact.Relationship{
|
|
From: p1,
|
|
To: c1,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
r4 := artifact.Relationship{
|
|
From: p2,
|
|
To: c2,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
r5 := artifact.Relationship{
|
|
From: p3,
|
|
To: c2,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
|
|
dup := artifact.Relationship{
|
|
From: p3,
|
|
To: c2,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
|
|
idx := NewIndex(r1, r2, r3, r4, r5, dup)
|
|
require.ElementsMatch(t, slice(r1, r2, r3, r4, r5), idx.All())
|
|
|
|
require.ElementsMatch(t, slice(r1, r4), idx.References(p2))
|
|
require.ElementsMatch(t, slice(r4), idx.References(p2, artifact.ContainsRelationship))
|
|
|
|
require.ElementsMatch(t, slice(r1), idx.To(p2))
|
|
require.ElementsMatch(t, []artifact.Relationship(nil), idx.To(p2, artifact.ContainsRelationship))
|
|
|
|
require.ElementsMatch(t, slice(r4), idx.From(p2))
|
|
require.ElementsMatch(t, slice(r4), idx.From(p2, artifact.ContainsRelationship))
|
|
}
|
|
|
|
func Test_sortOrder(t *testing.T) {
|
|
r1 := artifact.Relationship{
|
|
From: id("1"),
|
|
To: id("2"),
|
|
Type: "1",
|
|
}
|
|
r2 := artifact.Relationship{
|
|
From: id("2"),
|
|
To: id("3"),
|
|
Type: "1",
|
|
}
|
|
r3 := artifact.Relationship{
|
|
From: id("3"),
|
|
To: id("4"),
|
|
Type: "1",
|
|
}
|
|
r4 := artifact.Relationship{
|
|
From: id("1"),
|
|
To: id("2"),
|
|
Type: "2",
|
|
}
|
|
r5 := artifact.Relationship{
|
|
From: id("2"),
|
|
To: id("3"),
|
|
Type: "2",
|
|
}
|
|
dup := artifact.Relationship{
|
|
From: id("2"),
|
|
To: id("3"),
|
|
Type: "2",
|
|
}
|
|
r6 := artifact.Relationship{
|
|
From: id("2"),
|
|
To: id("3"),
|
|
Type: "3",
|
|
}
|
|
|
|
idx := NewIndex(r5, r2, r6, r4, r1, r3, dup)
|
|
require.EqualValues(t, slice(r1, r2, r3, r4, r5, r6), idx.All())
|
|
|
|
require.EqualValues(t, slice(r1, r4), idx.From(id("1")))
|
|
|
|
require.EqualValues(t, slice(r2, r5, r6), idx.To(id("3")))
|
|
|
|
rLast := artifact.Relationship{
|
|
From: id("0"),
|
|
To: id("3"),
|
|
Type: "9999",
|
|
}
|
|
|
|
rFirst := artifact.Relationship{
|
|
From: id("0"),
|
|
To: id("3"),
|
|
Type: "1",
|
|
}
|
|
|
|
rMid := artifact.Relationship{
|
|
From: id("0"),
|
|
To: id("1"),
|
|
Type: "2",
|
|
}
|
|
|
|
idx.Add(rLast, rFirst, rMid)
|
|
|
|
require.EqualValues(t, slice(rFirst, r1, r2, r3, rMid, r4, r5, r6, rLast), idx.All())
|
|
|
|
require.EqualValues(t, slice(rFirst, r2, r5, r6, rLast), idx.To(id("3")))
|
|
}
|
|
|
|
func Test_Coordinates(t *testing.T) {
|
|
p1 := pkg.Package{
|
|
Name: "pkg-1",
|
|
}
|
|
p2 := pkg.Package{
|
|
Name: "pkg-2",
|
|
}
|
|
p3 := pkg.Package{
|
|
Name: "pkg-3",
|
|
}
|
|
c1 := file.Coordinates{
|
|
RealPath: "/coords/1",
|
|
}
|
|
c2 := file.Coordinates{
|
|
RealPath: "/coords/2",
|
|
}
|
|
c3 := file.Coordinates{
|
|
RealPath: "/coords/3",
|
|
}
|
|
c4 := file.Coordinates{
|
|
RealPath: "/coords/4",
|
|
}
|
|
|
|
for _, p := range []*pkg.Package{&p1, &p2, &p3} {
|
|
p.SetID()
|
|
}
|
|
|
|
r1 := artifact.Relationship{
|
|
From: p1,
|
|
To: p2,
|
|
Type: artifact.DependencyOfRelationship,
|
|
}
|
|
r2 := artifact.Relationship{
|
|
From: p1,
|
|
To: p3,
|
|
Type: artifact.DependencyOfRelationship,
|
|
}
|
|
r3 := artifact.Relationship{
|
|
From: p1,
|
|
To: c1,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
r4 := artifact.Relationship{
|
|
From: p2,
|
|
To: c2,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
r5 := artifact.Relationship{
|
|
From: p3,
|
|
To: c1,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
r6 := artifact.Relationship{
|
|
From: p3,
|
|
To: c2,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
r7 := artifact.Relationship{
|
|
From: c1,
|
|
To: c3,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
r8 := artifact.Relationship{
|
|
From: c3,
|
|
To: c4,
|
|
Type: artifact.ContainsRelationship,
|
|
}
|
|
|
|
idx := NewIndex(r1, r2, r3, r4, r5, r6, r7, r8)
|
|
|
|
got := idx.Coordinates(p1)
|
|
require.ElementsMatch(t, slice(c1), got)
|
|
|
|
got = idx.Coordinates(p3)
|
|
require.ElementsMatch(t, slice(c1, c2), got)
|
|
}
|
|
|
|
type id string
|
|
|
|
func (i id) ID() artifact.ID {
|
|
return artifact.ID(i)
|
|
}
|
|
|
|
func slice[T any](values ...T) []T {
|
|
return values
|
|
}
|