mirror of
https://github.com/coder/coder.git
synced 2026-10-29 17:44:33 +08:00
feat: refactor deployment config (#6347)
This commit is contained in:
+54
-4
@@ -3,6 +3,7 @@ package clitest
|
||||
import (
|
||||
"archive/tar"
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
@@ -10,14 +11,17 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/coder/coder/cli"
|
||||
"github.com/coder/coder/cli/config"
|
||||
"github.com/coder/coder/codersdk"
|
||||
"github.com/coder/coder/provisioner/echo"
|
||||
"github.com/coder/coder/testutil"
|
||||
)
|
||||
|
||||
// New creates a CLI instance with a configuration pointed to a
|
||||
@@ -26,6 +30,22 @@ func New(t *testing.T, args ...string) (*cobra.Command, config.Root) {
|
||||
return NewWithSubcommands(t, cli.AGPL(), args...)
|
||||
}
|
||||
|
||||
type logWriter struct {
|
||||
prefix string
|
||||
t *testing.T
|
||||
}
|
||||
|
||||
func (l *logWriter) Write(p []byte) (n int, err error) {
|
||||
trimmed := strings.TrimSpace(string(p))
|
||||
if trimmed == "" {
|
||||
return len(p), nil
|
||||
}
|
||||
l.t.Log(
|
||||
l.prefix + ": " + trimmed,
|
||||
)
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
func NewWithSubcommands(
|
||||
t *testing.T, subcommands []*cobra.Command, args ...string,
|
||||
) (*cobra.Command, config.Root) {
|
||||
@@ -34,10 +54,9 @@ func NewWithSubcommands(
|
||||
root := config.Root(dir)
|
||||
cmd.SetArgs(append([]string{"--global-config", dir}, args...))
|
||||
|
||||
// We could consider using writers
|
||||
// that log via t.Log here instead.
|
||||
cmd.SetOut(io.Discard)
|
||||
cmd.SetErr(io.Discard)
|
||||
// These can be overridden by the test.
|
||||
cmd.SetOut(&logWriter{prefix: "stdout", t: t})
|
||||
cmd.SetErr(&logWriter{prefix: "stderr", t: t})
|
||||
|
||||
return cmd, root
|
||||
}
|
||||
@@ -98,3 +117,34 @@ func extractTar(t *testing.T, data []byte, directory string) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Start runs the command in a goroutine and cleans it up when
|
||||
// the test completed.
|
||||
func Start(ctx context.Context, t *testing.T, cmd *cobra.Command) {
|
||||
t.Helper()
|
||||
|
||||
closeCh := make(chan struct{})
|
||||
|
||||
deadline, hasDeadline := ctx.Deadline()
|
||||
if !hasDeadline {
|
||||
// We don't want to wait the full 5 minutes for a test to time out.
|
||||
deadline = time.Now().Add(testutil.WaitMedium)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithDeadline(ctx, deadline)
|
||||
|
||||
go func() {
|
||||
defer cancel()
|
||||
defer close(closeCh)
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
if ctx.Err() == nil {
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
}()
|
||||
|
||||
// Don't exit test routine until server is done.
|
||||
t.Cleanup(func() {
|
||||
cancel()
|
||||
<-closeCh
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user