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