1// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2package parser2v3 3 4import ( 5 "testing" 6 7 "github.com/spdx/tools-golang/spdx/common" 8) 9 10// ===== Helper function tests ===== 11 12func TestCanExtractSubvalues(t *testing.T) { 13 subkey, subvalue, err := extractSubs("SHA1: abc123") 14 if err != nil { 15 t.Errorf("got error when calling extractSubs: %v", err) 16 } 17 if subkey != "SHA1" { 18 t.Errorf("got %v for subkey", subkey) 19 } 20 if subvalue != "abc123" { 21 t.Errorf("got %v for subvalue", subvalue) 22 } 23} 24 25func TestReturnsErrorForInvalidSubvalueFormat(t *testing.T) { 26 _, _, err := extractSubs("blah") 27 if err == nil { 28 t.Errorf("expected error when calling extractSubs for invalid format (0 colons), got nil") 29 } 30} 31 32func TestCanExtractDocumentAndElementRefsFromID(t *testing.T) { 33 // test with valid ID in this document 34 helperForExtractDocElementID(t, "SPDXRef-file1", false, "", "file1") 35 // test with valid ID in another document 36 helperForExtractDocElementID(t, "DocumentRef-doc2:SPDXRef-file2", false, "doc2", "file2") 37 // test with invalid ID in this document 38 helperForExtractDocElementID(t, "a:SPDXRef-file1", true, "", "") 39 helperForExtractDocElementID(t, "file1", true, "", "") 40 helperForExtractDocElementID(t, "SPDXRef-", true, "", "") 41 helperForExtractDocElementID(t, "SPDXRef-file1:", true, "", "") 42 // test with invalid ID in another document 43 helperForExtractDocElementID(t, "DocumentRef-doc2", true, "", "") 44 helperForExtractDocElementID(t, "DocumentRef-doc2:", true, "", "") 45 helperForExtractDocElementID(t, "DocumentRef-doc2:SPDXRef-", true, "", "") 46 helperForExtractDocElementID(t, "DocumentRef-doc2:a", true, "", "") 47 helperForExtractDocElementID(t, "DocumentRef-:", true, "", "") 48 helperForExtractDocElementID(t, "DocumentRef-:SPDXRef-file1", true, "", "") 49 // test with invalid formats 50 helperForExtractDocElementID(t, "DocumentRef-doc2:SPDXRef-file1:file2", true, "", "") 51} 52 53func helperForExtractDocElementID(t *testing.T, tst string, wantErr bool, wantDoc string, wantElt string) { 54 deID, err := extractDocElementID(tst) 55 if err != nil && wantErr == false { 56 t.Errorf("testing %v: expected nil error, got %v", tst, err) 57 } 58 if err == nil && wantErr == true { 59 t.Errorf("testing %v: expected non-nil error, got nil", tst) 60 } 61 if deID.DocumentRefID != wantDoc { 62 if wantDoc == "" { 63 t.Errorf("testing %v: want empty string for DocumentRefID, got %v", tst, deID.DocumentRefID) 64 } else { 65 t.Errorf("testing %v: want %v for DocumentRefID, got %v", tst, wantDoc, deID.DocumentRefID) 66 } 67 } 68 if deID.ElementRefID != common.ElementID(wantElt) { 69 if wantElt == "" { 70 t.Errorf("testing %v: want empty string for ElementRefID, got %v", tst, deID.ElementRefID) 71 } else { 72 t.Errorf("testing %v: want %v for ElementRefID, got %v", tst, wantElt, deID.ElementRefID) 73 } 74 } 75} 76 77func TestCanExtractSpecialDocumentIDs(t *testing.T) { 78 permittedSpecial := []string{"NONE", "NOASSERTION"} 79 // test with valid special values 80 helperForExtractDocElementSpecial(t, permittedSpecial, "NONE", false, "", "", "NONE") 81 helperForExtractDocElementSpecial(t, permittedSpecial, "NOASSERTION", false, "", "", "NOASSERTION") 82 // test with valid regular IDs 83 helperForExtractDocElementSpecial(t, permittedSpecial, "SPDXRef-file1", false, "", "file1", "") 84 helperForExtractDocElementSpecial(t, permittedSpecial, "DocumentRef-doc2:SPDXRef-file2", false, "doc2", "file2", "") 85 helperForExtractDocElementSpecial(t, permittedSpecial, "a:SPDXRef-file1", true, "", "", "") 86 helperForExtractDocElementSpecial(t, permittedSpecial, "DocumentRef-doc2", true, "", "", "") 87 // test with invalid other words not on permitted list 88 helperForExtractDocElementSpecial(t, permittedSpecial, "FOO", true, "", "", "") 89} 90 91func helperForExtractDocElementSpecial(t *testing.T, permittedSpecial []string, tst string, wantErr bool, wantDoc string, wantElt string, wantSpecial string) { 92 deID, err := extractDocElementSpecial(tst, permittedSpecial) 93 if err != nil && wantErr == false { 94 t.Errorf("testing %v: expected nil error, got %v", tst, err) 95 } 96 if err == nil && wantErr == true { 97 t.Errorf("testing %v: expected non-nil error, got nil", tst) 98 } 99 if deID.DocumentRefID != wantDoc { 100 if wantDoc == "" { 101 t.Errorf("testing %v: want empty string for DocumentRefID, got %v", tst, deID.DocumentRefID) 102 } else { 103 t.Errorf("testing %v: want %v for DocumentRefID, got %v", tst, wantDoc, deID.DocumentRefID) 104 } 105 } 106 if deID.ElementRefID != common.ElementID(wantElt) { 107 if wantElt == "" { 108 t.Errorf("testing %v: want empty string for ElementRefID, got %v", tst, deID.ElementRefID) 109 } else { 110 t.Errorf("testing %v: want %v for ElementRefID, got %v", tst, wantElt, deID.ElementRefID) 111 } 112 } 113 if deID.SpecialID != wantSpecial { 114 if wantSpecial == "" { 115 t.Errorf("testing %v: want empty string for SpecialID, got %v", tst, deID.SpecialID) 116 } else { 117 t.Errorf("testing %v: want %v for SpecialID, got %v", tst, wantSpecial, deID.SpecialID) 118 } 119 } 120} 121 122func TestCanExtractElementRefsOnlyFromID(t *testing.T) { 123 // test with valid ID in this document 124 helperForExtractElementID(t, "SPDXRef-file1", false, "file1") 125 // test with valid ID in another document 126 helperForExtractElementID(t, "DocumentRef-doc2:SPDXRef-file2", true, "") 127 // test with invalid ID in this document 128 helperForExtractElementID(t, "a:SPDXRef-file1", true, "") 129 helperForExtractElementID(t, "file1", true, "") 130 helperForExtractElementID(t, "SPDXRef-", true, "") 131 helperForExtractElementID(t, "SPDXRef-file1:", true, "") 132 // test with invalid ID in another document 133 helperForExtractElementID(t, "DocumentRef-doc2", true, "") 134 helperForExtractElementID(t, "DocumentRef-doc2:", true, "") 135 helperForExtractElementID(t, "DocumentRef-doc2:SPDXRef-", true, "") 136 helperForExtractElementID(t, "DocumentRef-doc2:a", true, "") 137 helperForExtractElementID(t, "DocumentRef-:", true, "") 138 helperForExtractElementID(t, "DocumentRef-:SPDXRef-file1", true, "") 139} 140 141func helperForExtractElementID(t *testing.T, tst string, wantErr bool, wantElt string) { 142 eID, err := extractElementID(tst) 143 if err != nil && wantErr == false { 144 t.Errorf("testing %v: expected nil error, got %v", tst, err) 145 } 146 if err == nil && wantErr == true { 147 t.Errorf("testing %v: expected non-nil error, got nil", tst) 148 } 149 if eID != common.ElementID(wantElt) { 150 if wantElt == "" { 151 t.Errorf("testing %v: want emptyString for ElementRefID, got %v", tst, eID) 152 } else { 153 t.Errorf("testing %v: want %v for ElementRefID, got %v", tst, wantElt, eID) 154 } 155 } 156} 157