summaryrefslogtreecommitdiff
path: root/go/internal/handler/exec_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/internal/handler/exec_test.go')
-rw-r--r--go/internal/handler/exec_test.go153
1 files changed, 153 insertions, 0 deletions
diff --git a/go/internal/handler/exec_test.go b/go/internal/handler/exec_test.go
new file mode 100644
index 0000000..e19ebc4
--- /dev/null
+++ b/go/internal/handler/exec_test.go
@@ -0,0 +1,153 @@
+package handler
+
+import (
+ "context"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+ "google.golang.org/grpc"
+)
+
+func TestInteralRunHandler(t *testing.T) {
+ type testCase struct {
+ name string
+ args []string
+ handler func(context.Context, *grpc.ClientConn, string) (int32, error)
+ want int
+ wantErr bool
+ }
+
+ var currentTest *testCase
+ makeHandler := func(r1 int32, r2 error) func(context.Context, *grpc.ClientConn, string) (int32, error) {
+ return func(ctx context.Context, client *grpc.ClientConn, requestJSON string) (int32, error) {
+ require.NotNil(t, ctx)
+ require.NotNil(t, client)
+ require.Equal(t, currentTest.args[2], requestJSON)
+ return r1, r2
+ }
+ }
+ tests := []testCase{
+ {
+ name: "expected",
+ args: []string{"test", "tcp://localhost:9999", "{}"},
+ handler: makeHandler(0, nil),
+ want: 0,
+ wantErr: false,
+ },
+ {
+ name: "handler_error",
+ args: []string{"test", "tcp://localhost:9999", "{}"},
+ handler: makeHandler(0, fmt.Errorf("error")),
+ want: 0,
+ wantErr: true,
+ },
+ {
+ name: "handler_exitcode",
+ args: []string{"test", "tcp://localhost:9999", "{}"},
+ handler: makeHandler(1, nil),
+ want: 1,
+ wantErr: false,
+ },
+ {
+ name: "handler_error_exitcode",
+ args: []string{"test", "tcp://localhost:9999", "{}"},
+ handler: makeHandler(1, fmt.Errorf("error")),
+ want: 1,
+ wantErr: true,
+ },
+ {
+ name: "too_few_arguments",
+ args: []string{"test"},
+ handler: makeHandler(10, nil),
+ want: 1,
+ wantErr: true,
+ },
+ {
+ name: "too_many_arguments",
+ args: []string{"test", "1", "2", "3"},
+ handler: makeHandler(10, nil),
+ want: 1,
+ wantErr: true,
+ },
+ {
+ name: "empty_gitaly_address",
+ args: []string{"test", "", "{}"},
+ handler: makeHandler(10, nil),
+ want: 1,
+ wantErr: true,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ currentTest = &tt
+ defer func() {
+ currentTest = nil
+ }()
+
+ done, err := createEnv()
+ defer done()
+ require.NoError(t, err)
+
+ got, err := internalRunGitalyCommand(tt.args, tt.handler)
+ if tt.wantErr {
+ require.Error(t, err)
+ } else {
+ require.NoError(t, err)
+ }
+
+ require.Equal(t, tt.want, got)
+ })
+ }
+}
+
+// createEnv sets up an environment for `config.New()`.
+func createEnv() (func(), error) {
+ var dir string
+ var oldWd string
+ closer := func() {
+ if oldWd != "" {
+ err := os.Chdir(oldWd)
+ if err != nil {
+ panic(err)
+ }
+ }
+
+ if dir != "" {
+ err := os.RemoveAll(dir)
+ if err != nil {
+ panic(err)
+ }
+ }
+ }
+
+ dir, err := ioutil.TempDir("", "test")
+ if err != nil {
+ return closer, err
+ }
+
+ err = ioutil.WriteFile(filepath.Join(dir, "config.yml"), []byte{}, 0644)
+ if err != nil {
+ return closer, err
+ }
+
+ err = ioutil.WriteFile(filepath.Join(dir, "gitlab-shell.log"), []byte{}, 0644)
+ if err != nil {
+ return closer, err
+ }
+
+ oldWd, err = os.Getwd()
+ if err != nil {
+ return closer, err
+ }
+
+ err = os.Chdir(dir)
+ if err != nil {
+ return closer, err
+ }
+
+ return closer, err
+}