github.com/anchore/syft@v1.38.2/syft/format/cyclonedxxml/decoder_test.go (about) 1 package cyclonedxxml 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "path/filepath" 8 "strings" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 14 "github.com/anchore/syft/syft/sbom" 15 ) 16 17 func TestDecoder_Decode(t *testing.T) { 18 tests := []struct { 19 name string 20 file string 21 err bool 22 distro string 23 packages []string 24 }{ 25 { 26 name: "dir-scan", 27 file: "snapshot/TestCycloneDxDirectoryEncoder.golden", 28 distro: "debian:1.2.3", 29 packages: []string{"package-1:1.0.1", "package-2:2.0.1"}, 30 }, 31 { 32 name: "image-scan", 33 file: "snapshot/TestCycloneDxImageEncoder.golden", 34 distro: "debian:1.2.3", 35 packages: []string{"package-1:1.0.1", "package-2:2.0.1"}, 36 }, 37 { 38 name: "not-an-sbom", 39 file: "bad-sbom", 40 err: true, 41 }, 42 } 43 for _, test := range tests { 44 t.Run(test.file, func(t *testing.T) { 45 reader, err := os.Open(filepath.Join("test-fixtures", test.file)) 46 require.NoError(t, err) 47 48 reset := func() { _, err = reader.Seek(0, io.SeekStart); require.NoError(t, err) } 49 50 dec := NewFormatDecoder() 51 52 formatID, formatVersion := dec.Identify(reader) 53 if test.err { 54 assert.Equal(t, sbom.FormatID(""), formatID) 55 assert.Equal(t, "", formatVersion) 56 57 reset() 58 _, decodeID, decodeVersion, err := dec.Decode(reader) 59 require.Error(t, err) 60 assert.Equal(t, sbom.FormatID(""), decodeID) 61 assert.Equal(t, "", decodeVersion) 62 63 return 64 } 65 assert.Equal(t, ID, formatID) 66 assert.NotEmpty(t, formatVersion) 67 68 reset() 69 bom, decodeID, decodeVersion, err := dec.Decode(reader) 70 require.NotNil(t, bom) 71 require.NoError(t, err) 72 73 assert.Equal(t, ID, decodeID) 74 assert.Equal(t, formatVersion, decodeVersion) 75 76 split := strings.SplitN(test.distro, ":", 2) 77 distroName := split[0] 78 distroVersion := split[1] 79 assert.Equal(t, bom.Artifacts.LinuxDistribution.ID, distroName) 80 assert.Equal(t, bom.Artifacts.LinuxDistribution.Version, distroVersion) 81 82 var pkgs []string 83 for p := range bom.Artifacts.Packages.Enumerate() { 84 pkgs = append(pkgs, fmt.Sprintf("%s:%s", p.Name, p.Version)) 85 } 86 87 assert.ElementsMatch(t, test.packages, pkgs) 88 }) 89 } 90 } 91 92 func TestDecoder_Identify(t *testing.T) { 93 type testCase struct { 94 name string 95 file string 96 id sbom.FormatID 97 version string 98 } 99 100 var cases []testCase 101 102 for _, version := range SupportedVersions() { 103 cases = append(cases, testCase{ 104 name: fmt.Sprintf("v%s schema", version), 105 file: fmt.Sprintf("test-fixtures/identify/%s.xml", version), 106 id: ID, 107 version: version, 108 }) 109 } 110 111 for _, test := range cases { 112 t.Run(test.name, func(t *testing.T) { 113 reader, err := os.Open(test.file) 114 require.NoError(t, err) 115 116 dec := NewFormatDecoder() 117 118 formatID, formatVersion := dec.Identify(reader) 119 assert.Equal(t, test.id, formatID) 120 assert.Equal(t, test.version, formatVersion) 121 }) 122 } 123 }