github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/debian/parse_deb_archive_test.go (about)

     1  package debian
     2  
     3  import (
     4  	"archive/tar"
     5  	"bytes"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/anchore/syft/syft/file"
    12  	"github.com/anchore/syft/syft/pkg"
    13  )
    14  
    15  func TestReadControlFiles(t *testing.T) {
    16  	tarBytes := createTestTarWithControlFiles(t)
    17  
    18  	tarReader := bytes.NewReader(tarBytes)
    19  	reader := tar.NewReader(tarReader)
    20  
    21  	controlFile, md5sums, conffiles, err := readControlFiles(reader)
    22  
    23  	require.NoError(t, err)
    24  	assert.NotNil(t, controlFile, "expected control file to be found")
    25  	assert.NotNil(t, md5sums, "expected md5sums file to be found")
    26  	assert.NotNil(t, conffiles, "expected conffiles file to be found")
    27  
    28  	assert.Contains(t, string(controlFile), "Package: test-package")
    29  	assert.Contains(t, string(md5sums), "d41d8cd98f00b204e9800998ecf8427e")
    30  	assert.Contains(t, string(conffiles), "/etc/test")
    31  }
    32  
    33  // createTestTarWithControlFiles creates a simple in-memory tar file with test control files
    34  func createTestTarWithControlFiles(t *testing.T) []byte {
    35  	var buf bytes.Buffer
    36  	tw := tar.NewWriter(&buf)
    37  
    38  	// Add control file
    39  	controlContent := `Package: test-package
    40  Version: 1.0.0
    41  Architecture: all
    42  Maintainer: Test <test@example.com>
    43  Description: Test package
    44  `
    45  	err := tw.WriteHeader(&tar.Header{
    46  		Name: "control",
    47  		Mode: 0644,
    48  		Size: int64(len(controlContent)),
    49  	})
    50  	require.NoError(t, err)
    51  	_, err = tw.Write([]byte(controlContent))
    52  	require.NoError(t, err)
    53  
    54  	// Add md5sums file
    55  	md5Content := "d41d8cd98f00b204e9800998ecf8427e  usr/bin/test-command\n"
    56  	err = tw.WriteHeader(&tar.Header{
    57  		Name: "md5sums",
    58  		Mode: 0644,
    59  		Size: int64(len(md5Content)),
    60  	})
    61  	require.NoError(t, err)
    62  	_, err = tw.Write([]byte(md5Content))
    63  	require.NoError(t, err)
    64  
    65  	// Add conffiles file
    66  	conffilesContent := "/etc/test/config.conf\n"
    67  	err = tw.WriteHeader(&tar.Header{
    68  		Name: "conffiles",
    69  		Mode: 0644,
    70  		Size: int64(len(conffilesContent)),
    71  	})
    72  	require.NoError(t, err)
    73  	_, err = tw.Write([]byte(conffilesContent))
    74  	require.NoError(t, err)
    75  
    76  	// Close the tar writer
    77  	err = tw.Close()
    78  	require.NoError(t, err)
    79  
    80  	return buf.Bytes()
    81  }
    82  
    83  func TestMarkConfigFiles(t *testing.T) {
    84  	// Create test data
    85  	conffilesContent := []byte("/usr/bin/test-command\n/etc/test/config.conf\n")
    86  
    87  	files := []pkg.DpkgFileRecord{
    88  		{
    89  			Path: "/usr/bin/test-command",
    90  			Digest: &file.Digest{
    91  				Algorithm: "md5",
    92  				Value:     "d41d8cd98f00b204e9800998ecf8427e",
    93  			},
    94  		},
    95  		{
    96  			Path: "/etc/test/config.conf",
    97  			Digest: &file.Digest{
    98  				Algorithm: "md5",
    99  				Value:     "d41d8cd98f00b204e9800998ecf8427e",
   100  			},
   101  		},
   102  		{
   103  			Path: "/usr/bin/other-command",
   104  			Digest: &file.Digest{
   105  				Algorithm: "md5",
   106  				Value:     "d41d8cd98f00b204e9800998ecf8427e",
   107  			},
   108  		},
   109  	}
   110  
   111  	markConfigFiles(conffilesContent, files)
   112  
   113  	assert.True(t, files[0].IsConfigFile, "first file should be marked as config file")
   114  	assert.True(t, files[1].IsConfigFile, "second file should be marked as config file")
   115  	assert.False(t, files[2].IsConfigFile, "third file should not be marked as config file")
   116  }
   117  
   118  func TestParseControlFile(t *testing.T) {
   119  	controlContent := `Package: test-package
   120  Version: 1.2.3-4
   121  Architecture: amd64
   122  Maintainer: Test User <test@example.com>
   123  Installed-Size: 1234
   124  Depends: libc6, libtest
   125  Description: This is a test package
   126   More description text
   127   And even more details
   128  `
   129  
   130  	metadata, err := parseControlFile(controlContent)
   131  
   132  	require.NoError(t, err)
   133  	assert.Equal(t, "test-package", metadata.Package)
   134  	assert.Equal(t, "1.2.3-4", metadata.Version)
   135  	assert.Equal(t, "amd64", metadata.Architecture)
   136  	assert.Equal(t, "Test User <test@example.com>", metadata.Maintainer)
   137  	assert.Equal(t, 1234, metadata.InstalledSize)
   138  	assert.Contains(t, metadata.Description, "This is a test package")
   139  	assert.Len(t, metadata.Depends, 2)
   140  	assert.Contains(t, metadata.Depends, "libc6")
   141  	assert.Contains(t, metadata.Depends, "libtest")
   142  }