github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/format/encoders_test.go (about) 1 package format 2 3 import ( 4 "testing" 5 6 "github.com/scylladb/go-set/strset" 7 "github.com/stretchr/testify/assert" 8 "github.com/stretchr/testify/require" 9 10 "github.com/anchore/syft/internal" 11 "github.com/anchore/syft/syft/format/cyclonedxjson" 12 "github.com/anchore/syft/syft/format/cyclonedxxml" 13 "github.com/anchore/syft/syft/format/internal/cyclonedxutil" 14 "github.com/anchore/syft/syft/format/internal/spdxutil" 15 "github.com/anchore/syft/syft/format/spdxjson" 16 "github.com/anchore/syft/syft/format/spdxtagvalue" 17 "github.com/anchore/syft/syft/format/syftjson" 18 "github.com/anchore/syft/syft/format/template" 19 "github.com/anchore/syft/syft/sbom" 20 ) 21 22 func Test_Encoders(t *testing.T) { 23 // this is an explicit test that the default encoders and encoders are the same and does not error 24 encs, err := DefaultEncodersConfig().Encoders() 25 require.NoError(t, err) 26 assert.NotEmpty(t, encs) 27 28 expected := expectedDefaultEncoders() 29 assertHasEncoders(t, expected, encs) 30 assertHasEncoders(t, expected, Encoders()) 31 } 32 33 func expectedDefaultEncoders() *strset.Set { 34 expected := strset.New() 35 // note: template is not expected in the default encoders 36 expected.Add("syft-json@" + internal.JSONSchemaVersion) // TODO: support multiple versions 37 expected.Add("syft-table@") // no version 38 expected.Add("syft-text@") // no version 39 expected.Add("github-json@") // no version 40 for _, v := range spdxjson.SupportedVersions() { 41 expected.Add("spdx-json@" + v) 42 } 43 for _, v := range spdxtagvalue.SupportedVersions() { 44 expected.Add("spdx-tag-value@" + v) 45 } 46 for _, v := range cyclonedxjson.SupportedVersions() { 47 expected.Add("cyclonedx-json@" + v) 48 } 49 for _, v := range cyclonedxxml.SupportedVersions() { 50 expected.Add("cyclonedx-xml@" + v) 51 } 52 return expected 53 } 54 55 func assertHasEncoders(t *testing.T, expected *strset.Set, encs []sbom.FormatEncoder) { 56 for _, enc := range encs { 57 assert.True(t, expected.Has(string(enc.ID())+"@"+enc.Version()), "missing: "+string(enc.ID())+"@"+enc.Version()) 58 } 59 60 if t.Failed() { 61 t.Log("got encoders:") 62 for _, enc := range encs { 63 t.Log(" - " + string(enc.ID()) + "@" + enc.Version()) 64 } 65 } 66 } 67 68 func TestEncodersConfig_Encoders(t *testing.T) { 69 70 tests := []struct { 71 name string 72 cfg EncodersConfig 73 want *strset.Set 74 wantErr require.ErrorAssertionFunc 75 }{ 76 { 77 name: "default", 78 cfg: DefaultEncodersConfig(), 79 want: expectedDefaultEncoders(), 80 }, 81 { 82 name: "with template", 83 cfg: func() EncodersConfig { 84 cfg := DefaultEncodersConfig() 85 cfg.Template.TemplatePath = "foo" 86 return cfg 87 }(), 88 want: func() *strset.Set { 89 expected := expectedDefaultEncoders() 90 expected.Add("template@") 91 return expected 92 }(), 93 }, 94 { 95 name: "explicit versions template", 96 cfg: EncodersConfig{ 97 Template: template.DefaultEncoderConfig(), 98 SyftJSON: syftjson.DefaultEncoderConfig(), 99 SPDXJSON: spdxjson.DefaultEncoderConfig(), 100 SPDXTagValue: spdxtagvalue.DefaultEncoderConfig(), 101 CyclonedxJSON: cyclonedxjson.DefaultEncoderConfig(), 102 CyclonedxXML: cyclonedxxml.DefaultEncoderConfig(), 103 }, 104 want: func() *strset.Set { 105 expected := strset.New() 106 // note: template is not expected in the default encoders 107 expected.Add("syft-json@" + internal.JSONSchemaVersion) // TODO: support multiple versions 108 expected.Add("syft-table@") // no version 109 expected.Add("syft-text@") // no version 110 expected.Add("github-json@") // no version 111 expected.Add("spdx-json@" + spdxutil.DefaultVersion) 112 expected.Add("spdx-tag-value@" + spdxutil.DefaultVersion) 113 expected.Add("cyclonedx-json@" + cyclonedxutil.DefaultVersion) 114 expected.Add("cyclonedx-xml@" + cyclonedxutil.DefaultVersion) 115 116 return expected 117 }(), 118 }, 119 } 120 for _, tt := range tests { 121 t.Run(tt.name, func(t *testing.T) { 122 if tt.wantErr == nil { 123 tt.wantErr = require.NoError 124 } 125 126 got, err := tt.cfg.Encoders() 127 tt.wantErr(t, err) 128 if err != nil { 129 return 130 } 131 132 assertHasEncoders(t, tt.want, got) 133 }) 134 } 135 }