github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/test/integration/convert_test.go (about) 1 package integration 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 "testing" 8 9 "github.com/nextlinux/gosbom/cmd/gosbom/cli/convert" 10 "github.com/nextlinux/gosbom/gosbom/formats" 11 "github.com/nextlinux/gosbom/gosbom/formats/cyclonedxjson" 12 "github.com/nextlinux/gosbom/gosbom/formats/cyclonedxxml" 13 "github.com/nextlinux/gosbom/gosbom/formats/gosbomjson" 14 "github.com/nextlinux/gosbom/gosbom/formats/spdxjson" 15 "github.com/nextlinux/gosbom/gosbom/formats/spdxtagvalue" 16 "github.com/nextlinux/gosbom/gosbom/formats/table" 17 "github.com/nextlinux/gosbom/gosbom/sbom" 18 "github.com/nextlinux/gosbom/gosbom/source" 19 "github.com/nextlinux/gosbom/internal/config" 20 "github.com/stretchr/testify/require" 21 ) 22 23 // TestConvertCmd tests if the converted SBOM is a valid document according 24 // to spec. 25 // TODO: This test can, but currently does not, check the converted SBOM content. It 26 // might be useful to do that in the future, once we gather a better understanding of 27 // what users expect from the convert command. 28 func TestConvertCmd(t *testing.T) { 29 tests := []struct { 30 name string 31 format sbom.Format 32 }{ 33 { 34 name: "gosbom-json", 35 format: gosbomjson.Format(), 36 }, 37 { 38 name: "spdx-json", 39 format: spdxjson.Format(), 40 }, 41 { 42 name: "spdx-tag-value", 43 format: spdxtagvalue.Format(), 44 }, 45 { 46 name: "cyclonedx-json", 47 format: cyclonedxjson.Format(), 48 }, 49 { 50 name: "cyclonedx-xml", 51 format: cyclonedxxml.Format(), 52 }, 53 } 54 for _, test := range tests { 55 t.Run(test.name, func(t *testing.T) { 56 gosbomSbom, _ := catalogFixtureImage(t, "image-pkg-coverage", source.SquashedScope, nil) 57 gosbomFormat := gosbomjson.Format() 58 59 gosbomFile, err := os.CreateTemp("", "test-convert-sbom-") 60 require.NoError(t, err) 61 defer func() { 62 _ = os.Remove(gosbomFile.Name()) 63 }() 64 65 err = gosbomFormat.Encode(gosbomFile, gosbomSbom) 66 require.NoError(t, err) 67 68 formatFile, err := os.CreateTemp("", "test-convert-sbom-") 69 require.NoError(t, err) 70 defer func() { 71 _ = os.Remove(gosbomFile.Name()) 72 }() 73 74 ctx := context.Background() 75 app := &config.Application{ 76 Outputs: []string{fmt.Sprintf("%s=%s", test.format.ID().String(), formatFile.Name())}, 77 } 78 79 // stdout reduction of test noise 80 rescue := os.Stdout // keep backup of the real stdout 81 os.Stdout, _ = os.OpenFile(os.DevNull, os.O_APPEND|os.O_WRONLY, os.ModeAppend) 82 defer func() { 83 os.Stdout = rescue 84 }() 85 86 err = convert.Run(ctx, app, []string{gosbomFile.Name()}) 87 require.NoError(t, err) 88 contents, err := os.ReadFile(formatFile.Name()) 89 require.NoError(t, err) 90 91 formatFound := formats.Identify(contents) 92 if test.format.ID() == table.ID { 93 require.Nil(t, formatFound) 94 return 95 } 96 require.Equal(t, test.format.ID(), formatFound.ID()) 97 }) 98 } 99 }