From 5349db8e2f7d366eeafc9956a7131ed16fc30e93 Mon Sep 17 00:00:00 2001 From: liran2000 Date: Tue, 25 Feb 2025 10:52:53 +0200 Subject: [PATCH 1/2] feat: add telemetry helper utils Signed-off-by: liran2000 --- .../dev/openfeature/sdk/EvaluationEvent.java | 31 +++ .../java/dev/openfeature/sdk/Telemetry.java | 93 +++++++ .../dev/openfeature/sdk/TelemetryTest.java | 235 ++++++++++++++++++ 3 files changed, 359 insertions(+) create mode 100644 src/main/java/dev/openfeature/sdk/EvaluationEvent.java create mode 100644 src/main/java/dev/openfeature/sdk/Telemetry.java create mode 100644 src/test/java/dev/openfeature/sdk/TelemetryTest.java diff --git a/src/main/java/dev/openfeature/sdk/EvaluationEvent.java b/src/main/java/dev/openfeature/sdk/EvaluationEvent.java new file mode 100644 index 000000000..09a3bb680 --- /dev/null +++ b/src/main/java/dev/openfeature/sdk/EvaluationEvent.java @@ -0,0 +1,31 @@ +package dev.openfeature.sdk; + +import java.util.HashMap; +import java.util.Map; +import lombok.Builder; +import lombok.Getter; +import lombok.Singular; + +/** + * Represents an evaluation event. + */ +@Builder +@Getter +public class EvaluationEvent { + + private String name; + + @Singular("attribute") + private Map attributes; + + @Singular("bodyElement") + private Map body; + + public Map getAttributes() { + return new HashMap<>(attributes); + } + + public Map getBody() { + return new HashMap<>(body); + } +} diff --git a/src/main/java/dev/openfeature/sdk/Telemetry.java b/src/main/java/dev/openfeature/sdk/Telemetry.java new file mode 100644 index 000000000..eb02749ad --- /dev/null +++ b/src/main/java/dev/openfeature/sdk/Telemetry.java @@ -0,0 +1,93 @@ +package dev.openfeature.sdk; + +/** + * The Telemetry class provides constants and methods for creating OpenTelemetry compliant + * evaluation events. + */ +public class Telemetry { + + /* + The OpenTelemetry compliant event attributes for flag evaluation. + Specification: https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-logs/ + */ + public static final String TELEMETRY_KEY = "feature_flag.key"; + public static final String TELEMETRY_ERROR_CODE = "error.type"; + public static final String TELEMETRY_VARIANT = "feature_flag.variant"; + public static final String TELEMETRY_CONTEXT_ID = "feature_flag.context.id"; + public static final String TELEMETRY_ERROR_MSG = "feature_flag.evaluation.error.message"; + public static final String TELEMETRY_REASON = "feature_flag.evaluation.reason"; + public static final String TELEMETRY_PROVIDER = "feature_flag.provider_name"; + public static final String TELEMETRY_FLAG_SET_ID = "feature_flag.set.id"; + public static final String TELEMETRY_VERSION = "feature_flag.version"; + + // Well-known flag metadata attributes for telemetry events. + // Specification: https://openfeature.dev/specification/appendix-d#flag-metadata + public static final String TELEMETRY_FLAG_META_CONTEXT_ID = "contextId"; + public static final String TELEMETRY_FLAG_META_FLAG_SET_ID = "flagSetId"; + public static final String TELEMETRY_FLAG_META_VERSION = "version"; + + // OpenTelemetry event body. + // Specification: https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-logs/ + public static final String TELEMETRY_BODY = "value"; + + public static final String FLAG_EVALUATION_EVENT_NAME = "feature_flag.evaluation"; + + /** + * Creates an EvaluationEvent using the provided HookContext and ProviderEvaluation. + * + * @param hookContext the context containing flag evaluation details + * @param providerEvaluation the evaluation result from the provider + * + * @return an EvaluationEvent populated with telemetry data + */ + public static EvaluationEvent createEvaluationEvent(HookContext hookContext, + ProviderEvaluation providerEvaluation) { + EvaluationEvent.EvaluationEventBuilder evaluationEventBuilder = EvaluationEvent.builder() + .name(FLAG_EVALUATION_EVENT_NAME) + .attribute(TELEMETRY_KEY, hookContext.getFlagKey()) + .attribute(TELEMETRY_PROVIDER, hookContext.getProviderMetadata().getName()); + + if (providerEvaluation.getReason() != null) { + evaluationEventBuilder.attribute(TELEMETRY_REASON, providerEvaluation.getReason().toLowerCase()); + } else { + evaluationEventBuilder.attribute(TELEMETRY_REASON, Reason.UNKNOWN.name().toLowerCase()); + } + + if (providerEvaluation.getVariant() != null) { + evaluationEventBuilder.attribute(TELEMETRY_VARIANT, providerEvaluation.getVariant()); + } else { + evaluationEventBuilder.bodyElement(TELEMETRY_BODY, providerEvaluation.getValue()); + } + + String contextId = providerEvaluation.getFlagMetadata().getString(TELEMETRY_FLAG_META_CONTEXT_ID); + if (contextId != null) { + evaluationEventBuilder.attribute(TELEMETRY_CONTEXT_ID, contextId); + } else { + evaluationEventBuilder.attribute(TELEMETRY_CONTEXT_ID, hookContext.getCtx().getTargetingKey()); + } + + String setID = providerEvaluation.getFlagMetadata().getString(TELEMETRY_FLAG_META_FLAG_SET_ID); + if (setID != null) { + evaluationEventBuilder.attribute(TELEMETRY_FLAG_SET_ID, setID); + } + + String version = providerEvaluation.getFlagMetadata().getString(TELEMETRY_FLAG_META_VERSION); + if (version != null) { + evaluationEventBuilder.attribute(TELEMETRY_VERSION, version); + } + + if (Reason.ERROR.name().equals(providerEvaluation.getReason())) { + if (providerEvaluation.getErrorCode() != null) { + evaluationEventBuilder.attribute(TELEMETRY_ERROR_CODE, providerEvaluation.getErrorCode()); + } else { + evaluationEventBuilder.attribute(TELEMETRY_ERROR_CODE, ErrorCode.GENERAL); + } + + if (providerEvaluation.getErrorMessage() != null) { + evaluationEventBuilder.attribute(TELEMETRY_ERROR_MSG, providerEvaluation.getErrorMessage()); + } + } + + return evaluationEventBuilder.build(); + } +} diff --git a/src/test/java/dev/openfeature/sdk/TelemetryTest.java b/src/test/java/dev/openfeature/sdk/TelemetryTest.java new file mode 100644 index 000000000..bda75af12 --- /dev/null +++ b/src/test/java/dev/openfeature/sdk/TelemetryTest.java @@ -0,0 +1,235 @@ +package dev.openfeature.sdk; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; + +public class TelemetryTest { + + @Test + public void testCreatesEvaluationEventWithMandatoryFields() { + // Arrange + String flagKey = "test-flag"; + String providerName = "test-provider"; + String reason = "static"; + + Metadata providerMetadata = mock(Metadata.class); + when(providerMetadata.getName()).thenReturn(providerName); + + HookContext hookContext = HookContext.builder() + .flagKey(flagKey) + .providerMetadata(providerMetadata) + .type(FlagValueType.BOOLEAN) + .defaultValue(false) + .ctx(new ImmutableContext()) + .build(); + + ProviderEvaluation evaluation = ProviderEvaluation.builder() + .reason(reason) + .value(true) + .build(); + + EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, evaluation); + + assertEquals(Telemetry.FLAG_EVALUATION_EVENT_NAME, event.getName()); + assertEquals(flagKey, event.getAttributes().get(Telemetry.TELEMETRY_KEY)); + assertEquals(providerName, event.getAttributes().get(Telemetry.TELEMETRY_PROVIDER)); + assertEquals(reason.toLowerCase(), event.getAttributes().get(Telemetry.TELEMETRY_REASON)); + } + + @Test + public void testHandlesNullReason() { + // Arrange + String flagKey = "test-flag"; + String providerName = "test-provider"; + + Metadata providerMetadata = mock(Metadata.class); + when(providerMetadata.getName()).thenReturn(providerName); + + HookContext hookContext = HookContext.builder() + .flagKey(flagKey) + .providerMetadata(providerMetadata) + .type(FlagValueType.BOOLEAN) + .defaultValue(false) + .ctx(new ImmutableContext()) + .build(); + + ProviderEvaluation evaluation = ProviderEvaluation.builder() + .reason(null) + .value(true) + .build(); + + EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, evaluation); + + assertEquals(Reason.UNKNOWN.name().toLowerCase(), event.getAttributes().get(Telemetry.TELEMETRY_REASON)); + } + + @Test + public void testSetsVariantAttributeWhenVariantExists() { + HookContext hookContext = HookContext.builder() + .flagKey("testFlag") + .type(FlagValueType.STRING) + .defaultValue("default") + .ctx(mock(EvaluationContext.class)) + .clientMetadata(mock(ClientMetadata.class)) + .providerMetadata(mock(Metadata.class)) + .build(); + + ProviderEvaluation providerEvaluation = ProviderEvaluation.builder() + .variant("testVariant") + .flagMetadata(ImmutableMetadata.builder().build()) + .build(); + + EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, providerEvaluation); + + assertEquals("testVariant", event.getAttributes().get(Telemetry.TELEMETRY_VARIANT)); + } + + @Test + public void test_sets_value_in_body_when_variant_is_null() { + HookContext hookContext = HookContext.builder() + .flagKey("testFlag") + .type(FlagValueType.STRING) + .defaultValue("default") + .ctx(mock(EvaluationContext.class)) + .clientMetadata(mock(ClientMetadata.class)) + .providerMetadata(mock(Metadata.class)) + .build(); + + ProviderEvaluation providerEvaluation = ProviderEvaluation.builder() + .value("testValue") + .flagMetadata(ImmutableMetadata.builder().build()) + .build(); + + EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, providerEvaluation); + + assertEquals("testValue", event.getBody().get(Telemetry.TELEMETRY_BODY)); + } + + @Test + public void testAllFieldsPopulated() { + EvaluationContext evaluationContext = mock(EvaluationContext.class); + when(evaluationContext.getTargetingKey()).thenReturn("realTargetingKey"); + + Metadata providerMetadata = mock(Metadata.class); + when(providerMetadata.getName()).thenReturn("realProviderName"); + + HookContext hookContext = HookContext.builder() + .flagKey("realFlag") + .type(FlagValueType.STRING) + .defaultValue("realDefault") + .ctx(evaluationContext) + .clientMetadata(mock(ClientMetadata.class)) + .providerMetadata(providerMetadata) + .build(); + + ProviderEvaluation providerEvaluation = ProviderEvaluation.builder() + .flagMetadata(ImmutableMetadata.builder() + .addString("contextId", "realContextId") + .addString("flagSetId", "realFlagSetId") + .addString("version", "realVersion") + .build()) + .reason(Reason.DEFAULT.name()) + .variant("realVariant") + .build(); + + EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, providerEvaluation); + + assertEquals("realFlag", event.getAttributes().get(Telemetry.TELEMETRY_KEY)); + assertEquals("realProviderName", event.getAttributes().get(Telemetry.TELEMETRY_PROVIDER)); + assertEquals("default", event.getAttributes().get(Telemetry.TELEMETRY_REASON)); + assertEquals("realContextId", event.getAttributes().get(Telemetry.TELEMETRY_CONTEXT_ID)); + assertEquals("realFlagSetId", event.getAttributes().get(Telemetry.TELEMETRY_FLAG_SET_ID)); + assertEquals("realVersion", event.getAttributes().get(Telemetry.TELEMETRY_VERSION)); + assertNull(event.getAttributes().get(Telemetry.TELEMETRY_ERROR_CODE)); + assertEquals("realVariant", event.getAttributes().get(Telemetry.TELEMETRY_VARIANT)); + + } + + @Test + public void testErrorEvaluation() { + EvaluationContext evaluationContext = mock(EvaluationContext.class); + when(evaluationContext.getTargetingKey()).thenReturn("realTargetingKey"); + + Metadata providerMetadata = mock(Metadata.class); + when(providerMetadata.getName()).thenReturn("realProviderName"); + + HookContext hookContext = HookContext.builder() + .flagKey("realFlag") + .type(FlagValueType.STRING) + .defaultValue("realDefault") + .ctx(evaluationContext) + .clientMetadata(mock(ClientMetadata.class)) + .providerMetadata(providerMetadata) + .build(); + + ProviderEvaluation providerEvaluation = ProviderEvaluation.builder() + .flagMetadata(ImmutableMetadata.builder() + .addString("contextId", "realContextId") + .addString("flagSetId", "realFlagSetId") + .addString("version", "realVersion") + .build()) + .reason(Reason.ERROR.name()) + .errorMessage("realErrorMessage") + .build(); + + EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, providerEvaluation); + + assertEquals("realFlag", event.getAttributes().get(Telemetry.TELEMETRY_KEY)); + assertEquals("realProviderName", event.getAttributes().get(Telemetry.TELEMETRY_PROVIDER)); + assertEquals("error", event.getAttributes().get(Telemetry.TELEMETRY_REASON)); + assertEquals("realContextId", event.getAttributes().get(Telemetry.TELEMETRY_CONTEXT_ID)); + assertEquals("realFlagSetId", event.getAttributes().get(Telemetry.TELEMETRY_FLAG_SET_ID)); + assertEquals("realVersion", event.getAttributes().get(Telemetry.TELEMETRY_VERSION)); + assertEquals(ErrorCode.GENERAL, event.getAttributes().get(Telemetry.TELEMETRY_ERROR_CODE)); + assertEquals("realErrorMessage", event.getAttributes().get(Telemetry.TELEMETRY_ERROR_MSG)); + assertNull(event.getAttributes().get(Telemetry.TELEMETRY_VARIANT)); + + } + + @Test + public void testErrorCodeEvaluation() { + EvaluationContext evaluationContext = mock(EvaluationContext.class); + when(evaluationContext.getTargetingKey()).thenReturn("realTargetingKey"); + + Metadata providerMetadata = mock(Metadata.class); + when(providerMetadata.getName()).thenReturn("realProviderName"); + + HookContext hookContext = HookContext.builder() + .flagKey("realFlag") + .type(FlagValueType.STRING) + .defaultValue("realDefault") + .ctx(evaluationContext) + .clientMetadata(mock(ClientMetadata.class)) + .providerMetadata(providerMetadata) + .build(); + + ProviderEvaluation providerEvaluation = ProviderEvaluation.builder() + .flagMetadata(ImmutableMetadata.builder() + .addString("contextId", "realContextId") + .addString("flagSetId", "realFlagSetId") + .addString("version", "realVersion") + .build()) + .reason(Reason.ERROR.name()) + .errorMessage("realErrorMessage") + .errorCode(ErrorCode.INVALID_CONTEXT) + .build(); + + EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, providerEvaluation); + + assertEquals("realFlag", event.getAttributes().get(Telemetry.TELEMETRY_KEY)); + assertEquals("realProviderName", event.getAttributes().get(Telemetry.TELEMETRY_PROVIDER)); + assertEquals("error", event.getAttributes().get(Telemetry.TELEMETRY_REASON)); + assertEquals("realContextId", event.getAttributes().get(Telemetry.TELEMETRY_CONTEXT_ID)); + assertEquals("realFlagSetId", event.getAttributes().get(Telemetry.TELEMETRY_FLAG_SET_ID)); + assertEquals("realVersion", event.getAttributes().get(Telemetry.TELEMETRY_VERSION)); + assertEquals(ErrorCode.INVALID_CONTEXT, event.getAttributes().get(Telemetry.TELEMETRY_ERROR_CODE)); + assertEquals("realErrorMessage", event.getAttributes().get(Telemetry.TELEMETRY_ERROR_MSG)); + assertNull(event.getAttributes().get(Telemetry.TELEMETRY_VARIANT)); + + } + +} From 1a33af2a01cb2262ec7e2ca8ce7c9e1ac07a57ec Mon Sep 17 00:00:00 2001 From: liran2000 Date: Tue, 25 Feb 2025 11:49:16 +0200 Subject: [PATCH 2/2] updates Signed-off-by: liran2000 --- .../java/dev/openfeature/sdk/Telemetry.java | 21 +-- .../dev/openfeature/sdk/TelemetryTest.java | 120 ++++++++---------- 2 files changed, 69 insertions(+), 72 deletions(-) diff --git a/src/main/java/dev/openfeature/sdk/Telemetry.java b/src/main/java/dev/openfeature/sdk/Telemetry.java index eb02749ad..0e99991fc 100644 --- a/src/main/java/dev/openfeature/sdk/Telemetry.java +++ b/src/main/java/dev/openfeature/sdk/Telemetry.java @@ -6,6 +6,8 @@ */ public class Telemetry { + private Telemetry() {} + /* The OpenTelemetry compliant event attributes for flag evaluation. Specification: https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-logs/ @@ -40,17 +42,19 @@ public class Telemetry { * * @return an EvaluationEvent populated with telemetry data */ - public static EvaluationEvent createEvaluationEvent(HookContext hookContext, - ProviderEvaluation providerEvaluation) { + public static EvaluationEvent createEvaluationEvent( + HookContext hookContext, ProviderEvaluation providerEvaluation) { EvaluationEvent.EvaluationEventBuilder evaluationEventBuilder = EvaluationEvent.builder() - .name(FLAG_EVALUATION_EVENT_NAME) - .attribute(TELEMETRY_KEY, hookContext.getFlagKey()) - .attribute(TELEMETRY_PROVIDER, hookContext.getProviderMetadata().getName()); + .name(FLAG_EVALUATION_EVENT_NAME) + .attribute(TELEMETRY_KEY, hookContext.getFlagKey()) + .attribute(TELEMETRY_PROVIDER, hookContext.getProviderMetadata().getName()); if (providerEvaluation.getReason() != null) { - evaluationEventBuilder.attribute(TELEMETRY_REASON, providerEvaluation.getReason().toLowerCase()); + evaluationEventBuilder.attribute( + TELEMETRY_REASON, providerEvaluation.getReason().toLowerCase()); } else { - evaluationEventBuilder.attribute(TELEMETRY_REASON, Reason.UNKNOWN.name().toLowerCase()); + evaluationEventBuilder.attribute( + TELEMETRY_REASON, Reason.UNKNOWN.name().toLowerCase()); } if (providerEvaluation.getVariant() != null) { @@ -63,7 +67,8 @@ public static EvaluationEvent createEvaluationEvent(HookContext hookContext, if (contextId != null) { evaluationEventBuilder.attribute(TELEMETRY_CONTEXT_ID, contextId); } else { - evaluationEventBuilder.attribute(TELEMETRY_CONTEXT_ID, hookContext.getCtx().getTargetingKey()); + evaluationEventBuilder.attribute( + TELEMETRY_CONTEXT_ID, hookContext.getCtx().getTargetingKey()); } String setID = providerEvaluation.getFlagMetadata().getString(TELEMETRY_FLAG_META_FLAG_SET_ID); diff --git a/src/test/java/dev/openfeature/sdk/TelemetryTest.java b/src/test/java/dev/openfeature/sdk/TelemetryTest.java index bda75af12..1bd7ded8a 100644 --- a/src/test/java/dev/openfeature/sdk/TelemetryTest.java +++ b/src/test/java/dev/openfeature/sdk/TelemetryTest.java @@ -10,7 +10,7 @@ public class TelemetryTest { @Test - public void testCreatesEvaluationEventWithMandatoryFields() { + void testCreatesEvaluationEventWithMandatoryFields() { // Arrange String flagKey = "test-flag"; String providerName = "test-provider"; @@ -20,17 +20,15 @@ public void testCreatesEvaluationEventWithMandatoryFields() { when(providerMetadata.getName()).thenReturn(providerName); HookContext hookContext = HookContext.builder() - .flagKey(flagKey) - .providerMetadata(providerMetadata) - .type(FlagValueType.BOOLEAN) - .defaultValue(false) - .ctx(new ImmutableContext()) - .build(); - - ProviderEvaluation evaluation = ProviderEvaluation.builder() - .reason(reason) - .value(true) - .build(); + .flagKey(flagKey) + .providerMetadata(providerMetadata) + .type(FlagValueType.BOOLEAN) + .defaultValue(false) + .ctx(new ImmutableContext()) + .build(); + + ProviderEvaluation evaluation = + ProviderEvaluation.builder().reason(reason).value(true).build(); EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, evaluation); @@ -41,7 +39,7 @@ public void testCreatesEvaluationEventWithMandatoryFields() { } @Test - public void testHandlesNullReason() { + void testHandlesNullReason() { // Arrange String flagKey = "test-flag"; String providerName = "test-provider"; @@ -50,17 +48,15 @@ public void testHandlesNullReason() { when(providerMetadata.getName()).thenReturn(providerName); HookContext hookContext = HookContext.builder() - .flagKey(flagKey) - .providerMetadata(providerMetadata) - .type(FlagValueType.BOOLEAN) - .defaultValue(false) - .ctx(new ImmutableContext()) - .build(); - - ProviderEvaluation evaluation = ProviderEvaluation.builder() - .reason(null) - .value(true) - .build(); + .flagKey(flagKey) + .providerMetadata(providerMetadata) + .type(FlagValueType.BOOLEAN) + .defaultValue(false) + .ctx(new ImmutableContext()) + .build(); + + ProviderEvaluation evaluation = + ProviderEvaluation.builder().reason(null).value(true).build(); EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, evaluation); @@ -68,20 +64,20 @@ public void testHandlesNullReason() { } @Test - public void testSetsVariantAttributeWhenVariantExists() { + void testSetsVariantAttributeWhenVariantExists() { HookContext hookContext = HookContext.builder() - .flagKey("testFlag") - .type(FlagValueType.STRING) - .defaultValue("default") - .ctx(mock(EvaluationContext.class)) - .clientMetadata(mock(ClientMetadata.class)) - .providerMetadata(mock(Metadata.class)) - .build(); + .flagKey("testFlag") + .type(FlagValueType.STRING) + .defaultValue("default") + .ctx(mock(EvaluationContext.class)) + .clientMetadata(mock(ClientMetadata.class)) + .providerMetadata(mock(Metadata.class)) + .build(); ProviderEvaluation providerEvaluation = ProviderEvaluation.builder() - .variant("testVariant") - .flagMetadata(ImmutableMetadata.builder().build()) - .build(); + .variant("testVariant") + .flagMetadata(ImmutableMetadata.builder().build()) + .build(); EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, providerEvaluation); @@ -89,20 +85,20 @@ public void testSetsVariantAttributeWhenVariantExists() { } @Test - public void test_sets_value_in_body_when_variant_is_null() { + void test_sets_value_in_body_when_variant_is_null() { HookContext hookContext = HookContext.builder() - .flagKey("testFlag") - .type(FlagValueType.STRING) - .defaultValue("default") - .ctx(mock(EvaluationContext.class)) - .clientMetadata(mock(ClientMetadata.class)) - .providerMetadata(mock(Metadata.class)) - .build(); + .flagKey("testFlag") + .type(FlagValueType.STRING) + .defaultValue("default") + .ctx(mock(EvaluationContext.class)) + .clientMetadata(mock(ClientMetadata.class)) + .providerMetadata(mock(Metadata.class)) + .build(); ProviderEvaluation providerEvaluation = ProviderEvaluation.builder() - .value("testValue") - .flagMetadata(ImmutableMetadata.builder().build()) - .build(); + .value("testValue") + .flagMetadata(ImmutableMetadata.builder().build()) + .build(); EvaluationEvent event = Telemetry.createEvaluationEvent(hookContext, providerEvaluation); @@ -110,7 +106,7 @@ public void test_sets_value_in_body_when_variant_is_null() { } @Test - public void testAllFieldsPopulated() { + void testAllFieldsPopulated() { EvaluationContext evaluationContext = mock(EvaluationContext.class); when(evaluationContext.getTargetingKey()).thenReturn("realTargetingKey"); @@ -118,20 +114,20 @@ public void testAllFieldsPopulated() { when(providerMetadata.getName()).thenReturn("realProviderName"); HookContext hookContext = HookContext.builder() - .flagKey("realFlag") - .type(FlagValueType.STRING) - .defaultValue("realDefault") - .ctx(evaluationContext) - .clientMetadata(mock(ClientMetadata.class)) - .providerMetadata(providerMetadata) - .build(); + .flagKey("realFlag") + .type(FlagValueType.STRING) + .defaultValue("realDefault") + .ctx(evaluationContext) + .clientMetadata(mock(ClientMetadata.class)) + .providerMetadata(providerMetadata) + .build(); ProviderEvaluation providerEvaluation = ProviderEvaluation.builder() .flagMetadata(ImmutableMetadata.builder() - .addString("contextId", "realContextId") - .addString("flagSetId", "realFlagSetId") - .addString("version", "realVersion") - .build()) + .addString("contextId", "realContextId") + .addString("flagSetId", "realFlagSetId") + .addString("version", "realVersion") + .build()) .reason(Reason.DEFAULT.name()) .variant("realVariant") .build(); @@ -146,11 +142,10 @@ public void testAllFieldsPopulated() { assertEquals("realVersion", event.getAttributes().get(Telemetry.TELEMETRY_VERSION)); assertNull(event.getAttributes().get(Telemetry.TELEMETRY_ERROR_CODE)); assertEquals("realVariant", event.getAttributes().get(Telemetry.TELEMETRY_VARIANT)); - } @Test - public void testErrorEvaluation() { + void testErrorEvaluation() { EvaluationContext evaluationContext = mock(EvaluationContext.class); when(evaluationContext.getTargetingKey()).thenReturn("realTargetingKey"); @@ -187,11 +182,10 @@ public void testErrorEvaluation() { assertEquals(ErrorCode.GENERAL, event.getAttributes().get(Telemetry.TELEMETRY_ERROR_CODE)); assertEquals("realErrorMessage", event.getAttributes().get(Telemetry.TELEMETRY_ERROR_MSG)); assertNull(event.getAttributes().get(Telemetry.TELEMETRY_VARIANT)); - } @Test - public void testErrorCodeEvaluation() { + void testErrorCodeEvaluation() { EvaluationContext evaluationContext = mock(EvaluationContext.class); when(evaluationContext.getTargetingKey()).thenReturn("realTargetingKey"); @@ -229,7 +223,5 @@ public void testErrorCodeEvaluation() { assertEquals(ErrorCode.INVALID_CONTEXT, event.getAttributes().get(Telemetry.TELEMETRY_ERROR_CODE)); assertEquals("realErrorMessage", event.getAttributes().get(Telemetry.TELEMETRY_ERROR_MSG)); assertNull(event.getAttributes().get(Telemetry.TELEMETRY_VARIANT)); - } - }