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  }