From 27793412509b4600c2142d560f0a028699aea8f5 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Thu, 7 Apr 2016 10:28:03 -0700 Subject: [PATCH] e2e: clean up, return all lines in error 1. change file names 2. now if sub-command errors, the test will receive all lines from stdout and stderr. Expected output: ``` read /dev/ptmx: input/output error (expected key2, got ["key1\r\n" "val1\r\n" ""]) ``` 3. change how we check GRPC timeout (only bypass timeout error when we give 0 timeout) --- e2e/{etcdctl_test.go => ctl_v2_test.go} | 0 e2e/{etcdctlv3_test.go => ctl_v3_test.go} | 27 +++++++++++++---------- e2e/etcd_test.go | 24 +++++++++++++++----- 3 files changed, 34 insertions(+), 17 deletions(-) rename e2e/{etcdctl_test.go => ctl_v2_test.go} (100%) rename e2e/{etcdctlv3_test.go => ctl_v3_test.go} (94%) diff --git a/e2e/etcdctl_test.go b/e2e/ctl_v2_test.go similarity index 100% rename from e2e/etcdctl_test.go rename to e2e/ctl_v2_test.go diff --git a/e2e/etcdctlv3_test.go b/e2e/ctl_v3_test.go similarity index 94% rename from e2e/etcdctlv3_test.go rename to e2e/ctl_v3_test.go index 96ed5b6a7..2a9a60660 100644 --- a/e2e/etcdctlv3_test.go +++ b/e2e/ctl_v3_test.go @@ -170,13 +170,13 @@ func putTest(cx ctlCtx) { key, value := "foo", "bar" - if err := ctlV3Put(cx, key, value); err != nil { - if cx.dialTimeout > 0 && isGRPCTimedout(err) { + if err := ctlV3Put(cx, key, value, ""); err != nil { + if cx.dialTimeout > 0 && !isGRPCTimedout(err) { cx.t.Fatalf("putTest ctlV3Put error (%v)", err) } } if err := ctlV3Get(cx, []string{key}, kv{key, value}); err != nil { - if cx.dialTimeout > 0 && isGRPCTimedout(err) { + if cx.dialTimeout > 0 && !isGRPCTimedout(err) { cx.t.Fatalf("putTest ctlV3Get error (%v)", err) } } @@ -205,13 +205,13 @@ func getTest(cx ctlCtx) { } for i := range kvs { - if err := ctlV3Put(cx, kvs[i].key, kvs[i].val); err != nil { + if err := ctlV3Put(cx, kvs[i].key, kvs[i].val, ""); err != nil { cx.t.Fatalf("getTest #%d: ctlV3Put error (%v)", i, err) } } for i, tt := range tests { if err := ctlV3Get(cx, tt.args, tt.wkv...); err != nil { - if cx.dialTimeout > 0 && isGRPCTimedout(err) { + if cx.dialTimeout > 0 && !isGRPCTimedout(err) { cx.t.Errorf("getTest #%d: ctlV3Get error (%v)", i, err) } } @@ -246,12 +246,12 @@ func delTest(cx ctlCtx) { for i, tt := range tests { for j := range tt.puts { - if err := ctlV3Put(cx, tt.puts[j].key, tt.puts[j].val); err != nil { + if err := ctlV3Put(cx, tt.puts[j].key, tt.puts[j].val, ""); err != nil { cx.t.Fatalf("delTest #%d-%d: ctlV3Put error (%v)", i, j, err) } } if err := ctlV3Del(cx, tt.args, tt.deletedNum); err != nil { - if cx.dialTimeout > 0 && isGRPCTimedout(err) { + if cx.dialTimeout > 0 && !isGRPCTimedout(err) { cx.t.Fatalf("delTest #%d: ctlV3Del error (%v)", i, err) } } @@ -287,13 +287,13 @@ func watchTest(cx ctlCtx) { for i, tt := range tests { go func() { for j := range tt.puts { - if err := ctlV3Put(cx, tt.puts[j].key, tt.puts[j].val); err != nil { + if err := ctlV3Put(cx, tt.puts[j].key, tt.puts[j].val, ""); err != nil { cx.t.Fatalf("watchTest #%d-%d: ctlV3Put error (%v)", i, j, err) } } }() if err := ctlV3Watch(cx, tt.args, tt.wkv...); err != nil { - if cx.dialTimeout > 0 && isGRPCTimedout(err) { + if cx.dialTimeout > 0 && !isGRPCTimedout(err) { cx.t.Errorf("watchTest #%d: ctlV3Watch error (%v)", i, err) } } @@ -319,10 +319,10 @@ func epHealthTest(cx ctlCtx) { func txnTestSuccess(cx ctlCtx) { defer close(cx.errc) - if err := ctlV3Put(cx, "key1", "value1"); err != nil { + if err := ctlV3Put(cx, "key1", "value1", ""); err != nil { cx.t.Fatalf("txnTestSuccess ctlV3Put error (%v)", err) } - if err := ctlV3Put(cx, "key2", "value2"); err != nil { + if err := ctlV3Put(cx, "key2", "value2", ""); err != nil { cx.t.Fatalf("txnTestSuccess ctlV3Put error (%v)", err) } @@ -371,8 +371,11 @@ func ctlV3PrefixArgs(clus *etcdProcessCluster, dialTimeout time.Duration) []stri return cmdArgs } -func ctlV3Put(cx ctlCtx, key, value string) error { +func ctlV3Put(cx ctlCtx, key, value, leaseID string) error { cmdArgs := append(ctlV3PrefixArgs(cx.epc, cx.dialTimeout), "put", key, value) + if leaseID != "" { + cmdArgs = append(cmdArgs, "--lease", leaseID) + } return spawnWithExpect(cmdArgs, "OK") } diff --git a/e2e/etcd_test.go b/e2e/etcd_test.go index d49fe7071..5eb57eaa6 100644 --- a/e2e/etcd_test.go +++ b/e2e/etcd_test.go @@ -416,8 +416,7 @@ func (epc *etcdProcessCluster) Close() (err error) { } func spawnCmd(args []string) (*expect.ExpectProcess, error) { - // redirect stderr to stdout since expect only uses stdout - cmdargs := append([]string{"-c"}, strings.Join(append(args, "2>&1"), " ")) + cmdargs := append([]string{"-c"}, strings.Join(args, " ")) return expect.NewExpect("/bin/sh", cmdargs...) } @@ -430,16 +429,31 @@ func spawnWithExpects(args []string, xs ...string) error { if err != nil { return err } + // process until either stdout or stderr contains + // the expected string + var ( + lines []string + lineFunc = func(txt string) bool { return true } + ) for _, txt := range xs { - _, err = proc.Expect(txt) - if err != nil { - return err + for { + l, err := proc.ExpectFunc(lineFunc) + if err != nil { + return fmt.Errorf("%v (expected %s, got %q)", err, txt, lines) + } + lines = append(lines, l) + if strings.Contains(l, txt) { + break + } } } perr := proc.Close() if err != nil { return err } + if len(xs) == 0 && proc.LineCount() != 0 { // expect no output + return fmt.Errorf("unexpected output (got lines %q, line count %d)", lines, proc.LineCount()) + } return perr }