|
14 | 14 | import org.mockito.junit.jupiter.MockitoExtension; |
15 | 15 | import org.slf4j.MDC; |
16 | 16 | import software.amazon.lambda.powertools.metrics.Metrics; |
| 17 | +import software.amazon.lambda.powertools.metrics.internal.Validator; |
17 | 18 | import software.amazon.lambda.powertools.metrics.model.DimensionSet; |
18 | 19 | import software.amazon.lambda.powertools.metrics.model.MetricUnit; |
19 | 20 |
|
20 | 21 | import java.util.Map; |
21 | 22 |
|
22 | 23 | import static org.hamcrest.MatcherAssert.assertThat; |
23 | 24 | import static org.hamcrest.Matchers.equalTo; |
| 25 | +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; |
24 | 26 | import static org.junit.jupiter.api.Assertions.assertEquals; |
25 | 27 | import static org.junit.jupiter.api.Assertions.assertFalse; |
26 | 28 | import static org.junit.jupiter.api.Assertions.assertNotNull; |
27 | 29 | import static org.junit.jupiter.api.Assertions.assertNull; |
28 | 30 | import static org.junit.jupiter.api.Assertions.assertSame; |
29 | 31 | import static org.junit.jupiter.api.Assertions.assertTrue; |
30 | 32 | import static org.mockito.ArgumentMatchers.any; |
| 33 | +import static org.mockito.ArgumentMatchers.anyString; |
| 34 | +import static org.mockito.Mockito.doReturn; |
| 35 | +import static org.mockito.Mockito.doThrow; |
| 36 | +import static org.mockito.Mockito.mock; |
31 | 37 | import static org.mockito.Mockito.never; |
| 38 | +import static org.mockito.Mockito.spy; |
32 | 39 | import static org.mockito.Mockito.verify; |
33 | 40 |
|
34 | 41 | @ExtendWith(MockitoExtension.class) |
@@ -203,7 +210,79 @@ void shouldCleanMetricDimension() { |
203 | 210 | assertEquals("this_has_whitespace", EventProbe.clean("this has whitespace")); |
204 | 211 | assertEquals("correct_value", EventProbe.clean("correct_value")); |
205 | 212 | assertEquals("no_content", EventProbe.clean("")); |
| 213 | + assertEquals("no_content", EventProbe.clean(" ")); |
206 | 214 | assertEquals("no_content", EventProbe.clean(null)); |
207 | 215 | assertEquals("test_test", EventProbe.clean("test\ntest")); |
| 216 | + assertEquals("test", EventProbe.clean(":test")); |
| 217 | + assertEquals("test", EventProbe.clean("::test")); |
| 218 | + assertEquals("no_content", EventProbe.clean(":")); |
| 219 | + assertEquals(250, EventProbe.clean("1".repeat(300)).length()); |
| 220 | + assertEquals( |
| 221 | + "includes_non_ascii_printable___char", |
| 222 | + EventProbe.clean("includes_non_ascii_printable_¬_char")); |
| 223 | + } |
| 224 | + |
| 225 | + @Test |
| 226 | + void shouldCleanAComplexString() { |
| 227 | + String complexString = |
| 228 | + EventProbe.clean( |
| 229 | + """ |
| 230 | + :Hello world\t😀 |
| 231 | + éñö @@##!! 12345 \f \\slashes// ""quotes"" |
| 232 | + line2-with-stuff 🧨🚀✨ |
| 233 | + more-text---here---###$$$%%%&&& |
| 234 | + control-\u0007-char |
| 235 | + 𝔘𝔫𝔦𝔠𝔬𝔡𝔢 block |
| 236 | + final-line-with: symbols_*&^%$#@!+=()[]{}<>?/|~` |
| 237 | + 😀😀 end |
| 238 | + """ |
| 239 | + .repeat(500)); |
| 240 | + |
| 241 | + assertDoesNotThrow(() -> Validator.validateDimension("_", complexString)); |
| 242 | + assertEquals(250, complexString.length()); |
| 243 | + } |
| 244 | + |
| 245 | + @Test |
| 246 | + void shouldFallbackOnBadMetric() { |
| 247 | + assertDoesNotThrow(() -> eventProbe.counterMetric("with space")); |
| 248 | + assertDoesNotThrow(() -> eventProbe.counterMetric("with space", 1d)); |
| 249 | + } |
| 250 | + |
| 251 | + @Test |
| 252 | + void counterMetricHandlesExceptionGracefully() { |
| 253 | + doThrow(new RuntimeException("error")).when(mockMetrics).addMetric("bad metric", 1d); |
| 254 | + |
| 255 | + EventProbe result = assertDoesNotThrow(() -> eventProbe.counterMetric("bad-metric")); |
| 256 | + |
| 257 | + verify(mockMetrics).addMetric("bad-metric", 1d); |
| 258 | + assertSame(eventProbe, result); |
| 259 | + } |
| 260 | + |
| 261 | + @Test |
| 262 | + void counterMetricWithValueHandlesExceptionGracefully() { |
| 263 | + doThrow(new RuntimeException("error")).when(mockMetrics).addMetric("bad-metric-2", 42d); |
| 264 | + |
| 265 | + EventProbe result = assertDoesNotThrow(() -> eventProbe.counterMetric("bad-metric-2", 42d)); |
| 266 | + |
| 267 | + verify(mockMetrics).addMetric("bad-metric-2", 42d); |
| 268 | + assertSame(eventProbe, result); |
| 269 | + } |
| 270 | + |
| 271 | + @Test |
| 272 | + void addDimensionsHandlesExceptionsGracefully() { |
| 273 | + DimensionSet mockSet = mock(DimensionSet.class); |
| 274 | + |
| 275 | + doThrow(new RuntimeException("error")).when(mockSet).addDimension(anyString(), anyString()); |
| 276 | + |
| 277 | + EventProbe spyProbe = spy(new EventProbe(mockMetrics)); |
| 278 | + doReturn(mockSet).when(spyProbe).newDimensionSet(); |
| 279 | + |
| 280 | + doThrow(new RuntimeException("error")) |
| 281 | + .when(mockMetrics) |
| 282 | + .addDimension(any(DimensionSet.class)); |
| 283 | + |
| 284 | + assertDoesNotThrow(() -> spyProbe.addDimensions(Map.of("bad Key", "bad Value"))); |
| 285 | + |
| 286 | + verify(mockMetrics).addDimension(mockSet); |
208 | 287 | } |
209 | 288 | } |
0 commit comments