Skip to content

test: lambda/runtime/api/client package #527

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Mar 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,34 @@ void testLoadAllClassesWithMultipleEntries(@TempDir Path tempDir) throws IOExcep
}
}

@Test
void testLoadAllClassesWithBlocklistedClass(@TempDir Path tempDir) throws IOException {
File jarFile = tempDir.resolve("blocklist-test.jar").toFile();

try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarFile))) {
JarEntry blockedEntry = new JarEntry("META-INF/versions/9/module-info.class");
jos.putNextEntry(blockedEntry);
jos.write("dummy content".getBytes());
jos.closeEntry();

JarEntry normalEntry = new JarEntry("com/test/Normal.class");
jos.putNextEntry(normalEntry);
jos.write("dummy content".getBytes());
jos.closeEntry();
}

String originalClasspath = System.getProperty("java.class.path");
try {
System.setProperty("java.class.path", jarFile.getAbsolutePath());
ClasspathLoader.main(new String[]{});
// The test passes if no exception is thrown and the blocklisted class is skipped
} finally {
if (originalClasspath != null) {
System.setProperty("java.class.path", originalClasspath);
}
}
}

private File createSimpleJar(Path tempDir, String jarName, String className) throws IOException {
File jarFile = tempDir.resolve(jarName).toFile();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
/*
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/

package com.amazonaws.services.lambda.runtime.api.client;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class HandlerInfoTest {

@Test
void testConstructor() {
Class<?> testClass = String.class;
String methodName = "testMethod";

HandlerInfo info = new HandlerInfo(testClass, methodName);

assertNotNull(info);
assertEquals(testClass, info.clazz);
assertEquals(methodName, info.methodName);
}

@Test
void testFromStringWithoutMethod() throws Exception {
String handler = "java.lang.String";
HandlerInfo info = HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader());

assertEquals(String.class, info.clazz);
assertNull(info.methodName);
}

@Test
void testFromStringWithMethod() throws Exception {
String handler = "java.lang.String::length";
HandlerInfo info = HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader());

assertEquals(String.class, info.clazz);
assertEquals("length", info.methodName);
}

@Test
void testFromStringWithEmptyClass() {
String handler = "::method";

assertThrows(HandlerInfo.InvalidHandlerException.class, () ->
HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader())
);
}

@Test
void testFromStringWithEmptyMethod() {
String handler = "java.lang.String::";

assertThrows(HandlerInfo.InvalidHandlerException.class, () ->
HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader())
);
}

@Test
void testFromStringWithNonexistentClass() {
String handler = "com.nonexistent.TestClass::method";

assertThrows(ClassNotFoundException.class, () ->
HandlerInfo.fromString(handler, ClassLoader.getSystemClassLoader())
);
}

@Test
void testFromStringWithNullHandler() {
assertThrows(NullPointerException.class, () ->
HandlerInfo.fromString(null, ClassLoader.getSystemClassLoader())
);
}

@Test
void testClassNameWithoutMethod() {
String handler = "java.lang.String";
String className = HandlerInfo.className(handler);

assertEquals("java.lang.String", className);
}

@Test
void testClassNameWithMethod() {
String handler = "java.lang.String::length";
String className = HandlerInfo.className(handler);

assertEquals("java.lang.String", className);
}

@Test
void testClassNameWithEmptyString() {
String handler = "";
String className = HandlerInfo.className(handler);

assertEquals("", className);
}

@Test
void testClassNameWithOnlyDelimiter() {
String handler = "::";
String className = HandlerInfo.className(handler);

assertEquals("", className);
}

@Test
void testInvalidHandlerExceptionSerialVersionUID() {
assertEquals(-1L, HandlerInfo.InvalidHandlerException.serialVersionUID);
}

@Test
void testFromStringWithInnerClass() throws Exception {
// Create a custom class loader that can load our test class
ClassLoader cl = new ClassLoader() {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (name.equals("com.test.OuterClass$InnerClass")) {
throw new ClassNotFoundException("Test class not found");
}
return super.loadClass(name);
}
};

String handler = "com.test.OuterClass$InnerClass::method";
assertThrows(ClassNotFoundException.class, () ->
HandlerInfo.fromString(handler, cl)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
/*
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/

package com.amazonaws.services.lambda.runtime.api.client;

import com.amazonaws.services.lambda.runtime.api.client.runtimeapi.dto.InvocationRequest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

class LambdaRequestHandlerTest {

private InvocationRequest mockRequest;

@BeforeEach
void setUp() {
mockRequest = mock(InvocationRequest.class);
}

@Test
void testInitErrorHandler() {
String className = "com.example.TestClass";
Exception testException = new RuntimeException("initialization error");

LambdaRequestHandler handler = LambdaRequestHandler.initErrorHandler(testException, className);

assertNotNull(handler);
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);

LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
UserFault fault = userFaultHandler.fault;

assertNotNull(fault);
assertEquals("Error loading class " + className + ": initialization error", fault.msg);
assertEquals("java.lang.RuntimeException", fault.exception);
assertTrue(fault.fatal);
}

@Test
void testClassNotFound() {
String className = "com.example.MissingClass";
Exception testException = new ClassNotFoundException("class not found");

LambdaRequestHandler handler = LambdaRequestHandler.classNotFound(testException, className);

assertNotNull(handler);
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);

LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
UserFault fault = userFaultHandler.fault;

assertNotNull(fault);
assertEquals("Class not found: " + className, fault.msg);
assertEquals("java.lang.ClassNotFoundException", fault.exception);
assertFalse(fault.fatal);
}

@Test
void testUserFaultHandlerConstructor() {
UserFault testFault = new UserFault("test message", "TestException", "test trace");
LambdaRequestHandler.UserFaultHandler handler = new LambdaRequestHandler.UserFaultHandler(testFault);

assertNotNull(handler);
assertSame(testFault, handler.fault);
}

@Test
void testUserFaultHandlerCallThrowsFault() {
UserFault testFault = new UserFault("test message", "TestException", "test trace");
LambdaRequestHandler.UserFaultHandler handler = new LambdaRequestHandler.UserFaultHandler(testFault);

UserFault thrownFault = assertThrows(UserFault.class, () -> handler.call(mockRequest));
assertSame(testFault, thrownFault);
}

@Test
void testInitErrorHandlerWithNullMessage() {
String className = "com.example.TestClass";
Exception testException = new RuntimeException();

LambdaRequestHandler handler = LambdaRequestHandler.initErrorHandler(testException, className);

assertNotNull(handler);
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);

LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
UserFault fault = userFaultHandler.fault;

assertNotNull(fault);
assertEquals("Error loading class " + className, fault.msg);
assertEquals("java.lang.RuntimeException", fault.exception);
assertTrue(fault.fatal);
}

@Test
void testInitErrorHandlerWithNullClassName() {
Exception testException = new RuntimeException("test error");

LambdaRequestHandler handler = LambdaRequestHandler.initErrorHandler(testException, null);

assertNotNull(handler);
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);

LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
UserFault fault = userFaultHandler.fault;

assertNotNull(fault);
assertEquals("Error loading class null: test error", fault.msg);
assertEquals("java.lang.RuntimeException", fault.exception);
assertTrue(fault.fatal);
}

@Test
void testClassNotFoundWithNullClassName() {
Exception testException = new ClassNotFoundException("test error");

LambdaRequestHandler handler = LambdaRequestHandler.classNotFound(testException, null);

assertNotNull(handler);
assertTrue(handler instanceof LambdaRequestHandler.UserFaultHandler);

LambdaRequestHandler.UserFaultHandler userFaultHandler = (LambdaRequestHandler.UserFaultHandler) handler;
UserFault fault = userFaultHandler.fault;

assertNotNull(fault);
assertEquals("Class not found: null", fault.msg);
assertEquals("java.lang.ClassNotFoundException", fault.exception);
assertFalse(fault.fatal);
}

@Test
void testUserFaultHandlerCallWithNullRequest() {
UserFault testFault = new UserFault("test message", "TestException", "test trace");
LambdaRequestHandler.UserFaultHandler handler = new LambdaRequestHandler.UserFaultHandler(testFault);

UserFault thrownFault = assertThrows(UserFault.class, () -> handler.call(null));
assertSame(testFault, thrownFault);
}
}
Loading