xref: /aosp_15_r20/external/spdx-tools/rdfloader/parser2v3/parse_file_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 parser2v3
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"bufio"
7*ba677afaSXin Li	"strings"
8*ba677afaSXin Li	"testing"
9*ba677afaSXin Li
10*ba677afaSXin Li	gordfParser "github.com/spdx/gordf/rdfloader/parser"
11*ba677afaSXin Li	rdfloader2 "github.com/spdx/gordf/rdfloader/xmlreader"
12*ba677afaSXin Li	gordfWriter "github.com/spdx/gordf/rdfwriter"
13*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/common"
14*ba677afaSXin Li	"github.com/spdx/tools-golang/spdx/v2_3"
15*ba677afaSXin Li)
16*ba677afaSXin Li
17*ba677afaSXin Li// content is the tags within the rdf:RDF tag
18*ba677afaSXin Li// pads the content with the enclosing rdf:RDF tag
19*ba677afaSXin Lifunc wrapIntoTemplate(content string) string {
20*ba677afaSXin Li	header := `<rdf:RDF
21*ba677afaSXin Li        xmlns:spdx="http://spdx.org/rdf/terms#"
22*ba677afaSXin Li        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
23*ba677afaSXin Li        xmlns="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#"
24*ba677afaSXin Li        xmlns:doap="http://usefulinc.com/ns/doap#"
25*ba677afaSXin Li        xmlns:j.0="http://www.w3.org/2009/pointers#"
26*ba677afaSXin Li        xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">`
27*ba677afaSXin Li	footer := `</rdf:RDF>`
28*ba677afaSXin Li	return header + content + footer
29*ba677afaSXin Li}
30*ba677afaSXin Li
31*ba677afaSXin Lifunc parserFromBodyContent(content string) (*rdfParser2_3, error) {
32*ba677afaSXin Li	rdfContent := wrapIntoTemplate(content)
33*ba677afaSXin Li	xmlreader := rdfloader2.XMLReaderFromFileObject(bufio.NewReader(strings.NewReader(rdfContent)))
34*ba677afaSXin Li	rootBlock, err := xmlreader.Read()
35*ba677afaSXin Li	if err != nil {
36*ba677afaSXin Li		return nil, err
37*ba677afaSXin Li	}
38*ba677afaSXin Li	parser := gordfParser.New()
39*ba677afaSXin Li	err = parser.Parse(rootBlock)
40*ba677afaSXin Li	if err != nil {
41*ba677afaSXin Li		return nil, err
42*ba677afaSXin Li	}
43*ba677afaSXin Li	nodeToTriples := gordfWriter.GetNodeToTriples(parser.Triples)
44*ba677afaSXin Li	rdfParser := NewParser2_3(parser, nodeToTriples)
45*ba677afaSXin Li	return rdfParser, err
46*ba677afaSXin Li}
47*ba677afaSXin Li
48*ba677afaSXin Lifunc Test_rdfParser2_3_getArtifactFromNode(t *testing.T) {
49*ba677afaSXin Li	// TestCase 1: artifactOf without project URI
50*ba677afaSXin Li	rdfParser, err := parserFromBodyContent(
51*ba677afaSXin Li		`<spdx:File>
52*ba677afaSXin Li			<spdx:artifactOf>
53*ba677afaSXin Li				<doap:Project>
54*ba677afaSXin Li					<doap:homepage>http://www.openjena.org/</doap:homepage>
55*ba677afaSXin Li					<doap:name>Jena</doap:name>
56*ba677afaSXin Li				</doap:Project>
57*ba677afaSXin Li			</spdx:artifactOf>
58*ba677afaSXin Li		</spdx:File>`)
59*ba677afaSXin Li	if err != nil {
60*ba677afaSXin Li		t.Errorf("unexpected error while parsing a valid example: %v", err)
61*ba677afaSXin Li	}
62*ba677afaSXin Li	artifactOfNode := gordfWriter.FilterTriples(rdfParser.gordfParserObj.Triples, nil, &SPDX_ARTIFACT_OF, nil)[0].Object
63*ba677afaSXin Li	artifact, err := rdfParser.getArtifactFromNode(artifactOfNode)
64*ba677afaSXin Li	if err != nil {
65*ba677afaSXin Li		t.Errorf("error parsing a valid artifactOf node: %v", err)
66*ba677afaSXin Li	}
67*ba677afaSXin Li	if artifact.Name != "Jena" {
68*ba677afaSXin Li		t.Errorf("expected name of artifact: %s, found: %s", "Jena", artifact.Name)
69*ba677afaSXin Li	}
70*ba677afaSXin Li	expectedHomePage := "http://www.openjena.org/"
71*ba677afaSXin Li	if artifact.HomePage != expectedHomePage {
72*ba677afaSXin Li		t.Errorf("wrong artifact homepage. Expected: %s, found: %s", expectedHomePage, artifact.HomePage)
73*ba677afaSXin Li	}
74*ba677afaSXin Li	if artifact.URI != "" {
75*ba677afaSXin Li		t.Errorf("wrong artifact URI. Expected: %s, found: %s", "", artifact.URI)
76*ba677afaSXin Li	}
77*ba677afaSXin Li
78*ba677afaSXin Li	// TestCase 2: artifactOf with a Project URI
79*ba677afaSXin Li	rdfParser, err = parserFromBodyContent(
80*ba677afaSXin Li		`<spdx:File>
81*ba677afaSXin Li			<spdx:artifactOf>
82*ba677afaSXin Li				<doap:Project rdf:about="http://subversion.apache.org/doap.rdf">
83*ba677afaSXin Li					<doap:homepage>http://www.openjena.org/</doap:homepage>
84*ba677afaSXin Li					<doap:name>Jena</doap:name>
85*ba677afaSXin Li				</doap:Project>
86*ba677afaSXin Li			</spdx:artifactOf>
87*ba677afaSXin Li		</spdx:File>`)
88*ba677afaSXin Li	if err != nil {
89*ba677afaSXin Li		t.Errorf("unexpected error while parsing a valid example: %v", err)
90*ba677afaSXin Li	}
91*ba677afaSXin Li	artifactOfNode = gordfWriter.FilterTriples(rdfParser.gordfParserObj.Triples, nil, &SPDX_ARTIFACT_OF, nil)[0].Object
92*ba677afaSXin Li	artifact, err = rdfParser.getArtifactFromNode(artifactOfNode)
93*ba677afaSXin Li	if err != nil {
94*ba677afaSXin Li		t.Errorf("error parsing a valid artifactOf node: %v", err)
95*ba677afaSXin Li	}
96*ba677afaSXin Li	expectedURI := "http://subversion.apache.org/doap.rdf"
97*ba677afaSXin Li	if artifact.URI != expectedURI {
98*ba677afaSXin Li		t.Errorf("wrong artifact URI. Expected: %s, found: %s", expectedURI, artifact.URI)
99*ba677afaSXin Li	}
100*ba677afaSXin Li
101*ba677afaSXin Li	// TestCase 3: artifactOf with unknown predicate
102*ba677afaSXin Li	rdfParser, err = parserFromBodyContent(
103*ba677afaSXin Li		`<spdx:File>
104*ba677afaSXin Li			<spdx:artifactOf>
105*ba677afaSXin Li				<doap:Project rdf:about="http://subversion.apache.org/doap.rdf">
106*ba677afaSXin Li					<doap:homepage>http://www.openjena.org/</doap:homepage>
107*ba677afaSXin Li					<doap:name>Jena</doap:name>
108*ba677afaSXin Li					<doap:invalidTag rdf:ID="invalid"/>
109*ba677afaSXin Li				</doap:Project>
110*ba677afaSXin Li			</spdx:artifactOf>
111*ba677afaSXin Li		</spdx:File>`)
112*ba677afaSXin Li	if err != nil {
113*ba677afaSXin Li		t.Errorf("unexpected error while parsing a valid example: %v", err)
114*ba677afaSXin Li	}
115*ba677afaSXin Li	artifactOfNode = gordfWriter.FilterTriples(rdfParser.gordfParserObj.Triples, nil, &SPDX_ARTIFACT_OF, nil)[0].Object
116*ba677afaSXin Li	_, err = rdfParser.getArtifactFromNode(artifactOfNode)
117*ba677afaSXin Li	if err == nil {
118*ba677afaSXin Li		t.Errorf("must've raised an error for an invalid predicate")
119*ba677afaSXin Li	}
120*ba677afaSXin Li}
121*ba677afaSXin Li
122*ba677afaSXin Lifunc Test_rdfParser2_3_getFileTypeFromUri(t *testing.T) {
123*ba677afaSXin Li	rdfParser, _ := parserFromBodyContent(``)
124*ba677afaSXin Li
125*ba677afaSXin Li	// TestCase 1: Valid fileType URI:
126*ba677afaSXin Li	fileTypeURI := "http://spdx.org/rdf/terms#fileType_source"
127*ba677afaSXin Li	fileType, err := rdfParser.getFileTypeFromUri(fileTypeURI)
128*ba677afaSXin Li	if err != nil {
129*ba677afaSXin Li		t.Errorf("error in a valid example: %v", err)
130*ba677afaSXin Li	}
131*ba677afaSXin Li	if fileType != "source" {
132*ba677afaSXin Li		t.Errorf("wrong fileType. expected: %s, found: %s", "source", fileType)
133*ba677afaSXin Li	}
134*ba677afaSXin Li
135*ba677afaSXin Li	// TestCase 2: Invalid fileType URI format.
136*ba677afaSXin Li	fileTypeURI = "http://spdx.org/rdf/terms#source"
137*ba677afaSXin Li	fileType, err = rdfParser.getFileTypeFromUri(fileTypeURI)
138*ba677afaSXin Li	if err == nil {
139*ba677afaSXin Li		t.Error("should've raised an error for invalid fileType")
140*ba677afaSXin Li	}
141*ba677afaSXin Li}
142*ba677afaSXin Li
143*ba677afaSXin Lifunc Test_rdfParser2_3_setUnpackagedFiles(t *testing.T) {
144*ba677afaSXin Li	// unpackaged files are the files which are not associated with any package
145*ba677afaSXin Li	// file associated with a package sets parser.assocWithPackage[fileID] to true.
146*ba677afaSXin Li	rdfParser, _ := parserFromBodyContent(``)
147*ba677afaSXin Li	file1 := &v2_3.File{FileSPDXIdentifier: common.ElementID("file1")}
148*ba677afaSXin Li	file2 := &v2_3.File{FileSPDXIdentifier: common.ElementID("file2")}
149*ba677afaSXin Li	file3 := &v2_3.File{FileSPDXIdentifier: common.ElementID("file3")}
150*ba677afaSXin Li
151*ba677afaSXin Li	// setting files to the document as if it were to be set when it was parsed using triples.
152*ba677afaSXin Li	rdfParser.files[file1.FileSPDXIdentifier] = file1
153*ba677afaSXin Li	rdfParser.files[file2.FileSPDXIdentifier] = file2
154*ba677afaSXin Li	rdfParser.files[file3.FileSPDXIdentifier] = file3
155*ba677afaSXin Li
156*ba677afaSXin Li	// assuming file1 is associated with a package
157*ba677afaSXin Li	rdfParser.assocWithPackage[file1.FileSPDXIdentifier] = true
158*ba677afaSXin Li
159*ba677afaSXin Li	rdfParser.setUnpackagedFiles()
160*ba677afaSXin Li
161*ba677afaSXin Li	// after setting unpackaged files, parser.doc.Files must've file2 and file3
162*ba677afaSXin Li	if n := len(rdfParser.doc.Files); n != 2 {
163*ba677afaSXin Li		t.Errorf("unpackage files should've had 2 files, found %d files", n)
164*ba677afaSXin Li	}
165*ba677afaSXin Li
166*ba677afaSXin Li	// checking if the unpackagedFiles contain only file2 & file3.
167*ba677afaSXin Li	for _, file := range rdfParser.doc.Files {
168*ba677afaSXin Li		switch string(file.FileSPDXIdentifier) {
169*ba677afaSXin Li		case "file2", "file3":
170*ba677afaSXin Li			continue
171*ba677afaSXin Li		default:
172*ba677afaSXin Li			t.Errorf("unexpected file with id %s found in unpackaged files", file.FileSPDXIdentifier)
173*ba677afaSXin Li		}
174*ba677afaSXin Li	}
175*ba677afaSXin Li}
176*ba677afaSXin Li
177*ba677afaSXin Lifunc Test_setFileIdentifier(t *testing.T) {
178*ba677afaSXin Li	file := &v2_3.File{}
179*ba677afaSXin Li
180*ba677afaSXin Li	// TestCase 1: valid example
181*ba677afaSXin Li	err := setFileIdentifier("http://spdx.org/documents/spdx-toolsv2.1.7-SNAPSHOT#SPDXRef-129", file)
182*ba677afaSXin Li	if err != nil {
183*ba677afaSXin Li		t.Errorf("unexpected error: %v", err)
184*ba677afaSXin Li	}
185*ba677afaSXin Li	if file.FileSPDXIdentifier != "129" {
186*ba677afaSXin Li		t.Errorf("expected %s, found: %s", "129", file.FileSPDXIdentifier)
187*ba677afaSXin Li	}
188*ba677afaSXin Li
189*ba677afaSXin Li	// TestCase 2: invalid example
190*ba677afaSXin Li	err = setFileIdentifier("http://spdx.org/documents/spdx-toolsv2.1.7-SNAPSHOT#129", file)
191*ba677afaSXin Li	if err == nil {
192*ba677afaSXin Li		t.Errorf("should've raised an error for an invalid example")
193*ba677afaSXin Li	}
194*ba677afaSXin Li}
195*ba677afaSXin Li
196*ba677afaSXin Lifunc Test_rdfParser2_3_setFileChecksumFromNode(t *testing.T) {
197*ba677afaSXin Li	// TestCase 1: md5 checksum
198*ba677afaSXin Li	parser, _ := parserFromBodyContent(`
199*ba677afaSXin Li		<spdx:Checksum>
200*ba677afaSXin Li			<spdx:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_md5" />
201*ba677afaSXin Li		    <spdx:checksumValue>d2356e0fe1c0b85285d83c6b2ad51b5f</spdx:checksumValue>
202*ba677afaSXin Li		</spdx:Checksum>
203*ba677afaSXin Li    `)
204*ba677afaSXin Li	checksumNode := gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_CHECKSUM_CAPITALIZED)[0].Subject
205*ba677afaSXin Li	file := &v2_3.File{}
206*ba677afaSXin Li	err := parser.setFileChecksumFromNode(file, checksumNode)
207*ba677afaSXin Li	if err != nil {
208*ba677afaSXin Li		t.Errorf("error parsing a valid checksum node")
209*ba677afaSXin Li	}
210*ba677afaSXin Li	checksumValue := "d2356e0fe1c0b85285d83c6b2ad51b5f"
211*ba677afaSXin Li	for _, checksum := range file.Checksums {
212*ba677afaSXin Li		switch checksum.Algorithm {
213*ba677afaSXin Li		case common.SHA1:
214*ba677afaSXin Li			if checksum.Value != "" {
215*ba677afaSXin Li				t.Errorf("incorrectly set sha1, should've been empty")
216*ba677afaSXin Li			}
217*ba677afaSXin Li		case common.SHA256:
218*ba677afaSXin Li			if checksum.Value != "" {
219*ba677afaSXin Li				t.Errorf("incorrectly set sha256, should've been empty")
220*ba677afaSXin Li			}
221*ba677afaSXin Li		case common.MD5:
222*ba677afaSXin Li			if checksum.Value != checksumValue {
223*ba677afaSXin Li				t.Errorf("wrong checksum value for md5. Expected: %s, found: %s", checksumValue, checksum.Value)
224*ba677afaSXin Li			}
225*ba677afaSXin Li		}
226*ba677afaSXin Li	}
227*ba677afaSXin Li
228*ba677afaSXin Li	// TestCase 2: valid sha1 checksum
229*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
230*ba677afaSXin Li		<spdx:Checksum>
231*ba677afaSXin Li			<spdx:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1" />
232*ba677afaSXin Li		    <spdx:checksumValue>d2356e0fe1c0b85285d83c6b2ad51b5f</spdx:checksumValue>
233*ba677afaSXin Li		</spdx:Checksum>
234*ba677afaSXin Li    `)
235*ba677afaSXin Li	checksumNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_CHECKSUM_CAPITALIZED)[0].Subject
236*ba677afaSXin Li	file = &v2_3.File{}
237*ba677afaSXin Li	err = parser.setFileChecksumFromNode(file, checksumNode)
238*ba677afaSXin Li	if err != nil {
239*ba677afaSXin Li		t.Errorf("error parsing a valid checksum node")
240*ba677afaSXin Li	}
241*ba677afaSXin Li	for _, checksum := range file.Checksums {
242*ba677afaSXin Li		switch checksum.Algorithm {
243*ba677afaSXin Li		case common.SHA1:
244*ba677afaSXin Li			if checksum.Value != checksumValue {
245*ba677afaSXin Li				t.Errorf("wrong checksum value for sha1. Expected: %s, found: %s", checksumValue, checksum.Value)
246*ba677afaSXin Li			}
247*ba677afaSXin Li		case common.SHA256:
248*ba677afaSXin Li			if checksum.Value != "" {
249*ba677afaSXin Li				t.Errorf("incorrectly set sha256, should've been empty")
250*ba677afaSXin Li			}
251*ba677afaSXin Li		case common.MD5:
252*ba677afaSXin Li			if checksum.Value != checksumValue {
253*ba677afaSXin Li				t.Errorf("incorrectly set md5, should've been empty")
254*ba677afaSXin Li			}
255*ba677afaSXin Li		}
256*ba677afaSXin Li	}
257*ba677afaSXin Li
258*ba677afaSXin Li	// TestCase 3: valid sha256 checksum
259*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
260*ba677afaSXin Li		<spdx:Checksum>
261*ba677afaSXin Li			<spdx:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha256" />
262*ba677afaSXin Li		    <spdx:checksumValue>d2356e0fe1c0b85285d83c6b2ad51b5f</spdx:checksumValue>
263*ba677afaSXin Li		</spdx:Checksum>
264*ba677afaSXin Li    `)
265*ba677afaSXin Li	checksumNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_CHECKSUM_CAPITALIZED)[0].Subject
266*ba677afaSXin Li	file = &v2_3.File{}
267*ba677afaSXin Li	err = parser.setFileChecksumFromNode(file, checksumNode)
268*ba677afaSXin Li	if err != nil {
269*ba677afaSXin Li		t.Errorf("error parsing a valid checksum node")
270*ba677afaSXin Li	}
271*ba677afaSXin Li	for _, checksum := range file.Checksums {
272*ba677afaSXin Li		switch checksum.Algorithm {
273*ba677afaSXin Li		case common.SHA1:
274*ba677afaSXin Li			if checksum.Value != checksumValue {
275*ba677afaSXin Li				t.Errorf("incorrectly set sha1, should've been empty")
276*ba677afaSXin Li			}
277*ba677afaSXin Li		case common.SHA256:
278*ba677afaSXin Li			if checksum.Value != checksumValue {
279*ba677afaSXin Li				t.Errorf("wrong checksum value for sha256. Expected: %s, found: %s", checksumValue, checksum.Value)
280*ba677afaSXin Li			}
281*ba677afaSXin Li		case common.MD5:
282*ba677afaSXin Li			if checksum.Value != checksumValue {
283*ba677afaSXin Li				t.Errorf("incorrectly set md5, should've been empty")
284*ba677afaSXin Li			}
285*ba677afaSXin Li		}
286*ba677afaSXin Li	}
287*ba677afaSXin Li
288*ba677afaSXin Li	// TestCase 4: checksum node without one of the mandatory attributes
289*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
290*ba677afaSXin Li		<spdx:Checksum>
291*ba677afaSXin Li		    <spdx:checksumValue>d2356e0fe1c0b85285d83c6b2ad51b5f</spdx:checksumValue>
292*ba677afaSXin Li		</spdx:Checksum>
293*ba677afaSXin Li    `)
294*ba677afaSXin Li	checksumNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_CHECKSUM_CAPITALIZED)[0].Subject
295*ba677afaSXin Li	file = &v2_3.File{}
296*ba677afaSXin Li	err = parser.setFileChecksumFromNode(file, checksumNode)
297*ba677afaSXin Li	if err == nil {
298*ba677afaSXin Li		t.Errorf("should've raised an error parsing an invalid checksum node")
299*ba677afaSXin Li	}
300*ba677afaSXin Li
301*ba677afaSXin Li	// TestCase 5: invalid checksum algorithm
302*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
303*ba677afaSXin Li		<spdx:Checksum>
304*ba677afaSXin Li			<spdx:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_md43" />
305*ba677afaSXin Li		    <spdx:checksumValue>d2356e0fe1c0b85285d83c6b2ad51b5f</spdx:checksumValue>
306*ba677afaSXin Li		</spdx:Checksum>
307*ba677afaSXin Li    `)
308*ba677afaSXin Li	checksumNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_CHECKSUM_CAPITALIZED)[0].Subject
309*ba677afaSXin Li	file = &v2_3.File{}
310*ba677afaSXin Li	err = parser.setFileChecksumFromNode(file, checksumNode)
311*ba677afaSXin Li	if err == nil {
312*ba677afaSXin Li		t.Errorf("should've raised an error parsing an invalid checksum node")
313*ba677afaSXin Li	}
314*ba677afaSXin Li
315*ba677afaSXin Li	// TestCase 6: valid checksum algorithm which is invalid for file (like md4, md6, sha384, etc.)
316*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
317*ba677afaSXin Li		<spdx:Checksum>
318*ba677afaSXin Li			<spdx:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha2000" />
319*ba677afaSXin Li		    <spdx:checksumValue>d2356e0fe1c0b85285d83c6b2ad51b5f</spdx:checksumValue>
320*ba677afaSXin Li		</spdx:Checksum>
321*ba677afaSXin Li    `)
322*ba677afaSXin Li	checksumNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_CHECKSUM_CAPITALIZED)[0].Subject
323*ba677afaSXin Li	file = &v2_3.File{}
324*ba677afaSXin Li	err = parser.setFileChecksumFromNode(file, checksumNode)
325*ba677afaSXin Li	if err == nil {
326*ba677afaSXin Li		t.Errorf("should've raised an error parsing an invalid checksum algorithm for a file")
327*ba677afaSXin Li	}
328*ba677afaSXin Li}
329*ba677afaSXin Li
330*ba677afaSXin Lifunc Test_rdfParser2_3_getFileFromNode(t *testing.T) {
331*ba677afaSXin Li	// TestCase 1: file with invalid id
332*ba677afaSXin Li	parser, _ := parserFromBodyContent(`
333*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gzspdx.rdf#item177"/>
334*ba677afaSXin Li	`)
335*ba677afaSXin Li	fileNode := gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
336*ba677afaSXin Li	_, err := parser.getFileFromNode(fileNode)
337*ba677afaSXin Li	if err == nil {
338*ba677afaSXin Li		t.Errorf("should've raised an error stating invalid file ID")
339*ba677afaSXin Li	}
340*ba677afaSXin Li
341*ba677afaSXin Li	// TestCase 2: invalid fileType
342*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
343*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
344*ba677afaSXin Li			<spdx:fileType rdf:resource="http://spdx.org/rdf/terms#source"/>
345*ba677afaSXin Li		</spdx:File>
346*ba677afaSXin Li	`)
347*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
348*ba677afaSXin Li	_, err = parser.getFileFromNode(fileNode)
349*ba677afaSXin Li	if err == nil {
350*ba677afaSXin Li		t.Errorf("should've raised an error stating invalid fileType")
351*ba677afaSXin Li	}
352*ba677afaSXin Li
353*ba677afaSXin Li	// TestCase 3: invalid file checksum
354*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
355*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
356*ba677afaSXin Li			<spdx:checksum>
357*ba677afaSXin Li				<spdx:Checksum>
358*ba677afaSXin Li					<spdx:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha2000" />
359*ba677afaSXin Li					<spdx:checksumValue>0a3a0e1ab72b7c132f5021c538a7a3ea6d539bcd</spdx:checksumValue>
360*ba677afaSXin Li				</spdx:Checksum>
361*ba677afaSXin Li			</spdx:checksum>
362*ba677afaSXin Li		</spdx:File>
363*ba677afaSXin Li	`)
364*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
365*ba677afaSXin Li	_, err = parser.getFileFromNode(fileNode)
366*ba677afaSXin Li	if err == nil {
367*ba677afaSXin Li		t.Errorf("should've raised an error stating invalid checksum")
368*ba677afaSXin Li	}
369*ba677afaSXin Li
370*ba677afaSXin Li	// TestCase 4: invalid license concluded
371*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
372*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
373*ba677afaSXin Li			<spdx:licenseConcluded rdf:resource="http://spdx.org/rdf/terms#invalid_license" />
374*ba677afaSXin Li		</spdx:File>
375*ba677afaSXin Li	`)
376*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
377*ba677afaSXin Li	_, err = parser.getFileFromNode(fileNode)
378*ba677afaSXin Li	if err == nil {
379*ba677afaSXin Li		t.Errorf("should've raised an error stating invalid license Concluded")
380*ba677afaSXin Li	}
381*ba677afaSXin Li
382*ba677afaSXin Li	// TestCase 5: invalid artifactOf attribute
383*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
384*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
385*ba677afaSXin Li			<spdx:artifactOf>
386*ba677afaSXin Li				<doap:Project>
387*ba677afaSXin Li					<doap:unknown_tag />
388*ba677afaSXin Li					<doap:name>Jena</doap:name>
389*ba677afaSXin Li				</doap:Project>
390*ba677afaSXin Li			</spdx:artifactOf>
391*ba677afaSXin Li		</spdx:File>
392*ba677afaSXin Li	`)
393*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
394*ba677afaSXin Li	_, err = parser.getFileFromNode(fileNode)
395*ba677afaSXin Li	if err == nil {
396*ba677afaSXin Li		t.Errorf("should've raised an error stating invalid artifactOf predicate")
397*ba677afaSXin Li	}
398*ba677afaSXin Li
399*ba677afaSXin Li	// TestCase 6: invalid file dependency
400*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
401*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
402*ba677afaSXin Li			<spdx:fileDependency rdf:resource="http://spdx.org/spdxdocs/spdx-example#CommonsLangSrc"/>
403*ba677afaSXin Li		</spdx:File>
404*ba677afaSXin Li	`)
405*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
406*ba677afaSXin Li	_, err = parser.getFileFromNode(fileNode)
407*ba677afaSXin Li	if err == nil {
408*ba677afaSXin Li		t.Errorf("should've raised an error stating invalid fileDependency")
409*ba677afaSXin Li	}
410*ba677afaSXin Li
411*ba677afaSXin Li	// TestCase 7: invalid annotation with unknown predicate
412*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
413*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
414*ba677afaSXin Li			<spdx:annotation>
415*ba677afaSXin Li				<spdx:Annotation>
416*ba677afaSXin Li					<spdx:unknownAttribute />
417*ba677afaSXin Li				</spdx:Annotation>
418*ba677afaSXin Li			</spdx:annotation>
419*ba677afaSXin Li		</spdx:File>
420*ba677afaSXin Li	`)
421*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
422*ba677afaSXin Li	_, err = parser.getFileFromNode(fileNode)
423*ba677afaSXin Li	if err == nil {
424*ba677afaSXin Li		t.Errorf("should've raised an error stating invalid annotation predicate")
425*ba677afaSXin Li	}
426*ba677afaSXin Li
427*ba677afaSXin Li	// TestCase 8: invalid relationship
428*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
429*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
430*ba677afaSXin Li			<spdx:relationship>
431*ba677afaSXin Li				<spdx:Relationship>
432*ba677afaSXin Li					<spdx:relationshipType rdf:resource="http://spdx.org/rdf/terms#dynamicLink"/>
433*ba677afaSXin Li				</spdx:Relationship>
434*ba677afaSXin Li			</spdx:relationship>
435*ba677afaSXin Li		</spdx:File>
436*ba677afaSXin Li	`)
437*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
438*ba677afaSXin Li	_, err = parser.getFileFromNode(fileNode)
439*ba677afaSXin Li	if err == nil {
440*ba677afaSXin Li		t.Errorf("should've raised an error stating invalid relationship Type")
441*ba677afaSXin Li	}
442*ba677afaSXin Li
443*ba677afaSXin Li	// TestCase 8: unknown predicate
444*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
445*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
446*ba677afaSXin Li			<spdx:unknown />
447*ba677afaSXin Li		</spdx:File>
448*ba677afaSXin Li	`)
449*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
450*ba677afaSXin Li	_, err = parser.getFileFromNode(fileNode)
451*ba677afaSXin Li	if err == nil {
452*ba677afaSXin Li		t.Error("should've raised an error stating invalid predicate for a file")
453*ba677afaSXin Li	}
454*ba677afaSXin Li
455*ba677afaSXin Li	// TestCase 9: invalid licenseInfoInFile.
456*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
457*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
458*ba677afaSXin Li			<spdx:licenseInfoInFile rdf:resource="http://spdx.org/licenses/DC0-1.0" />
459*ba677afaSXin Li		</spdx:File>
460*ba677afaSXin Li	`)
461*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
462*ba677afaSXin Li	_, err = parser.getFileFromNode(fileNode)
463*ba677afaSXin Li	if err == nil {
464*ba677afaSXin Li		t.Error("should've raised an error stating invalid licenseInfoInFile for a file")
465*ba677afaSXin Li	}
466*ba677afaSXin Li
467*ba677afaSXin Li	// TestCase 10: Splitting of File definition into parents of different tags mustn't create new file objects.
468*ba677afaSXin Li	fileDefinitions := []string{
469*ba677afaSXin Li		`<spdx:Package rdf:about="#SPDXRef-Package1">
470*ba677afaSXin Li			<spdx:hasFile>
471*ba677afaSXin Li				<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
472*ba677afaSXin Li					<spdx:fileName>time-1.9/ChangeLog</spdx:fileName>
473*ba677afaSXin Li					<spdx:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/>
474*ba677afaSXin Li				</spdx:File>
475*ba677afaSXin Li			</spdx:hasFile>
476*ba677afaSXin Li		</spdx:Package>`,
477*ba677afaSXin Li		`<spdx:Package rdf:about="#SPDXRef-Package2">
478*ba677afaSXin Li			<spdx:hasFile>
479*ba677afaSXin Li				<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
480*ba677afaSXin Li					<spdx:licenseConcluded rdf:resource="http://spdx.org/rdf/terms#noassertion" />
481*ba677afaSXin Li					<spdx:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#NOASSERTION" />
482*ba677afaSXin Li				</spdx:File>
483*ba677afaSXin Li			</spdx:hasFile>
484*ba677afaSXin Li		</spdx:Package>`,
485*ba677afaSXin Li	}
486*ba677afaSXin Li	parser, _ = parserFromBodyContent(strings.Join(fileDefinitions, ""))
487*ba677afaSXin Li
488*ba677afaSXin Li	var file *v2_3.File
489*ba677afaSXin Li	packageTypeTriples := gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_PACKAGE)
490*ba677afaSXin Li	for _, typeTriple := range packageTypeTriples {
491*ba677afaSXin Li		pkg, err := parser.getPackageFromNode(typeTriple.Subject)
492*ba677afaSXin Li		if err != nil {
493*ba677afaSXin Li			t.Errorf("unexpected error parsing a valid package: %v", err)
494*ba677afaSXin Li		}
495*ba677afaSXin Li		if n := len(pkg.Files); n != 1 {
496*ba677afaSXin Li			t.Errorf("expected package to contain exactly 1 file. Found %d files", n)
497*ba677afaSXin Li		}
498*ba677afaSXin Li		for _, file = range pkg.Files {
499*ba677afaSXin Li		}
500*ba677afaSXin Li	}
501*ba677afaSXin Li
502*ba677afaSXin Li	// checking if all the attributes that spanned over a several tags are set in the same variable.
503*ba677afaSXin Li	expectedFileName := "time-1.9/ChangeLog"
504*ba677afaSXin Li	if file.FileName != expectedFileName {
505*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedFileName, file.FileName)
506*ba677afaSXin Li	}
507*ba677afaSXin Li	expectedLicenseConcluded := "NOASSERTION"
508*ba677afaSXin Li	if file.LicenseConcluded != expectedLicenseConcluded {
509*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedLicenseConcluded, file.LicenseConcluded)
510*ba677afaSXin Li	}
511*ba677afaSXin Li	expectedFileType := "source"
512*ba677afaSXin Li	if file.FileTypes[0] != expectedFileType {
513*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedFileType, file.FileTypes)
514*ba677afaSXin Li	}
515*ba677afaSXin Li	expectedLicenseInfoInFile := "NOASSERTION"
516*ba677afaSXin Li	if file.LicenseInfoInFiles[0] != expectedLicenseInfoInFile {
517*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedLicenseInfoInFile, file.LicenseInfoInFiles[0])
518*ba677afaSXin Li	}
519*ba677afaSXin Li
520*ba677afaSXin Li	// TestCase 12: checking if recursive dependencies are resolved.
521*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
522*ba677afaSXin Li		<spdx:File rdf:about="#SPDXRef-ParentFile">
523*ba677afaSXin Li			<spdx:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/>
524*ba677afaSXin Li			<spdx:fileDependency>
525*ba677afaSXin Li				<spdx:File rdf:about="#SPDXRef-ChildFile">
526*ba677afaSXin Li					<spdx:fileDependency>
527*ba677afaSXin Li						<spdx:File rdf:about="#SPDXRef-ParentFile">
528*ba677afaSXin Li							<spdx:fileName>ParentFile</spdx:fileName>
529*ba677afaSXin Li						</spdx:File>
530*ba677afaSXin Li					</spdx:fileDependency>
531*ba677afaSXin Li				</spdx:File>
532*ba677afaSXin Li			</spdx:fileDependency>
533*ba677afaSXin Li		</spdx:File>
534*ba677afaSXin Li	`)
535*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
536*ba677afaSXin Li	file, err = parser.getFileFromNode(fileNode)
537*ba677afaSXin Li
538*ba677afaSXin Li	// TestCase 11: all valid attribute and it's values.
539*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
540*ba677afaSXin Li		<spdx:File rdf:about="http://anupam-VirtualBox/repo/SPDX2_time-1.9.tar.gz_1535120734-spdx.rdf#SPDXRef-item177">
541*ba677afaSXin Li			<spdx:fileName>time-1.9/ChangeLog</spdx:fileName>
542*ba677afaSXin Li			<spdx:name/>
543*ba677afaSXin Li			<spdx:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/>
544*ba677afaSXin Li			<spdx:checksum>
545*ba677afaSXin Li				<spdx:Checksum>
546*ba677afaSXin Li					<spdx:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1" />
547*ba677afaSXin Li					<spdx:checksumValue>0a3a0e1ab72b7c132f5021c538a7a3ea6d539bcd</spdx:checksumValue>
548*ba677afaSXin Li				</spdx:Checksum>
549*ba677afaSXin Li			</spdx:checksum>
550*ba677afaSXin Li			<spdx:licenseConcluded rdf:resource="http://spdx.org/rdf/terms#noassertion" />
551*ba677afaSXin Li			<spdx:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#NOASSERTION" />
552*ba677afaSXin Li			<spdx:licenseComments>no comments</spdx:licenseComments>
553*ba677afaSXin Li			<spdx:copyrightText>from spdx file</spdx:copyrightText>
554*ba677afaSXin Li			<spdx:artifactOf>
555*ba677afaSXin Li				<doap:Project>
556*ba677afaSXin Li					<doap:homepage>http://www.openjena.org/</doap:homepage>
557*ba677afaSXin Li					<doap:name>Jena</doap:name>
558*ba677afaSXin Li				</doap:Project>
559*ba677afaSXin Li			</spdx:artifactOf>
560*ba677afaSXin Li			<rdfs:comment>no comments</rdfs:comment>
561*ba677afaSXin Li			<spdx:noticeText rdf:resource="http://spdx.org/rdf/terms#noassertion"/>
562*ba677afaSXin Li			<spdx:fileContributor>Some Organization</spdx:fileContributor>
563*ba677afaSXin Li			<spdx:fileDependency rdf:resource="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-CommonsLangSrc"/>
564*ba677afaSXin Li			<spdx:attributionText>attribution text</spdx:attributionText>
565*ba677afaSXin Li			<spdx:annotation>
566*ba677afaSXin Li				<spdx:Annotation>
567*ba677afaSXin Li					<spdx:annotationDate>2011-01-29T18:30:22Z</spdx:annotationDate>
568*ba677afaSXin Li					<rdfs:comment>File level annotation copied from a spdx document</rdfs:comment>
569*ba677afaSXin Li					<spdx:annotator>Person: File Commenter</spdx:annotator>
570*ba677afaSXin Li					<spdx:annotationType rdf:resource="http://spdx.org/rdf/terms#annotationType_other"/>
571*ba677afaSXin Li				</spdx:Annotation>
572*ba677afaSXin Li			</spdx:annotation>
573*ba677afaSXin Li			<spdx:relationship>
574*ba677afaSXin Li				<spdx:Relationship>
575*ba677afaSXin Li					<spdx:relationshipType rdf:resource="http://spdx.org/rdf/terms#relationshipType_contains"/>
576*ba677afaSXin Li					<spdx:relatedSpdxElement rdf:resource="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-Package"/>
577*ba677afaSXin Li				</spdx:Relationship>
578*ba677afaSXin Li			</spdx:relationship>
579*ba677afaSXin Li		</spdx:File>
580*ba677afaSXin Li	`)
581*ba677afaSXin Li	fileNode = gordfWriter.FilterTriples(parser.gordfParserObj.Triples, nil, &RDF_TYPE, &SPDX_FILE)[0].Subject
582*ba677afaSXin Li	file, err = parser.getFileFromNode(fileNode)
583*ba677afaSXin Li	if err != nil {
584*ba677afaSXin Li		t.Errorf("unexpected error parsing a valid file: %v", err)
585*ba677afaSXin Li	}
586*ba677afaSXin Li
587*ba677afaSXin Li	// checking each and every attribute of the obtained file.
588*ba677afaSXin Li
589*ba677afaSXin Li	expectedFileName = "time-1.9/ChangeLog"
590*ba677afaSXin Li	if file.FileName != expectedFileName {
591*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedFileName, file.FileName)
592*ba677afaSXin Li	}
593*ba677afaSXin Li
594*ba677afaSXin Li	if len(file.FileTypes) != 1 {
595*ba677afaSXin Li		t.Errorf("given file should have 1 fileType attribute. found %d", len(file.FileTypes))
596*ba677afaSXin Li	}
597*ba677afaSXin Li	expectedFileType = "source"
598*ba677afaSXin Li	if file.FileTypes[0] != expectedFileType {
599*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedFileType, file.FileTypes)
600*ba677afaSXin Li	}
601*ba677afaSXin Li
602*ba677afaSXin Li	expectedChecksum := "0a3a0e1ab72b7c132f5021c538a7a3ea6d539bcd"
603*ba677afaSXin Li
604*ba677afaSXin Li	for _, checksum := range file.Checksums {
605*ba677afaSXin Li		switch checksum.Algorithm {
606*ba677afaSXin Li		case common.SHA1:
607*ba677afaSXin Li			if checksum.Value != expectedChecksum {
608*ba677afaSXin Li				t.Errorf("expected %s, found %s", expectedChecksum, checksum.Value)
609*ba677afaSXin Li			}
610*ba677afaSXin Li		}
611*ba677afaSXin Li	}
612*ba677afaSXin Li
613*ba677afaSXin Li	expectedLicenseConcluded = "NOASSERTION"
614*ba677afaSXin Li	if file.LicenseConcluded != expectedLicenseConcluded {
615*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedLicenseConcluded, file.LicenseConcluded)
616*ba677afaSXin Li	}
617*ba677afaSXin Li
618*ba677afaSXin Li	if len(file.LicenseInfoInFiles) != 1 {
619*ba677afaSXin Li		t.Errorf("given file should have 1 licenseInfoInFile attribute. found %d", len(file.LicenseInfoInFiles))
620*ba677afaSXin Li	}
621*ba677afaSXin Li	expectedLicenseInfoInFile = "NOASSERTION"
622*ba677afaSXin Li	if file.LicenseInfoInFiles[0] != expectedLicenseInfoInFile {
623*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedLicenseInfoInFile, file.LicenseInfoInFiles[0])
624*ba677afaSXin Li	}
625*ba677afaSXin Li
626*ba677afaSXin Li	expectedLicenseComments := "no comments"
627*ba677afaSXin Li	if file.LicenseComments != expectedLicenseComments {
628*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedLicenseComments, file.LicenseComments)
629*ba677afaSXin Li	}
630*ba677afaSXin Li
631*ba677afaSXin Li	expectedCopyrightText := "from spdx file"
632*ba677afaSXin Li	if file.FileCopyrightText != expectedCopyrightText {
633*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedCopyrightText, file.FileCopyrightText)
634*ba677afaSXin Li	}
635*ba677afaSXin Li
636*ba677afaSXin Li	if n := len(file.ArtifactOfProjects); n != 1 {
637*ba677afaSXin Li		t.Errorf("given file should have 1 artifactOfProjects attribute. found %d", n)
638*ba677afaSXin Li	}
639*ba677afaSXin Li	artifactOf := file.ArtifactOfProjects[0]
640*ba677afaSXin Li	expectedHomePage := "http://www.openjena.org/"
641*ba677afaSXin Li	if artifactOf.HomePage != expectedHomePage {
642*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedHomePage, artifactOf.HomePage)
643*ba677afaSXin Li	}
644*ba677afaSXin Li	if artifactOf.Name != "Jena" {
645*ba677afaSXin Li		t.Errorf("expected %s, found %s", "Jena", artifactOf.Name)
646*ba677afaSXin Li	}
647*ba677afaSXin Li	if artifactOf.URI != "" {
648*ba677afaSXin Li		t.Errorf("expected artifactOf uri to be empty, found %s", artifactOf.URI)
649*ba677afaSXin Li	}
650*ba677afaSXin Li
651*ba677afaSXin Li	expectedFileComment := "no comments"
652*ba677afaSXin Li	if file.FileComment != expectedFileComment {
653*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedFileName, file.FileComment)
654*ba677afaSXin Li	}
655*ba677afaSXin Li
656*ba677afaSXin Li	expectedNoticeText := "NOASSERTION"
657*ba677afaSXin Li	if file.FileNotice != expectedNoticeText {
658*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedNoticeText, file.FileNotice)
659*ba677afaSXin Li	}
660*ba677afaSXin Li
661*ba677afaSXin Li	if n := len(file.FileContributors); n != 1 {
662*ba677afaSXin Li		t.Errorf("given file should have 1 fileContributor. found %d", n)
663*ba677afaSXin Li	}
664*ba677afaSXin Li	expectedFileContributor := "Some Organization"
665*ba677afaSXin Li	if file.FileContributors[0] != expectedFileContributor {
666*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedFileContributor, file.FileContributors)
667*ba677afaSXin Li	}
668*ba677afaSXin Li
669*ba677afaSXin Li	if n := len(file.FileDependencies); n != 1 {
670*ba677afaSXin Li		t.Errorf("given file should have 1 fileDependencies. found %d", n)
671*ba677afaSXin Li	}
672*ba677afaSXin Li	expectedFileDependency := "CommonsLangSrc"
673*ba677afaSXin Li	if file.FileDependencies[0] != expectedFileDependency {
674*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedFileDependency, file.FileDependencies[0])
675*ba677afaSXin Li	}
676*ba677afaSXin Li
677*ba677afaSXin Li	if n := len(file.FileAttributionTexts); n != 1 {
678*ba677afaSXin Li		t.Errorf("given file should have 1 attributionText. found %d", n)
679*ba677afaSXin Li	}
680*ba677afaSXin Li	expectedAttributionText := "attribution text"
681*ba677afaSXin Li	if file.FileAttributionTexts[0] != expectedAttributionText {
682*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedAttributionText, file.FileAttributionTexts[0])
683*ba677afaSXin Li	}
684*ba677afaSXin Li
685*ba677afaSXin Li	if n := len(parser.doc.Annotations); n != 1 {
686*ba677afaSXin Li		t.Errorf("doc should've had 1 annotation. found %d", n)
687*ba677afaSXin Li	}
688*ba677afaSXin Li	ann := parser.doc.Annotations[0]
689*ba677afaSXin Li	expectedAnnDate := "2011-01-29T18:30:22Z"
690*ba677afaSXin Li	if ann.AnnotationDate != expectedAnnDate {
691*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedAnnDate, ann.AnnotationDate)
692*ba677afaSXin Li	}
693*ba677afaSXin Li	expectedAnnComment := "File level annotation copied from a spdx document"
694*ba677afaSXin Li	if ann.AnnotationComment != expectedAnnComment {
695*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedAnnComment, ann.AnnotationComment)
696*ba677afaSXin Li	}
697*ba677afaSXin Li	expectedAnnotationType := "OTHER"
698*ba677afaSXin Li	if ann.AnnotationType != expectedAnnotationType {
699*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedAnnotationType, ann.AnnotationType)
700*ba677afaSXin Li	}
701*ba677afaSXin Li	expectedAnnotator := "File Commenter"
702*ba677afaSXin Li	if ann.Annotator.Annotator != expectedAnnotator {
703*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedAnnotator, ann.Annotator)
704*ba677afaSXin Li	}
705*ba677afaSXin Li	expectedAnnotatorType := "Person"
706*ba677afaSXin Li	if ann.AnnotationType != expectedAnnotationType {
707*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedAnnotatorType, ann.Annotator.AnnotatorType)
708*ba677afaSXin Li	}
709*ba677afaSXin Li
710*ba677afaSXin Li	if n := len(parser.doc.Relationships); n != 1 {
711*ba677afaSXin Li		t.Errorf("doc should've had 1 relation. found %d", n)
712*ba677afaSXin Li	}
713*ba677afaSXin Li	reln := parser.doc.Relationships[0]
714*ba677afaSXin Li	expectedRefAEID := "item177"
715*ba677afaSXin Li	if reln.RefA.DocumentRefID != "" {
716*ba677afaSXin Li		t.Errorf("expected refA.DocumentRefID to be empty, found %s", reln.RefA.DocumentRefID)
717*ba677afaSXin Li	}
718*ba677afaSXin Li	if string(reln.RefA.ElementRefID) != expectedRefAEID {
719*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedRefAEID, reln.RefA.ElementRefID)
720*ba677afaSXin Li	}
721*ba677afaSXin Li	expectedRefBEID := "Package"
722*ba677afaSXin Li	if reln.RefB.DocumentRefID != "" {
723*ba677afaSXin Li		t.Errorf("expected refB.DocumentRefID to be empty, found %s", reln.RefB.DocumentRefID)
724*ba677afaSXin Li	}
725*ba677afaSXin Li	if string(reln.RefB.ElementRefID) != expectedRefBEID {
726*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedRefBEID, reln.RefB.ElementRefID)
727*ba677afaSXin Li	}
728*ba677afaSXin Li	expectedRelationType := "contains"
729*ba677afaSXin Li	if reln.Relationship != expectedRelationType {
730*ba677afaSXin Li		t.Errorf("expected %s, found %s", expectedRefBEID, reln.RefB.ElementRefID)
731*ba677afaSXin Li	}
732*ba677afaSXin Li	if reln.RelationshipComment != "" {
733*ba677afaSXin Li		t.Errorf("expected relationship comment to be empty, found %s", reln.RelationshipComment)
734*ba677afaSXin Li	}
735*ba677afaSXin Li}
736*ba677afaSXin Li
737*ba677afaSXin Lifunc Test_getNoticeTextFromNode(t *testing.T) {
738*ba677afaSXin Li	// TestCase 1: SPDX_NOASSERTION_SMALL must return NOASSERTION
739*ba677afaSXin Li	output := getNoticeTextFromNode(&gordfParser.Node{
740*ba677afaSXin Li		NodeType: gordfParser.IRI,
741*ba677afaSXin Li		ID:       SPDX_NOASSERTION_SMALL,
742*ba677afaSXin Li	})
743*ba677afaSXin Li	if strings.ToUpper(output) != "NOASSERTION" {
744*ba677afaSXin Li		t.Errorf("expected NOASSERTION, found %s", strings.ToUpper(output))
745*ba677afaSXin Li	}
746*ba677afaSXin Li
747*ba677afaSXin Li	// TestCase 2: SPDX_NOASSERTION_CAPS must return NOASSERTION
748*ba677afaSXin Li	output = getNoticeTextFromNode(&gordfParser.Node{
749*ba677afaSXin Li		NodeType: gordfParser.IRI,
750*ba677afaSXin Li		ID:       SPDX_NOASSERTION_CAPS,
751*ba677afaSXin Li	})
752*ba677afaSXin Li	if strings.ToUpper(output) != "NOASSERTION" {
753*ba677afaSXin Li		t.Errorf("expected NOASSERTION, found %s", strings.ToUpper(output))
754*ba677afaSXin Li	}
755*ba677afaSXin Li
756*ba677afaSXin Li	// TestCase 3: not a NOASSERTION must return the field verbatim
757*ba677afaSXin Li	// TestCase 1: SPDX_NOASSERTION_SMALL must return NOASSERTION
758*ba677afaSXin Li	output = getNoticeTextFromNode(&gordfParser.Node{
759*ba677afaSXin Li		NodeType: gordfParser.IRI,
760*ba677afaSXin Li		ID:       "text",
761*ba677afaSXin Li	})
762*ba677afaSXin Li	if output != "text" {
763*ba677afaSXin Li		t.Errorf("expected text, found %s", output)
764*ba677afaSXin Li	}
765*ba677afaSXin Li}
766