github.com/lineaje-labs/syft@v0.98.1-0.20231227153149-9e393f60ff1b/syft/format/cyclonedxjson/decoder_test.go (about)

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