clean_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //go:build !integration
  2. // +build !integration
  3. package main
  4. import (
  5. "context"
  6. "fmt"
  7. "os/exec"
  8. "strings"
  9. "testing"
  10. "github.com/Jguer/go-alpm/v2"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/stretchr/testify/require"
  13. "github.com/Jguer/yay/v12/pkg/db/mock"
  14. "github.com/Jguer/yay/v12/pkg/settings"
  15. "github.com/Jguer/yay/v12/pkg/settings/exe"
  16. "github.com/Jguer/yay/v12/pkg/settings/parser"
  17. )
  18. func TestCleanHanging(t *testing.T) {
  19. pacmanBin := t.TempDir() + "/pacman"
  20. t.Parallel()
  21. testCases := []struct {
  22. name string
  23. args []string
  24. wantShow []string
  25. }{
  26. {
  27. name: "clean",
  28. args: []string{"Y", "c"},
  29. wantShow: []string{"pacman", "-R", "-s", "-u", "--config", "/etc/pacman.conf", "--", "lsp-plugins"},
  30. },
  31. {
  32. name: "clean double",
  33. args: []string{"Y", "c", "c"},
  34. wantShow: []string{"pacman", "-R", "-s", "-u", "--config", "/etc/pacman.conf", "--", "lsp-plugins", "linux-headers"},
  35. },
  36. }
  37. dbExc := &mock.DBExecutor{
  38. PackageOptionalDependsFn: func(i alpm.IPackage) []alpm.Depend {
  39. if i.Name() == "linux" {
  40. return []alpm.Depend{
  41. {
  42. Name: "linux-headers",
  43. },
  44. }
  45. }
  46. return []alpm.Depend{}
  47. },
  48. PackageProvidesFn: func(p alpm.IPackage) []alpm.Depend { return []alpm.Depend{} },
  49. PackageDependsFn: func(p alpm.IPackage) []alpm.Depend { return []alpm.Depend{} },
  50. LocalPackagesFn: func() []mock.IPackage {
  51. return []mock.IPackage{
  52. &mock.Package{
  53. PReason: alpm.PkgReasonExplicit,
  54. PName: "linux",
  55. },
  56. &mock.Package{
  57. PReason: alpm.PkgReasonDepend,
  58. PName: "lsp-plugins",
  59. },
  60. &mock.Package{
  61. PReason: alpm.PkgReasonDepend,
  62. PName: "linux-headers",
  63. },
  64. }
  65. },
  66. }
  67. for _, tc := range testCases {
  68. t.Run(tc.name, func(t *testing.T) {
  69. mockRunner := &exe.MockRunner{
  70. CaptureFn: func(cmd *exec.Cmd) (stdout string, stderr string, err error) {
  71. return "", "", nil
  72. },
  73. ShowFn: func(cmd *exec.Cmd) error { return nil },
  74. }
  75. cmdBuilder := &exe.CmdBuilder{
  76. SudoBin: "su",
  77. PacmanBin: pacmanBin,
  78. PacmanConfigPath: "/etc/pacman.conf",
  79. GitBin: "git",
  80. Runner: mockRunner,
  81. SudoLoopEnabled: false,
  82. }
  83. cfg := &settings.Configuration{
  84. Runtime: &settings.Runtime{CmdBuilder: cmdBuilder},
  85. }
  86. cmdArgs := parser.MakeArguments()
  87. cmdArgs.AddArg(tc.args...)
  88. err := handleCmd(context.Background(),
  89. cfg, cmdArgs, dbExc,
  90. )
  91. require.NoError(t, err)
  92. for i, call := range mockRunner.ShowCalls {
  93. show := call.Args[0].(*exec.Cmd).String()
  94. show = strings.ReplaceAll(show, pacmanBin, "pacman")
  95. // options are in a different order on different systems and on CI root user is used
  96. assert.Subset(t, strings.Split(show, " "),
  97. strings.Split(tc.wantShow[i], " "),
  98. fmt.Sprintf("%d - %s", i, show))
  99. }
  100. })
  101. }
  102. }