MAILBOX-332 Enforce event deserialization stability Store JSON in files to prevent them to be changed by IDE refactorings
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/409792c2 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/409792c2 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/409792c2 Branch: refs/heads/master Commit: 409792c2499fea1a792f4e23eb421e4e0e69cbb1 Parents: 0a393f6 Author: benwa <btell...@linagora.com> Authored: Wed May 9 16:48:15 2018 +0700 Committer: benwa <btell...@linagora.com> Committed: Thu May 10 09:15:41 2018 +0700 ---------------------------------------------------------------------- .../mailbox/quota/cassandra/dto/DTOTest.java | 111 ++++++++++++++----- .../src/test/resources/json/event.json | 19 ++++ .../src/test/resources/json/event2.json | 20 ++++ .../src/test/resources/json/event3.json | 23 ++++ .../src/test/resources/json/event4.json | 23 ++++ .../org/apache/james/util/ClassLoaderUtils.java | 16 ++- 6 files changed, 180 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/409792c2/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java ---------------------------------------------------------------------- diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java index a42725a..2f48a55 100644 --- a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java +++ b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java @@ -20,8 +20,12 @@ package org.apache.james.mailbox.quota.cassandra.dto; import static net.javacrumbs.jsonunit.fluent.JsonFluentAssert.assertThatJson; +import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture._75; +import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture._80; import static org.assertj.core.api.Assertions.assertThat; +import java.time.Instant; + import org.apache.james.core.User; import org.apache.james.eventsourcing.EventId; import org.apache.james.eventsourcing.cassandra.JsonEventSerializer; @@ -31,6 +35,8 @@ import org.apache.james.mailbox.quota.QuotaSize; import org.apache.james.mailbox.quota.mailing.aggregates.UserQuotaThresholds; import org.apache.james.mailbox.quota.mailing.events.QuotaThresholdChangedEvent; import org.apache.james.mailbox.quota.model.HistoryEvolution; +import org.apache.james.mailbox.quota.model.QuotaThresholdChange; +import org.apache.james.util.ClassLoaderUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -42,6 +48,7 @@ class DTOTest { public static final Quota<QuotaSize> SIZE_QUOTA = Quota.<QuotaSize>builder().used(QuotaSize.size(23)).computedLimit(QuotaSize.size(33)).build(); public static final Quota<QuotaCount> COUNT_QUOTA = Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.count(45)).build(); + public static final Instant INSTANT = Instant.ofEpochMilli(45554); public static final QuotaThresholdChangedEvent EVENT = new QuotaThresholdChangedEvent( EventId.first(), HistoryEvolution.noChanges(), @@ -49,32 +56,34 @@ class DTOTest { SIZE_QUOTA, COUNT_QUOTA, UserQuotaThresholds.Id.from(User.fromUsername("f...@bar.com"))); + public static final QuotaThresholdChangedEvent EVENT_2 = new QuotaThresholdChangedEvent( + EventId.first(), + HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)), + HistoryEvolution.noChanges(), + SIZE_QUOTA, + Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(), + UserQuotaThresholds.Id.from(User.fromUsername("f...@bar.com"))); + public static final QuotaThresholdChangedEvent EVENT_3 = new QuotaThresholdChangedEvent( + EventId.first(), + HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)), + HistoryEvolution.higherThresholdReached(new QuotaThresholdChange(_80, INSTANT), + HistoryEvolution.HighestThresholdRecentness.NotAlreadyReachedDuringGracePeriod), + SIZE_QUOTA, + Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(), + UserQuotaThresholds.Id.from(User.fromUsername("f...@bar.com"))); + public static final QuotaThresholdChangedEvent EVENT_4 = new QuotaThresholdChangedEvent( + EventId.first(), + HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)), + HistoryEvolution.higherThresholdReached(new QuotaThresholdChange(_80, INSTANT), + HistoryEvolution.HighestThresholdRecentness.AlreadyReachedDuringGracePeriod), + SIZE_QUOTA, + Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(), + UserQuotaThresholds.Id.from(User.fromUsername("f...@bar.com"))); - public static final String EVENT_JSON = "{" + - " \"type\": \"quota-threshold-change\"," + - " \"eventId\": 0," + - " \"user\": \"f...@bar.com\"," + - " \"sizeQuota\": {" + - " \"used\": 23," + - " \"limit\": 33" + - " }," + - " \"countQuota\": {" + - " \"used\": 12," + - " \"limit\": 45" + - " }," + - " \"sizeEvolution\": {" + - " \"change\": \"NoChange\"," + - " \"threshold\": null," + - " \"instant\": null," + - " \"recentness\": null" + - " }," + - " \"countEvolution\": {" + - " \"change\": \"NoChange\"," + - " \"threshold\": null," + - " \"instant\": null," + - " \"recentness\": null" + - " }" + - "}"; + public static final String EVENT_JSON = ClassLoaderUtils.getSystemResourceAsString("json/event.json"); + public static final String EVENT_JSON_2 = ClassLoaderUtils.getSystemResourceAsString("json/event2.json"); + public static final String EVENT_JSON_3 = ClassLoaderUtils.getSystemResourceAsString("json/event3.json"); + public static final String EVENT_JSON_4 = ClassLoaderUtils.getSystemResourceAsString("json/event4.json"); public static final String COUNT_QUOTA_JSON = "{" + " \"used\": 12," + @@ -129,9 +138,6 @@ class DTOTest { @Test void shouldDeserializeQuotaThresholdChangedEventDTO() throws Exception { - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.registerModule(new Jdk8Module()); - assertThat(objectMapper.readValue(EVENT_JSON, QuotaThresholdChangedEventDTO.class) .toEvent()) .isEqualTo(EVENT); @@ -144,4 +150,53 @@ class DTOTest { .isEqualTo(EVENT_JSON); } + @Test + void shouldDeserializeQuotaThresholdChangedEvent() throws Exception { + assertThatJson(new JsonEventSerializer(new QuotaThresholdChangedEventDTOModule()) + .deserialize(EVENT_JSON)) + .isEqualTo(EVENT); + } + + @Test + void shouldSerializeEvent2() throws Exception { + assertThatJson(new JsonEventSerializer(new QuotaThresholdChangedEventDTOModule()) + .serialize(EVENT_2)) + .isEqualTo(EVENT_JSON_2); + } + + @Test + void shouldDeserializeEvent2() throws Exception { + assertThatJson(new JsonEventSerializer(new QuotaThresholdChangedEventDTOModule()) + .deserialize(EVENT_JSON_2)) + .isEqualTo(EVENT_2); + } + + @Test + void shouldSerializeEvent3() throws Exception { + assertThatJson(new JsonEventSerializer(new QuotaThresholdChangedEventDTOModule()) + .serialize(EVENT_3)) + .isEqualTo(EVENT_JSON_3); + } + + @Test + void shouldDeserializeEvent3() throws Exception { + assertThatJson(new JsonEventSerializer(new QuotaThresholdChangedEventDTOModule()) + .deserialize(EVENT_JSON_3)) + .isEqualTo(EVENT_3); + } + + @Test + void shouldSerializeEvent4() throws Exception { + assertThatJson(new JsonEventSerializer(new QuotaThresholdChangedEventDTOModule()) + .serialize(EVENT_4)) + .isEqualTo(EVENT_JSON_4); + } + + @Test + void shouldDeserializeEvent4() throws Exception { + assertThatJson(new JsonEventSerializer(new QuotaThresholdChangedEventDTOModule()) + .deserialize(EVENT_JSON_4)) + .isEqualTo(EVENT_4); + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/409792c2/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event.json ---------------------------------------------------------------------- diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event.json b/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event.json new file mode 100644 index 0000000..4449047 --- /dev/null +++ b/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event.json @@ -0,0 +1,19 @@ +{ + "type": "quota-threshold-change", + "eventId": 0, + "user": "f...@bar.com", + "sizeQuota": { + "used": 23, + "limit": 33 + }, + "countQuota": { + "used": 12, + "limit": 45 + }, + "sizeEvolution": { + "change": "NoChange" + }, + "countEvolution": { + "change": "NoChange" + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/409792c2/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event2.json ---------------------------------------------------------------------- diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event2.json b/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event2.json new file mode 100644 index 0000000..b20cfab --- /dev/null +++ b/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event2.json @@ -0,0 +1,20 @@ +{ + "type":"quota-threshold-change", + "eventId":0, + "user":"f...@bar.com", + "sizeQuota":{ + "used":23, + "limit":33 + }, + "countQuota":{ + "used":12 + }, + "sizeEvolution":{ + "threshold":0.75, + "instant":45554, + "change":"LowerThresholdReached" + }, + "countEvolution":{ + "change":"NoChange" + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/409792c2/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event3.json ---------------------------------------------------------------------- diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event3.json b/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event3.json new file mode 100644 index 0000000..4bda126 --- /dev/null +++ b/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event3.json @@ -0,0 +1,23 @@ +{ + "type":"quota-threshold-change", + "eventId":0, + "user":"f...@bar.com", + "sizeQuota":{ + "used":23, + "limit":33 + }, + "countQuota":{ + "used":12 + }, + "sizeEvolution":{ + "threshold":0.75, + "instant":45554, + "change":"LowerThresholdReached" + }, + "countEvolution":{ + "recentness":"NotAlreadyReachedDuringGracePeriod", + "threshold":0.8, + "instant":45554, + "change":"HigherThresholdReached" + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/409792c2/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event4.json ---------------------------------------------------------------------- diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event4.json b/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event4.json new file mode 100644 index 0000000..0852dc5 --- /dev/null +++ b/mailbox/plugin/quota-mailing-cassandra/src/test/resources/json/event4.json @@ -0,0 +1,23 @@ +{ + "type":"quota-threshold-change", + "eventId":0, + "user":"f...@bar.com", + "sizeQuota":{ + "used":23, + "limit":33 + }, + "countQuota":{ + "used":12 + }, + "sizeEvolution":{ + "threshold":0.75, + "instant":45554, + "change":"LowerThresholdReached" + }, + "countEvolution":{ + "recentness":"AlreadyReachedDuringGracePeriod", + "threshold":0.8, + "instant":45554, + "change":"HigherThresholdReached" + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/409792c2/server/container/util-java8/src/main/java/org/apache/james/util/ClassLoaderUtils.java ---------------------------------------------------------------------- diff --git a/server/container/util-java8/src/main/java/org/apache/james/util/ClassLoaderUtils.java b/server/container/util-java8/src/main/java/org/apache/james/util/ClassLoaderUtils.java index d7df10a..89574b6 100644 --- a/server/container/util-java8/src/main/java/org/apache/james/util/ClassLoaderUtils.java +++ b/server/container/util-java8/src/main/java/org/apache/james/util/ClassLoaderUtils.java @@ -25,11 +25,19 @@ import java.nio.charset.StandardCharsets; import org.apache.commons.io.IOUtils; public class ClassLoaderUtils { - public static String getSystemResourceAsString(String filename) throws IOException { - return IOUtils.toString(ClassLoader.getSystemResourceAsStream(filename), StandardCharsets.US_ASCII); + public static String getSystemResourceAsString(String filename) { + try { + return IOUtils.toString(ClassLoader.getSystemResourceAsStream(filename), StandardCharsets.US_ASCII); + } catch (IOException e) { + throw new RuntimeException(e); + } } - public static byte[] getSystemResourceAsByteArray(String filename) throws IOException { - return IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream(filename)); + public static byte[] getSystemResourceAsByteArray(String filename) { + try { + return IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream(filename)); + } catch (IOException e) { + throw new RuntimeException(e); + } } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org