Fix Cloud Events support for Message functions

Ensured Cloud Event completness by adding assertion for required attributes as well as generation of default values for attributes such as ID and SPECVERSION
This commit is contained in:
Oleg Zhurakousky
2020-12-02 18:22:17 +01:00
parent 923d5204e4
commit aede56dfc6
8 changed files with 124 additions and 59 deletions

View File

@@ -56,7 +56,6 @@ public class CloudEventFunctionTests {
.setType("org.springframework")
.build();
assertThat(inputMessage.getHeaders().getId()).isEqualTo(UUID.fromString(id));
assertThat(CloudEventMessageUtils.isCloudEvent(inputMessage)).isTrue();
Message<Person> resultMessage = (Message<Person>) function.apply(inputMessage);
@@ -87,8 +86,6 @@ public class CloudEventFunctionTests {
.setHeader("ce_type", "org.springframework")
.build();
// assertThat(CloudEventMessageUtils.isBinary(inputMessage)).isTrue();
Message<Person> resultMessage = (Message<Person>) function.apply(inputMessage);
/*
@@ -139,6 +136,44 @@ public class CloudEventFunctionTests {
assertThat(CloudEventMessageUtils.getSource(resultMessage)).isEqualTo(URI.create("http://spring.io/application-application"));
}
@SuppressWarnings("unchecked")
@Test
public void testStructuredPojoToPojoMessageFunction() throws Exception {
String payload = "{\n" +
" \"specversion\" : \"1.0\",\n" +
" \"type\" : \"org.springframework\",\n" +
" \"source\" : \"https://spring.io/\",\n" +
" \"id\" : \"A234-1234-1234\",\n" +
" \"datacontenttype\" : \"application/json\",\n" +
" \"data\" : {\n" +
" \"version\" : \"1.0\",\n" +
" \"releaseName\" : \"Spring Framework\",\n" +
" \"releaseDate\" : \"24-03-2004\"\n" +
" }\n" +
"}";
Function<Object, Object> function = this.lookup("springReleaseAsMessage", TestConfiguration.class);
Message<String> inputMessage = MessageBuilder
.withPayload(payload)
.setHeader(MessageHeaders.CONTENT_TYPE, CloudEventMessageUtils.APPLICATION_CLOUDEVENTS_VALUE + "+json")
.build();
assertThat(CloudEventMessageUtils.isCloudEvent(inputMessage)).isFalse();
Message<SpringReleaseEvent> resultMessage = (Message<SpringReleaseEvent>) function.apply(inputMessage);
assertThat(resultMessage.getPayload().getReleaseDate())
.isEqualTo(new SimpleDateFormat("dd-MM-yyyy").parse("01-10-2006"));
assertThat(resultMessage.getPayload().getVersion()).isEqualTo("2.0");
// /*
// * Validates that although user only deals with POJO, the framework recognizes
// * both on input and output that it is dealing with Cloud Event and generates
// * appropriate headers/attributes
// */
assertThat(CloudEventMessageUtils.isCloudEvent(resultMessage)).isTrue();
assertThat(CloudEventMessageUtils.getType(resultMessage)).isEqualTo(SpringReleaseEvent.class.getName());
assertThat(CloudEventMessageUtils.getSource(resultMessage)).isEqualTo(URI.create("https://spring.release.event"));
}
@SuppressWarnings("unchecked")
@Test
public void testStructuredPojoToPojoDefaultOutputAttributeProviderNoDataContentType() throws Exception {
@@ -155,8 +190,8 @@ public class CloudEventFunctionTests {
"}";
Function<Object, Object> function = this.lookup("springRelease", TestConfiguration.class);
Message<String> inputMessage = CloudEventMessageBuilder
.withData(payload)
Message<String> inputMessage = MessageBuilder
.withPayload(payload)
.setHeader(MessageHeaders.CONTENT_TYPE, CloudEventMessageUtils.APPLICATION_CLOUDEVENTS_VALUE + "+json")
.build();
assertThat(CloudEventMessageUtils.isCloudEvent(inputMessage)).isFalse();
@@ -202,6 +237,18 @@ public class CloudEventFunctionTests {
}
};
}
@Bean
Function<Message<SpringReleaseEvent>, Message<SpringReleaseEvent>> springReleaseAsMessage() {
return message -> {
SpringReleaseEvent updated = springRelease().apply(message.getPayload());
return CloudEventMessageBuilder.withData(updated)
.copyHeaders(message.getHeaders())
.setSource("https://spring.release.event")
.setType(SpringReleaseEvent.class.getName())
.build();
};
}
}
public static class Person {

View File

@@ -46,7 +46,7 @@ public class CloudEventMessageUtilsAndBuilderTests {
Message<String> kafkaMessage = CloudEventMessageBuilder.fromMessage(httpMessage).build(CloudEventMessageUtils.KAFKA_ATTR_PREFIX);
attributes = CloudEventMessageUtils.getAttributes(kafkaMessage);
assertThat(attributes.size()).isEqualTo(3);
assertThat(attributes.size()).isEqualTo(4); // id will be auto injected, so always at least 4 (as tehre are 4 required attributes in CE)
assertThat(kafkaMessage.getHeaders().get("ce_source")).isNotNull();
assertThat(CloudEventMessageUtils.getSource(kafkaMessage)).isEqualTo(URI.create("https://foo.bar"));
assertThat(kafkaMessage.getHeaders().get("ce_type")).isNotNull();
@@ -56,7 +56,7 @@ public class CloudEventMessageUtilsAndBuilderTests {
httpMessage = CloudEventMessageBuilder.fromMessage(kafkaMessage).build(CloudEventMessageUtils.DEFAULT_ATTR_PREFIX);
attributes = CloudEventMessageUtils.getAttributes(httpMessage);
assertThat(attributes.size()).isEqualTo(3);
assertThat(attributes.size()).isEqualTo(4); //
assertThat(httpMessage.getHeaders().get("ce-source")).isNotNull();
assertThat(CloudEventMessageUtils.getSource(httpMessage)).isEqualTo(URI.create("https://foo.bar"));
assertThat(httpMessage.getHeaders().get("ce-type")).isNotNull();