Skip to content

Commit 1585ccf

Browse files
ChinmayMadeshicopybara-github
authored andcommitted
Internal Changes
PiperOrigin-RevId: 808545608
1 parent e93d92b commit 1585ccf

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

testing/src/main/java/dev/cel/testing/testrunner/CelCoverageIndex.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,19 @@ final class CelCoverageIndex {
6161
new ConcurrentHashMap<>();
6262

6363
public void init(CelAbstractSyntaxTree ast) {
64-
this.ast = ast;
65-
CelNavigableExpr.fromExpr(ast.getExpr())
66-
.allNodes()
67-
.forEach(
68-
celNavigableExpr -> {
69-
NodeCoverageStats nodeCoverageStats = new NodeCoverageStats();
70-
nodeCoverageStats.isBooleanNode.set(isNodeTypeBoolean(celNavigableExpr.expr()));
71-
nodeCoverageStatsMap.put(celNavigableExpr.id(), nodeCoverageStats);
72-
});
64+
// If the AST and node coverage stats map are already initialized, then we don't need to
65+
// re-initialize them.
66+
if (this.ast == null && nodeCoverageStatsMap.isEmpty()) {
67+
this.ast = ast;
68+
CelNavigableExpr.fromExpr(ast.getExpr())
69+
.allNodes()
70+
.forEach(
71+
celNavigableExpr -> {
72+
NodeCoverageStats nodeCoverageStats = new NodeCoverageStats();
73+
nodeCoverageStats.isBooleanNode.set(isNodeTypeBoolean(celNavigableExpr.expr()));
74+
nodeCoverageStatsMap.put(celNavigableExpr.id(), nodeCoverageStats);
75+
});
76+
}
7377
}
7478

7579
/**

testing/src/test/java/dev/cel/testing/testrunner/CelCoverageIndexTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,28 @@ public void getCoverageReport_fullCoverage_writesToUndeclaredOutputs() throws Ex
154154
String fileContent = Files.asCharSource(outputFile, UTF_8).read();
155155
assertThat(fileContent).isEqualTo(report.dotGraph());
156156
}
157+
158+
@Test
159+
public void getCoverageReport_fullCoverage_multipleEvaluations() throws Exception {
160+
Cel cel = CelFactory.standardCelBuilder().addVar("x", SimpleType.INT).build();
161+
CelAbstractSyntaxTree ast = cel.compile("x > 1").getAst();
162+
CelRuntime.Program program = cel.createProgram(ast);
163+
CelCoverageIndex coverageIndex = new CelCoverageIndex();
164+
coverageIndex.init(ast);
165+
CelEvaluationListener listener = coverageIndex.newEvaluationListener();
166+
167+
program.trace(ImmutableMap.of("x", 2L), listener);
168+
coverageIndex.init(ast); // Re-initialize the coverage index.
169+
program.trace(ImmutableMap.of("x", 0L), listener);
170+
171+
CoverageReport report = coverageIndex.generateCoverageReport();
172+
assertThat(report.nodes()).isGreaterThan(0);
173+
assertThat(report.coveredNodes()).isEqualTo(report.nodes());
174+
assertThat(report.branches()).isEqualTo(2);
175+
// Despite re-initializing the coverage index now, the report should still
176+
// be fully covered. Else, only the second evaluation would've been covered.
177+
assertThat(report.coveredBooleanOutcomes()).isEqualTo(2);
178+
assertThat(report.unencounteredNodes()).isEmpty();
179+
assertThat(report.unencounteredBranches()).isEmpty();
180+
}
157181
}

0 commit comments

Comments
 (0)