|
@@ -0,0 +1,154 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "os/exec"
|
|
|
+ "sync/atomic"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "github.com/stretchr/testify/assert"
|
|
|
+
|
|
|
+ "github.com/Jguer/aur"
|
|
|
+
|
|
|
+ "github.com/Jguer/yay/v10/pkg/dep"
|
|
|
+ "github.com/Jguer/yay/v10/pkg/multierror"
|
|
|
+ "github.com/Jguer/yay/v10/pkg/settings/exe"
|
|
|
+ "github.com/Jguer/yay/v10/pkg/stringset"
|
|
|
+)
|
|
|
+
|
|
|
+type TestMakepkgBuilder struct {
|
|
|
+ exe.ICmdBuilder
|
|
|
+ parentBuilder *exe.CmdBuilder
|
|
|
+ test *testing.T
|
|
|
+ passes uint32
|
|
|
+ want string
|
|
|
+ wantDir string
|
|
|
+ showError error
|
|
|
+}
|
|
|
+
|
|
|
+func (z *TestMakepkgBuilder) BuildMakepkgCmd(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd {
|
|
|
+ cmd := z.parentBuilder.BuildMakepkgCmd(ctx, dir, extraArgs...)
|
|
|
+ if z.want != "" {
|
|
|
+ assert.Contains(z.test, cmd.String(), z.want)
|
|
|
+ }
|
|
|
+ if z.wantDir != "" {
|
|
|
+ assert.Equal(z.test, z.wantDir, cmd.Dir)
|
|
|
+ }
|
|
|
+
|
|
|
+ atomic.AddUint32(&z.passes, 1)
|
|
|
+
|
|
|
+ return cmd
|
|
|
+}
|
|
|
+
|
|
|
+func (z *TestMakepkgBuilder) Show(cmd *exec.Cmd) error {
|
|
|
+ return z.showError
|
|
|
+}
|
|
|
+
|
|
|
+// GIVEN 1 package
|
|
|
+// WHEN downloadPKGBUILDSource is called
|
|
|
+// THEN 1 call should be made to makepkg with the specified parameters and dir
|
|
|
+func Test_downloadPKGBUILDSource(t *testing.T) {
|
|
|
+ t.Parallel()
|
|
|
+ cmdBuilder := &TestMakepkgBuilder{
|
|
|
+ parentBuilder: &exe.CmdBuilder{MakepkgConfPath: "/etc/not.conf", MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg"},
|
|
|
+ test: t,
|
|
|
+ want: "makepkg --nocheck --config /etc/not.conf --verifysource -Ccf",
|
|
|
+ wantDir: "/tmp/yay-bin",
|
|
|
+ }
|
|
|
+ err := downloadPKGBUILDSource(context.TODO(), cmdBuilder, "/tmp", "yay-bin", stringset.Make())
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, 1, int(cmdBuilder.passes))
|
|
|
+}
|
|
|
+
|
|
|
+// GIVEN 1 package
|
|
|
+// WHEN downloadPKGBUILDSource is called
|
|
|
+// THEN 1 call should be made to makepkg which should return error
|
|
|
+func Test_downloadPKGBUILDSourceError(t *testing.T) {
|
|
|
+ t.Parallel()
|
|
|
+ cmdBuilder := &TestMakepkgBuilder{
|
|
|
+ parentBuilder: &exe.CmdBuilder{MakepkgConfPath: "/etc/not.conf", MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg"},
|
|
|
+ test: t,
|
|
|
+ want: "makepkg --nocheck --config /etc/not.conf --verifysource -Ccf",
|
|
|
+ wantDir: "/tmp/yay-bin",
|
|
|
+ showError: &exec.ExitError{},
|
|
|
+ }
|
|
|
+ err := downloadPKGBUILDSource(context.TODO(), cmdBuilder, "/tmp", "yay-bin", stringset.Make())
|
|
|
+ assert.Error(t, err)
|
|
|
+ assert.EqualError(t, err, "error downloading sources: \x1b[36myay-bin\x1b[0m \n\t context: <nil> \n\t \n")
|
|
|
+}
|
|
|
+
|
|
|
+// GIVEN 5 packages
|
|
|
+// WHEN downloadPKGBUILDSourceFanout is called
|
|
|
+// THEN 5 calls should be made to makepkg
|
|
|
+func Test_downloadPKGBUILDSourceFanout(t *testing.T) {
|
|
|
+ t.Parallel()
|
|
|
+ cmdBuilder := &TestMakepkgBuilder{
|
|
|
+ parentBuilder: &exe.CmdBuilder{
|
|
|
+ MakepkgConfPath: "/etc/not.conf",
|
|
|
+ MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg",
|
|
|
+ },
|
|
|
+ test: t,
|
|
|
+ }
|
|
|
+
|
|
|
+ bases := []dep.Base{
|
|
|
+ {&aur.Pkg{PackageBase: "yay"}},
|
|
|
+ {&aur.Pkg{PackageBase: "yay-bin"}},
|
|
|
+ {&aur.Pkg{PackageBase: "yay-git"}},
|
|
|
+ {&aur.Pkg{PackageBase: "yay-v11"}},
|
|
|
+ {&aur.Pkg{PackageBase: "yay-v12"}},
|
|
|
+ }
|
|
|
+
|
|
|
+ err := downloadPKGBUILDSourceFanout(context.TODO(), cmdBuilder, "/tmp", bases, stringset.Make())
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, 5, int(cmdBuilder.passes))
|
|
|
+}
|
|
|
+
|
|
|
+// GIVEN 1 package
|
|
|
+// WHEN downloadPKGBUILDSourceFanout is called
|
|
|
+// THEN 1 calls should be made to makepkg without concurrency
|
|
|
+func Test_downloadPKGBUILDSourceFanoutNoCC(t *testing.T) {
|
|
|
+ t.Parallel()
|
|
|
+ cmdBuilder := &TestMakepkgBuilder{
|
|
|
+ parentBuilder: &exe.CmdBuilder{
|
|
|
+ MakepkgConfPath: "/etc/not.conf",
|
|
|
+ MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg",
|
|
|
+ },
|
|
|
+ test: t,
|
|
|
+ }
|
|
|
+
|
|
|
+ bases := []dep.Base{
|
|
|
+ {&aur.Pkg{PackageBase: "yay"}},
|
|
|
+ }
|
|
|
+
|
|
|
+ err := downloadPKGBUILDSourceFanout(context.TODO(), cmdBuilder, "/tmp", bases, stringset.Make())
|
|
|
+ assert.NoError(t, err)
|
|
|
+ assert.Equal(t, 1, int(cmdBuilder.passes))
|
|
|
+}
|
|
|
+
|
|
|
+// GIVEN 5 packages
|
|
|
+// WHEN downloadPKGBUILDSourceFanout is called
|
|
|
+// THEN 5 calls should be made to makepkg
|
|
|
+func Test_downloadPKGBUILDSourceFanoutError(t *testing.T) {
|
|
|
+ t.Parallel()
|
|
|
+ cmdBuilder := &TestMakepkgBuilder{
|
|
|
+ parentBuilder: &exe.CmdBuilder{
|
|
|
+ MakepkgConfPath: "/etc/not.conf",
|
|
|
+ MakepkgFlags: []string{"--nocheck"}, MakepkgBin: "makepkg",
|
|
|
+ },
|
|
|
+ test: t,
|
|
|
+ showError: &exec.ExitError{},
|
|
|
+ }
|
|
|
+
|
|
|
+ bases := []dep.Base{
|
|
|
+ {&aur.Pkg{PackageBase: "yay"}},
|
|
|
+ {&aur.Pkg{PackageBase: "yay-bin"}},
|
|
|
+ {&aur.Pkg{PackageBase: "yay-git"}},
|
|
|
+ {&aur.Pkg{PackageBase: "yay-v11"}},
|
|
|
+ {&aur.Pkg{PackageBase: "yay-v12"}},
|
|
|
+ }
|
|
|
+
|
|
|
+ err := downloadPKGBUILDSourceFanout(context.TODO(), cmdBuilder, "/tmp", bases, stringset.Make())
|
|
|
+ assert.Error(t, err)
|
|
|
+ assert.Equal(t, 5, int(cmdBuilder.passes))
|
|
|
+ assert.Len(t, err.(*multierror.MultiError).Errors, 5)
|
|
|
+}
|