-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
cmd/test: Default
-v
traces show notes and fails
The default value for `--explain` was used when `--verbose`/`-v` was specified. Now if only a verbose flag is specified we will show both "fails" and "notes", which is most likely what someone would want when troubleshooting some test failure. Fixes: #2068 Signed-off-by: Patrick East <east.patrick@gmail.com>
- Loading branch information
1 parent
2d22309
commit e3c6240
Showing
3 changed files
with
240 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,192 @@ | ||
package cmd | ||
|
||
import ( | ||
"bytes" | ||
"context" | ||
"testing" | ||
|
||
"github.com/open-policy-agent/opa/rego" | ||
"github.com/open-policy-agent/opa/topdown" | ||
) | ||
|
||
func TestFilterTraceDefault(t *testing.T) { | ||
p := newTestCommandParams() | ||
p.verbose = false | ||
expected := `Enter data.testing.test_p = _ | ||
| Enter data.testing.test_p | ||
| | Enter data.testing.p | ||
| | | Enter data.testing.q | ||
| | | | Enter data.testing.r | ||
| | | | | Fail x = data.x | ||
| | | | Fail data.testing.r[x] | ||
| | | Fail data.testing.q.foo | ||
| | Fail data.testing.p with data.x as "bar" | ||
| Fail data.testing.test_p = _ | ||
` | ||
verifyFilteredTrace(t, p, expected) | ||
} | ||
|
||
func TestFilterTraceVerbose(t *testing.T) { | ||
p := newTestCommandParams() | ||
p.verbose = true | ||
expected := `Enter data.testing.test_p = _ | ||
| Enter data.testing.test_p | ||
| | Enter data.testing.p | ||
| | | Note "test test" | ||
| | | Enter data.testing.q | ||
| | | | Note "got this far" | ||
| | | | Enter data.testing.r | ||
| | | | | Note "got this far2" | ||
| | | | | Fail x = data.x | ||
| | | | Fail data.testing.r[x] | ||
| | | Fail data.testing.q.foo | ||
| | Fail data.testing.p with data.x as "bar" | ||
| Fail data.testing.test_p = _ | ||
` | ||
verifyFilteredTrace(t, p, expected) | ||
} | ||
|
||
func TestFilterTraceExplainFails(t *testing.T) { | ||
p := newTestCommandParams() | ||
p.explain.Set(explainModeFails) | ||
expected := `Enter data.testing.test_p = _ | ||
| Enter data.testing.test_p | ||
| | Enter data.testing.p | ||
| | | Enter data.testing.q | ||
| | | | Enter data.testing.r | ||
| | | | | Fail x = data.x | ||
| | | | Fail data.testing.r[x] | ||
| | | Fail data.testing.q.foo | ||
| | Fail data.testing.p with data.x as "bar" | ||
| Fail data.testing.test_p = _ | ||
` | ||
verifyFilteredTrace(t, p, expected) | ||
} | ||
|
||
func TestFilterTraceExplainNotes(t *testing.T) { | ||
p := newTestCommandParams() | ||
p.explain.Set(explainModeNotes) | ||
expected := `Enter data.testing.test_p = _ | ||
| Enter data.testing.test_p | ||
| | Enter data.testing.p | ||
| | | Note "test test" | ||
| | | Enter data.testing.q | ||
| | | | Note "got this far" | ||
| | | | Enter data.testing.r | ||
| | | | | Note "got this far2" | ||
` | ||
verifyFilteredTrace(t, p, expected) | ||
} | ||
|
||
func TestFilterTraceExplainFull(t *testing.T) { | ||
p := newTestCommandParams() | ||
p.explain.Set(explainModeFull) | ||
expected := `Enter data.testing.test_p = _ | ||
| Eval data.testing.test_p = _ | ||
| Index data.testing.test_p = _ (matched 1 rule) | ||
| Enter data.testing.test_p | ||
| | Eval data.testing.p with data.x as "bar" | ||
| | Index data.testing.p with data.x as "bar" (matched 1 rule) | ||
| | Enter data.testing.p | ||
| | | Eval data.testing.x | ||
| | | Index data.testing.x (matched 1 rule) | ||
| | | Enter data.testing.x | ||
| | | | Eval data.testing.y | ||
| | | | Index data.testing.y (matched 1 rule) | ||
| | | | Enter data.testing.y | ||
| | | | | Eval true | ||
| | | | | Exit data.testing.y | ||
| | | | Exit data.testing.x | ||
| | | Eval trace("test test") | ||
| | | Note "test test" | ||
| | | Eval data.testing.q.foo | ||
| | | Index data.testing.q.foo (matched 1 rule) | ||
| | | Enter data.testing.q | ||
| | | | Eval trace("got this far") | ||
| | | | Note "got this far" | ||
| | | | Eval data.testing.r[x] | ||
| | | | Index data.testing.r[__local0__] (matched 1 rule) | ||
| | | | Enter data.testing.r | ||
| | | | | Eval trace("got this far2") | ||
| | | | | Note "got this far2" | ||
| | | | | Eval x = data.x | ||
| | | | | Fail x = data.x | ||
| | | | | Redo trace("got this far2") | ||
| | | | Fail data.testing.r[x] | ||
| | | | Redo trace("got this far") | ||
| | | Fail data.testing.q.foo | ||
| | | Redo trace("test test") | ||
| | | Redo data.testing.x | ||
| | | Redo data.testing.x | ||
| | | | Redo data.testing.y | ||
| | | | Redo data.testing.y | ||
| | | | | Redo true | ||
| | Fail data.testing.p with data.x as "bar" | ||
| Fail data.testing.test_p = _ | ||
` | ||
verifyFilteredTrace(t, p, expected) | ||
} | ||
|
||
func verifyFilteredTrace(t *testing.T, params *testCommandParams, expected string) { | ||
filtered := filterTrace(params, failTrace(t)) | ||
|
||
var buff bytes.Buffer | ||
topdown.PrettyTrace(&buff, filtered) | ||
actual := buff.String() | ||
|
||
if actual != expected { | ||
t.Fatalf("Expected:\n\n%s\n\nGot:\n\n%s\n\n", expected, actual) | ||
} | ||
} | ||
|
||
func failTrace(t *testing.T) []*topdown.Event { | ||
t.Helper() | ||
mod := ` | ||
package testing | ||
p { | ||
x # Always true | ||
trace("test test") | ||
q["foo"] | ||
} | ||
x { | ||
y | ||
} | ||
y { | ||
true | ||
} | ||
q[x] { | ||
some x | ||
trace("got this far") | ||
r[x] | ||
trace("got this far1") | ||
} | ||
r[x] { | ||
trace("got this far2") | ||
x := data.x | ||
} | ||
test_p { | ||
p with data.x as "bar" | ||
} | ||
` | ||
|
||
tracer := topdown.NewBufferTracer() | ||
|
||
_, err := rego.New( | ||
rego.Module("test.rego", mod), | ||
rego.Trace(true), | ||
rego.Tracer(tracer), | ||
rego.Query("data.testing.test_p"), | ||
).Eval(context.Background()) | ||
|
||
if err != nil { | ||
t.Fatalf("Unexpected error: %s", err) | ||
} | ||
|
||
return *tracer | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters