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