1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Li 3*ba677afaSXin Lipackage saver2v3 4*ba677afaSXin Li 5*ba677afaSXin Liimport ( 6*ba677afaSXin Li "bytes" 7*ba677afaSXin Li "testing" 8*ba677afaSXin Li 9*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/common" 10*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_3" 11*ba677afaSXin Li) 12*ba677afaSXin Li 13*ba677afaSXin Li// ===== File section Saver tests ===== 14*ba677afaSXin Lifunc TestSaver2_3FileSavesText(t *testing.T) { 15*ba677afaSXin Li f := &v2_3.File{ 16*ba677afaSXin Li FileName: "/tmp/whatever.txt", 17*ba677afaSXin Li FileSPDXIdentifier: common.ElementID("File123"), 18*ba677afaSXin Li FileTypes: []string{ 19*ba677afaSXin Li "TEXT", 20*ba677afaSXin Li "DOCUMENTATION", 21*ba677afaSXin Li }, 22*ba677afaSXin Li Checksums: []common.Checksum{ 23*ba677afaSXin Li {Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"}, 24*ba677afaSXin Li {Algorithm: common.SHA256, Value: "11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd"}, 25*ba677afaSXin Li {Algorithm: common.MD5, Value: "624c1abb3664f4b35547e7c73864ad24"}, 26*ba677afaSXin Li }, 27*ba677afaSXin Li LicenseConcluded: "Apache-2.0", 28*ba677afaSXin Li LicenseInfoInFiles: []string{ 29*ba677afaSXin Li "Apache-2.0", 30*ba677afaSXin Li "Apache-1.1", 31*ba677afaSXin Li }, 32*ba677afaSXin Li LicenseComments: "this is a license comment(s)", 33*ba677afaSXin Li FileCopyrightText: "Copyright (c) Jane Doe", 34*ba677afaSXin Li ArtifactOfProjects: []*v2_3.ArtifactOfProject{ 35*ba677afaSXin Li { 36*ba677afaSXin Li Name: "project1", 37*ba677afaSXin Li HomePage: "http://example.com/1/", 38*ba677afaSXin Li URI: "http://example.com/1/uri.whatever", 39*ba677afaSXin Li }, 40*ba677afaSXin Li { 41*ba677afaSXin Li Name: "project2", 42*ba677afaSXin Li }, 43*ba677afaSXin Li { 44*ba677afaSXin Li Name: "project3", 45*ba677afaSXin Li HomePage: "http://example.com/3/", 46*ba677afaSXin Li }, 47*ba677afaSXin Li { 48*ba677afaSXin Li Name: "project4", 49*ba677afaSXin Li URI: "http://example.com/4/uri.whatever", 50*ba677afaSXin Li }, 51*ba677afaSXin Li }, 52*ba677afaSXin Li FileComment: "this is a file comment", 53*ba677afaSXin Li FileNotice: "This file may be used under either Apache-2.0 or Apache-1.1.", 54*ba677afaSXin Li FileContributors: []string{ 55*ba677afaSXin Li "John Doe [email protected]", 56*ba677afaSXin Li "EvilCorp", 57*ba677afaSXin Li }, 58*ba677afaSXin Li FileAttributionTexts: []string{ 59*ba677afaSXin Li "attributions", 60*ba677afaSXin Li `multi-line 61*ba677afaSXin Liattribution`, 62*ba677afaSXin Li }, 63*ba677afaSXin Li FileDependencies: []string{ 64*ba677afaSXin Li "f-1.txt", 65*ba677afaSXin Li "g.txt", 66*ba677afaSXin Li }, 67*ba677afaSXin Li } 68*ba677afaSXin Li 69*ba677afaSXin Li // what we want to get, as a buffer of bytes 70*ba677afaSXin Li want := bytes.NewBufferString(`FileName: /tmp/whatever.txt 71*ba677afaSXin LiSPDXID: SPDXRef-File123 72*ba677afaSXin LiFileType: TEXT 73*ba677afaSXin LiFileType: DOCUMENTATION 74*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c 75*ba677afaSXin LiFileChecksum: SHA256: 11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd 76*ba677afaSXin LiFileChecksum: MD5: 624c1abb3664f4b35547e7c73864ad24 77*ba677afaSXin LiLicenseConcluded: Apache-2.0 78*ba677afaSXin LiLicenseInfoInFile: Apache-2.0 79*ba677afaSXin LiLicenseInfoInFile: Apache-1.1 80*ba677afaSXin LiLicenseComments: this is a license comment(s) 81*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe 82*ba677afaSXin LiArtifactOfProjectName: project1 83*ba677afaSXin LiArtifactOfProjectHomePage: http://example.com/1/ 84*ba677afaSXin LiArtifactOfProjectURI: http://example.com/1/uri.whatever 85*ba677afaSXin LiArtifactOfProjectName: project2 86*ba677afaSXin LiArtifactOfProjectName: project3 87*ba677afaSXin LiArtifactOfProjectHomePage: http://example.com/3/ 88*ba677afaSXin LiArtifactOfProjectName: project4 89*ba677afaSXin LiArtifactOfProjectURI: http://example.com/4/uri.whatever 90*ba677afaSXin LiFileComment: this is a file comment 91*ba677afaSXin LiFileNotice: This file may be used under either Apache-2.0 or Apache-1.1. 92*ba677afaSXin LiFileContributor: John Doe jdoe@example.com 93*ba677afaSXin LiFileContributor: EvilCorp 94*ba677afaSXin LiFileAttributionText: attributions 95*ba677afaSXin LiFileAttributionText: <text>multi-line 96*ba677afaSXin Liattribution</text> 97*ba677afaSXin LiFileDependency: f-1.txt 98*ba677afaSXin LiFileDependency: g.txt 99*ba677afaSXin Li 100*ba677afaSXin Li`) 101*ba677afaSXin Li 102*ba677afaSXin Li // render as buffer of bytes 103*ba677afaSXin Li var got bytes.Buffer 104*ba677afaSXin Li err := renderFile2_3(f, &got) 105*ba677afaSXin Li if err != nil { 106*ba677afaSXin Li t.Errorf("Expected nil error, got %v", err) 107*ba677afaSXin Li } 108*ba677afaSXin Li 109*ba677afaSXin Li // check that they match 110*ba677afaSXin Li c := bytes.Compare(want.Bytes(), got.Bytes()) 111*ba677afaSXin Li if c != 0 { 112*ba677afaSXin Li t.Errorf("Expected %v, got %v", want.String(), got.String()) 113*ba677afaSXin Li } 114*ba677afaSXin Li} 115*ba677afaSXin Li 116*ba677afaSXin Lifunc TestSaver2_3FileSavesSnippetsAlso(t *testing.T) { 117*ba677afaSXin Li sn1 := &v2_3.Snippet{ 118*ba677afaSXin Li SnippetSPDXIdentifier: common.ElementID("Snippet19"), 119*ba677afaSXin Li SnippetFromFileSPDXIdentifier: common.MakeDocElementID("", "File123").ElementRefID, 120*ba677afaSXin Li Ranges: []common.SnippetRange{{StartPointer: common.SnippetRangePointer{Offset: 17}, EndPointer: common.SnippetRangePointer{Offset: 209}}}, 121*ba677afaSXin Li SnippetLicenseConcluded: "GPL-2.0-or-later", 122*ba677afaSXin Li SnippetCopyrightText: "Copyright (c) John Doe 20x6", 123*ba677afaSXin Li } 124*ba677afaSXin Li 125*ba677afaSXin Li sn2 := &v2_3.Snippet{ 126*ba677afaSXin Li SnippetSPDXIdentifier: common.ElementID("Snippet20"), 127*ba677afaSXin Li SnippetFromFileSPDXIdentifier: common.MakeDocElementID("", "File123").ElementRefID, 128*ba677afaSXin Li Ranges: []common.SnippetRange{{StartPointer: common.SnippetRangePointer{Offset: 268}, EndPointer: common.SnippetRangePointer{Offset: 309}}}, 129*ba677afaSXin Li SnippetLicenseConcluded: "WTFPL", 130*ba677afaSXin Li SnippetCopyrightText: "NOASSERTION", 131*ba677afaSXin Li } 132*ba677afaSXin Li 133*ba677afaSXin Li sns := map[common.ElementID]*v2_3.Snippet{ 134*ba677afaSXin Li common.ElementID("Snippet19"): sn1, 135*ba677afaSXin Li common.ElementID("Snippet20"): sn2, 136*ba677afaSXin Li } 137*ba677afaSXin Li 138*ba677afaSXin Li f := &v2_3.File{ 139*ba677afaSXin Li FileName: "/tmp/whatever.txt", 140*ba677afaSXin Li FileSPDXIdentifier: common.ElementID("File123"), 141*ba677afaSXin Li Checksums: []common.Checksum{ 142*ba677afaSXin Li {Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"}, 143*ba677afaSXin Li }, 144*ba677afaSXin Li LicenseConcluded: "Apache-2.0", 145*ba677afaSXin Li LicenseInfoInFiles: []string{ 146*ba677afaSXin Li "Apache-2.0", 147*ba677afaSXin Li }, 148*ba677afaSXin Li FileCopyrightText: "Copyright (c) Jane Doe", 149*ba677afaSXin Li Snippets: sns, 150*ba677afaSXin Li } 151*ba677afaSXin Li 152*ba677afaSXin Li // what we want to get, as a buffer of bytes 153*ba677afaSXin Li want := bytes.NewBufferString(`FileName: /tmp/whatever.txt 154*ba677afaSXin LiSPDXID: SPDXRef-File123 155*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c 156*ba677afaSXin LiLicenseConcluded: Apache-2.0 157*ba677afaSXin LiLicenseInfoInFile: Apache-2.0 158*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe 159*ba677afaSXin Li 160*ba677afaSXin LiSnippetSPDXID: SPDXRef-Snippet19 161*ba677afaSXin LiSnippetFromFileSPDXID: SPDXRef-File123 162*ba677afaSXin LiSnippetByteRange: 17:209 163*ba677afaSXin LiSnippetLicenseConcluded: GPL-2.0-or-later 164*ba677afaSXin LiSnippetCopyrightText: Copyright (c) John Doe 20x6 165*ba677afaSXin Li 166*ba677afaSXin LiSnippetSPDXID: SPDXRef-Snippet20 167*ba677afaSXin LiSnippetFromFileSPDXID: SPDXRef-File123 168*ba677afaSXin LiSnippetByteRange: 268:309 169*ba677afaSXin LiSnippetLicenseConcluded: WTFPL 170*ba677afaSXin LiSnippetCopyrightText: NOASSERTION 171*ba677afaSXin Li 172*ba677afaSXin Li`) 173*ba677afaSXin Li 174*ba677afaSXin Li // render as buffer of bytes 175*ba677afaSXin Li var got bytes.Buffer 176*ba677afaSXin Li err := renderFile2_3(f, &got) 177*ba677afaSXin Li if err != nil { 178*ba677afaSXin Li t.Errorf("Expected nil error, got %v", err) 179*ba677afaSXin Li } 180*ba677afaSXin Li 181*ba677afaSXin Li // check that they match 182*ba677afaSXin Li c := bytes.Compare(want.Bytes(), got.Bytes()) 183*ba677afaSXin Li if c != 0 { 184*ba677afaSXin Li t.Errorf("Expected %v, got %v", want.String(), got.String()) 185*ba677afaSXin Li } 186*ba677afaSXin Li} 187*ba677afaSXin Li 188*ba677afaSXin Lifunc TestSaver2_3FileOmitsOptionalFieldsIfEmpty(t *testing.T) { 189*ba677afaSXin Li f := &v2_3.File{ 190*ba677afaSXin Li FileName: "/tmp/whatever.txt", 191*ba677afaSXin Li FileSPDXIdentifier: common.ElementID("File123"), 192*ba677afaSXin Li Checksums: []common.Checksum{ 193*ba677afaSXin Li {Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"}, 194*ba677afaSXin Li }, 195*ba677afaSXin Li LicenseConcluded: "Apache-2.0", 196*ba677afaSXin Li LicenseInfoInFiles: []string{ 197*ba677afaSXin Li "Apache-2.0", 198*ba677afaSXin Li }, 199*ba677afaSXin Li FileCopyrightText: "Copyright (c) Jane Doe", 200*ba677afaSXin Li } 201*ba677afaSXin Li 202*ba677afaSXin Li // what we want to get, as a buffer of bytes 203*ba677afaSXin Li want := bytes.NewBufferString(`FileName: /tmp/whatever.txt 204*ba677afaSXin LiSPDXID: SPDXRef-File123 205*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c 206*ba677afaSXin LiLicenseConcluded: Apache-2.0 207*ba677afaSXin LiLicenseInfoInFile: Apache-2.0 208*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe 209*ba677afaSXin Li 210*ba677afaSXin Li`) 211*ba677afaSXin Li 212*ba677afaSXin Li // render as buffer of bytes 213*ba677afaSXin Li var got bytes.Buffer 214*ba677afaSXin Li err := renderFile2_3(f, &got) 215*ba677afaSXin Li if err != nil { 216*ba677afaSXin Li t.Errorf("Expected nil error, got %v", err) 217*ba677afaSXin Li } 218*ba677afaSXin Li 219*ba677afaSXin Li // check that they match 220*ba677afaSXin Li c := bytes.Compare(want.Bytes(), got.Bytes()) 221*ba677afaSXin Li if c != 0 { 222*ba677afaSXin Li t.Errorf("Expected %v, got %v", want.String(), got.String()) 223*ba677afaSXin Li } 224*ba677afaSXin Li} 225*ba677afaSXin Li 226*ba677afaSXin Lifunc TestSaver2_3FileWrapsCopyrightMultiLine(t *testing.T) { 227*ba677afaSXin Li f := &v2_3.File{ 228*ba677afaSXin Li FileName: "/tmp/whatever.txt", 229*ba677afaSXin Li FileSPDXIdentifier: common.ElementID("File123"), 230*ba677afaSXin Li Checksums: []common.Checksum{ 231*ba677afaSXin Li {Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"}, 232*ba677afaSXin Li }, 233*ba677afaSXin Li LicenseConcluded: "Apache-2.0", 234*ba677afaSXin Li LicenseInfoInFiles: []string{ 235*ba677afaSXin Li "Apache-2.0", 236*ba677afaSXin Li }, 237*ba677afaSXin Li FileCopyrightText: `Copyright (c) Jane Doe 238*ba677afaSXin LiCopyright (c) John Doe`, 239*ba677afaSXin Li } 240*ba677afaSXin Li 241*ba677afaSXin Li // what we want to get, as a buffer of bytes 242*ba677afaSXin Li want := bytes.NewBufferString(`FileName: /tmp/whatever.txt 243*ba677afaSXin LiSPDXID: SPDXRef-File123 244*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c 245*ba677afaSXin LiLicenseConcluded: Apache-2.0 246*ba677afaSXin LiLicenseInfoInFile: Apache-2.0 247*ba677afaSXin LiFileCopyrightText: <text>Copyright (c) Jane Doe 248*ba677afaSXin LiCopyright (c) John Doe</text> 249*ba677afaSXin Li 250*ba677afaSXin Li`) 251*ba677afaSXin Li 252*ba677afaSXin Li // render as buffer of bytes 253*ba677afaSXin Li var got bytes.Buffer 254*ba677afaSXin Li err := renderFile2_3(f, &got) 255*ba677afaSXin Li if err != nil { 256*ba677afaSXin Li t.Errorf("Expected nil error, got %v", err) 257*ba677afaSXin Li } 258*ba677afaSXin Li 259*ba677afaSXin Li // check that they match 260*ba677afaSXin Li c := bytes.Compare(want.Bytes(), got.Bytes()) 261*ba677afaSXin Li if c != 0 { 262*ba677afaSXin Li t.Errorf("Expected %v, got %v", want.String(), got.String()) 263*ba677afaSXin Li } 264*ba677afaSXin Li} 265*ba677afaSXin Li 266*ba677afaSXin Lifunc TestSaver2_3FileWrapsCommentsAndNoticesMultiLine(t *testing.T) { 267*ba677afaSXin Li f := &v2_3.File{ 268*ba677afaSXin Li FileName: "/tmp/whatever.txt", 269*ba677afaSXin Li FileSPDXIdentifier: common.ElementID("File123"), 270*ba677afaSXin Li Checksums: []common.Checksum{ 271*ba677afaSXin Li {Algorithm: common.SHA1, Value: "85ed0817af83a24ad8da68c2b5094de69833983c"}, 272*ba677afaSXin Li }, 273*ba677afaSXin Li LicenseComments: `this is a 274*ba677afaSXin Limulti-line license comment`, 275*ba677afaSXin Li LicenseConcluded: "Apache-2.0", 276*ba677afaSXin Li LicenseInfoInFiles: []string{ 277*ba677afaSXin Li "Apache-2.0", 278*ba677afaSXin Li }, 279*ba677afaSXin Li FileCopyrightText: "Copyright (c) Jane Doe", 280*ba677afaSXin Li FileComment: `this is a 281*ba677afaSXin Limulti-line file comment`, 282*ba677afaSXin Li FileNotice: `This file may be used 283*ba677afaSXin Liunder either Apache-2.0 or Apache-1.1.`, 284*ba677afaSXin Li } 285*ba677afaSXin Li 286*ba677afaSXin Li // what we want to get, as a buffer of bytes 287*ba677afaSXin Li want := bytes.NewBufferString(`FileName: /tmp/whatever.txt 288*ba677afaSXin LiSPDXID: SPDXRef-File123 289*ba677afaSXin LiFileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c 290*ba677afaSXin LiLicenseConcluded: Apache-2.0 291*ba677afaSXin LiLicenseInfoInFile: Apache-2.0 292*ba677afaSXin LiLicenseComments: <text>this is a 293*ba677afaSXin Limulti-line license comment</text> 294*ba677afaSXin LiFileCopyrightText: Copyright (c) Jane Doe 295*ba677afaSXin LiFileComment: <text>this is a 296*ba677afaSXin Limulti-line file comment</text> 297*ba677afaSXin LiFileNotice: <text>This file may be used 298*ba677afaSXin Liunder either Apache-2.0 or Apache-1.1.</text> 299*ba677afaSXin Li 300*ba677afaSXin Li`) 301*ba677afaSXin Li 302*ba677afaSXin Li // render as buffer of bytes 303*ba677afaSXin Li var got bytes.Buffer 304*ba677afaSXin Li err := renderFile2_3(f, &got) 305*ba677afaSXin Li if err != nil { 306*ba677afaSXin Li t.Errorf("Expected nil error, got %v", err) 307*ba677afaSXin Li } 308*ba677afaSXin Li 309*ba677afaSXin Li // check that they match 310*ba677afaSXin Li c := bytes.Compare(want.Bytes(), got.Bytes()) 311*ba677afaSXin Li if c != 0 { 312*ba677afaSXin Li t.Errorf("Expected %v, got %v", want.String(), got.String()) 313*ba677afaSXin Li } 314*ba677afaSXin Li} 315