Skip to content

Commit c7aedc4

Browse files
eldimijeromevdl
andauthored
chore(unit-test): Add missing unit tests in modules with low coverage (#1264)
* chore(unit-tests): add unit tests to powertools-core * chore(unit-tests): add unit tests to powertools-parameters * chore(unit-tests): add unit tests to powertools-serialization * chore(unit-tests): add unit tests to powertools-validation * chore(unit-tests): add unit tests to powertools-logging * chore(unit-tests): minor formatting fixes * chore(unit-tests): add missing return statement * chore(unit-test): rename, reformat, fix typos as suggested from code review Co-authored-by: Jérôme Van Der Linden <[email protected]> * chore(unit-tests): address review comments * chore(unit-tests): revert refactoring of EventDeserializer * chore(unit-tests): expand and optimize imports * chore(unit-tests): change response of base64gzip when decompressing empty string * chore(unit-tests): add unit test and fix config for wrong arg type in base64gzip function invocation * chore(unit-tests): fix base64gzip function invocation for argument value argument --------- Co-authored-by: Jérôme Van Der Linden <[email protected]>
1 parent 2c282a9 commit c7aedc4

File tree

79 files changed

+1728
-316
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1728
-316
lines changed

Diff for: pom.xml

+1
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@
516516
<version>3.1.2</version>
517517
<configuration>
518518
<argLine>
519+
@{argLine}
519520
--add-opens java.base/java.util=ALL-UNNAMED
520521
--add-opens java.base/java.lang=ALL-UNNAMED
521522
</argLine>

Diff for: powertools-core/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@
8282
<artifactId>assertj-core</artifactId>
8383
<scope>test</scope>
8484
</dependency>
85+
<dependency>
86+
<groupId>org.mockito</groupId>
87+
<artifactId>mockito-inline</artifactId>
88+
<scope>test</scope>
89+
</dependency>
8590
</dependencies>
8691

8792
</project>

Diff for: powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/LambdaConstants.java

+5
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,9 @@ public class LambdaConstants {
1818
public static final String AWS_REGION_ENV = "AWS_REGION";
1919
public static final String AWS_LAMBDA_INITIALIZATION_TYPE = "AWS_LAMBDA_INITIALIZATION_TYPE";
2020
public static final String ON_DEMAND = "on-demand";
21+
public static final String X_AMZN_TRACE_ID = "_X_AMZN_TRACE_ID";
22+
public static final String AWS_SAM_LOCAL = "AWS_SAM_LOCAL";
23+
public static final String ROOT_EQUALS = "Root=";
24+
public static final String POWERTOOLS_SERVICE_NAME = "POWERTOOLS_SERVICE_NAME";
25+
public static final String SERVICE_UNDEFINED = "service_undefined";
2126
}

Diff for: powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/LambdaHandlerProcessor.java

+23-16
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,21 @@
2727
import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv;
2828

2929
public final class LambdaHandlerProcessor {
30+
3031
// SERVICE_NAME cannot be final for testing purposes
31-
private static String SERVICE_NAME = null != System.getenv("POWERTOOLS_SERVICE_NAME")
32-
? System.getenv("POWERTOOLS_SERVICE_NAME") : "service_undefined";
32+
private static String SERVICE_NAME = calculateServiceName();
33+
3334
private static Boolean IS_COLD_START = null;
3435

3536
private LambdaHandlerProcessor() {
3637
// Hide default constructor
3738
}
3839

40+
private static String calculateServiceName() {
41+
return null != getenv(LambdaConstants.POWERTOOLS_SERVICE_NAME)
42+
? getenv(LambdaConstants.POWERTOOLS_SERVICE_NAME) : LambdaConstants.SERVICE_UNDEFINED;
43+
}
44+
3945
public static boolean isHandlerMethod(final ProceedingJoinPoint pjp) {
4046
return placedOnRequestHandler(pjp) || placedOnStreamHandler(pjp);
4147
}
@@ -56,23 +62,24 @@ public static boolean placedOnStreamHandler(final ProceedingJoinPoint pjp) {
5662

5763
public static Context extractContext(final ProceedingJoinPoint pjp) {
5864

59-
if (isHandlerMethod(pjp)) {
60-
if (placedOnRequestHandler(pjp)) {
61-
return (Context) pjp.getArgs()[1];
62-
}
63-
64-
if (placedOnStreamHandler(pjp)) {
65-
return (Context) pjp.getArgs()[2];
66-
}
65+
if (placedOnRequestHandler(pjp)) {
66+
return (Context) pjp.getArgs()[1];
67+
} else if (placedOnStreamHandler(pjp)) {
68+
return (Context) pjp.getArgs()[2];
69+
} else {
70+
return null;
6771
}
68-
69-
return null;
7072
}
7173

7274
public static String serviceName() {
7375
return SERVICE_NAME;
7476
}
7577

78+
// Method used for testing purposes
79+
protected static void resetServiceName() {
80+
SERVICE_NAME = calculateServiceName();
81+
}
82+
7683
public static boolean isColdStart() {
7784
return IS_COLD_START == null;
7885
}
@@ -82,13 +89,13 @@ public static void coldStartDone() {
8289
}
8390

8491
public static boolean isSamLocal() {
85-
return "true".equals(System.getenv("AWS_SAM_LOCAL"));
92+
return "true".equals(getenv(LambdaConstants.AWS_SAM_LOCAL));
8693
}
8794

8895
public static Optional<String> getXrayTraceId() {
89-
final String X_AMZN_TRACE_ID = getenv("_X_AMZN_TRACE_ID");
90-
if(X_AMZN_TRACE_ID != null) {
91-
return of(X_AMZN_TRACE_ID.split(";")[0].replace("Root=", ""));
96+
final String X_AMZN_TRACE_ID = getenv(LambdaConstants.X_AMZN_TRACE_ID);
97+
if (X_AMZN_TRACE_ID != null) {
98+
return of(X_AMZN_TRACE_ID.split(";")[0].replace(LambdaConstants.ROOT_EQUALS, ""));
9299
}
93100
return empty();
94101
}

Diff for: powertools-core/src/test/java/software/amazon/lambda/powertools/core/internal/LambdaHandlerProcessorTest.java

+187-16
Original file line numberDiff line numberDiff line change
@@ -6,60 +6,231 @@
66
import org.aspectj.lang.ProceedingJoinPoint;
77
import org.aspectj.lang.Signature;
88
import org.junit.jupiter.api.Test;
9+
import org.mockito.MockedStatic;
910

1011
import java.io.InputStream;
1112
import java.io.OutputStream;
13+
import java.util.Optional;
1214

1315
import static org.assertj.core.api.Assertions.assertThat;
16+
import static org.junit.jupiter.api.Assertions.assertNotNull;
1417
import static org.mockito.Mockito.mock;
18+
import static org.mockito.Mockito.mockStatic;
1519
import static org.mockito.Mockito.when;
20+
import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv;
1621

1722
class LambdaHandlerProcessorTest {
1823

24+
private Signature signature = mock(Signature.class);
25+
private ProceedingJoinPoint pjpMock = mock(ProceedingJoinPoint.class);
26+
1927
@Test
2028
void isHandlerMethod_shouldRecognizeRequestHandler() {
21-
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp();
29+
Object[] args = {new Object(), mock(Context.class)};
30+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestHandler.class, args);
2231

2332
assertThat(LambdaHandlerProcessor.isHandlerMethod(pjpMock)).isTrue();
2433
}
2534

2635
@Test
2736
void isHandlerMethod_shouldRecognizeRequestStreamHandler() {
28-
ProceedingJoinPoint pjpMock = mockRequestStreamHandlerPjp();
37+
Object[] args = {mock(InputStream.class), mock(OutputStream.class), mock(Context.class)};
38+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestStreamHandler.class, args);
2939

3040
assertThat(LambdaHandlerProcessor.isHandlerMethod(pjpMock)).isTrue();
3141
}
3242

43+
@Test
44+
void isHandlerMethod_shouldReturnFalse() {
45+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(Object.class, new Object[]{});
46+
47+
boolean isHandlerMethod = LambdaHandlerProcessor.isHandlerMethod(pjpMock);
48+
49+
assertThat(isHandlerMethod).isFalse();
50+
}
51+
3352
@Test
3453
void placedOnRequestHandler_shouldRecognizeRequestHandler() {
35-
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp();
54+
Object[] args = {new Object(), mock(Context.class)};
55+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestHandler.class, args);
3656

3757
assertThat(LambdaHandlerProcessor.placedOnRequestHandler(pjpMock)).isTrue();
3858
}
3959

4060
@Test
4161
void placedOnStreamHandler_shouldRecognizeRequestStreamHandler() {
42-
ProceedingJoinPoint pjpMock = mockRequestStreamHandlerPjp();
62+
Object[] args = {mock(InputStream.class), mock(OutputStream.class), mock(Context.class)};
63+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestStreamHandler.class, args);
4364

4465
assertThat(LambdaHandlerProcessor.placedOnStreamHandler(pjpMock)).isTrue();
4566
}
4667

47-
private static ProceedingJoinPoint mockRequestHandlerPjp() {
48-
Signature signature = mock(Signature.class);
49-
when(signature.getDeclaringType()).thenReturn(RequestHandler.class);
50-
ProceedingJoinPoint pjpMock = mock(ProceedingJoinPoint.class);
68+
@Test
69+
void placedOnRequestHandler_shouldInvalidateOnWrongNoOfArgs() {
70+
Object[] args = {new Object()};
71+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestHandler.class, args);
72+
73+
boolean isPlacedOnRequestHandler = LambdaHandlerProcessor.placedOnRequestHandler(pjpMock);
74+
75+
assertThat(isPlacedOnRequestHandler).isFalse();
76+
}
77+
78+
@Test
79+
void placedOnRequestHandler_shouldInvalidateOnWrongTypeOfArgs() {
80+
Object[] args = {new Object(), new Object()};
81+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestHandler.class, args);
82+
83+
boolean isPlacedOnRequestHandler = LambdaHandlerProcessor.placedOnRequestHandler(pjpMock);
84+
85+
assertThat(isPlacedOnRequestHandler).isFalse();
86+
}
87+
88+
@Test
89+
void placedOnStreamHandler_shouldInvalidateOnWrongNoOfArgs() {
90+
Object[] args = {new Object()};
91+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestStreamHandler.class, args);
92+
93+
boolean isPlacedOnStreamHandler = LambdaHandlerProcessor.placedOnStreamHandler(pjpMock);
94+
95+
assertThat(isPlacedOnStreamHandler).isFalse();
96+
}
97+
98+
@Test
99+
void placedOnStreamHandler_shouldInvalidateOnWrongTypeOfArgs() {
100+
Object[] args = {new Object(), new Object(), new Object()};
101+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestStreamHandler.class, args);
102+
103+
boolean isPlacedOnStreamHandler = LambdaHandlerProcessor.placedOnStreamHandler(pjpMock);
104+
105+
assertThat(isPlacedOnStreamHandler).isFalse();
106+
}
107+
108+
@Test
109+
void placedOnStreamHandler_shouldInvalidateOnTypeOfArgs_invalidOutputStreamArg() {
110+
Object[] args = {mock(InputStream.class), new Object(), mock(Context.class)};
111+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestStreamHandler.class, args);
112+
113+
boolean isPlacedOnStreamHandler = LambdaHandlerProcessor.placedOnStreamHandler(pjpMock);
114+
115+
assertThat(isPlacedOnStreamHandler).isFalse();
116+
}
117+
118+
@Test
119+
void placedOnStreamHandler_shouldInvalidateOnTypeOfArgs_invalidContextArg() {
120+
Object[] args = {mock(InputStream.class), mock(OutputStream.class), new Object()};
121+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestStreamHandler.class, args);
122+
123+
boolean isPlacedOnStreamHandler = LambdaHandlerProcessor.placedOnStreamHandler(pjpMock);
124+
125+
assertThat(isPlacedOnStreamHandler).isFalse();
126+
}
127+
128+
@Test
129+
void getXrayTraceId_present() {
130+
String traceID = "Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1\"";
131+
try (MockedStatic<SystemWrapper> mockedSystemWrapper = mockStatic(SystemWrapper.class)) {
132+
mockedSystemWrapper.when(() -> getenv(LambdaConstants.X_AMZN_TRACE_ID)).thenReturn(traceID);
133+
134+
Optional xRayTraceId = LambdaHandlerProcessor.getXrayTraceId();
135+
136+
assertThat(xRayTraceId.isPresent()).isTrue();
137+
assertThat(traceID.split(";")[0].replace(LambdaConstants.ROOT_EQUALS, "")).isEqualTo(xRayTraceId.get());
138+
}
139+
}
140+
141+
@Test
142+
void getXrayTraceId_notPresent() {
143+
try (MockedStatic<SystemWrapper> mockedSystemWrapper = mockStatic(SystemWrapper.class)) {
144+
mockedSystemWrapper.when(() -> getenv(LambdaConstants.X_AMZN_TRACE_ID)).thenReturn(null);
145+
146+
boolean isXRayTraceIdPresent = LambdaHandlerProcessor.getXrayTraceId().isPresent();
147+
148+
assertThat(isXRayTraceIdPresent).isFalse();
149+
}
150+
}
151+
152+
@Test
153+
void extractContext_fromRequestHandler() {
51154
Object[] args = {new Object(), mock(Context.class)};
52-
when(pjpMock.getArgs()).thenReturn(args);
53-
when(pjpMock.getSignature()).thenReturn(signature);
54-
return pjpMock;
155+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestHandler.class, args);
156+
157+
Context context = LambdaHandlerProcessor.extractContext(pjpMock);
158+
159+
assertThat(context).isNotNull();
55160
}
56161

