mirror of https://github.com/status-im/consul.git
debug: improve a couple of the test cases
Use gotest.tools/v3/fs to make better assertions about the files Remove the TestAgent from TestDebugCommand_Prepare_ValidateTiming, since we can test that validation without making any API calls.
This commit is contained in:
parent
bbf6a94c9a
commit
31bcd80528
|
@ -14,19 +14,18 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/pprof/profile"
|
||||||
"github.com/mitchellh/cli"
|
"github.com/mitchellh/cli"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
"gotest.tools/v3/assert"
|
||||||
"github.com/google/pprof/profile"
|
"gotest.tools/v3/fs"
|
||||||
|
|
||||||
"github.com/hashicorp/consul/agent"
|
"github.com/hashicorp/consul/agent"
|
||||||
"github.com/hashicorp/consul/sdk/testutil"
|
"github.com/hashicorp/consul/sdk/testutil"
|
||||||
"github.com/hashicorp/consul/testrpc"
|
"github.com/hashicorp/consul/testrpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDebugCommand_noTabs(t *testing.T) {
|
func TestDebugCommand_Help_TextContainsNoTabs(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
if strings.ContainsRune(New(cli.NewMockUi(), nil).Help(), '\t') {
|
if strings.ContainsRune(New(cli.NewMockUi(), nil).Help(), '\t') {
|
||||||
t.Fatal("help has tabs")
|
t.Fatal("help has tabs")
|
||||||
}
|
}
|
||||||
|
@ -63,6 +62,16 @@ func TestDebugCommand(t *testing.T) {
|
||||||
require.Equal(t, 0, code)
|
require.Equal(t, 0, code)
|
||||||
require.Equal(t, "", ui.ErrorWriter.String())
|
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"))
|
metricsFiles, err := filepath.Glob(fmt.Sprintf("%s/*/%s", outputPath, "metrics.json"))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Len(t, metricsFiles, 1)
|
require.Len(t, metricsFiles, 1)
|
||||||
|
@ -127,15 +136,10 @@ func TestDebugCommand_Archive(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDebugCommand_ArgsBad(t *testing.T) {
|
func TestDebugCommand_ArgsBad(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
ui := cli.NewMockUi()
|
||||||
cmd := New(ui, nil)
|
cmd := New(ui, nil)
|
||||||
|
|
||||||
args := []string{
|
args := []string{"foo", "bad"}
|
||||||
"foo",
|
|
||||||
"bad",
|
|
||||||
}
|
|
||||||
|
|
||||||
if code := cmd.Run(args); code == 0 {
|
if code := cmd.Run(args); code == 0 {
|
||||||
t.Fatalf("should exit non-zero, got code: %d", code)
|
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) {
|
func TestDebugCommand_Prepare_ValidateTiming(t *testing.T) {
|
||||||
if testing.Short() {
|
|
||||||
t.Skip("too slow for testing.Short")
|
|
||||||
}
|
|
||||||
|
|
||||||
cases := map[string]struct {
|
cases := map[string]struct {
|
||||||
duration string
|
duration string
|
||||||
interval string
|
interval string
|
||||||
output string
|
expected string
|
||||||
code int
|
|
||||||
}{
|
}{
|
||||||
"both": {
|
"both": {
|
||||||
"20ms",
|
duration: "20ms",
|
||||||
"10ms",
|
interval: "10ms",
|
||||||
"duration must be longer",
|
expected: "duration must be longer",
|
||||||
1,
|
|
||||||
},
|
},
|
||||||
"short interval": {
|
"short interval": {
|
||||||
"10s",
|
duration: "10s",
|
||||||
"10ms",
|
interval: "10ms",
|
||||||
"interval must be longer",
|
expected: "interval must be longer",
|
||||||
1,
|
|
||||||
},
|
},
|
||||||
"lower duration": {
|
"lower duration": {
|
||||||
"20s",
|
duration: "20s",
|
||||||
"30s",
|
interval: "30s",
|
||||||
"must be longer than interval",
|
expected: "must be longer than interval",
|
||||||
1,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, tc := range cases {
|
for name, tc := range cases {
|
||||||
// Because we're only testng validation, we want to shut down
|
t.Run(name, func(t *testing.T) {
|
||||||
// the valid duration test to avoid hanging
|
ui := cli.NewMockUi()
|
||||||
shutdownCh := make(chan struct{})
|
cmd := New(ui, nil)
|
||||||
|
|
||||||
a := agent.NewTestAgent(t, "")
|
args := []string{
|
||||||
defer a.Shutdown()
|
"-duration=" + tc.duration,
|
||||||
testrpc.WaitForLeader(t, a.RPC, "dc1")
|
"-interval=" + tc.interval,
|
||||||
|
}
|
||||||
|
err := cmd.flags.Parse(args)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
ui := cli.NewMockUi()
|
_, err = cmd.prepare()
|
||||||
cmd := New(ui, shutdownCh)
|
testutil.RequireErrorContains(t, err, tc.expected)
|
||||||
|
})
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
go.mod
1
go.mod
|
@ -92,6 +92,7 @@ require (
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55
|
||||||
google.golang.org/grpc v1.25.1
|
google.golang.org/grpc v1.25.1
|
||||||
gopkg.in/square/go-jose.v2 v2.5.1
|
gopkg.in/square/go-jose.v2 v2.5.1
|
||||||
|
gotest.tools/v3 v3.0.3
|
||||||
k8s.io/api v0.16.9
|
k8s.io/api v0.16.9
|
||||||
k8s.io/apimachinery v0.16.9
|
k8s.io/apimachinery v0.16.9
|
||||||
k8s.io/client-go v0.16.9
|
k8s.io/client-go v0.16.9
|
||||||
|
|
3
go.sum
3
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-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-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-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-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-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/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.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 h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
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-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-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
|
Loading…
Reference in New Issue