1 package com.github.davidmoten.aws.lw.client.internal.util;
2
3 import static org.junit.Assert.assertArrayEquals;
4 import static org.junit.Assert.assertEquals;
5 import static org.junit.Assert.assertFalse;
6 import static org.junit.Assert.assertTrue;
7
8 import java.io.ByteArrayInputStream;
9 import java.io.IOException;
10 import java.io.InputStream;
11 import java.io.UncheckedIOException;
12 import java.net.URL;
13 import java.nio.charset.StandardCharsets;
14 import java.util.Collections;
15 import java.util.Optional;
16 import java.util.concurrent.atomic.AtomicBoolean;
17
18 import org.junit.Assert;
19 import org.junit.Ignore;
20 import org.junit.Test;
21
22 import com.github.davidmoten.junit.Asserts;
23
24 public class UtilTest {
25
26 @Test
27 public void isUtilityClass() {
28 Asserts.assertIsUtilityClass(Util.class);
29 }
30
31 @Test(expected = RuntimeException.class)
32 public void testHash() {
33 Util.hash("hi there".getBytes(StandardCharsets.UTF_8), "does not exist");
34 }
35
36 @Test(expected = RuntimeException.class)
37 public void testToUrl() {
38 Util.toUrl("bad");
39 }
40
41 @Test(expected = RuntimeException.class)
42 public void testUrlEncode() {
43 Util.urlEncode("abc://google.com", true, "does not exist");
44 }
45
46 @Test
47 public void testCreateConnectionBad() throws IOException {
48 Util.createHttpConnection(new URL("https://doesnotexist.never12345"), "GET",
49 Collections.emptyMap(), 100, 100);
50 }
51
52 @Test
53 public void testReadAndClose() {
54 byte[] b = "hi there".getBytes(StandardCharsets.UTF_8);
55 ByteArrayInputStream in = new ByteArrayInputStream(b);
56 assertArrayEquals(b, Util.readBytesAndClose(in));
57 }
58
59 @Test
60 public void testReadAndCloseReadThrows() {
61 AtomicBoolean closed = new AtomicBoolean();
62 InputStream in = new InputStream() {
63
64 @Override
65 public int read() throws IOException {
66 throw new IOException("boo");
67 }
68
69 @Override
70 public void close() {
71 closed.set(true);
72 }
73 };
74 try {
75 Util.readBytesAndClose(in);
76 Assert.fail();
77 } catch (UncheckedIOException e) {
78
79 assertTrue(closed.get());
80 }
81 }
82
83 @Test
84 public void testReadAndCloseThrows() {
85 InputStream in = new InputStream() {
86
87 @Override
88 public int read() throws IOException {
89 return -1;
90 }
91
92 @Override
93 public void close() throws IOException {
94 throw new IOException("boo");
95 }
96 };
97 try {
98 Util.readBytesAndClose(in);
99 Assert.fail();
100 } catch (UncheckedIOException e) {
101
102 }
103 }
104
105 @Test
106 public void testCanonicalMetadata() {
107 assertEquals("abc123", Util.canonicalMetadataKey("abc123"));
108 }
109
110 @Test
111 public void testCanonicalMetadataIgnoresDisallowedCharacters() {
112 assertEquals("abc123", Util.canonicalMetadataKey("abc123@!"));
113 }
114
115
116
117 @Test
118 public void testJsonFieldTextExtractStringField() {
119 String json = "{\"name\":\"John\"}";
120 assertEquals(Optional.of("John"), Util.jsonFieldText(json, "name"));
121 }
122
123 @Test
124 public void testJsonFieldTextExtractStringFieldWithEscapedQuotes() {
125 String json = "{\"name\":\"John \\\"Doe\\\"\"}";
126 assertEquals(Optional.of("John \"Doe\""), Util.jsonFieldText(json, "name"));
127 }
128
129 @Test
130 public void testJsonFieldTextExtractNonStringField() {
131 String json = "{\"age\":30}";
132 assertEquals(Optional.of("30"), Util.jsonFieldText(json, "age"));
133 }
134
135 @Test
136 public void testJsonFieldTextExtractBooleanField() {
137 String json = "{\"isActive\":true}";
138 assertEquals(Optional.of("true"), Util.jsonFieldText(json, "isActive"));
139 }
140
141 @Test
142 @Ignore
143 public void testJsonFieldTextExtractNullField() {
144 String json = "{\"middleName\":null}";
145 assertEquals(Optional.of("null"), Util.jsonFieldText(json, "middleName"));
146 }
147
148 @Test
149 public void testJsonFieldTextFieldNotFound() {
150 String json = "{\"name\":\"John\"}";
151 assertEquals(Optional.empty(), Util.jsonFieldText(json, "age"));
152 }
153
154 @Test
155 public void testJsonFieldTextEmptyJson() {
156 String json = "{}";
157 assertEquals(Optional.empty(), Util.jsonFieldText(json, "name"));
158 }
159
160 @Test
161 public void testJsonFieldTextJsonWithWhitespace() {
162 String json = " { \"name\" : \"John\" , \"age\" : 30 } ";
163 assertEquals(Optional.of("John"), Util.jsonFieldText(json, "name"));
164 assertEquals(Optional.of("30"), Util.jsonFieldText(json, "age"));
165 }
166
167 @Test
168 public void testJsonFieldTextJsonWithExtraFields() {
169 String json = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
170 assertEquals(Optional.of("John"), Util.jsonFieldText(json, "name"));
171 assertEquals(Optional.of("30"), Util.jsonFieldText(json, "age"));
172 assertEquals(Optional.of("New York"), Util.jsonFieldText(json, "city"));
173 }
174
175 @Test
176 public void testJsonFieldTextJsonWithNestedQuotesInStringField() {
177 String json = "{\"quote\":\"\\\"To be or not to be\\\"\"}";
178 assertEquals(Optional.of("\"To be or not to be\""), Util.jsonFieldText(json, "quote"));
179 }
180
181 @Test
182 public void testJsonFieldTextJsonWithTrailingComma() {
183 String json = "{\"name\":\"John\",}";
184 assertEquals(Optional.of("John"), Util.jsonFieldText(json, "name"));
185 }
186
187 @Test
188 public void testJsonFieldTextFieldWithSpecialCharacters() {
189 String json = "{\"key-1\":\"value!@#$%^&*()\"}";
190 assertEquals(Optional.of("value!@#$%^&*()"), Util.jsonFieldText(json, "key-1"));
191 }
192
193 @Test
194 public void testJsonFieldTextMultipleFieldsWithSameName() {
195 String json = "{\"name\":\"John\", \"other\":{\"name\":\"Doe\"}}";
196 assertEquals(Optional.of("John"), Util.jsonFieldText(json, "name"));
197 }
198
199 @Test
200 public void testJsonFieldNoColon() {
201 String json = "[\"name\"]";
202 assertFalse(Util.jsonFieldText(json, "name").isPresent());
203 }
204
205 @Test
206 public void testJsonFieldIsNull() {
207 String json = "{\"name\": null}";
208 assertFalse(Util.jsonFieldText(json, "name").isPresent());
209 }
210 }