clean_test.go 2.8 KB

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