View Javadoc

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      * #x9 | #xA | #xD | [#x20 to #xD7FF] | [#xE000 to #xFFFD] | [#x10000 to #x10FFFF]
127      *
128      * (see http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)
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 }