Skip to content

Commit

Permalink
coverage: remove duplicates from coverage report
Browse files Browse the repository at this point in the history
Fixes open-policy-agent#4393

Signed-off-by: Anders Eknert <anders@eknert.com>
  • Loading branch information
anderseknert committed Mar 4, 2022
1 parent 2c166fe commit 076c528
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 3 deletions.
8 changes: 5 additions & 3 deletions cover/cover.go
Expand Up @@ -232,7 +232,7 @@ func (r Report) IsCovered(file string, row int) bool {
}

// CoverageThresholdError represents an error raised when the global
// code coverage percenta is lower than the specified threshold.
// code coverage percentage is lower than the specified threshold.
type CoverageThresholdError struct {
Coverage float64
Threshold float64
Expand All @@ -252,9 +252,11 @@ func sortedPositionSliceToRangeSlice(sorted []Position) (result []Range) {
start, end := sorted[0], sorted[0]
for i := 1; i < len(sorted); i++ {
curr := sorted[i]
if curr.Row == end.Row+1 {
switch {
case curr.Row == end.Row: // skip
case curr.Row == end.Row+1:
end = curr
} else {
default:
result = append(result, Range{start, end})
start, end = curr, curr
}
Expand Down
93 changes: 93 additions & 0 deletions cover/cover_test.go
Expand Up @@ -139,6 +139,99 @@ p {
}
}

func TestCoverNoDuplicates(t *testing.T) {

cover := New()

module := `package test
# Both a rule and an expression, but should not be counted twice
foo := 1
allow { true }
`

parsedModule, err := ast.ParseModule("test.rego", module)
if err != nil {
t.Fatal(err)
}

eval := rego.New(
rego.Module("test.rego", module),
rego.Query("data.test.allow"),
rego.QueryTracer(cover),
)

ctx := context.Background()
_, err = eval.Eval(ctx)

if err != nil {
t.Fatal(err)
}

report := cover.Report(map[string]*ast.Module{
"test.rego": parsedModule,
})

fr, ok := report.Files["test.rego"]
if !ok {
t.Fatal("Expected file report for test.rego")
}

expectedCovered := []Position{
{6}, // allow
}

expectedNotCovered := []Position{
{4}, // foo
}

for _, exp := range expectedCovered {
if !fr.IsCovered(exp.Row) {
t.Errorf("Expected %v to be covered", exp)
}
}

for _, exp := range expectedNotCovered {
if !fr.IsNotCovered(exp.Row) {
t.Errorf("Expected %v to NOT be covered", exp)
}
}

if len(expectedCovered) != fr.locCovered() {
t.Errorf(
"Expected %d loc to be covered, got %d instead",
len(expectedCovered),
fr.locCovered())
}

if len(expectedNotCovered) != fr.locNotCovered() {
t.Errorf(
"Expected %d loc to not be covered, got %d instead",
len(expectedNotCovered),
fr.locNotCovered())
}

expectedCoveragePercentage := round(100.0*float64(len(expectedCovered))/float64(len(expectedCovered)+len(expectedNotCovered)), 2)
if expectedCoveragePercentage != fr.Coverage {
t.Errorf("Expected coverage %f != %f", expectedCoveragePercentage, fr.Coverage)
}

if expectedCoveragePercentage != report.Coverage {
t.Errorf("Expected report coverage %f != %f",
expectedCoveragePercentage,
report.Coverage)
}

if t.Failed() {
bs, err := json.MarshalIndent(fr, "", " ")
if err != nil {
t.Fatal(err)
}
fmt.Println(string(bs))
}
}

func TestCoverTraceConfig(t *testing.T) {
ct := topdown.QueryTracer(New())
conf := ct.Config()
Expand Down

0 comments on commit 076c528

Please sign in to comment.