Skip to content

Commit 0763aa9

Browse files
authored
test: lambda/runtime/api/client package (#527)
* test: Pojo serializer * test: add UserFaultTests * test: more tests * test: add test around blocklisting * test: add test for HandlerInfoTest
1 parent 338d006 commit 0763aa9

File tree

6 files changed

+550
-0
lines changed

6 files changed

+550
-0
lines changed

aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/api/client/ClasspathLoaderTest.java

+28
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,34 @@ void testLoadAllClassesWithMultipleEntries(@TempDir Path tempDir) throws IOExcep
109109
}
110110
}
111111

112+
@Test
113+
void testLoadAllClassesWithBlocklistedClass(@TempDir Path tempDir) throws IOException {
114+
File jarFile = tempDir.resolve("blocklist-test.jar").toFile();
115+
116+
try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarFile))) {
117+
JarEntry blockedEntry = new JarEntry("META-INF/versions/9/module-info.class");
118+
jos.putNextEntry(blockedEntry);
119+
jos.write("dummy content".getBytes());
120+
jos.closeEntry();
121+
122+
JarEntry normalEntry = new JarEntry("com/test/Normal.class");
123+
jos.putNextEntry(normalEntry);
124+
jos.write("dummy content".getBytes());
125+
jos.closeEntry();
126+
}
127+
128+
String originalClasspath = System.getProperty("java.class.path");
129+
try {
130+
System.setProperty("java.class.path", jarFile.getAbsolutePath());
131+
ClasspathLoader.main(new String[]{});
132+
// The test passes if no exception is thrown and the blocklisted class is skipped
133+
} finally {
134+
if (originalClasspath != null) {
135+
System.setProperty("java.class.path", originalClasspath);
136+
}
137+
}
138+
}
139+
112140
private File createSimpleJar(Path tempDir, String jarName, String className) throws IOException {
113141
File jarFile = tempDir.resolve(jarName).toFile();
114142

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/*
2+
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.amazonaws.services.lambda.runtime.api.client;
7+
8+
import org.junit.jupiter.api.Test;
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
class HandlerInfoTest {
12+
13+
@Test
14+
void testConstructor() {
15+
Class<?> testClass = String.class;
16+
String methodName = "testMethod";
17+
18+
HandlerInfo info = new HandlerInfo(testClass, methodName);
19+
20+
assertNotNull(info);
21+
assertEquals(testClass, info.clazz);
22+
assertEquals(methodName, info.methodName);
23+
}
24+
25+
@Test
26+
void testFromStringWithoutMethod() throws Exception {
27+
String handler = "java.lang.String";
28+
HandlerInfo info = HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader());
29+
30+
assertEquals(String.class, info.clazz);
31+
assertNull(info.methodName);
32+
}
33+
34+
@Test
35+
void testFromStringWithMethod() throws Exception {
36+
String handler = "java.lang.String::length";
37+
HandlerInfo info = HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader());
38+
39+
assertEquals(String.class, info.clazz);
40+
assertEquals("length", info.methodName);
41+
}
42+
43+
@Test
44+
void testFromStringWithEmptyClass() {
45+
String handler = "::method";
46+
47+
assertThrows(HandlerInfo.InvalidHandlerException.class, () ->
48+
HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader())
49+
);
50+
}
51+
52+
@Test
53+
void testFromStringWithEmptyMethod() {
54+
String handler = "java.lang.String::";
55+
56+
assertThrows(HandlerInfo.InvalidHandlerException.class, () ->
57+
HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader())
58+
);
59+
}
60+
61+
@Test
62+
void testFromStringWithNonexistentClass() {
63+
String handler = "com.nonexistent.TestClass::method";
64+
65+
assertThrows(ClassNotFoundException.class, () ->
66+
HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader())
67+
);
68+
}
69+
70+
@Test
71+
void testFromStringWithNullHandler() {
72+
assertThrows(NullPointerException.class, () ->
73+
HandlerInfo.fromString(null, ClassLoader.getSystemClassLoader())
74+
);
75+
}
76+
77+
@Test
78+
void testClassNameWithoutMethod() {
79+
String handler = "java.lang.String";
80+
String className = HandlerInfo.className(handler);
81+
82+
assertEquals("java.lang.String", className);
83+
}
84+
85+
@Test
86+
void testClassNameWithMethod() {
87+
String handler = "java.lang.String::length";
88+
String className = HandlerInfo.className(handler);
89+
90+
assertEquals("java.lang.String", className);
91+
}
92+
93+
@Test
94+
void testClassNameWithEmptyString() {
95+
String handler = "";
96+
String className = HandlerInfo.className(handler);
97+
98+
assertEquals("", className);
99+
}
100+
101+
@Test
102+
void testClassNameWithOnlyDelimiter() {
103+
String handler = "::";
104+
String className = HandlerInfo.className(handler);
105+
106+
assertEquals("", className);
107+
}
108+
109+
@Test
110+
void testInvalidHandlerExceptionSerialVersionUID() {
111+
assertEquals(-1L, HandlerInfo.InvalidHandlerException.serialVersionUID);
112+
}
113+
114+
@Test
115+
void testFromStringWithInnerClass() throws Exception {
116+
// Create a custom class loader that can load our test class
117+
ClassLoader cl = new ClassLoader() {
118+
@Override
119+
public Class<?> loadClass(String name) throws ClassNotFoundException {
120+
if (name.equals("com.test.OuterClass$InnerClass")) {
121+
throw new ClassNotFoundException("Test class not found");
122+
}
123+
return super.loadClass(name);
124+
}
125+
};
126+
127+
String handler = "com.test.OuterClass$InnerClass::method";
128+
assertThrows(ClassNotFoundException.class, () ->
129+
HandlerInfo.fromString(handler, cl)
130+
);
131+
}
132+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
/*
2+
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.amazonaws.services.lambda.runtime.api.client;
7+
8+
import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.InvocationRequest;
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.BeforeEach;
11+
import static org.junit.jupiter.api.Assertions.*;
12+
import static org.mockito.Mockito.*;
13+
14+
class LambdaRequestHandlerTest {
15+
16+
private InvocationRequest mockRequest;
17+
18+
@BeforeEach
19+
void setUp() {
20+
mockRequest = mock(InvocationRequest.class);
21+
}
22+
23+
@Test
24+
void testInitErrorHandler() {
25+
String className = "com.example.TestClass";
26+
Exception testException = new RuntimeException("initialization error");
27+
28+
LambdaRequestHandler handler = LambdaRequestHandler.initErrorHandler(testException, className);
29+
30+
assertNotNull(handler);
31+
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);
32+
33+
LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
34+
UserFault fault = userFaultHandler.fault;
35+
36+
assertNotNull(fault);
37+
assertEquals("Error loading class " + className + ": initialization error", fault.msg);
38+
assertEquals("java.lang.RuntimeException", fault.exception);
39+
assertTrue(fault.fatal);
40+
}
41+
42+
@Test
43+
void testClassNotFound() {
44+
String className = "com.example.MissingClass";
45+
Exception testException = new ClassNotFoundException("class not found");
46+
47+
LambdaRequestHandler handler = LambdaRequestHandler.classNotFound(testException, className);
48+
49+
assertNotNull(handler);
50+
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);
51+
52+
LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
53+
UserFault fault = userFaultHandler.fault;
54+
55+
assertNotNull(fault);
56+
assertEquals("Class not found: " + className, fault.msg);
57+
assertEquals("java.lang.ClassNotFoundException", fault.exception);
58+
assertFalse(fault.fatal);
59+
}
60+
61+
@Test
62+
void testUserFaultHandlerConstructor() {
63+
UserFault testFault = new UserFault("test message", "TestException", "test trace");
64+
LambdaRequestHandler.UserFaultHandler handler = new LambdaRequestHandler.UserFaultHandler(testFault);
65+
66+
assertNotNull(handler);
67+
assertSame(testFault, handler.fault);
68+
}
69+
70+
@Test
71+
void testUserFaultHandlerCallThrowsFault() {
72+
UserFault testFault = new UserFault("test message", "TestException", "test trace");
73+
LambdaRequestHandler.UserFaultHandler handler = new LambdaRequestHandler.UserFaultHandler(testFault);
74+
75+
UserFault thrownFault = assertThrows(UserFault.class, () -> handler.call(mockRequest));
76+
assertSame(testFault, thrownFault);
77+
}
78+
79+
@Test
80+
void testInitErrorHandlerWithNullMessage() {
81+
String className = "com.example.TestClass";
82+
Exception testException = new RuntimeException();
83+
84+
LambdaRequestHandler handler = LambdaRequestHandler.initErrorHandler(testException, className);
85+
86+
assertNotNull(handler);
87+
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);
88+
89+
LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
90+
UserFault fault = userFaultHandler.fault;
91+
92+
assertNotNull(fault);
93+
assertEquals("Error loading class " + className, fault.msg);
94+
assertEquals("java.lang.RuntimeException", fault.exception);
95+
assertTrue(fault.fatal);
96+
}
97+
98+
@Test
99+
void testInitErrorHandlerWithNullClassName() {
100+
Exception testException = new RuntimeException("test error");
101+
102+
LambdaRequestHandler handler = LambdaRequestHandler.initErrorHandler(testException, null);
103+
104+
assertNotNull(handler);
105+
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);
106+
107+
LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
108+
UserFault fault = userFaultHandler.fault;
109+
110+
assertNotNull(fault);
111+
assertEquals("Error loading class null: test error", fault.msg);
112+
assertEquals("java.lang.RuntimeException", fault.exception);
113+
assertTrue(fault.fatal);
114+
}
115+
116+
@Test
117+
void testClassNotFoundWithNullClassName() {
118+
Exception testException = new ClassNotFoundException("test error");
119+
120+
LambdaRequestHandler handler = LambdaRequestHandler.classNotFound(testException, null);
121+
122+
assertNotNull(handler);
123+
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);
124+
125+
LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
126+
UserFault fault = userFaultHandler.fault;
127+
128+
assertNotNull(fault);
129+
assertEquals("Class not found: null", fault.msg);
130+
assertEquals("java.lang.ClassNotFoundException", fault.exception);
131+
assertFalse(fault.fatal);
132+
}
133+
134+
@Test
135+
void testUserFaultHandlerCallWithNullRequest() {
136+
UserFault testFault = new UserFault("test message", "TestException", "test trace");
137+
LambdaRequestHandler.UserFaultHandler handler = new LambdaRequestHandler.UserFaultHandler(testFault);
138+
139+
UserFault thrownFault = assertThrows(UserFault.class, () -> handler.call(null));
140+
assertSame(testFault, thrownFault);
141+
}
142+
}

0 commit comments

Comments
 (0)