clean_test.go 2.8 KB

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