github.com/anchore/syft@v1.38.2/syft/format/cyclonedxjson/decoder_test.go (about) 1 package cyclonedxjson 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 reset := func() { _, err = reader.Seek(0, io.SeekStart); require.NoError(t, err) } 48 49 dec := NewFormatDecoder() 50 51 formatID, formatVersion := dec.Identify(reader) 52 if test.err { 53 assert.Equal(t, sbom.FormatID(""), formatID) 54 assert.Equal(t, "", formatVersion) 55 56 reset() 57 _, decodeID, decodeVersion, err := dec.Decode(reader) 58 require.Error(t, err) 59 assert.Equal(t, sbom.FormatID(""), decodeID) 60 assert.Equal(t, "", decodeVersion) 61 62 return 63 } 64 assert.Equal(t, ID, formatID) 65 assert.NotEmpty(t, formatVersion) 66 67 reset() 68 bom, decodeID, decodeVersion, err := dec.Decode(reader) 69 require.NotNil(t, bom) 70 require.NoError(t, err) 71 72 assert.Equal(t, ID, decodeID) 73 assert.Equal(t, formatVersion, decodeVersion) 74 75 split := strings.SplitN(test.distro, ":", 2) 76 distroName := split[0] 77 distroVersion := split[1] 78 assert.Equal(t, bom.Artifacts.LinuxDistribution.ID, distroName) 79 assert.Equal(t, bom.Artifacts.LinuxDistribution.Version, distroVersion) 80 81 var pkgs []string 82 for p := range bom.Artifacts.Packages.Enumerate() { 83 pkgs = append(pkgs, fmt.Sprintf("%s:%s", p.Name, p.Version)) 84 } 85 86 assert.ElementsMatch(t, test.packages, pkgs) 87 }) 88 } 89 } 90 91 func TestDecoder_Identify(t *testing.T) { 92 type testCase struct { 93 name string 94 file string 95 id sbom.FormatID 96 version string 97 } 98 99 var cases []testCase 100 101 for _, version := range SupportedVersions() { 102 cases = append(cases, testCase{ 103 name: fmt.Sprintf("v%s schema", version), 104 file: fmt.Sprintf("test-fixtures/identify/%s.json", version), 105 id: ID, 106 version: version, 107 }) 108 } 109 110 cases = append(cases, []testCase{ 111 { 112 name: "no-schema-1.4", 113 file: "test-fixtures/identify/micronaut-1.4.json", 114 id: ID, 115 version: "1.4", 116 }, 117 { 118 name: "no-schema-1.5", 119 file: "test-fixtures/identify/micronaut-1.5.json", 120 id: ID, 121 version: "1.5", 122 }, 123 }...) 124 125 for _, test := range cases { 126 t.Run(test.name, func(t *testing.T) { 127 reader, err := os.Open(test.file) 128 require.NoError(t, err) 129 130 dec := NewFormatDecoder() 131 132 formatID, formatVersion := dec.Identify(reader) 133 assert.Equal(t, test.id, formatID) 134 assert.Equal(t, test.version, formatVersion) 135 }) 136 } 137 }