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  }