mock.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package exe
  2. import (
  3. "context"
  4. "fmt"
  5. "os/exec"
  6. "sync"
  7. "github.com/Jguer/yay/v12/pkg/settings/parser"
  8. )
  9. type Call struct {
  10. Res []interface{}
  11. Args []interface{}
  12. Dir string
  13. }
  14. func (c *Call) String() string {
  15. return fmt.Sprintf("%+v", c.Args)
  16. }
  17. type MockBuilder struct {
  18. Runner Runner
  19. BuildMakepkgCmdCallsMu sync.Mutex
  20. BuildMakepkgCmdCalls []Call
  21. BuildMakepkgCmdFn func(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd
  22. BuildPacmanCmdFn func(ctx context.Context, args *parser.Arguments, mode parser.TargetMode, noConfirm bool) *exec.Cmd
  23. }
  24. type MockRunner struct {
  25. ShowCallsMu sync.Mutex
  26. ShowCalls []Call
  27. CaptureCallsMu sync.Mutex
  28. CaptureCalls []Call
  29. ShowFn func(cmd *exec.Cmd) error
  30. CaptureFn func(cmd *exec.Cmd) (stdout string, stderr string, err error)
  31. }
  32. func (m *MockBuilder) BuildGPGCmd(ctx context.Context, extraArgs ...string) *exec.Cmd {
  33. return exec.CommandContext(ctx, "gpg", extraArgs...)
  34. }
  35. func (m *MockBuilder) BuildMakepkgCmd(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd {
  36. var res *exec.Cmd
  37. if m.BuildMakepkgCmdFn != nil {
  38. res = m.BuildMakepkgCmdFn(ctx, dir, extraArgs...)
  39. } else {
  40. res = exec.CommandContext(ctx, "makepkg", extraArgs...)
  41. }
  42. m.BuildMakepkgCmdCallsMu.Lock()
  43. m.BuildMakepkgCmdCalls = append(m.BuildMakepkgCmdCalls, Call{
  44. Res: []interface{}{res},
  45. Args: []interface{}{
  46. ctx,
  47. dir,
  48. extraArgs,
  49. },
  50. })
  51. m.BuildMakepkgCmdCallsMu.Unlock()
  52. return res
  53. }
  54. func (m *MockBuilder) AddMakepkgFlag(flag string) {
  55. }
  56. func (m *MockBuilder) BuildGitCmd(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd {
  57. return exec.CommandContext(ctx, "git", extraArgs...)
  58. }
  59. func (m *MockBuilder) BuildPacmanCmd(ctx context.Context, args *parser.Arguments, mode parser.TargetMode, noConfirm bool) *exec.Cmd {
  60. var res *exec.Cmd
  61. if m.BuildPacmanCmdFn != nil {
  62. res = m.BuildPacmanCmdFn(ctx, args, mode, noConfirm)
  63. } else {
  64. res = exec.CommandContext(ctx, "pacman")
  65. }
  66. return res
  67. }
  68. func (m *MockBuilder) SetPacmanDBPath(path string) {
  69. }
  70. func (m *MockBuilder) SudoLoop() {
  71. }
  72. func (m *MockBuilder) Capture(cmd *exec.Cmd) (stdout, stderr string, err error) {
  73. return m.Runner.Capture(cmd)
  74. }
  75. func (m *MockBuilder) Show(cmd *exec.Cmd) error {
  76. return m.Runner.Show(cmd)
  77. }
  78. func (m *MockRunner) Capture(cmd *exec.Cmd) (stdout, stderr string, err error) {
  79. m.CaptureCallsMu.Lock()
  80. m.CaptureCalls = append(m.CaptureCalls, Call{
  81. Args: []interface{}{
  82. cmd,
  83. },
  84. Dir: cmd.Dir,
  85. })
  86. m.CaptureCallsMu.Unlock()
  87. if m.CaptureFn != nil {
  88. return m.CaptureFn(cmd)
  89. }
  90. return "", "", nil
  91. }
  92. func (m *MockRunner) Show(cmd *exec.Cmd) error {
  93. var err error
  94. if m.ShowFn != nil {
  95. err = m.ShowFn(cmd)
  96. }
  97. m.ShowCallsMu.Lock()
  98. m.ShowCalls = append(m.ShowCalls, Call{
  99. Args: []interface{}{
  100. cmd,
  101. },
  102. Dir: cmd.Dir,
  103. })
  104. m.ShowCallsMu.Unlock()
  105. return err
  106. }