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 }