1 package com.atlassian.messagequeue.internal.core;
2
3 import org.junit.Before;
4 import org.junit.Rule;
5 import org.junit.Test;
6 import org.mockito.junit.MockitoJUnit;
7 import org.mockito.junit.MockitoRule;
8
9 import javax.annotation.Nonnull;
10
11 import static com.atlassian.messagequeue.internal.core.NestedMessageConstants.MESSAGE_RUNNER_KEY_ATTRIBUTE_NAME;
12 import static com.atlassian.messagequeue.internal.core.NestedMessageConstants.TENANT_ID_ATTRIBUTE_NAME;
13 import static org.hamcrest.CoreMatchers.is;
14 import static org.hamcrest.CoreMatchers.nullValue;
15 import static org.junit.Assert.assertThat;
16
17 public abstract class AbstractNestedMessageSerializerTest {
18 private NestedMessageSerializer serializer;
19
20 @Rule
21 public MockitoRule mockitoRule = MockitoJUnit.rule();
22
23 @Before
24 public void setUp() throws Exception {
25 serializer = newNestedMessageSerializer();
26 }
27
28 @Nonnull
29 abstract NestedMessageSerializer newNestedMessageSerializer();
30
31 private static String codePointToString(int i) {
32 return String.valueOf(Character.toChars(i));
33 }
34
35 @Test
36 public void serialize() throws Exception {
37 NestedMessage nestedMessage = new NestedMessage()
38 .addAttribute(TENANT_ID_ATTRIBUTE_NAME, "tenant-123")
39 .addAttribute(MESSAGE_RUNNER_KEY_ATTRIBUTE_NAME, "fooMessageRunner")
40 .setPayload("body");
41
42 String result = serializer.serialize(nestedMessage);
43
44 assertThat(result, is("{\"attributes\":{\"tenantId\":\"tenant-123\"," +
45 "\"messageRunnerKey\":\"fooMessageRunner\"}," +
46 "\"payload\":\"body\"}"));
47 }
48
49 @Test
50 public void deserialize() throws Exception {
51 NestedMessage nestedMessage = serializer.deserialize("{\"attributes\":{\"tenantId\":\"tenant-123\"," +
52 "\"messageRunnerKey\":\"fooMessageRunner\"}," +
53 "\"payload\":\"body\"}");
54
55 assertThat(nestedMessage.getAttribute(TENANT_ID_ATTRIBUTE_NAME), is("tenant-123"));
56 assertThat(nestedMessage.getAttribute(MESSAGE_RUNNER_KEY_ATTRIBUTE_NAME), is("fooMessageRunner"));
57 assertThat(nestedMessage.getPayload(), is("body"));
58 }
59
60 @Test
61 public void serializeNullPayload() throws Exception {
62 NestedMessage nestedMessage = new NestedMessage()
63 .addAttribute(TENANT_ID_ATTRIBUTE_NAME, "tenant-123")
64 .addAttribute(MESSAGE_RUNNER_KEY_ATTRIBUTE_NAME, "fooMessageRunner")
65 .setPayload(null);
66
67 String result = serializer.serialize(nestedMessage);
68
69 assertThat(result, is("{\"attributes\":{\"tenantId\":\"tenant-123\"," +
70 "\"messageRunnerKey\":\"fooMessageRunner\"}," +
71 "\"payload\":null}"));
72 }
73
74 @Test
75 public void serializeEmptyPayload() throws Exception {
76 NestedMessage nestedMessage = new NestedMessage()
77 .addAttribute(TENANT_ID_ATTRIBUTE_NAME, "tenant-123")
78 .addAttribute(MESSAGE_RUNNER_KEY_ATTRIBUTE_NAME, "fooMessageRunner")
79 .setPayload("");
80
81 String result = serializer.serialize(nestedMessage);
82
83 assertThat(result, is("{\"attributes\":{\"tenantId\":\"tenant-123\"," +
84 "\"messageRunnerKey\":\"fooMessageRunner\"}," +
85 "\"payload\":\"\"}"));
86 }
87
88 @Test
89 public void deserializeNullPayload() throws Exception {
90 NestedMessage nestedMessage = serializer.deserialize("{\"attributes\":{\"tenantId\":\"tenant-123\"," +
91 "\"messageRunnerKey\":\"fooMessageRunner\"}," +
92 "\"payload\":null}");
93
94 assertThat(nestedMessage.getAttribute(TENANT_ID_ATTRIBUTE_NAME), is("tenant-123"));
95 assertThat(nestedMessage.getAttribute(MESSAGE_RUNNER_KEY_ATTRIBUTE_NAME), is("fooMessageRunner"));
96 assertThat(nestedMessage.getPayload(), is(nullValue()));
97 }
98
99 @Test
100 public void deserializeEmptyPayload() throws Exception {
101 NestedMessage nestedMessage = serializer.deserialize("{\"attributes\":{\"tenantId\":\"tenant-123\"," +
102 "\"messageRunnerKey\":\"fooMessageRunner\"}," +
103 "\"payload\":\"\"}");
104
105 assertThat(nestedMessage.getAttribute(TENANT_ID_ATTRIBUTE_NAME), is("tenant-123"));
106 assertThat(nestedMessage.getAttribute(MESSAGE_RUNNER_KEY_ATTRIBUTE_NAME), is("fooMessageRunner"));
107 assertThat(nestedMessage.getPayload(), is(""));
108 }
109
110 @Test
111 public void preserveDoubleQuote() throws Exception {
112 assertValuePreservedAfterRoundTrip("foo \" bar");
113 }
114
115 @Test
116 public void preserveBackslash() throws Exception {
117 assertValuePreservedAfterRoundTrip("foo \\ bar");
118 }
119
120 @Test
121 public void preserveBase64Encoding() throws Exception {
122 assertValuePreservedAfterRoundTrip("c3ViamVjdHM/X2Q9MQ==");
123 }
124
125
126
127
128
129
130 @Test
131 public void preserveSQSUnicodeCodePoints() throws Exception {
132 assertValuePreservedAfterRoundTrip(codePointToString(0x9));
133 assertValuePreservedAfterRoundTrip(codePointToString(0xA));
134 assertValuePreservedAfterRoundTrip(codePointToString(0xD));
135
136 for (int i = 0x20; i <= 0xD7FF; i++) {
137 assertValuePreservedAfterRoundTrip(codePointToString(i));
138 }
139
140 for (int i = 0xE000; i <= 0xFFFD; i++) {
141 assertValuePreservedAfterRoundTrip(codePointToString(i));
142 }
143
144 for (int i = 0x10000; i <= 0x10FFFF; i++) {
145 assertValuePreservedAfterRoundTrip(codePointToString(i));
146 }
147 }
148
149 private void assertValuePreservedAfterRoundTrip(String value) {
150 NestedMessage nestedMessage = new NestedMessage()
151 .addAttribute("foo", value)
152 .setPayload(value);
153
154 assertThat(serializer.deserialize(serializer.serialize(nestedMessage)).getPayload(), is(value));
155 }
156 }