diff --git a/pkg/expect/expect.go b/pkg/expect/expect.go index b7e2978af5c2..088bb916bfbc 100644 --- a/pkg/expect/expect.go +++ b/pkg/expect/expect.go @@ -23,6 +23,7 @@ import ( "io" "os" "os/exec" + "regexp" "strings" "sync" "syscall" @@ -224,7 +225,23 @@ func (ep *ExpectProcess) ExpectFunc(ctx context.Context, f func(string) bool) (s // ExpectWithContext returns the first line containing the given string. func (ep *ExpectProcess) ExpectWithContext(ctx context.Context, s string) (string, error) { - return ep.ExpectFunc(ctx, func(txt string) bool { return strings.Contains(txt, s) }) + return ep.ExpectFunc(ctx, func(txt string) bool { + if strings.Contains(txt, s) { + return true + } + + if strings.HasPrefix(s, "EXPR") { + s = s[4:] + } else { + return false + } + + r, err := regexp.Compile(s) + if err != nil { + return false + } + return r.MatchString(txt) + }) } // Expect returns the first line containing the given string. diff --git a/tests/e2e/v3_curl_test.go b/tests/e2e/v3_curl_test.go index ddd1da103dcd..3e0d383d223a 100644 --- a/tests/e2e/v3_curl_test.go +++ b/tests/e2e/v3_curl_test.go @@ -180,7 +180,7 @@ func testV3CurlTxn(cx ctlCtx) { if jerr != nil { cx.t.Fatal(jerr) } - expected := `"succeeded":true,"responses":[{"response_put":{"header":{"revision":"2"}}}]` + expected := `EXPR.*"succeeded":true,\s*"responses":\[{"response_put":{"header":{"revision":"2"}}}].*` p := cx.apiPrefix if err := e2e.CURLPost(cx.epc, e2e.CURLReq{Endpoint: path.Join(p, "/kv/txn"), Value: string(jsonDat), Expected: expected}); err != nil { cx.t.Fatalf("failed testV3CurlTxn txn with curl using prefix (%s) (%v)", p, err) @@ -188,7 +188,7 @@ func testV3CurlTxn(cx ctlCtx) { // was crashing etcd server malformed := `{"compare":[{"result":0,"target":1,"key":"Zm9v","TargetUnion":null}],"success":[{"Request":{"RequestPut":{"key":"Zm9v","value":"YmFy"}}}]}` - if err := e2e.CURLPost(cx.epc, e2e.CURLReq{Endpoint: path.Join(p, "/kv/txn"), Value: malformed, Expected: `"code":3,"message":"etcdserver: key not found"`}); err != nil { + if err := e2e.CURLPost(cx.epc, e2e.CURLReq{Endpoint: path.Join(p, "/kv/txn"), Value: malformed, Expected: `EXPR.*"code":3,\s*"message":"etcdserver: key not found".*`}); err != nil { cx.t.Fatalf("failed testV3CurlTxn put with curl using prefix (%s) (%v)", p, err) }