diff --git a/command/debug/debug_test.go b/command/debug/debug_test.go index fee8113b66..215475706c 100644 --- a/command/debug/debug_test.go +++ b/command/debug/debug_test.go @@ -14,19 +14,18 @@ import ( "testing" "time" + "github.com/google/pprof/profile" "github.com/mitchellh/cli" "github.com/stretchr/testify/require" - - "github.com/google/pprof/profile" + "gotest.tools/v3/assert" + "gotest.tools/v3/fs" "github.com/hashicorp/consul/agent" "github.com/hashicorp/consul/sdk/testutil" "github.com/hashicorp/consul/testrpc" ) -func TestDebugCommand_noTabs(t *testing.T) { - t.Parallel() - +func TestDebugCommand_Help_TextContainsNoTabs(t *testing.T) { if strings.ContainsRune(New(cli.NewMockUi(), nil).Help(), '\t') { t.Fatal("help has tabs") } @@ -63,6 +62,16 @@ func TestDebugCommand(t *testing.T) { require.Equal(t, 0, code) require.Equal(t, "", ui.ErrorWriter.String()) + expected := fs.Expected(t, + fs.WithDir("debug", + fs.WithFile("agent.json", "", fs.MatchAnyFileContent), + fs.WithFile("host.json", "", fs.MatchAnyFileContent), + fs.WithFile("index.json", "", fs.MatchAnyFileContent), + fs.WithFile("members.json", "", fs.MatchAnyFileContent), + // TODO: make the sub-directory names predictable) + fs.MatchExtraFiles)) + assert.Assert(t, fs.Equal(testDir, expected)) + metricsFiles, err := filepath.Glob(fmt.Sprintf("%s/*/%s", outputPath, "metrics.json")) require.NoError(t, err) require.Len(t, metricsFiles, 1) @@ -127,15 +136,10 @@ func TestDebugCommand_Archive(t *testing.T) { } func TestDebugCommand_ArgsBad(t *testing.T) { - t.Parallel() - ui := cli.NewMockUi() cmd := New(ui, nil) - args := []string{ - "foo", - "bad", - } + args := []string{"foo", "bad"} if code := cmd.Run(args); code == 0 { t.Fatalf("should exit non-zero, got code: %d", code) @@ -518,65 +522,44 @@ func TestDebugCommand_ProfilesExist(t *testing.T) { } } -func TestDebugCommand_ValidateTiming(t *testing.T) { - if testing.Short() { - t.Skip("too slow for testing.Short") - } - +func TestDebugCommand_Prepare_ValidateTiming(t *testing.T) { cases := map[string]struct { duration string interval string - output string - code int + expected string }{ "both": { - "20ms", - "10ms", - "duration must be longer", - 1, + duration: "20ms", + interval: "10ms", + expected: "duration must be longer", }, "short interval": { - "10s", - "10ms", - "interval must be longer", - 1, + duration: "10s", + interval: "10ms", + expected: "interval must be longer", }, "lower duration": { - "20s", - "30s", - "must be longer than interval", - 1, + duration: "20s", + interval: "30s", + expected: "must be longer than interval", }, } for name, tc := range cases { - // Because we're only testng validation, we want to shut down - // the valid duration test to avoid hanging - shutdownCh := make(chan struct{}) + t.Run(name, func(t *testing.T) { + ui := cli.NewMockUi() + cmd := New(ui, nil) - a := agent.NewTestAgent(t, "") - defer a.Shutdown() - testrpc.WaitForLeader(t, a.RPC, "dc1") + args := []string{ + "-duration=" + tc.duration, + "-interval=" + tc.interval, + } + err := cmd.flags.Parse(args) + require.NoError(t, err) - ui := cli.NewMockUi() - cmd := New(ui, shutdownCh) - - args := []string{ - "-http-addr=" + a.HTTPAddr(), - "-duration=" + tc.duration, - "-interval=" + tc.interval, - "-capture=agent", - } - code := cmd.Run(args) - - if code != tc.code { - t.Errorf("%s: should exit %d, got code: %d", name, tc.code, code) - } - - errOutput := ui.ErrorWriter.String() - if !strings.Contains(errOutput, tc.output) { - t.Errorf("%s: expected error output '%s', got '%q'", name, tc.output, errOutput) - } + _, err = cmd.prepare() + testutil.RequireErrorContains(t, err, tc.expected) + }) } } diff --git a/go.mod b/go.mod index 9c7bb865f3..b2531f76e5 100644 --- a/go.mod +++ b/go.mod @@ -92,6 +92,7 @@ require ( google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 google.golang.org/grpc v1.25.1 gopkg.in/square/go-jose.v2 v2.5.1 + gotest.tools/v3 v3.0.3 k8s.io/api v0.16.9 k8s.io/apimachinery v0.16.9 k8s.io/client-go v0.16.9 diff --git a/go.sum b/go.sum index 35862eacef..c8c2ff4fc4 100644 --- a/go.sum +++ b/go.sum @@ -652,6 +652,7 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -710,6 +711,8 @@ gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=