View Javadoc
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              // expected
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             // expected
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     // json tests generated by chatgpt
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 // should return empty
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 }