57-
private static ProceedingJoinPoint mockRequestStreamHandlerPjp() {
58-
Signature signature = mock(Signature.class);
59-
when(signature.getDeclaringType()).thenReturn(RequestStreamHandler.class);
60-
ProceedingJoinPoint pjpMock = mock(ProceedingJoinPoint.class);
162+
@Test
163+
void extractContext_fromStreamRequestHandler() {
61164
Object[] args = {mock(InputStream.class), mock(OutputStream.class), mock(Context.class)};
62-
when(pjpMock.getArgs()).thenReturn(args);
165+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(RequestStreamHandler.class, args);
166+
167+
Context context = LambdaHandlerProcessor.extractContext(pjpMock);
168+
169+
assertNotNull(context);
170+
}
171+
172+
@Test
173+
void extractContext_notKnownHandler() {
174+
Object[] args = {new Object()};
175+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp(Object.class, args);
176+
177+
Context context = LambdaHandlerProcessor.extractContext(pjpMock);
178+
179+
assertThat(context).isNull();
180+
}
181+
182+
@Test
183+
void isColdStart() {
184+
boolean isColdStart = LambdaHandlerProcessor.isColdStart();
185+
186+
assertThat(isColdStart).isTrue();
187+
}
188+
189+
@Test
190+
void isColdStart_coldStartDone() {
191+
LambdaHandlerProcessor.coldStartDone();
192+
193+
boolean isColdStart = LambdaHandlerProcessor.isColdStart();
194+
195+
assertThat(isColdStart).isFalse();
196+
}
197+
198+
@Test
199+
void isSamLocal() {
200+
try (MockedStatic<SystemWrapper> mockedSystemWrapper = mockStatic(SystemWrapper.class)) {
201+
mockedSystemWrapper.when(() -> getenv(LambdaConstants.AWS_SAM_LOCAL)).thenReturn("true");
202+
203+
boolean isSamLocal = LambdaHandlerProcessor.isSamLocal();
204+
205+
assertThat(isSamLocal).isTrue();
206+
}
207+
}
208+
209+
@Test
210+
void serviceName() {
211+
try (MockedStatic<SystemWrapper> mockedSystemWrapper = mockStatic(SystemWrapper.class)) {
212+
String expectedServiceName = "MyService";
213+
mockedSystemWrapper.when(() -> getenv(LambdaConstants.POWERTOOLS_SERVICE_NAME)).thenReturn(expectedServiceName);
214+
215+
String actualServiceName = LambdaHandlerProcessor.serviceName();
216+
217+
assertThat(actualServiceName).isEqualTo(expectedServiceName);
218+
}
219+
}
220+
221+
@Test
222+
void serviceName_Undefined() {
223+
LambdaHandlerProcessor.resetServiceName();
224+
try (MockedStatic<SystemWrapper> mockedSystemWrapper = mockStatic(SystemWrapper.class)) {
225+
mockedSystemWrapper.when(() -> getenv(LambdaConstants.POWERTOOLS_SERVICE_NAME)).thenReturn(null);
226+
227+
assertThat(LambdaHandlerProcessor.serviceName()).isEqualTo(LambdaConstants.SERVICE_UNDEFINED);
228+
}
229+
}
230+
231+
private ProceedingJoinPoint mockRequestHandlerPjp(Class handlerClass, Object[] handlerArgs) {
232+
when(signature.getDeclaringType()).thenReturn(handlerClass);
233+
when(pjpMock.getArgs()).thenReturn(handlerArgs);
63234
when(pjpMock.getSignature()).thenReturn(signature);
64235
return pjpMock;
65236
}

Diff for: powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/LoggingUtils.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
*/
1414
package software.amazon.lambda.powertools.logging;
1515

16-
import java.util.Map;
17-
1816
import com.fasterxml.jackson.databind.ObjectMapper;
1917
import org.apache.logging.log4j.ThreadContext;
2018

19+
import java.util.Map;
20+
2121
import static java.util.Arrays.asList;
2222

2323
/**

0 commit comments

Comments
 (0)