Skip to content

Commit 60a017e

Browse files
committed
targeting key for remote evaluation
Signed-off-by: Kavindu Dodanduwa <[email protected]>
1 parent fa2e3d9 commit 60a017e

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

Diff for: providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/grpc/GrpcResolver.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ private <ValT, ReqT extends Message, ResT extends Message> ProviderEvaluation<Va
161161
// build the gRPC request
162162
Message req = request.newBuilderForType()
163163
.setField(getFieldDescriptor(request, FLAG_KEY_FIELD), key)
164-
.setField(getFieldDescriptor(request, CONTEXT_FIELD), this.convertContext(ctx))
164+
.setField(getFieldDescriptor(request, CONTEXT_FIELD), convertContext(ctx))
165165
.build();
166166

167167
final Message response;
@@ -216,7 +216,12 @@ private static Value convertObjectResponse(Struct protobuf) {
216216
* Recursively convert the Evaluation context to a protobuf structure.
217217
*/
218218
private static Struct convertContext(EvaluationContext ctx) {
219-
return convertMap(ctx.asMap()).getStructValue();
219+
Map<String, Value> ctxMap = ctx.asMap();
220+
// asMap() does not provide explicitly set targeting key (ex:- new ImmutableContext("TargetingKey") ).
221+
// Hence, we add this explicitly here for targeting rule processing.
222+
ctxMap.put("targetingKey", new Value(ctx.getTargetingKey()));
223+
224+
return convertMap(ctxMap).getStructValue();
220225
}
221226

222227
/**

Diff for: providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdProviderTest.java

+21-14
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import io.grpc.Deadline;
3131
import org.junit.jupiter.api.BeforeAll;
3232
import org.junit.jupiter.api.Test;
33+
import org.mockito.ArgumentMatcher;
3334
import org.mockito.MockedStatic;
3435

3536
import java.lang.reflect.Field;
@@ -303,7 +304,6 @@ void resolvers_should_not_cache_responses_if_event_stream_not_alive() {
303304

304305
@Test
305306
void context_is_parsed_and_passed_to_grpc_service() {
306-
307307
final String BOOLEAN_ATTR_KEY = "bool-attr";
308308
final String INT_ATTR_KEY = "int-attr";
309309
final String STRING_ATTR_KEY = "string-attr";
@@ -313,9 +313,9 @@ void context_is_parsed_and_passed_to_grpc_service() {
313313
final String STRUCT_ATTR_INNER_KEY = "struct-inner-key";
314314

315315
final Boolean BOOLEAN_ATTR_VALUE = true;
316-
final Integer INT_ATTR_VALUE = 1;
316+
final int INT_ATTR_VALUE = 1;
317317
final String STRING_ATTR_VALUE = "str";
318-
final Double DOUBLE_ATTR_VALUE = 0.5d;
318+
final double DOUBLE_ATTR_VALUE = 0.5d;
319319
final List<Value> LIST_ATTR_VALUE = new ArrayList<Value>() {
320320
{
321321
add(new Value(1));
@@ -335,23 +335,30 @@ void context_is_parsed_and_passed_to_grpc_service() {
335335
when(serviceBlockingStubMock.withDeadlineAfter(anyLong(), any(TimeUnit.class)))
336336
.thenReturn(serviceBlockingStubMock);
337337
when(serviceBlockingStubMock.resolveBoolean(argThat(
338-
x -> STRING_ATTR_VALUE.equals(x.getContext().getFieldsMap().get(STRING_ATTR_KEY).getStringValue())
339-
&& INT_ATTR_VALUE == x.getContext().getFieldsMap().get(INT_ATTR_KEY).getNumberValue()
340-
&& DOUBLE_ATTR_VALUE == x.getContext().getFieldsMap().get(DOUBLE_ATTR_KEY).getNumberValue()
341-
&& LIST_ATTR_VALUE.get(0).asInteger() == x.getContext().getFieldsMap()
342-
.get(LIST_ATTR_KEY).getListValue().getValuesList().get(0).getNumberValue()
343-
&& x.getContext().getFieldsMap().get(BOOLEAN_ATTR_KEY).getBoolValue()
344-
&& STRUCT_ATTR_INNER_VALUE.equals(x.getContext().getFieldsMap()
345-
.get(STRUCT_ATTR_KEY).getStructValue().getFieldsMap().get(STRUCT_ATTR_INNER_KEY)
346-
.getStringValue()))))
347-
.thenReturn(booleanResponse);
338+
x -> {
339+
final Struct struct = x.getContext();
340+
final Map<String, com.google.protobuf.Value> valueMap = struct.getFieldsMap();
341+
342+
return STRING_ATTR_VALUE.equals(valueMap.get(STRING_ATTR_KEY).getStringValue())
343+
&& INT_ATTR_VALUE == valueMap.get(INT_ATTR_KEY).getNumberValue()
344+
&& DOUBLE_ATTR_VALUE == valueMap.get(DOUBLE_ATTR_KEY).getNumberValue()
345+
&& valueMap.get(BOOLEAN_ATTR_KEY).getBoolValue()
346+
&& "MY_TARGETING_KEY".equals(valueMap.get("targetingKey").getStringValue())
347+
&& LIST_ATTR_VALUE.get(0).asInteger() ==
348+
valueMap.get(LIST_ATTR_KEY).getListValue().getValuesList().get(0).getNumberValue()
349+
&& STRUCT_ATTR_INNER_VALUE.equals(
350+
valueMap.get(STRUCT_ATTR_KEY).getStructValue().getFieldsMap()
351+
.get(STRUCT_ATTR_INNER_KEY).getStringValue());
352+
}
353+
))
354+
).thenReturn(booleanResponse);
348355

349356
GrpcConnector grpc = mock(GrpcConnector.class);
350357
when(grpc.getResolver()).thenReturn(serviceBlockingStubMock);
351358

352359
OpenFeatureAPI.getInstance().setProvider(createProvider(grpc));
353360

354-
MutableContext context = new MutableContext();
361+
final MutableContext context = new MutableContext("MY_TARGETING_KEY");
355362
context.add(BOOLEAN_ATTR_KEY, BOOLEAN_ATTR_VALUE);
356363
context.add(INT_ATTR_KEY, INT_ATTR_VALUE);
357364
context.add(DOUBLE_ATTR_KEY, DOUBLE_ATTR_VALUE);

0 commit comments

Comments
 (0)