aur_install_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. package main
  2. import (
  3. "context"
  4. "os"
  5. "os/exec"
  6. "strings"
  7. "testing"
  8. gosrc "github.com/Morganamilo/go-srcinfo"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. "github.com/Jguer/yay/v11/pkg/db/mock"
  12. "github.com/Jguer/yay/v11/pkg/dep"
  13. "github.com/Jguer/yay/v11/pkg/settings/exe"
  14. "github.com/Jguer/yay/v11/pkg/settings/parser"
  15. "github.com/Jguer/yay/v11/pkg/vcs"
  16. )
  17. func ptrString(s string) *string {
  18. return &s
  19. }
  20. func TestInstaller_InstallNeeded(t *testing.T) {
  21. t.Parallel()
  22. makepkgBin := t.TempDir() + "/makepkg"
  23. pacmanBin := t.TempDir() + "/pacman"
  24. f, err := os.OpenFile(makepkgBin, os.O_RDONLY|os.O_CREATE, 0o755)
  25. require.NoError(t, err)
  26. require.NoError(t, f.Close())
  27. f, err = os.OpenFile(pacmanBin, os.O_RDONLY|os.O_CREATE, 0o755)
  28. require.NoError(t, err)
  29. require.NoError(t, f.Close())
  30. type testCase struct {
  31. desc string
  32. isInstalled bool
  33. isBuilt bool
  34. wantShow []string
  35. wantCapture []string
  36. }
  37. testCases := []testCase{
  38. {
  39. desc: "not installed and not built",
  40. isInstalled: false,
  41. isBuilt: false,
  42. wantShow: []string{
  43. "makepkg --nobuild -fC --ignorearch",
  44. "makepkg -cf --noconfirm --noextract --noprepare --holdver --ignorearch",
  45. "pacman -U --needed --config -- /testdir/yay-91.0.0-1-x86_64.pkg.tar.zst",
  46. "pacman -D -q --asexplicit --config -- yay",
  47. },
  48. wantCapture: []string{"makepkg --packagelist"},
  49. },
  50. {
  51. desc: "not installed and built",
  52. isInstalled: false,
  53. isBuilt: true,
  54. wantShow: []string{
  55. "makepkg --nobuild -fC --ignorearch",
  56. "makepkg -c --nobuild --noextract --ignorearch",
  57. "pacman -U --needed --config -- /testdir/yay-91.0.0-1-x86_64.pkg.tar.zst",
  58. "pacman -D -q --asexplicit --config -- yay",
  59. },
  60. wantCapture: []string{"makepkg --packagelist"},
  61. },
  62. {
  63. desc: "installed",
  64. isInstalled: true,
  65. isBuilt: false,
  66. wantShow: []string{
  67. "makepkg --nobuild -fC --ignorearch",
  68. "makepkg -c --nobuild --noextract --ignorearch",
  69. },
  70. wantCapture: []string{"makepkg --packagelist"},
  71. },
  72. }
  73. for _, tc := range testCases {
  74. tc := tc
  75. t.Run(tc.desc, func(td *testing.T) {
  76. tmpDir := td.TempDir()
  77. pkgTar := tmpDir + "/yay-91.0.0-1-x86_64.pkg.tar.zst"
  78. captureOverride := func(cmd *exec.Cmd) (stdout string, stderr string, err error) {
  79. return pkgTar, "", nil
  80. }
  81. i := 0
  82. showOverride := func(cmd *exec.Cmd) error {
  83. i++
  84. if i == 2 {
  85. if !tc.isBuilt {
  86. f, err := os.OpenFile(pkgTar, os.O_RDONLY|os.O_CREATE, 0o666)
  87. require.NoError(td, err)
  88. require.NoError(td, f.Close())
  89. }
  90. }
  91. return nil
  92. }
  93. // create a mock file
  94. if tc.isBuilt {
  95. f, err := os.OpenFile(pkgTar, os.O_RDONLY|os.O_CREATE, 0o666)
  96. require.NoError(td, err)
  97. require.NoError(td, f.Close())
  98. }
  99. isCorrectInstalledOverride := func(string, string) bool {
  100. return tc.isInstalled
  101. }
  102. mockDB := &mock.DBExecutor{IsCorrectVersionInstalledFunc: isCorrectInstalledOverride}
  103. mockRunner := &exe.MockRunner{CaptureFn: captureOverride, ShowFn: showOverride}
  104. cmdBuilder := &exe.CmdBuilder{
  105. MakepkgBin: makepkgBin,
  106. SudoBin: "su",
  107. PacmanBin: pacmanBin,
  108. Runner: mockRunner,
  109. SudoLoopEnabled: false,
  110. }
  111. cmdBuilder.Runner = mockRunner
  112. installer := NewInstaller(mockDB, cmdBuilder, &vcs.Mock{}, parser.ModeAny)
  113. cmdArgs := parser.MakeArguments()
  114. cmdArgs.AddArg("needed")
  115. cmdArgs.AddTarget("yay")
  116. pkgBuildDirs := map[string]string{
  117. "yay": tmpDir,
  118. }
  119. srcInfos := map[string]*gosrc.Srcinfo{"yay": {}}
  120. targets := []map[string]*dep.InstallInfo{
  121. {
  122. "yay": {
  123. Source: dep.AUR,
  124. Reason: dep.Explicit,
  125. Version: "91.0.0-1",
  126. SrcinfoPath: ptrString(tmpDir + "/.SRCINFO"),
  127. AURBase: ptrString("yay"),
  128. SyncDBName: nil,
  129. },
  130. },
  131. }
  132. errI := installer.Install(context.Background(), cmdArgs, targets, pkgBuildDirs, srcInfos)
  133. require.NoError(td, errI)
  134. require.Len(td, mockRunner.ShowCalls, len(tc.wantShow))
  135. require.Len(td, mockRunner.CaptureCalls, len(tc.wantCapture))
  136. for i, call := range mockRunner.ShowCalls {
  137. show := call.Args[0].(*exec.Cmd).String()
  138. show = strings.ReplaceAll(show, tmpDir, "/testdir") // replace the temp dir with a static path
  139. show = strings.ReplaceAll(show, makepkgBin, "makepkg")
  140. show = strings.ReplaceAll(show, pacmanBin, "pacman")
  141. // options are in a different order on different systems and on CI root user is used
  142. assert.Subset(td, strings.Split(show, " "), strings.Split(tc.wantShow[i], " "), show)
  143. }
  144. for i, call := range mockRunner.CaptureCalls {
  145. capture := call.Args[0].(*exec.Cmd).String()
  146. capture = strings.ReplaceAll(capture, tmpDir, "/testdir") // replace the temp dir with a static path
  147. capture = strings.ReplaceAll(capture, makepkgBin, "makepkg")
  148. capture = strings.ReplaceAll(capture, pacmanBin, "pacman")
  149. assert.Subset(td, strings.Split(capture, " "), strings.Split(tc.wantCapture[i], " "), capture)
  150. }
  151. })
  152. }
  153. }