Skip to content

Commit 07d01c4

Browse files
committed
provider evaluation de/serialization support
Signed-off-by: Kavindu Dodanduwa <[email protected]>
1 parent 6cd588b commit 07d01c4

File tree

5 files changed

+117
-3
lines changed

5 files changed

+117
-3
lines changed

pom.xml

+19
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@
6363
<version>2.0.7</version>
6464
</dependency>
6565

66+
<dependency>
67+
<groupId>com.fasterxml.jackson.core</groupId>
68+
<artifactId>jackson-annotations</artifactId>
69+
<version>2.15.2</version>
70+
</dependency>
71+
72+
<dependency>
73+
<groupId>com.fasterxml.jackson.core</groupId>
74+
<artifactId>jackson-databind</artifactId>
75+
<version>2.15.2</version>
76+
</dependency>
77+
6678
<!-- test -->
6779
<dependency>
6880
<groupId>org.mockito</groupId>
@@ -152,6 +164,13 @@
152164
<version>4.2.0</version>
153165
<scope>test</scope>
154166
</dependency>
167+
168+
<dependency>
169+
<groupId>com.fasterxml.jackson.core</groupId>
170+
<artifactId>jackson-core</artifactId>
171+
<version>2.15.2</version>
172+
<scope>test</scope>
173+
</dependency>
155174
</dependencies>
156175

157176
<dependencyManagement>

src/main/java/dev/openfeature/sdk/ImmutableMetadata.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package dev.openfeature.sdk;
22

3+
import com.fasterxml.jackson.annotation.JsonGetter;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
35
import lombok.extern.slf4j.Slf4j;
46

57
import java.util.HashMap;
@@ -13,10 +15,17 @@
1315
public class ImmutableMetadata {
1416
private final Map<String, Object> metadata;
1517

16-
private ImmutableMetadata(Map<String, Object> metadata) {
18+
private ImmutableMetadata(@JsonProperty("metadata") Map<String, Object> metadata) {
1719
this.metadata = metadata;
1820
}
1921

22+
// This is required for serialization support
23+
@SuppressWarnings({"PMD.UnusedPrivateMethod"})
24+
@JsonGetter("metadata")
25+
private Map<String, Object> getMetadata() {
26+
return this.metadata;
27+
}
28+
2029
/**
2130
* Retrieve a {@link String} value for the given key. A {@code null} value is returned if the key does not exist
2231
* or if the value is of a different type.

src/main/java/dev/openfeature/sdk/ProviderEvaluation.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
import lombok.Builder;
44
import lombok.Data;
5+
import lombok.extern.jackson.Jacksonized;
56

67
import javax.annotation.Nullable;
78

89
@SuppressWarnings("checkstyle:MissingJavadocType")
9-
@Data @Builder
10+
@Data
11+
@Builder
12+
@Jacksonized
1013
public class ProviderEvaluation<T> implements BaseEvaluation<T> {
1114
T value;
1215
@Nullable String variant;

src/test/java/dev/openfeature/sdk/FlagMetadataTest.java renamed to src/test/java/dev/openfeature/sdk/ImmutableMetadataTest.java

+38-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package dev.openfeature.sdk;
22

3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
35
import org.junit.jupiter.api.DisplayName;
46
import org.junit.jupiter.api.Test;
57

68
import static org.assertj.core.api.Assertions.assertThat;
79

8-
class FlagMetadataTest {
10+
class ImmutableMetadataTest {
911

1012
@Test
1113
@DisplayName("Test metadata payload construction and retrieval")
@@ -61,4 +63,39 @@ public void notfound_error_validation() {
6163
// then
6264
assertThat(flagMetadata.getBoolean("string")).isNull();
6365
}
66+
67+
@Test
68+
@DisplayName("Make sure class is se/deserializable")
69+
public void test_serialize_deserialization() throws JsonProcessingException {
70+
// given
71+
ImmutableMetadata original = ImmutableMetadata.builder()
72+
.addString("string", "string")
73+
.addInteger("integer", 1)
74+
.addLong("long", Long.MAX_VALUE)
75+
.addFloat("float", Float.MAX_VALUE)
76+
.addDouble("double", Double.MAX_VALUE)
77+
.addBoolean("boolean", Boolean.FALSE)
78+
.build();
79+
80+
81+
final ObjectMapper mapper = new ObjectMapper();
82+
83+
// when
84+
final String json = mapper.writeValueAsString(original);
85+
final ImmutableMetadata converted = mapper.readValue(json, ImmutableMetadata.class);
86+
87+
// then
88+
assertThat(json).isEqualTo("{\"metadata\":{\"boolean\":false,\"string\":\"string\"," +
89+
"\"double\":1.7976931348623157E308,\"integer\":1,\"float\":3.4028235E38,\"long\":9223372036854775807}}");
90+
91+
assertThat(converted.getValue("string", String.class)).isEqualTo(original.getString("string"));
92+
assertThat(converted.getValue("integer", Integer.class)).isEqualTo(original.getInteger("integer"));
93+
assertThat(converted.getValue("boolean", Boolean.class)).isEqualTo(original.getBoolean("boolean"));
94+
assertThat(converted.getValue("long", Long.class)).isEqualTo(original.getValue("long", Long.class));
95+
assertThat(converted.getValue("double", Number.class)).isEqualTo(original.getValue("double", Number.class));
96+
97+
// float get converted to double, hence representation comparison
98+
assertThat(converted.getValue("float", Double.class).toString())
99+
.isEqualTo(original.getValue("float", Float.class).toString());
100+
}
64101
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package dev.openfeature.sdk;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import org.junit.jupiter.api.DisplayName;
5+
import org.junit.jupiter.api.Test;
6+
7+
import java.io.IOException;
8+
import java.io.Reader;
9+
import java.io.StringReader;
10+
11+
import static org.assertj.core.api.Assertions.assertThat;
12+
13+
class ProviderEvaluationTest {
14+
15+
@Test
16+
@DisplayName("Provider evaluation must support JSON se/deserialization")
17+
public void test_serialization_deserialization() throws IOException {
18+
// given
19+
final ProviderEvaluation<String> original = ProviderEvaluation.<String>builder()
20+
.reason(Reason.STATIC.toString())
21+
.variant("Default")
22+
.value("StringValue")
23+
.flagMetadata(ImmutableMetadata.builder()
24+
.addString("key", "value")
25+
.addInteger("integer", 10)
26+
.build()
27+
)
28+
.build();
29+
30+
31+
// when
32+
final String json = new ObjectMapper().writer().writeValueAsString(original);
33+
final ObjectMapper objectMapper = new ObjectMapper();
34+
final Reader reader = new StringReader(json);
35+
final ProviderEvaluation converted = objectMapper.readValue(reader, ProviderEvaluation.class);
36+
37+
// then
38+
assertThat(converted.getReason()).isEqualTo(original.getReason());
39+
assertThat(converted.getVariant()).isEqualTo(original.getVariant());
40+
assertThat(converted.getValue()).isEqualTo(original.getValue());
41+
assertThat(converted.getFlagMetadata().getString("key"))
42+
.isEqualTo(original.getFlagMetadata().getString("key"));
43+
assertThat(converted.getFlagMetadata().getInteger("integer"))
44+
.isEqualTo(original.getFlagMetadata().getInteger("integer"));
45+
}
46+
}

0 commit comments

Comments
 (0)