xref: /aosp_15_r20/external/spdx-tools/spdxlib/relationships_test.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Li
3*ba677afaSXin Lipackage spdxlib
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"testing"
7*ba677afaSXin Li
8*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/common"
9*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_1"
10*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_2"
11*ba677afaSXin Li)
12*ba677afaSXin Li
13*ba677afaSXin Li// ===== 2.1 tests =====
14*ba677afaSXin Li
15*ba677afaSXin Lifunc Test2_1FilterForDependencies(t *testing.T) {
16*ba677afaSXin Li	// set up document and some packages and relationships
17*ba677afaSXin Li	doc := &v2_1.Document{
18*ba677afaSXin Li		SPDXVersion:    "SPDX-2.1",
19*ba677afaSXin Li		DataLicense:    "CC0-1.0",
20*ba677afaSXin Li		SPDXIdentifier: common.ElementID("DOCUMENT"),
21*ba677afaSXin Li		CreationInfo:   &v2_1.CreationInfo{},
22*ba677afaSXin Li		Packages: []*v2_1.Package{
23*ba677afaSXin Li			{PackageName: "pkg1", PackageSPDXIdentifier: "p1"},
24*ba677afaSXin Li			{PackageName: "pkg2", PackageSPDXIdentifier: "p2"},
25*ba677afaSXin Li			{PackageName: "pkg3", PackageSPDXIdentifier: "p3"},
26*ba677afaSXin Li			{PackageName: "pkg4", PackageSPDXIdentifier: "p4"},
27*ba677afaSXin Li			{PackageName: "pkg5", PackageSPDXIdentifier: "p5"},
28*ba677afaSXin Li		},
29*ba677afaSXin Li		Relationships: []*v2_1.Relationship{
30*ba677afaSXin Li			{
31*ba677afaSXin Li				RefA:         common.MakeDocElementID("", "DOCUMENT"),
32*ba677afaSXin Li				RefB:         common.MakeDocElementID("", "p1"),
33*ba677afaSXin Li				Relationship: "DESCRIBES",
34*ba677afaSXin Li			},
35*ba677afaSXin Li			{
36*ba677afaSXin Li				RefA:         common.MakeDocElementID("", "DOCUMENT"),
37*ba677afaSXin Li				RefB:         common.MakeDocElementID("", "p5"),
38*ba677afaSXin Li				Relationship: "DESCRIBES",
39*ba677afaSXin Li			},
40*ba677afaSXin Li			{
41*ba677afaSXin Li				RefA:         common.MakeDocElementID("", "p4"),
42*ba677afaSXin Li				RefB:         common.MakeDocElementID("", "DOCUMENT"),
43*ba677afaSXin Li				Relationship: "DESCRIBED_BY",
44*ba677afaSXin Li			},
45*ba677afaSXin Li			{
46*ba677afaSXin Li				RefA:         common.MakeDocElementID("", "p1"),
47*ba677afaSXin Li				RefB:         common.MakeDocElementID("", "p2"),
48*ba677afaSXin Li				Relationship: "DEPENDS_ON",
49*ba677afaSXin Li			},
50*ba677afaSXin Li			{
51*ba677afaSXin Li				RefA:         common.MakeDocElementID("", "p3"),
52*ba677afaSXin Li				RefB:         common.MakeDocElementID("", "p4"),
53*ba677afaSXin Li				Relationship: "DEPENDENCY_OF",
54*ba677afaSXin Li			},
55*ba677afaSXin Li		},
56*ba677afaSXin Li	}
57*ba677afaSXin Li
58*ba677afaSXin Li	eIDs, err := FilterRelationships2_1(doc, func(relationship *v2_1.Relationship) *common.ElementID {
59*ba677afaSXin Li		p1EID := common.MakeDocElementID("", "p1")
60*ba677afaSXin Li		if relationship.Relationship == "DEPENDS_ON" && relationship.RefA == p1EID {
61*ba677afaSXin Li			return &relationship.RefB.ElementRefID
62*ba677afaSXin Li		} else if relationship.Relationship == "DEPENDENCY_OF" && relationship.RefB == p1EID {
63*ba677afaSXin Li			return &relationship.RefA.ElementRefID
64*ba677afaSXin Li		}
65*ba677afaSXin Li
66*ba677afaSXin Li		return nil
67*ba677afaSXin Li	})
68*ba677afaSXin Li	if err != nil {
69*ba677afaSXin Li		t.Fatalf("expected non-nil err, got: %s", err.Error())
70*ba677afaSXin Li	}
71*ba677afaSXin Li
72*ba677afaSXin Li	if len(eIDs) != 1 {
73*ba677afaSXin Li		t.Fatalf("expected 1 ElementID, got: %v", eIDs)
74*ba677afaSXin Li	}
75*ba677afaSXin Li
76*ba677afaSXin Li	if eIDs[0] != common.MakeDocElementID("", "p2").ElementRefID {
77*ba677afaSXin Li		t.Fatalf("received unexpected relationship: %v", eIDs[0])
78*ba677afaSXin Li	}
79*ba677afaSXin Li}
80*ba677afaSXin Li
81*ba677afaSXin Li// ===== 2.2 tests =====
82*ba677afaSXin Li
83*ba677afaSXin Lifunc Test2_2FindsDependsOnRelationships(t *testing.T) {
84*ba677afaSXin Li	// set up document and some packages and relationships
85*ba677afaSXin Li	doc := &v2_2.Document{
86*ba677afaSXin Li		SPDXVersion:    "SPDX-2.2",
87*ba677afaSXin Li		DataLicense:    "CC0-1.0",
88*ba677afaSXin Li		SPDXIdentifier: common.ElementID("DOCUMENT"),
89*ba677afaSXin Li		CreationInfo:   &v2_2.CreationInfo{},
90*ba677afaSXin Li		Packages: []*v2_2.Package{
91*ba677afaSXin Li			{PackageName: "pkg1", PackageSPDXIdentifier: "p1"},
92*ba677afaSXin Li			{PackageName: "pkg2", PackageSPDXIdentifier: "p2"},
93*ba677afaSXin Li			{PackageName: "pkg3", PackageSPDXIdentifier: "p3"},
94*ba677afaSXin Li			{PackageName: "pkg4", PackageSPDXIdentifier: "p4"},
95*ba677afaSXin Li			{PackageName: "pkg5", PackageSPDXIdentifier: "p5"},
96*ba677afaSXin Li		},
97*ba677afaSXin Li		Relationships: []*v2_2.Relationship{
98*ba677afaSXin Li			{
99*ba677afaSXin Li				RefA:         common.MakeDocElementID("", "DOCUMENT"),
100*ba677afaSXin Li				RefB:         common.MakeDocElementID("", "p1"),
101*ba677afaSXin Li				Relationship: "DESCRIBES",
102*ba677afaSXin Li			},
103*ba677afaSXin Li			{
104*ba677afaSXin Li				RefA:         common.MakeDocElementID("", "DOCUMENT"),
105*ba677afaSXin Li				RefB:         common.MakeDocElementID("", "p5"),
106*ba677afaSXin Li				Relationship: "DESCRIBES",
107*ba677afaSXin Li			},
108*ba677afaSXin Li			// inverse relationship -- should also get detected
109*ba677afaSXin Li			{
110*ba677afaSXin Li				RefA:         common.MakeDocElementID("", "p4"),
111*ba677afaSXin Li				RefB:         common.MakeDocElementID("", "DOCUMENT"),
112*ba677afaSXin Li				Relationship: "DESCRIBED_BY",
113*ba677afaSXin Li			},
114*ba677afaSXin Li			// different relationship
115*ba677afaSXin Li			{
116*ba677afaSXin Li				RefA:         common.MakeDocElementID("", "p1"),
117*ba677afaSXin Li				RefB:         common.MakeDocElementID("", "p2"),
118*ba677afaSXin Li				Relationship: "DEPENDS_ON",
119*ba677afaSXin Li			},
120*ba677afaSXin Li		},
121*ba677afaSXin Li	}
122*ba677afaSXin Li
123*ba677afaSXin Li	eIDs, err := FilterRelationships2_2(doc, func(relationship *v2_2.Relationship) *common.ElementID {
124*ba677afaSXin Li		p1EID := common.MakeDocElementID("", "p1")
125*ba677afaSXin Li		if relationship.Relationship == "DEPENDS_ON" && relationship.RefA == p1EID {
126*ba677afaSXin Li			return &relationship.RefB.ElementRefID
127*ba677afaSXin Li		} else if relationship.Relationship == "DEPENDENCY_OF" && relationship.RefB == p1EID {
128*ba677afaSXin Li			return &relationship.RefA.ElementRefID
129*ba677afaSXin Li		}
130*ba677afaSXin Li
131*ba677afaSXin Li		return nil
132*ba677afaSXin Li	})
133*ba677afaSXin Li	if err != nil {
134*ba677afaSXin Li		t.Fatalf("expected non-nil err, got: %s", err.Error())
135*ba677afaSXin Li	}
136*ba677afaSXin Li
137*ba677afaSXin Li	if len(eIDs) != 1 {
138*ba677afaSXin Li		t.Fatalf("expected 1 ElementID, got: %v", eIDs)
139*ba677afaSXin Li	}
140*ba677afaSXin Li
141*ba677afaSXin Li	if eIDs[0] != common.MakeDocElementID("", "p2").ElementRefID {
142*ba677afaSXin Li		t.Fatalf("received unexpected relationship: %v", eIDs[0])
143*ba677afaSXin Li	}
144*ba677afaSXin Li}
145