mock.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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) BuildMakepkgCmd(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd {
  33. var res *exec.Cmd
  34. if m.BuildMakepkgCmdFn != nil {
  35. res = m.BuildMakepkgCmdFn(ctx, dir, extraArgs...)
  36. } else {
  37. res = exec.CommandContext(ctx, "makepkg", extraArgs...)
  38. }
  39. m.BuildMakepkgCmdCallsMu.Lock()
  40. m.BuildMakepkgCmdCalls = append(m.BuildMakepkgCmdCalls, Call{
  41. Res: []interface{}{res},
  42. Args: []interface{}{
  43. ctx,
  44. dir,
  45. extraArgs,
  46. },
  47. })
  48. m.BuildMakepkgCmdCallsMu.Unlock()
  49. return res
  50. }
  51. func (m *MockBuilder) AddMakepkgFlag(flag string) {
  52. }
  53. func (m *MockBuilder) BuildGitCmd(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd {
  54. return exec.CommandContext(ctx, "git", extraArgs...)
  55. }
  56. func (m *MockBuilder) BuildPacmanCmd(ctx context.Context, args *parser.Arguments, mode parser.TargetMode, noConfirm bool) *exec.Cmd {
  57. var res *exec.Cmd
  58. if m.BuildPacmanCmdFn != nil {
  59. res = m.BuildPacmanCmdFn(ctx, args, mode, noConfirm)
  60. } else {
  61. res = exec.CommandContext(ctx, "pacman")
  62. }
  63. return res
  64. }
  65. func (m *MockBuilder) SetPacmanDBPath(path string) {
  66. }
  67. func (m *MockBuilder) SudoLoop() {
  68. }
  69. func (m *MockBuilder) Capture(cmd *exec.Cmd) (stdout, stderr string, err error) {
  70. return m.Runner.Capture(cmd)
  71. }
  72. func (m *MockBuilder) Show(cmd *exec.Cmd) error {
  73. return m.Runner.Show(cmd)
  74. }
  75. func (m *MockRunner) Capture(cmd *exec.Cmd) (stdout, stderr string, err error) {
  76. m.CaptureCallsMu.Lock()
  77. m.CaptureCalls = append(m.CaptureCalls, Call{
  78. Args: []interface{}{
  79. cmd,
  80. },
  81. Dir: cmd.Dir,
  82. })
  83. m.CaptureCallsMu.Unlock()
  84. if m.CaptureFn != nil {
  85. return m.CaptureFn(cmd)
  86. }
  87. return "", "", nil
  88. }
  89. func (m *MockRunner) Show(cmd *exec.Cmd) error {
  90. var err error
  91. if m.ShowFn != nil {
  92. err = m.ShowFn(cmd)
  93. }
  94. m.ShowCallsMu.Lock()
  95. m.ShowCalls = append(m.ShowCalls, Call{
  96. Args: []interface{}{
  97. cmd,
  98. },
  99. Dir: cmd.Dir,
  100. })
  101. m.ShowCallsMu.Unlock()
  102. return err
  103. }