1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Lipackage parser2v1 3*ba677afaSXin Li 4*ba677afaSXin Liimport ( 5*ba677afaSXin Li "testing" 6*ba677afaSXin Li 7*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_1" 8*ba677afaSXin Li) 9*ba677afaSXin Li 10*ba677afaSXin Li// ===== Relationship section tests ===== 11*ba677afaSXin Lifunc TestParser2_1FailsIfRelationshipNotSet(t *testing.T) { 12*ba677afaSXin Li parser := tvParser2_1{ 13*ba677afaSXin Li doc: &v2_1.Document{}, 14*ba677afaSXin Li st: psCreationInfo2_1, 15*ba677afaSXin Li } 16*ba677afaSXin Li err := parser.parsePairForRelationship2_1("Relationship", "SPDXRef-A CONTAINS SPDXRef-B") 17*ba677afaSXin Li if err == nil { 18*ba677afaSXin Li t.Errorf("expected error when calling parsePairFromRelationship2_1 without setting rln pointer") 19*ba677afaSXin Li } 20*ba677afaSXin Li} 21*ba677afaSXin Li 22*ba677afaSXin Lifunc TestParser2_1FailsIfRelationshipCommentWithoutRelationship(t *testing.T) { 23*ba677afaSXin Li parser := tvParser2_1{ 24*ba677afaSXin Li doc: &v2_1.Document{}, 25*ba677afaSXin Li st: psCreationInfo2_1, 26*ba677afaSXin Li } 27*ba677afaSXin Li err := parser.parsePair2_1("RelationshipComment", "comment whatever") 28*ba677afaSXin Li if err == nil { 29*ba677afaSXin Li t.Errorf("expected error when calling parsePair2_1 for RelationshipComment without Relationship first") 30*ba677afaSXin Li } 31*ba677afaSXin Li} 32*ba677afaSXin Li 33*ba677afaSXin Lifunc TestParser2_1CanParseRelationshipTags(t *testing.T) { 34*ba677afaSXin Li parser := tvParser2_1{ 35*ba677afaSXin Li doc: &v2_1.Document{}, 36*ba677afaSXin Li st: psCreationInfo2_1, 37*ba677afaSXin Li } 38*ba677afaSXin Li 39*ba677afaSXin Li // Relationship 40*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "SPDXRef-something CONTAINS DocumentRef-otherdoc:SPDXRef-something-else") 41*ba677afaSXin Li if err != nil { 42*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 43*ba677afaSXin Li } 44*ba677afaSXin Li if parser.rln.RefA.DocumentRefID != "" || parser.rln.RefA.ElementRefID != "something" { 45*ba677afaSXin Li t.Errorf("got %v for first part of Relationship, expected something", parser.rln.RefA) 46*ba677afaSXin Li } 47*ba677afaSXin Li if parser.rln.RefB.DocumentRefID != "otherdoc" || parser.rln.RefB.ElementRefID != "something-else" { 48*ba677afaSXin Li t.Errorf("got %v for second part of Relationship, expected otherdoc:something-else", parser.rln.RefB) 49*ba677afaSXin Li } 50*ba677afaSXin Li if parser.rln.Relationship != "CONTAINS" { 51*ba677afaSXin Li t.Errorf("got %v for Relationship type, expected CONTAINS", parser.rln.Relationship) 52*ba677afaSXin Li } 53*ba677afaSXin Li 54*ba677afaSXin Li // Relationship Comment 55*ba677afaSXin Li cmt := "this is a comment" 56*ba677afaSXin Li err = parser.parsePair2_1("RelationshipComment", cmt) 57*ba677afaSXin Li if err != nil { 58*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 59*ba677afaSXin Li } 60*ba677afaSXin Li if parser.rln.RelationshipComment != cmt { 61*ba677afaSXin Li t.Errorf("got %v for RelationshipComment, expected %v", parser.rln.RelationshipComment, cmt) 62*ba677afaSXin Li } 63*ba677afaSXin Li} 64*ba677afaSXin Li 65*ba677afaSXin Lifunc TestParser2_1InvalidRelationshipTagsNoValueFail(t *testing.T) { 66*ba677afaSXin Li parser := tvParser2_1{ 67*ba677afaSXin Li doc: &v2_1.Document{}, 68*ba677afaSXin Li st: psCreationInfo2_1, 69*ba677afaSXin Li } 70*ba677afaSXin Li 71*ba677afaSXin Li // no items 72*ba677afaSXin Li parser.rln = nil 73*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "") 74*ba677afaSXin Li if err == nil { 75*ba677afaSXin Li t.Errorf("expected error for empty items in relationship, got nil") 76*ba677afaSXin Li } 77*ba677afaSXin Li} 78*ba677afaSXin Li 79*ba677afaSXin Lifunc TestParser2_1InvalidRelationshipTagsOneValueFail(t *testing.T) { 80*ba677afaSXin Li parser := tvParser2_1{ 81*ba677afaSXin Li doc: &v2_1.Document{}, 82*ba677afaSXin Li st: psCreationInfo2_1, 83*ba677afaSXin Li } 84*ba677afaSXin Li 85*ba677afaSXin Li // one item 86*ba677afaSXin Li parser.rln = nil 87*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "DESCRIBES") 88*ba677afaSXin Li if err == nil { 89*ba677afaSXin Li t.Errorf("expected error for only one item in relationship, got nil") 90*ba677afaSXin Li } 91*ba677afaSXin Li} 92*ba677afaSXin Li 93*ba677afaSXin Lifunc TestParser2_1InvalidRelationshipTagsTwoValuesFail(t *testing.T) { 94*ba677afaSXin Li parser := tvParser2_1{ 95*ba677afaSXin Li doc: &v2_1.Document{}, 96*ba677afaSXin Li st: psCreationInfo2_1, 97*ba677afaSXin Li } 98*ba677afaSXin Li 99*ba677afaSXin Li // two items 100*ba677afaSXin Li parser.rln = nil 101*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "SPDXRef-DOCUMENT DESCRIBES") 102*ba677afaSXin Li if err == nil { 103*ba677afaSXin Li t.Errorf("expected error for only two items in relationship, got nil") 104*ba677afaSXin Li } 105*ba677afaSXin Li} 106*ba677afaSXin Li 107*ba677afaSXin Lifunc TestParser2_1InvalidRelationshipTagsThreeValuesSucceed(t *testing.T) { 108*ba677afaSXin Li parser := tvParser2_1{ 109*ba677afaSXin Li doc: &v2_1.Document{}, 110*ba677afaSXin Li st: psCreationInfo2_1, 111*ba677afaSXin Li } 112*ba677afaSXin Li 113*ba677afaSXin Li // three items but with interspersed additional whitespace 114*ba677afaSXin Li parser.rln = nil 115*ba677afaSXin Li err := parser.parsePair2_1("Relationship", " SPDXRef-DOCUMENT \t DESCRIBES SPDXRef-something-else ") 116*ba677afaSXin Li if err != nil { 117*ba677afaSXin Li t.Errorf("expected pass for three items in relationship w/ extra whitespace, got: %v", err) 118*ba677afaSXin Li } 119*ba677afaSXin Li} 120*ba677afaSXin Li 121*ba677afaSXin Lifunc TestParser2_1InvalidRelationshipTagsFourValuesFail(t *testing.T) { 122*ba677afaSXin Li parser := tvParser2_1{ 123*ba677afaSXin Li doc: &v2_1.Document{}, 124*ba677afaSXin Li st: psCreationInfo2_1, 125*ba677afaSXin Li } 126*ba677afaSXin Li 127*ba677afaSXin Li // four items 128*ba677afaSXin Li parser.rln = nil 129*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "SPDXRef-a DESCRIBES SPDXRef-b SPDXRef-c") 130*ba677afaSXin Li if err == nil { 131*ba677afaSXin Li t.Errorf("expected error for more than three items in relationship, got nil") 132*ba677afaSXin Li } 133*ba677afaSXin Li} 134*ba677afaSXin Li 135*ba677afaSXin Lifunc TestParser2_1InvalidRelationshipTagsInvalidRefIDs(t *testing.T) { 136*ba677afaSXin Li parser := tvParser2_1{ 137*ba677afaSXin Li doc: &v2_1.Document{}, 138*ba677afaSXin Li st: psCreationInfo2_1, 139*ba677afaSXin Li } 140*ba677afaSXin Li 141*ba677afaSXin Li // four items 142*ba677afaSXin Li parser.rln = nil 143*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "SPDXRef-a DESCRIBES b") 144*ba677afaSXin Li if err == nil { 145*ba677afaSXin Li t.Errorf("expected error for missing SPDXRef- prefix, got nil") 146*ba677afaSXin Li } 147*ba677afaSXin Li 148*ba677afaSXin Li parser.rln = nil 149*ba677afaSXin Li err = parser.parsePair2_1("Relationship", "a DESCRIBES SPDXRef-b") 150*ba677afaSXin Li if err == nil { 151*ba677afaSXin Li t.Errorf("expected error for missing SPDXRef- prefix, got nil") 152*ba677afaSXin Li } 153*ba677afaSXin Li} 154*ba677afaSXin Li 155*ba677afaSXin Lifunc TestParser2_1FailsToParseUnknownTagInRelationshipSection(t *testing.T) { 156*ba677afaSXin Li parser := tvParser2_1{ 157*ba677afaSXin Li doc: &v2_1.Document{}, 158*ba677afaSXin Li st: psCreationInfo2_1, 159*ba677afaSXin Li } 160*ba677afaSXin Li 161*ba677afaSXin Li // Relationship 162*ba677afaSXin Li err := parser.parsePair2_1("Relationship", "SPDXRef-something CONTAINS DocumentRef-otherdoc:SPDXRef-something-else") 163*ba677afaSXin Li if err != nil { 164*ba677afaSXin Li t.Errorf("expected nil error, got %v", err) 165*ba677afaSXin Li } 166*ba677afaSXin Li // invalid tag 167*ba677afaSXin Li err = parser.parsePairForRelationship2_1("blah", "whoops") 168*ba677afaSXin Li if err == nil { 169*ba677afaSXin Li t.Errorf("expected non-nil error, got nil") 170*ba677afaSXin Li } 171*ba677afaSXin Li} 172