aboutsummaryrefslogtreecommitdiff
path: root/tvsaver
diff options
context:
space:
mode:
authorSteve Winslow <steve@swinslow.net>2021-07-04 11:52:03 -0400
committerSteve Winslow <steve@swinslow.net>2021-07-04 11:52:03 -0400
commitbf2d1849ff4f03e2f6ccff6a6f0b2021579d92ad (patch)
tree970eb41c12b04bce967cc112be41446344532903 /tvsaver
parentfe1c1e7319f0f491c39703d27c3ac30762ff531c (diff)
downloadspdx-tools-bf2d1849ff4f03e2f6ccff6a6f0b2021579d92ad.tar.gz
Fix multi-line text wrapping fields
Signed-off-by: Steve Winslow <steve@swinslow.net>
Diffstat (limited to 'tvsaver')
-rw-r--r--tvsaver/saver2v1/save_file.go6
-rw-r--r--tvsaver/saver2v1/save_file_test.go48
-rw-r--r--tvsaver/saver2v1/save_package.go4
-rw-r--r--tvsaver/saver2v1/save_package_test.go49
-rw-r--r--tvsaver/saver2v1/save_relationship.go2
-rw-r--r--tvsaver/saver2v1/save_relationship_test.go30
-rw-r--r--tvsaver/saver2v1/save_review.go2
-rw-r--r--tvsaver/saver2v1/save_review_test.go31
-rw-r--r--tvsaver/saver2v2/save_file.go6
-rw-r--r--tvsaver/saver2v2/save_file_test.go57
-rw-r--r--tvsaver/saver2v2/save_package.go4
-rw-r--r--tvsaver/saver2v2/save_package_test.go49
-rw-r--r--tvsaver/saver2v2/save_relationship.go2
-rw-r--r--tvsaver/saver2v2/save_relationship_test.go30
-rw-r--r--tvsaver/saver2v2/save_review.go2
-rw-r--r--tvsaver/saver2v2/save_review_test.go31
16 files changed, 337 insertions, 16 deletions
diff --git a/tvsaver/saver2v1/save_file.go b/tvsaver/saver2v1/save_file.go
index a9df3ed..d22a012 100644
--- a/tvsaver/saver2v1/save_file.go
+++ b/tvsaver/saver2v1/save_file.go
@@ -36,7 +36,7 @@ func renderFile2_1(f *spdx.File2_1, w io.Writer) error {
fmt.Fprintf(w, "LicenseInfoInFile: %s\n", s)
}
if f.LicenseComments != "" {
- fmt.Fprintf(w, "LicenseComments: %s\n", f.LicenseComments)
+ fmt.Fprintf(w, "LicenseComments: %s\n", textify(f.LicenseComments))
}
if f.FileCopyrightText != "" {
fmt.Fprintf(w, "FileCopyrightText: %s\n", textify(f.FileCopyrightText))
@@ -51,10 +51,10 @@ func renderFile2_1(f *spdx.File2_1, w io.Writer) error {
}
}
if f.FileComment != "" {
- fmt.Fprintf(w, "FileComment: %s\n", f.FileComment)
+ fmt.Fprintf(w, "FileComment: %s\n", textify(f.FileComment))
}
if f.FileNotice != "" {
- fmt.Fprintf(w, "FileNotice: %s\n", f.FileNotice)
+ fmt.Fprintf(w, "FileNotice: %s\n", textify(f.FileNotice))
}
for _, s := range f.FileContributor {
fmt.Fprintf(w, "FileContributor: %s\n", s)
diff --git a/tvsaver/saver2v1/save_file_test.go b/tvsaver/saver2v1/save_file_test.go
index 9e652b6..9d6b09b 100644
--- a/tvsaver/saver2v1/save_file_test.go
+++ b/tvsaver/saver2v1/save_file_test.go
@@ -247,3 +247,51 @@ Copyright (c) John Doe</text>
t.Errorf("Expected %v, got %v", want.String(), got.String())
}
}
+
+func TestSaver2_1FileWrapsCommentsAndNoticesMultiLine(t *testing.T) {
+ f := &spdx.File2_1{
+ FileName: "/tmp/whatever.txt",
+ FileSPDXIdentifier: spdx.ElementID("File123"),
+ FileChecksumSHA1: "85ed0817af83a24ad8da68c2b5094de69833983c",
+ LicenseComments: `this is a
+multi-line license comment`,
+ LicenseConcluded: "Apache-2.0",
+ LicenseInfoInFile: []string{
+ "Apache-2.0",
+ },
+ FileCopyrightText: "Copyright (c) Jane Doe",
+ FileComment: `this is a
+multi-line file comment`,
+ FileNotice: `This file may be used
+under either Apache-2.0 or Apache-1.1.`,
+ }
+
+ // what we want to get, as a buffer of bytes
+ want := bytes.NewBufferString(`FileName: /tmp/whatever.txt
+SPDXID: SPDXRef-File123
+FileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c
+LicenseConcluded: Apache-2.0
+LicenseInfoInFile: Apache-2.0
+LicenseComments: <text>this is a
+multi-line license comment</text>
+FileCopyrightText: Copyright (c) Jane Doe
+FileComment: <text>this is a
+multi-line file comment</text>
+FileNotice: <text>This file may be used
+under either Apache-2.0 or Apache-1.1.</text>
+
+`)
+
+ // render as buffer of bytes
+ var got bytes.Buffer
+ err := renderFile2_1(f, &got)
+ if err != nil {
+ t.Errorf("Expected nil error, got %v", err)
+ }
+
+ // check that they match
+ c := bytes.Compare(want.Bytes(), got.Bytes())
+ if c != 0 {
+ t.Errorf("Expected %v, got %v", want.String(), got.String())
+ }
+}
diff --git a/tvsaver/saver2v1/save_package.go b/tvsaver/saver2v1/save_package.go
index c497404..9b19cfa 100644
--- a/tvsaver/saver2v1/save_package.go
+++ b/tvsaver/saver2v1/save_package.go
@@ -88,7 +88,7 @@ func renderPackage2_1(pkg *spdx.Package2_1, w io.Writer) error {
fmt.Fprintf(w, "PackageLicenseComments: %s\n", textify(pkg.PackageLicenseComments))
}
if pkg.PackageCopyrightText != "" {
- fmt.Fprintf(w, "PackageCopyrightText: %s\n", pkg.PackageCopyrightText)
+ fmt.Fprintf(w, "PackageCopyrightText: %s\n", textify(pkg.PackageCopyrightText))
}
if pkg.PackageSummary != "" {
fmt.Fprintf(w, "PackageSummary: %s\n", textify(pkg.PackageSummary))
@@ -102,7 +102,7 @@ func renderPackage2_1(pkg *spdx.Package2_1, w io.Writer) error {
for _, s := range pkg.PackageExternalReferences {
fmt.Fprintf(w, "ExternalRef: %s %s %s\n", s.Category, s.RefType, s.Locator)
if s.ExternalRefComment != "" {
- fmt.Fprintf(w, "ExternalRefComment: %s\n", s.ExternalRefComment)
+ fmt.Fprintf(w, "ExternalRefComment: %s\n", textify(s.ExternalRefComment))
}
}
diff --git a/tvsaver/saver2v1/save_package_test.go b/tvsaver/saver2v1/save_package_test.go
index 83f1fd5..fc6b2a6 100644
--- a/tvsaver/saver2v1/save_package_test.go
+++ b/tvsaver/saver2v1/save_package_test.go
@@ -29,7 +29,8 @@ func TestSaver2_1PackageSavesTextCombo1(t *testing.T) {
Category: "PACKAGE-MANAGER",
RefType: "npm",
Locator: "p1@0.1.0",
- // no ExternalRefComment for this one
+ ExternalRefComment: `this is a
+multi-line external ref comment`,
}
per3 := &spdx.PackageExternalReference2_1{
@@ -103,6 +104,8 @@ PackageComment: this is a comment comment
ExternalRef: SECURITY cpe22Type cpe:/a:john_doe_inc:p1:0.1.0
ExternalRefComment: this is an external ref comment #1
ExternalRef: PACKAGE-MANAGER npm p1@0.1.0
+ExternalRefComment: <text>this is a
+multi-line external ref comment</text>
ExternalRef: OTHER anything anything-without-spaces-can-go-here
`)
@@ -403,3 +406,47 @@ FileCopyrightText: Copyright (c) John Doe
t.Errorf("Expected %v, got %v", want.String(), got.String())
}
}
+
+func TestSaver2_1PackageWrapsCopyrightMultiLine(t *testing.T) {
+ pkg := &spdx.Package2_1{
+ PackageName: "p1",
+ PackageSPDXIdentifier: spdx.ElementID("p1"),
+ PackageDownloadLocation: "http://example.com/p1/p1-0.1.0-master.tar.gz",
+ FilesAnalyzed: false,
+ IsFilesAnalyzedTagPresent: true,
+ PackageLicenseConcluded: "GPL-2.0-or-later",
+ PackageLicenseInfoFromFiles: []string{
+ "Apache-1.1",
+ "Apache-2.0",
+ "GPL-2.0-or-later",
+ },
+ PackageLicenseDeclared: "Apache-2.0 OR GPL-2.0-or-later",
+ PackageCopyrightText: `Copyright (c) John Doe, Inc.
+Copyright Jane Doe`,
+ }
+
+ // what we want to get, as a buffer of bytes
+ want := bytes.NewBufferString(`PackageName: p1
+SPDXID: SPDXRef-p1
+PackageDownloadLocation: http://example.com/p1/p1-0.1.0-master.tar.gz
+FilesAnalyzed: false
+PackageLicenseConcluded: GPL-2.0-or-later
+PackageLicenseDeclared: Apache-2.0 OR GPL-2.0-or-later
+PackageCopyrightText: <text>Copyright (c) John Doe, Inc.
+Copyright Jane Doe</text>
+
+`)
+
+ // render as buffer of bytes
+ var got bytes.Buffer
+ err := renderPackage2_1(pkg, &got)
+ if err != nil {
+ t.Errorf("Expected nil error, got %v", err)
+ }
+
+ // check that they match
+ c := bytes.Compare(want.Bytes(), got.Bytes())
+ if c != 0 {
+ t.Errorf("Expected %v, got %v", want.String(), got.String())
+ }
+}
diff --git a/tvsaver/saver2v1/save_relationship.go b/tvsaver/saver2v1/save_relationship.go
index 6bde4b3..aea48bc 100644
--- a/tvsaver/saver2v1/save_relationship.go
+++ b/tvsaver/saver2v1/save_relationship.go
@@ -16,7 +16,7 @@ func renderRelationship2_1(rln *spdx.Relationship2_1, w io.Writer) error {
fmt.Fprintf(w, "Relationship: %s %s %s\n", rlnAStr, rln.Relationship, rlnBStr)
}
if rln.RelationshipComment != "" {
- fmt.Fprintf(w, "RelationshipComment: %s\n", rln.RelationshipComment)
+ fmt.Fprintf(w, "RelationshipComment: %s\n", textify(rln.RelationshipComment))
}
return nil
diff --git a/tvsaver/saver2v1/save_relationship_test.go b/tvsaver/saver2v1/save_relationship_test.go
index e8635b1..6fa03bd 100644
--- a/tvsaver/saver2v1/save_relationship_test.go
+++ b/tvsaver/saver2v1/save_relationship_test.go
@@ -62,3 +62,33 @@ func TestSaver2_1RelationshipOmitsOptionalFieldsIfEmpty(t *testing.T) {
t.Errorf("Expected %v, got %v", want.String(), got.String())
}
}
+
+func TestSaver2_1RelationshipWrapsCommentMultiLine(t *testing.T) {
+ rln := &spdx.Relationship2_1{
+ RefA: spdx.MakeDocElementID("", "DOCUMENT"),
+ RefB: spdx.MakeDocElementID("", "2"),
+ Relationship: "DESCRIBES",
+ RelationshipComment: `this is a
+multi-line comment`,
+ }
+
+ // what we want to get, as a buffer of bytes
+ // no trailing blank newline
+ want := bytes.NewBufferString(`Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2
+RelationshipComment: <text>this is a
+multi-line comment</text>
+`)
+
+ // render as buffer of bytes
+ var got bytes.Buffer
+ err := renderRelationship2_1(rln, &got)
+ if err != nil {
+ t.Errorf("Expected nil error, got %v", err)
+ }
+
+ // check that they match
+ c := bytes.Compare(want.Bytes(), got.Bytes())
+ if c != 0 {
+ t.Errorf("Expected %v, got %v", want.String(), got.String())
+ }
+}
diff --git a/tvsaver/saver2v1/save_review.go b/tvsaver/saver2v1/save_review.go
index 8d192ba..3193963 100644
--- a/tvsaver/saver2v1/save_review.go
+++ b/tvsaver/saver2v1/save_review.go
@@ -17,7 +17,7 @@ func renderReview2_1(rev *spdx.Review2_1, w io.Writer) error {
fmt.Fprintf(w, "ReviewDate: %s\n", rev.ReviewDate)
}
if rev.ReviewComment != "" {
- fmt.Fprintf(w, "ReviewComment: %s\n", rev.ReviewComment)
+ fmt.Fprintf(w, "ReviewComment: %s\n", textify(rev.ReviewComment))
}
fmt.Fprintf(w, "\n")
diff --git a/tvsaver/saver2v1/save_review_test.go b/tvsaver/saver2v1/save_review_test.go
index d780467..7421681 100644
--- a/tvsaver/saver2v1/save_review_test.go
+++ b/tvsaver/saver2v1/save_review_test.go
@@ -65,3 +65,34 @@ ReviewDate: 2018-10-14T10:28:00Z
t.Errorf("Expected %v, got %v", want.String(), got.String())
}
}
+
+func TestSaver2_1ReviewWrapsMultiLine(t *testing.T) {
+ rev := &spdx.Review2_1{
+ Reviewer: "John Doe",
+ ReviewerType: "Person",
+ ReviewDate: "2018-10-14T10:28:00Z",
+ ReviewComment: `this is a
+multi-line review comment`,
+ }
+
+ // what we want to get, as a buffer of bytes
+ want := bytes.NewBufferString(`Reviewer: Person: John Doe
+ReviewDate: 2018-10-14T10:28:00Z
+ReviewComment: <text>this is a
+multi-line review comment</text>
+
+`)
+
+ // render as buffer of bytes
+ var got bytes.Buffer
+ err := renderReview2_1(rev, &got)
+ if err != nil {
+ t.Errorf("Expected nil error, got %v", err)
+ }
+
+ // check that they match
+ c := bytes.Compare(want.Bytes(), got.Bytes())
+ if c != 0 {
+ t.Errorf("Expected %v, got %v", want.String(), got.String())
+ }
+}
diff --git a/tvsaver/saver2v2/save_file.go b/tvsaver/saver2v2/save_file.go
index 18e95b0..ce75f31 100644
--- a/tvsaver/saver2v2/save_file.go
+++ b/tvsaver/saver2v2/save_file.go
@@ -36,7 +36,7 @@ func renderFile2_2(f *spdx.File2_2, w io.Writer) error {
fmt.Fprintf(w, "LicenseInfoInFile: %s\n", s)
}
if f.LicenseComments != "" {
- fmt.Fprintf(w, "LicenseComments: %s\n", f.LicenseComments)
+ fmt.Fprintf(w, "LicenseComments: %s\n", textify(f.LicenseComments))
}
if f.FileCopyrightText != "" {
fmt.Fprintf(w, "FileCopyrightText: %s\n", textify(f.FileCopyrightText))
@@ -51,10 +51,10 @@ func renderFile2_2(f *spdx.File2_2, w io.Writer) error {
}
}
if f.FileComment != "" {
- fmt.Fprintf(w, "FileComment: %s\n", f.FileComment)
+ fmt.Fprintf(w, "FileComment: %s\n", textify(f.FileComment))
}
if f.FileNotice != "" {
- fmt.Fprintf(w, "FileNotice: %s\n", f.FileNotice)
+ fmt.Fprintf(w, "FileNotice: %s\n", textify(f.FileNotice))
}
for _, s := range f.FileContributor {
fmt.Fprintf(w, "FileContributor: %s\n", s)
diff --git a/tvsaver/saver2v2/save_file_test.go b/tvsaver/saver2v2/save_file_test.go
index 159074d..76ba839 100644
--- a/tvsaver/saver2v2/save_file_test.go
+++ b/tvsaver/saver2v2/save_file_test.go
@@ -65,6 +65,8 @@ func TestSaver2_2FileSavesText(t *testing.T) {
},
FileAttributionTexts: []string{
"attributions",
+ `multi-line
+attribution`,
},
FileDependencies: []string{
"f-1.txt",
@@ -98,6 +100,8 @@ FileNotice: This file may be used under either Apache-2.0 or Apache-1.1.
FileContributor: John Doe jdoe@example.com
FileContributor: EvilCorp
FileAttributionText: attributions
+FileAttributionText: <text>multi-line
+attribution</text>
FileDependency: f-1.txt
FileDependency: g.txt
@@ -277,3 +281,56 @@ Copyright (c) John Doe</text>
t.Errorf("Expected %v, got %v", want.String(), got.String())
}
}
+
+func TestSaver2_2FileWrapsCommentsAndNoticesMultiLine(t *testing.T) {
+ f := &spdx.File2_2{
+ FileName: "/tmp/whatever.txt",
+ FileSPDXIdentifier: spdx.ElementID("File123"),
+ FileChecksums: map[spdx.ChecksumAlgorithm]spdx.Checksum{
+ spdx.SHA1: spdx.Checksum{
+ Algorithm: spdx.SHA1,
+ Value: "85ed0817af83a24ad8da68c2b5094de69833983c",
+ },
+ },
+ LicenseComments: `this is a
+multi-line license comment`,
+ LicenseConcluded: "Apache-2.0",
+ LicenseInfoInFile: []string{
+ "Apache-2.0",
+ },
+ FileCopyrightText: "Copyright (c) Jane Doe",
+ FileComment: `this is a
+multi-line file comment`,
+ FileNotice: `This file may be used
+under either Apache-2.0 or Apache-1.1.`,
+ }
+
+ // what we want to get, as a buffer of bytes
+ want := bytes.NewBufferString(`FileName: /tmp/whatever.txt
+SPDXID: SPDXRef-File123
+FileChecksum: SHA1: 85ed0817af83a24ad8da68c2b5094de69833983c
+LicenseConcluded: Apache-2.0
+LicenseInfoInFile: Apache-2.0
+LicenseComments: <text>this is a
+multi-line license comment</text>
+FileCopyrightText: Copyright (c) Jane Doe
+FileComment: <text>this is a
+multi-line file comment</text>
+FileNotice: <text>This file may be used
+under either Apache-2.0 or Apache-1.1.</text>
+
+`)
+
+ // render as buffer of bytes
+ var got bytes.Buffer
+ err := renderFile2_2(f, &got)
+ if err != nil {
+ t.Errorf("Expected nil error, got %v", err)
+ }
+
+ // check that they match
+ c := bytes.Compare(want.Bytes(), got.Bytes())
+ if c != 0 {
+ t.Errorf("Expected %v, got %v", want.String(), got.String())
+ }
+}
diff --git a/tvsaver/saver2v2/save_package.go b/tvsaver/saver2v2/save_package.go
index 1c74872..4929775 100644
--- a/tvsaver/saver2v2/save_package.go
+++ b/tvsaver/saver2v2/save_package.go
@@ -88,7 +88,7 @@ func renderPackage2_2(pkg *spdx.Package2_2, w io.Writer) error {
fmt.Fprintf(w, "PackageLicenseComments: %s\n", textify(pkg.PackageLicenseComments))
}
if pkg.PackageCopyrightText != "" {
- fmt.Fprintf(w, "PackageCopyrightText: %s\n", pkg.PackageCopyrightText)
+ fmt.Fprintf(w, "PackageCopyrightText: %s\n", textify(pkg.PackageCopyrightText))
}
if pkg.PackageSummary != "" {
fmt.Fprintf(w, "PackageSummary: %s\n", textify(pkg.PackageSummary))
@@ -102,7 +102,7 @@ func renderPackage2_2(pkg *spdx.Package2_2, w io.Writer) error {
for _, s := range pkg.PackageExternalReferences {
fmt.Fprintf(w, "ExternalRef: %s %s %s\n", s.Category, s.RefType, s.Locator)
if s.ExternalRefComment != "" {
- fmt.Fprintf(w, "ExternalRefComment: %s\n", s.ExternalRefComment)
+ fmt.Fprintf(w, "ExternalRefComment: %s\n", textify(s.ExternalRefComment))
}
}
for _, s := range pkg.PackageAttributionTexts {
diff --git a/tvsaver/saver2v2/save_package_test.go b/tvsaver/saver2v2/save_package_test.go
index be16e85..72d1de2 100644
--- a/tvsaver/saver2v2/save_package_test.go
+++ b/tvsaver/saver2v2/save_package_test.go
@@ -29,7 +29,8 @@ func TestSaver2_2PackageSavesTextCombo1(t *testing.T) {
Category: "PACKAGE-MANAGER",
RefType: "npm",
Locator: "p1@0.1.0",
- // no ExternalRefComment for this one
+ ExternalRefComment: `this is a
+multi-line external ref comment`,
}
// NOTE, this is an entirely made up SWH persistent ID
@@ -124,6 +125,8 @@ PackageComment: this is a comment comment
ExternalRef: SECURITY cpe22Type cpe:/a:john_doe_inc:p1:0.1.0
ExternalRefComment: this is an external ref comment #1
ExternalRef: PACKAGE-MANAGER npm p1@0.1.0
+ExternalRefComment: <text>this is a
+multi-line external ref comment</text>
ExternalRef: PERSISTENT-ID swh swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2
ExternalRef: OTHER anything anything-without-spaces-can-go-here
PackageAttributionText: Include this notice in all advertising materials
@@ -471,3 +474,47 @@ FileCopyrightText: Copyright (c) John Doe
t.Errorf("Expected %v, got %v", want.String(), got.String())
}
}
+
+func TestSaver2_2PackageWrapsMultiLine(t *testing.T) {
+ pkg := &spdx.Package2_2{
+ PackageName: "p1",
+ PackageSPDXIdentifier: spdx.ElementID("p1"),
+ PackageDownloadLocation: "http://example.com/p1/p1-0.1.0-master.tar.gz",
+ FilesAnalyzed: false,
+ IsFilesAnalyzedTagPresent: true,
+ PackageLicenseConcluded: "GPL-2.0-or-later",
+ PackageLicenseInfoFromFiles: []string{
+ "Apache-1.1",
+ "Apache-2.0",
+ "GPL-2.0-or-later",
+ },
+ PackageLicenseDeclared: "Apache-2.0 OR GPL-2.0-or-later",
+ PackageCopyrightText: `Copyright (c) John Doe, Inc.
+Copyright Jane Doe`,
+ }
+
+ // what we want to get, as a buffer of bytes
+ want := bytes.NewBufferString(`PackageName: p1
+SPDXID: SPDXRef-p1
+PackageDownloadLocation: http://example.com/p1/p1-0.1.0-master.tar.gz
+FilesAnalyzed: false
+PackageLicenseConcluded: GPL-2.0-or-later
+PackageLicenseDeclared: Apache-2.0 OR GPL-2.0-or-later
+PackageCopyrightText: <text>Copyright (c) John Doe, Inc.
+Copyright Jane Doe</text>
+
+`)
+
+ // render as buffer of bytes
+ var got bytes.Buffer
+ err := renderPackage2_2(pkg, &got)
+ if err != nil {
+ t.Errorf("Expected nil error, got %v", err)
+ }
+
+ // check that they match
+ c := bytes.Compare(want.Bytes(), got.Bytes())
+ if c != 0 {
+ t.Errorf("Expected %v, got %v", want.String(), got.String())
+ }
+}
diff --git a/tvsaver/saver2v2/save_relationship.go b/tvsaver/saver2v2/save_relationship.go
index cff5a4a..4bd12dd 100644
--- a/tvsaver/saver2v2/save_relationship.go
+++ b/tvsaver/saver2v2/save_relationship.go
@@ -16,7 +16,7 @@ func renderRelationship2_2(rln *spdx.Relationship2_2, w io.Writer) error {
fmt.Fprintf(w, "Relationship: %s %s %s\n", rlnAStr, rln.Relationship, rlnBStr)
}
if rln.RelationshipComment != "" {
- fmt.Fprintf(w, "RelationshipComment: %s\n", rln.RelationshipComment)
+ fmt.Fprintf(w, "RelationshipComment: %s\n", textify(rln.RelationshipComment))
}
return nil
diff --git a/tvsaver/saver2v2/save_relationship_test.go b/tvsaver/saver2v2/save_relationship_test.go
index ab98184..ebb3e37 100644
--- a/tvsaver/saver2v2/save_relationship_test.go
+++ b/tvsaver/saver2v2/save_relationship_test.go
@@ -112,3 +112,33 @@ func TestSaver2_2RelationshipCanHaveNOASSERTIONOnRight(t *testing.T) {
t.Errorf("Expected %v, got %v", want.String(), got.String())
}
}
+
+func TestSaver2_2RelationshipWrapsCommentMultiLine(t *testing.T) {
+ rln := &spdx.Relationship2_2{
+ RefA: spdx.MakeDocElementID("", "DOCUMENT"),
+ RefB: spdx.MakeDocElementID("", "2"),
+ Relationship: "DESCRIBES",
+ RelationshipComment: `this is a
+multi-line comment`,
+ }
+
+ // what we want to get, as a buffer of bytes
+ // no trailing blank newline
+ want := bytes.NewBufferString(`Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-2
+RelationshipComment: <text>this is a
+multi-line comment</text>
+`)
+
+ // render as buffer of bytes
+ var got bytes.Buffer
+ err := renderRelationship2_2(rln, &got)
+ if err != nil {
+ t.Errorf("Expected nil error, got %v", err)
+ }
+
+ // check that they match
+ c := bytes.Compare(want.Bytes(), got.Bytes())
+ if c != 0 {
+ t.Errorf("Expected %v, got %v", want.String(), got.String())
+ }
+}
diff --git a/tvsaver/saver2v2/save_review.go b/tvsaver/saver2v2/save_review.go
index 5e2da6e..48004e4 100644
--- a/tvsaver/saver2v2/save_review.go
+++ b/tvsaver/saver2v2/save_review.go
@@ -17,7 +17,7 @@ func renderReview2_2(rev *spdx.Review2_2, w io.Writer) error {
fmt.Fprintf(w, "ReviewDate: %s\n", rev.ReviewDate)
}
if rev.ReviewComment != "" {
- fmt.Fprintf(w, "ReviewComment: %s\n", rev.ReviewComment)
+ fmt.Fprintf(w, "ReviewComment: %s\n", textify(rev.ReviewComment))
}
fmt.Fprintf(w, "\n")
diff --git a/tvsaver/saver2v2/save_review_test.go b/tvsaver/saver2v2/save_review_test.go
index 15fa28d..25fe469 100644
--- a/tvsaver/saver2v2/save_review_test.go
+++ b/tvsaver/saver2v2/save_review_test.go
@@ -65,3 +65,34 @@ ReviewDate: 2018-10-14T10:28:00Z
t.Errorf("Expected %v, got %v", want.String(), got.String())
}
}
+
+func TestSaver2_2ReviewWrapsMultiLine(t *testing.T) {
+ rev := &spdx.Review2_2{
+ Reviewer: "John Doe",
+ ReviewerType: "Person",
+ ReviewDate: "2018-10-14T10:28:00Z",
+ ReviewComment: `this is a
+multi-line review comment`,
+ }
+
+ // what we want to get, as a buffer of bytes
+ want := bytes.NewBufferString(`Reviewer: Person: John Doe
+ReviewDate: 2018-10-14T10:28:00Z
+ReviewComment: <text>this is a
+multi-line review comment</text>
+
+`)
+
+ // render as buffer of bytes
+ var got bytes.Buffer
+ err := renderReview2_2(rev, &got)
+ if err != nil {
+ t.Errorf("Expected nil error, got %v", err)
+ }
+
+ // check that they match
+ c := bytes.Compare(want.Bytes(), got.Bytes())
+ if c != 0 {
+ t.Errorf("Expected %v, got %v", want.String(), got.String())
+ }
+}