diff --git a/sdk/pom.xml b/sdk/pom.xml index 82ba03f4c..4691cb7bb 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -39,7 +39,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.1 + 2.15.1 io.projectreactor @@ -64,7 +64,7 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml - 2.11.3 + 2.15.1 test diff --git a/sdk/src/main/java/io/dapr/client/domain/CloudEvent.java b/sdk/src/main/java/io/dapr/client/domain/CloudEvent.java index 040aa9eb3..18d3465c1 100644 --- a/sdk/src/main/java/io/dapr/client/domain/CloudEvent.java +++ b/sdk/src/main/java/io/dapr/client/domain/CloudEvent.java @@ -15,10 +15,20 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.io.IOException; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Objects; @@ -76,6 +86,43 @@ public class CloudEvent { @JsonProperty("data_base64") private byte[] binaryData; + /** + * The pubsub component this CloudEvent came from. + */ + @JsonProperty("pubsubname") + private String pubsubName; + + /** + * The topic this CloudEvent came from. + */ + private String topic; + + /** + * The time this CloudEvent was created. + */ + @JsonSerialize(using = OffsetDateTimeSerializer.class) + @JsonDeserialize(using = OffsetDateTimeDeserializer.class) + private OffsetDateTime time; + + /** + * The trace id is the legacy name for trace parent. + */ + @Deprecated + @JsonProperty("traceid") + private String traceId; + + /** + * The trace parent. + */ + @JsonProperty("traceparent") + private String traceParent; + + /** + * The trace state. + */ + @JsonProperty("tracestate") + private String traceState; + /** * Instantiates a CloudEvent. */ @@ -125,9 +172,9 @@ public CloudEvent( this.type = type; this.specversion = specversion; this.datacontenttype = "application/octet-stream"; - this.binaryData = binaryData == null ? null : Arrays.copyOf(binaryData, binaryData.length);; + this.binaryData = binaryData == null ? null : Arrays.copyOf(binaryData, binaryData.length); } - + /** * Deserialize a message topic from Dapr. * @@ -255,6 +302,104 @@ public void setBinaryData(byte[] binaryData) { this.binaryData = binaryData == null ? null : Arrays.copyOf(binaryData, binaryData.length); } + /** + * Gets the pubsub component name. + * @return the pubsub component name. + */ + public String getPubsubName() { + return pubsubName; + } + + /** + * Sets the pubsub component name. + * @param pubsubName the pubsub component name. + */ + public void setPubsubName(String pubsubName) { + this.pubsubName = pubsubName; + } + + /** + * Gets the topic name. + * @return the topic name. + */ + public String getTopic() { + return topic; + } + + /** + * Sets the topic name. + * @param topic the topic name. + */ + public void setTopic(String topic) { + this.topic = topic; + } + + /** + * Gets the time. + * @return the time. + */ + public OffsetDateTime getTime() { + return time; + } + + /** + * Sets the time. + * @param time the time. + */ + public void setTime(OffsetDateTime time) { + this.time = time; + } + + /** + * Gets the trace id which is the legacy name for trace parent. + * @return the trace id. + */ + @Deprecated + public String getTraceId() { + return traceId; + } + + /** + * Sets the trace id which is the legacy name for trace parent. + * @param traceId the trace id. + */ + @Deprecated + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + /** + * Gets the trace parent. + * @return the trace parent. + */ + public String getTraceParent() { + return traceParent; + } + + /** + * Sets the trace parent. + * @param traceParent the trace parent. + */ + public void setTraceParent(String traceParent) { + this.traceParent = traceParent; + } + + /** + * Gets the trace state. + * @return the trace state. + */ + public String getTraceState() { + return traceState; + } + + /** + * Sets the trace state. + * @param traceState the trace state. + */ + public void setTraceState(String traceState) { + this.traceState = traceState; + } + /** * {@inheritDoc} */ @@ -273,7 +418,13 @@ public boolean equals(Object o) { && Objects.equals(specversion, that.specversion) && Objects.equals(datacontenttype, that.datacontenttype) && Objects.equals(data, that.data) - && Arrays.equals(binaryData, that.binaryData); + && Arrays.equals(binaryData, that.binaryData) + && Objects.equals(pubsubName, that.pubsubName) + && Objects.equals(topic, that.topic) + && ((time == null && that.time == null) || (time != null && that.time != null && time.isEqual(that.time))) + && Objects.equals(traceId, that.traceId) + && Objects.equals(traceParent, that.traceParent) + && Objects.equals(traceState, that.traceState); } /** @@ -281,6 +432,23 @@ public boolean equals(Object o) { */ @Override public int hashCode() { - return Objects.hash(id, source, type, specversion, datacontenttype, data, binaryData); + return Objects.hash(id, source, type, specversion, datacontenttype, data, binaryData, pubsubName, topic, time, + traceId, traceParent, traceState); + } + + private static class OffsetDateTimeSerializer extends JsonSerializer { + @Override + public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeString(offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + } + } + + private static class OffsetDateTimeDeserializer extends JsonDeserializer { + @Override + public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException { + return OffsetDateTime.parse(jsonParser.getText()); + } } } diff --git a/sdk/src/test/java/io/dapr/client/CloudEventTest.java b/sdk/src/test/java/io/dapr/client/CloudEventTest.java index fac624dab..bf893d712 100644 --- a/sdk/src/test/java/io/dapr/client/CloudEventTest.java +++ b/sdk/src/test/java/io/dapr/client/CloudEventTest.java @@ -13,12 +13,18 @@ package io.dapr.client; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.dapr.client.domain.CloudEvent; import org.junit.jupiter.api.Test; +import java.time.OffsetDateTime; +import java.util.Objects; + import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNull; public class CloudEventTest { @@ -28,6 +34,24 @@ public class CloudEventTest { public static class MyClass { public int id; public String name; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MyClass myClass = (MyClass) o; + + if (id != myClass.id) return false; + return Objects.equals(name, myClass.name); + } + + @Override + public int hashCode() { + int result = id; + result = 31 * result + (name != null ? name.hashCode() : 0); + return result; + } } @Test @@ -42,7 +66,12 @@ public void deserializeObjectClass() throws Exception { " \"comexampleextension1\" : \"value\",\n" + " \"comexampleothervalue\" : 5,\n" + " \"datacontenttype\" : \"application/json\",\n" + - " \"data\" : {\"id\": 1, \"name\": \"hello world\"}\n" + + " \"data\" : {\"id\": 1, \"name\": \"hello world\"},\n" + + " \"pubsubname\" : \"mypubsubname\",\n" + + " \"topic\" : \"mytopic\",\n" + + " \"traceid\" : \"Z987-0987-0987\",\n" + + " \"traceparent\" : \"Z987-0987-0987\",\n" + + " \"tracestate\" : \"\"\n" + "}"; MyClass expected = new MyClass() {{ @@ -51,7 +80,17 @@ public void deserializeObjectClass() throws Exception { }}; CloudEvent cloudEvent = CloudEvent.deserialize(content.getBytes()); + assertEquals("1.0", cloudEvent.getSpecversion()); + assertEquals("com.github.pull_request.opened", cloudEvent.getType()); + assertEquals("https://github.com/cloudevents/spec/pull", cloudEvent.getSource()); + assertEquals("A234-1234-1234", cloudEvent.getId()); + assertEquals(OffsetDateTime.parse("2018-04-05T17:31:00Z"), cloudEvent.getTime()); assertEquals("application/json", cloudEvent.getDatacontenttype()); + assertEquals("mypubsubname", cloudEvent.getPubsubName()); + assertEquals("mytopic", cloudEvent.getTopic()); + assertEquals("Z987-0987-0987", cloudEvent.getTraceId()); + assertEquals("Z987-0987-0987", cloudEvent.getTraceParent()); + assertEquals("", cloudEvent.getTraceState()); MyClass myObject = OBJECT_MAPPER.convertValue(cloudEvent.getData(), MyClass.class); assertEquals(expected.id, myObject.id); assertEquals(expected.name, myObject.name); @@ -179,4 +218,103 @@ public void deserializeBinaryData() throws Exception { assertNull(cloudEvent.getData()); assertArrayEquals(expected, cloudEvent.getBinaryData()); } + + @Test + public void serializeObjectClass() throws Exception { + CloudEvent cloudEvent = new CloudEvent<>(); + MyClass myClass = new MyClass(); + myClass.id = 1; + myClass.name = "Hello World"; + cloudEvent.setData(myClass); + OffsetDateTime now = OffsetDateTime.now(); + cloudEvent.setTime(now); + + String cloudEventAsString = OBJECT_MAPPER.writeValueAsString(cloudEvent); + CloudEvent cloudEventDeserialized = OBJECT_MAPPER.readValue(cloudEventAsString, + new TypeReference>() {}); + assertEquals(cloudEvent, cloudEventDeserialized); + assertEquals(now, cloudEventDeserialized.getTime()); + MyClass myClassDeserialized = cloudEventDeserialized.getData(); + assertEquals(myClass.id, myClassDeserialized.id); + assertEquals(myClass.name, myClassDeserialized.name); + } + + @Test + public void equalsCodecovTest() { + CloudEvent cloudEvent = new CloudEvent<>(); + assertFalse(cloudEvent.equals(null)); + assertFalse(cloudEvent.equals("")); + + CloudEvent cloudEventCopy = cloudEvent; + assertEquals(cloudEvent, cloudEventCopy); + + CloudEvent cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setId("id"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setSource("source"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setType("type"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setSpecversion("specversion"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setDatacontenttype("datacontenttype"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setData("data"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setBinaryData("binaryData".getBytes()); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setPubsubName("pubsubName"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setTopic("topic"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + OffsetDateTime now = OffsetDateTime.now(); + cloudEventDifferent = new CloudEvent<>(); + // cloudEvent null time, cloudEventDifferent now time + cloudEventDifferent.setTime(now); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + // cloudEvent now time, cloudEventDifferent now time + cloudEvent.setTime(now); + assertEquals(cloudEventCopy, cloudEventDifferent); + // cloudEvent now time, cloudEventDifferent now time + 1 nano + cloudEventDifferent.setTime(now.plusNanos(1L)); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + // reset cloudEvent time + cloudEvent.setTime(null); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setTraceId("traceId"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setTraceParent("traceParent"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + + cloudEventDifferent = new CloudEvent<>(); + cloudEventDifferent.setTraceState("traceState"); + assertNotEquals(cloudEventCopy, cloudEventDifferent); + } + + @Test + public void hashCodeCodecovTest() { + CloudEvent cloudEvent = new CloudEvent<>(); + final int EXPECTED_EMPTY_HASH_CODE = -505558625; + assertEquals(EXPECTED_EMPTY_HASH_CODE, cloudEvent.hashCode()); + } } diff --git a/sdk/src/test/java/io/dapr/serializer/DefaultObjectSerializerTest.java b/sdk/src/test/java/io/dapr/serializer/DefaultObjectSerializerTest.java index d540fb8ae..2807d55e3 100644 --- a/sdk/src/test/java/io/dapr/serializer/DefaultObjectSerializerTest.java +++ b/sdk/src/test/java/io/dapr/serializer/DefaultObjectSerializerTest.java @@ -13,8 +13,16 @@ package io.dapr.serializer; +import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.google.protobuf.ByteString; import com.google.protobuf.CodedOutputStream; import com.google.protobuf.MessageLite; @@ -28,6 +36,8 @@ import java.io.OutputStream; import java.io.Serializable; import java.lang.reflect.Type; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Base64; import java.util.List; @@ -57,6 +67,10 @@ public static class MyObjectTestToSerialize implements Serializable { private float floatValue; private double doubleValue; + @JsonSerialize(using = OffsetDateTimeSerializer.class) + @JsonDeserialize(using = OffsetDateTimeDeserializer.class) + private OffsetDateTime timeValue; + public String getStringValue() { return stringValue; } @@ -129,6 +143,14 @@ public void setDoubleValue(double doubleValue) { this.doubleValue = doubleValue; } + public OffsetDateTime getTimeValue() { + return timeValue; + } + + public void setTimeValue(OffsetDateTime timeValue) { + this.timeValue = timeValue; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -167,6 +189,9 @@ public boolean equals(Object o) { if (getStringValue() != null ? !getStringValue().equals(that.getStringValue()) : that.getStringValue() != null) { return false; } + if (getTimeValue() != null ? !getTimeValue().isEqual(that.getTimeValue()) : that.getTimeValue() != null) { + return false; + } return true; } @@ -185,6 +210,7 @@ public int hashCode() { result = 31 * result + (getFloatValue() != +0.0f ? Float.floatToIntBits(getFloatValue()) : 0); temp = Double.doubleToLongBits(getDoubleValue()); result = 31 * result + (int) (temp ^ (temp >>> 32)); + result = 31 * result + getTimeValue().toInstant().hashCode(); return result; } @@ -200,8 +226,23 @@ public String toString() { ", longValue=" + longValue + ", floatValue=" + floatValue + ", doubleValue=" + doubleValue + + ", timeValue=" + timeValue + '}'; } + + private static class OffsetDateTimeSerializer extends JsonSerializer { + @Override + public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeString(offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + } + } + + private static class OffsetDateTimeDeserializer extends JsonDeserializer { + @Override + public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { + return OffsetDateTime.parse(jsonParser.getText()); + } + } } @Test @@ -216,7 +257,8 @@ public void serializeStringObjectTest() { obj.setLongValue(9223372036854775807L); obj.setFloatValue(1.0f); obj.setDoubleValue(1000.0); - String expectedResult = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + obj.setTimeValue(OffsetDateTime.MIN); + String expectedResult = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"-999999999-01-01T00:00:00+18:00\"}"; String serializedValue; @@ -437,7 +479,7 @@ public void serializeFakeProtoTest() throws Exception { @Test public void deserializeObjectTest() { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setIntValue(2147483647); @@ -448,6 +490,7 @@ public void deserializeObjectTest() { expectedResult.setLongValue(9223372036854775807L); expectedResult.setFloatValue(1.0f); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { @@ -460,7 +503,7 @@ public void deserializeObjectTest() { @Test public void deserializeArrayObjectTest() { - String jsonToDeserialize = "[{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}]"; + String jsonToDeserialize = "[{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}]"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setIntValue(2147483647); @@ -471,6 +514,7 @@ public void deserializeArrayObjectTest() { expectedResult.setLongValue(9223372036854775807L); expectedResult.setFloatValue(1.0f); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); List result; try { @@ -536,7 +580,7 @@ public void deserializeNullObjectOrPrimitiveTest() { @Test public void deserializeObjectMissingStringPropertyTest() { - String jsonToDeserialize = "{\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + String jsonToDeserialize = "{\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setIntValue(2147483647); expectedResult.setBoolValue(true); @@ -546,11 +590,12 @@ public void deserializeObjectMissingStringPropertyTest() { expectedResult.setLongValue(9223372036854775807L); expectedResult.setFloatValue(1.0f); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); - assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECING: [[" + expectedResult + "]]"); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); } catch (IOException exception) { fail(exception.getMessage()); } @@ -558,7 +603,7 @@ public void deserializeObjectMissingStringPropertyTest() { @Test public void deserializeObjectMissingIntTest() { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setBoolValue(true); @@ -568,11 +613,12 @@ public void deserializeObjectMissingIntTest() { expectedResult.setLongValue(9223372036854775807L); expectedResult.setFloatValue(1.0f); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); - assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECING: [[" + expectedResult + "]]"); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); } catch (IOException exception) { fail(exception.getMessage()); } @@ -580,7 +626,7 @@ public void deserializeObjectMissingIntTest() { @Test public void deserializeObjectMissingBooleanTest() { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setIntValue(2147483647); @@ -590,11 +636,12 @@ public void deserializeObjectMissingBooleanTest() { expectedResult.setLongValue(9223372036854775807L); expectedResult.setFloatValue(1.0f); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); - assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECING: [[" + expectedResult + "]]"); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); } catch (IOException exception) { fail(exception.getMessage()); } @@ -602,7 +649,7 @@ public void deserializeObjectMissingBooleanTest() { @Test public void deserializeObjectMissingCharTest() { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setIntValue(2147483647); @@ -612,11 +659,12 @@ public void deserializeObjectMissingCharTest() { expectedResult.setLongValue(9223372036854775807L); expectedResult.setFloatValue(1.0f); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); - assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECING: [[" + expectedResult + "]]"); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); } catch (IOException exception) { fail(exception.getMessage()); } @@ -624,7 +672,7 @@ public void deserializeObjectMissingCharTest() { @Test public void deserializeObjectMissingByteTest() { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setIntValue(2147483647); @@ -634,11 +682,12 @@ public void deserializeObjectMissingByteTest() { expectedResult.setLongValue(9223372036854775807L); expectedResult.setFloatValue(1.0f); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); - assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECING: [[" + expectedResult + "]]"); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); } catch (IOException exception) { fail(exception.getMessage()); } @@ -646,7 +695,7 @@ public void deserializeObjectMissingByteTest() { @Test public void deserializeObjectMissingShortTest() { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setIntValue(2147483647); @@ -656,11 +705,12 @@ public void deserializeObjectMissingShortTest() { expectedResult.setLongValue(9223372036854775807L); expectedResult.setFloatValue(1.0f); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); - assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECING: [[" + expectedResult + "]]"); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); } catch (IOException exception) { fail(exception.getMessage()); } @@ -668,7 +718,7 @@ public void deserializeObjectMissingShortTest() { @Test public void deserializeObjectMissingLongTest() { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setIntValue(2147483647); @@ -678,11 +728,12 @@ public void deserializeObjectMissingLongTest() { expectedResult.setShortValue((short) 32767); expectedResult.setFloatValue(1.0f); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); - assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECING: [[" + expectedResult + "]]"); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); } catch (IOException exception) { fail(exception.getMessage()); } @@ -690,7 +741,7 @@ public void deserializeObjectMissingLongTest() { @Test public void deserializeObjectMissingFloatTest() { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"doubleValue\":1000.0}"; + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setIntValue(2147483647); @@ -700,11 +751,12 @@ public void deserializeObjectMissingFloatTest() { expectedResult.setShortValue((short) 32767); expectedResult.setLongValue(9223372036854775807L); expectedResult.setDoubleValue(1000.0); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); - assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECING: [[" + expectedResult + "]]"); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); } catch (IOException exception) { fail(exception.getMessage()); } @@ -712,7 +764,7 @@ public void deserializeObjectMissingFloatTest() { @Test public void deserializeObjectMissingDoubleTest() { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0}"; + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); expectedResult.setStringValue("A String"); expectedResult.setIntValue(2147483647); @@ -722,39 +774,70 @@ public void deserializeObjectMissingDoubleTest() { expectedResult.setShortValue((short) 32767); expectedResult.setLongValue(9223372036854775807L); expectedResult.setFloatValue(1.0f); + expectedResult.setTimeValue(OffsetDateTime.MAX); MyObjectTestToSerialize result; try { result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); - assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECING: [[" + expectedResult + "]]"); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); + } catch (IOException exception) { + fail(exception.getMessage()); + } + } + + @Test + public void deserializeObjectMissingTimeTest() { + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0}"; + MyObjectTestToSerialize expectedResult = new MyObjectTestToSerialize(); + expectedResult.setStringValue("A String"); + expectedResult.setIntValue(2147483647); + expectedResult.setBoolValue(true); + expectedResult.setCharValue('a'); + expectedResult.setByteValue((byte) 65); + expectedResult.setShortValue((short) 32767); + expectedResult.setLongValue(9223372036854775807L); + expectedResult.setFloatValue(1.0f); + MyObjectTestToSerialize result; + + try { + result = SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class); + assertEquals(expectedResult, result, "FOUND:[[" + result + "]] \n but was EXPECTING: [[" + expectedResult + "]]"); } catch (IOException exception) { fail(exception.getMessage()); } } @Test - public void deserializeObjectIntExceedMaximunValueTest() throws Exception { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483648,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + public void deserializeObjectIntExceedMaximumValueTest() { + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483648,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; + assertThrows(IOException.class, () -> SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class)); } @Test - public void deserializeObjectNotACharTest() throws Exception { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"Not A Char\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + public void deserializeObjectNotACharTest() { + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"Not A Char\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; assertThrows(IOException.class, () -> SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class)); } @Test - public void deserializeObjectShortExceededMaximunValueTest() throws Exception { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32768,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + public void deserializeObjectShortExceededMaximumValueTest() { + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32768,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; assertThrows(IOException.class, () -> SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class)); } @Test - public void deserializeObjectLongExceededMaximumValueTest() throws Exception { - String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775808,\"floatValue\":1.0,\"doubleValue\":1000.0}"; + public void deserializeObjectLongExceededMaximumValueTest() { + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775808,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+999999999-12-31T23:59:59.999999999-18:00\"}"; + + assertThrows(IOException.class, () -> SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class)); + } + + @Test + public void deserializeObjectTimeExceededMaximumValueTest() { + String jsonToDeserialize = "{\"stringValue\":\"A String\",\"intValue\":2147483647,\"boolValue\":true,\"charValue\":\"a\",\"byteValue\":65,\"shortValue\":32767,\"longValue\":9223372036854775807,\"floatValue\":1.0,\"doubleValue\":1000.0,\"timeValue\":\"+1000000000-12-31T23:59:59.999999999-18:00\"}"; assertThrows(IOException.class, () -> SERIALIZER.deserialize(jsonToDeserialize.getBytes(), MyObjectTestToSerialize.class)); } @@ -769,6 +852,7 @@ public void deserializeNullToPrimitives() throws Exception { assertEquals(0, SERIALIZER.deserialize(null, double.class), 0); assertEquals(0, SERIALIZER.deserialize(null, float.class), 0); assertEquals(false, SERIALIZER.deserialize(null, boolean.class)); + assertEquals(null, SERIALIZER.deserialize(null, OffsetDateTime.class)); assertNull(SERIALIZER.deserialize(null, Character.class)); assertNull(SERIALIZER.deserialize(null, Integer.class)); @@ -777,6 +861,7 @@ public void deserializeNullToPrimitives() throws Exception { assertNull(SERIALIZER.deserialize(null, Double.class)); assertNull(SERIALIZER.deserialize(null, Float.class)); assertNull(SERIALIZER.deserialize(null, Boolean.class)); + assertNull(SERIALIZER.deserialize(null, OffsetDateTime.class)); } @Test @@ -789,6 +874,7 @@ public void deserializeEmptyByteArrayToPrimitives() throws Exception { assertEquals(0, SERIALIZER.deserialize(new byte[0], double.class), 0); assertEquals(0, SERIALIZER.deserialize(new byte[0], float.class), 0); assertEquals(false, SERIALIZER.deserialize(new byte[0], boolean.class)); + assertEquals(null, SERIALIZER.deserialize(new byte[0], OffsetDateTime.class)); assertNull(SERIALIZER.deserialize(new byte[0], Character.class)); assertNull(SERIALIZER.deserialize(new byte[0], Integer.class)); @@ -797,6 +883,7 @@ public void deserializeEmptyByteArrayToPrimitives() throws Exception { assertNull(SERIALIZER.deserialize(new byte[0], Double.class)); assertNull(SERIALIZER.deserialize(new byte[0], Float.class)); assertNull(SERIALIZER.deserialize(new byte[0], Boolean.class)); + assertNull(SERIALIZER.deserialize(new byte[0], OffsetDateTime.class)); } @Test @@ -832,6 +919,20 @@ public void serializeDeserializeCloudEventEnvelope() throws Exception { "v2", "byte", Base64.getEncoder().encodeToString(new byte[] {0, 2, 99})))); + assertTrue(check.apply( + new CloudEvent( + "0987-0987", + "anothersource", + "anothertype", + "v3", + "blah".getBytes()))); + assertTrue(check.apply( + new CloudEvent( + "0987-0987", + "anothersource", + "anothertype", + "v3", + null))); } @Test @@ -866,9 +967,10 @@ public void deserializeCloudEventEnvelopeData() throws Exception { assertEquals(new TreeMap() {{ put("id", "123"); put("name", "Jon Doe"); - }}, deserializeData.apply("{\"id\": \"123\", \"name\": \"Jon Doe\"}")); - assertEquals("{\"id\": \"123\", \"name\": \"Jon Doe\"}", - deserializeData.apply(new ObjectMapper().writeValueAsString("{\"id\": \"123\", \"name\": \"Jon Doe\"}"))); + put("time", "1970-01-01-00:00:00+00:00"); + }}, deserializeData.apply("{\"id\": \"123\", \"name\": \"Jon Doe\", \"time\": \"1970-01-01-00:00:00+00:00\"}")); + assertEquals("{\"id\": \"123\", \"name\": \"Jon Doe\", \"time\": \"1970-01-01-00:00:00+00:00\"}", + deserializeData.apply(new ObjectMapper().writeValueAsString("{\"id\": \"123\", \"name\": \"Jon Doe\", \"time\": \"1970-01-01-00:00:00+00:00\"}"))); } @Test