Skip to content

Commit efba831

Browse files
CEL Dev Teamcopybara-github
authored andcommitted
Fix context propagation in AsyncProgramImpl to preserve resolved attributes.
PiperOrigin-RevId: 854258691
1 parent f7b9112 commit efba831

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

runtime/src/main/java/dev/cel/runtime/async/AsyncProgramImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ private ListenableFuture<Object> evalPass(
160160
new CelEvaluationException("Max Evaluation iterations exceeded: " + iteration));
161161
}
162162
return resolveAndReevaluate(
163-
(CelUnknownSet) result, startingUnknownContext, resolvableAttributePatterns, iteration);
163+
(CelUnknownSet) result, ctx, resolvableAttributePatterns, iteration);
164164
}
165165

166166
return immediateFuture(result);

runtime/src/test/java/dev/cel/runtime/async/CelAsyncRuntimeImplTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,56 @@ public void asyncProgram_basicUnknownResolution() throws Exception {
103103
assertThat(result).isEqualTo(true);
104104
}
105105

106+
@Test
107+
public void asyncProgram_sequentialUnknownResolution() throws Exception {
108+
// Arrange
109+
CelUnknownAttributeValueResolver resolveName =
110+
CelUnknownAttributeValueResolver.fromResolver(
111+
(attr) -> {
112+
Thread.sleep(500);
113+
return attr.toString();
114+
});
115+
Cel cel =
116+
CelFactory.standardCelBuilder()
117+
.setOptions(CelOptions.current().enableUnknownTracking(true).build())
118+
.addMessageTypes(TestAllTypes.getDescriptor())
119+
.addVar("com.google.var1", SimpleType.BOOL)
120+
.addVar("com.google.var2", SimpleType.STRING)
121+
.addVar("com.google.var3", SimpleType.STRING)
122+
.setResultType(SimpleType.STRING)
123+
.setContainer(CelContainer.ofName("com.google"))
124+
.build();
125+
126+
CelAsyncRuntime asyncRuntime =
127+
CelAsyncRuntimeFactory.defaultAsyncRuntime()
128+
.setRuntime(cel)
129+
.setExecutorService(newDirectExecutorService())
130+
.build();
131+
132+
CelAbstractSyntaxTree ast =
133+
cel.compile(
134+
"var1 ? var2 : var3")
135+
.getAst();
136+
137+
AsyncProgram program = asyncRuntime.createProgram(ast);
138+
139+
// Act
140+
ListenableFuture<Object> future =
141+
program.evaluateToCompletion(
142+
CelResolvableAttributePattern.of(
143+
CelAttributePattern.fromQualifiedIdentifier("com.google.var1"),
144+
CelUnknownAttributeValueResolver.fromResolver(unused -> true)),
145+
CelResolvableAttributePattern.of(
146+
CelAttributePattern.fromQualifiedIdentifier("com.google.var2"), resolveName),
147+
CelResolvableAttributePattern.of(
148+
CelAttributePattern.fromQualifiedIdentifier("com.google.var3"), resolveName));
149+
Object result = future.get(2, SECONDS);
150+
151+
// Assert
152+
assertThat(result).isInstanceOf(String.class);
153+
assertThat(result).isEqualTo("com.google.var2");
154+
}
155+
106156
@Test
107157
public void asyncProgram_basicAsyncResolver() throws Exception {
108158
// Arrange

0 commit comments

Comments
 (0)