aur_source_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package main
  2. import (
  3. "context"
  4. "os/exec"
  5. "sync/atomic"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/Jguer/aur"
  9. "github.com/Jguer/yay/v11/pkg/dep"
  10. "github.com/Jguer/yay/v11/pkg/multierror"
  11. "github.com/Jguer/yay/v11/pkg/settings/exe"
  12. "github.com/Jguer/yay/v11/pkg/stringset"
  13. )
  14. type TestMakepkgBuilder struct {
  15. exe.ICmdBuilder
  16. parentBuilder *exe.CmdBuilder
  17. test *testing.T
  18. passes uint32
  19. want string
  20. wantDir string
  21. showError error
  22. }
  23. func (z *TestMakepkgBuilder) BuildMakepkgCmd(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd {
  24. cmd := z.parentBuilder.BuildMakepkgCmd(ctx, dir, extraArgs...)
  25. if z.want != "" {
  26. assert.Contains(z.test, cmd.String(), z.want)
  27. }
  28. if z.wantDir != "" {
  29. assert.Equal(z.test, z.wantDir, cmd.Dir)
  30. }
  31. atomic.AddUint32(&z.passes, 1)
  32. return cmd
  33. }
  34. func (z *TestMakepkgBuilder) Show(cmd *exec.Cmd) error {
  35. return z.showError
  36. }
  37. // GIVEN 1 package
  38. // WHEN downloadPKGBUILDSource is called
  39. // THEN 1 call should be made to makepkg with the specified parameters and dir
  40. func Test_downloadPKGBUILDSource(t *testing.T) {
  41. t.Parallel()
  42. cmdBuilder := &TestMakepkgBuilder{
  43. parentBuilder: &exe.CmdBuilder{MakepkgConfPath: "/etc/not.conf", MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg"},
  44. test: t,
  45. want: "makepkg --nocheck --config /etc/not.conf --verifysource -Ccf",
  46. wantDir: "/tmp/yay-bin",
  47. }
  48. err := downloadPKGBUILDSource(context.TODO(), cmdBuilder, "/tmp", "yay-bin", stringset.Make())
  49. assert.NoError(t, err)
  50. assert.Equal(t, 1, int(cmdBuilder.passes))
  51. }
  52. // GIVEN 1 package
  53. // WHEN downloadPKGBUILDSource is called
  54. // THEN 1 call should be made to makepkg which should return error
  55. func Test_downloadPKGBUILDSourceError(t *testing.T) {
  56. t.Parallel()
  57. cmdBuilder := &TestMakepkgBuilder{
  58. parentBuilder: &exe.CmdBuilder{MakepkgConfPath: "/etc/not.conf", MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg"},
  59. test: t,
  60. want: "makepkg --nocheck --config /etc/not.conf --verifysource -Ccf",
  61. wantDir: "/tmp/yay-bin",
  62. showError: &exec.ExitError{},
  63. }
  64. err := downloadPKGBUILDSource(context.TODO(), cmdBuilder, "/tmp", "yay-bin", stringset.Make())
  65. assert.Error(t, err)
  66. assert.EqualError(t, err, "error downloading sources: \x1b[36myay-bin\x1b[0m \n\t context: <nil> \n\t \n")
  67. }
  68. // GIVEN 5 packages
  69. // WHEN downloadPKGBUILDSourceFanout is called
  70. // THEN 5 calls should be made to makepkg
  71. func Test_downloadPKGBUILDSourceFanout(t *testing.T) {
  72. t.Parallel()
  73. cmdBuilder := &TestMakepkgBuilder{
  74. parentBuilder: &exe.CmdBuilder{
  75. MakepkgConfPath: "/etc/not.conf",
  76. MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg",
  77. },
  78. test: t,
  79. }
  80. bases := []dep.Base{
  81. {&aur.Pkg{PackageBase: "yay"}},
  82. {&aur.Pkg{PackageBase: "yay-bin"}},
  83. {&aur.Pkg{PackageBase: "yay-git"}},
  84. {&aur.Pkg{PackageBase: "yay-v11"}},
  85. {&aur.Pkg{PackageBase: "yay-v12"}},
  86. }
  87. err := downloadPKGBUILDSourceFanout(context.TODO(), cmdBuilder, "/tmp", bases, stringset.Make())
  88. assert.NoError(t, err)
  89. assert.Equal(t, 5, int(cmdBuilder.passes))
  90. }
  91. // GIVEN 1 package
  92. // WHEN downloadPKGBUILDSourceFanout is called
  93. // THEN 1 calls should be made to makepkg without concurrency
  94. func Test_downloadPKGBUILDSourceFanoutNoCC(t *testing.T) {
  95. t.Parallel()
  96. cmdBuilder := &TestMakepkgBuilder{
  97. parentBuilder: &exe.CmdBuilder{
  98. MakepkgConfPath: "/etc/not.conf",
  99. MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg",
  100. },
  101. test: t,
  102. }
  103. bases := []dep.Base{
  104. {&aur.Pkg{PackageBase: "yay"}},
  105. }
  106. err := downloadPKGBUILDSourceFanout(context.TODO(), cmdBuilder, "/tmp", bases, stringset.Make())
  107. assert.NoError(t, err)
  108. assert.Equal(t, 1, int(cmdBuilder.passes))
  109. }
  110. // GIVEN 5 packages
  111. // WHEN downloadPKGBUILDSourceFanout is called
  112. // THEN 5 calls should be made to makepkg
  113. func Test_downloadPKGBUILDSourceFanoutError(t *testing.T) {
  114. t.Parallel()
  115. cmdBuilder := &TestMakepkgBuilder{
  116. parentBuilder: &exe.CmdBuilder{
  117. MakepkgConfPath: "/etc/not.conf",
  118. MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg",
  119. },
  120. test: t,
  121. showError: &exec.ExitError{},
  122. }
  123. bases := []dep.Base{
  124. {&aur.Pkg{PackageBase: "yay"}},
  125. {&aur.Pkg{PackageBase: "yay-bin"}},
  126. {&aur.Pkg{PackageBase: "yay-git"}},
  127. {&aur.Pkg{PackageBase: "yay-v11"}},
  128. {&aur.Pkg{PackageBase: "yay-v12"}},
  129. }
  130. err := downloadPKGBUILDSourceFanout(context.TODO(), cmdBuilder, "/tmp", bases, stringset.Make())
  131. assert.Error(t, err)
  132. assert.Equal(t, 5, int(cmdBuilder.passes))
  133. assert.Len(t, err.(*multierror.MultiError).Errors, 5)
  134. }