github.com/anchore/syft@v1.38.2/syft/format/cyclonedxjson/decoder_test.go (about)

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