package com.amazonaws.serverless.proxy.spring.embedded; import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; import com.amazonaws.serverless.proxy.spring.springbootapp.TestApplication; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.boot.context.embedded.EmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerException; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.core.SpringVersion; import javax.servlet.*; import java.io.IOException; import java.util.Objects; import static org.junit.Assert.*; import static org.junit.Assume.assumeFalse; public class ServerlessServletEmbeddedServerFactoryTest { @BeforeClass public static void before() { // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer // breaking changes in the latest Spring releases have not been supported in it. // TODO: Update the check to verify any Spring version above 5.2 assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); } // initialize a container handler to that the embedded factory can grab its instnace private SpringBootLambdaContainerHandler h = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class); public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializationException { } @Test public void getContainer_populatesInitializers() { ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); TestServlet initializer = new TestServlet(false); EmbeddedServletContainer container = factory.getEmbeddedServletContainer(initializer); assertNotNull(((ServerlessServletEmbeddedServerFactory)container).getInitializers()); assertEquals(1, ((ServerlessServletEmbeddedServerFactory)container).getInitializers().length); assertEquals(initializer, ((ServerlessServletEmbeddedServerFactory)container).getInitializers()[0]); container.stop(); // calling stop just once to get the test coverage since there's no code in it } @Test public void start_throwsException() { ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); TestServlet initializer = new TestServlet(true); EmbeddedServletContainer container = factory.getEmbeddedServletContainer(initializer); try { container.start(); } catch (EmbeddedServletContainerException e) { assertTrue(ServletException.class.isAssignableFrom(e.getCause().getClass())); assertEquals(TestServlet.EXCEPTION_MESSAGE, e.getCause().getMessage()); return; } fail("Did not throw the expected exception"); } @Test public void start_withoutException_setsServletContext() { ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); TestServlet initializer = new TestServlet(false); EmbeddedServletContainer container = factory.getEmbeddedServletContainer(initializer); container.start(); assertNotNull(initializer.getCtx()); assertEquals(h.getServletContext(), initializer.getCtx()); } public static class TestServlet implements Servlet, ServletContextInitializer { private ServletContext ctx; private boolean throwOnInit; public static final String EXCEPTION_MESSAGE = "Throw on init"; public TestServlet(boolean throwOnInit) { this.throwOnInit = throwOnInit; } @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { } @Override public String getServletInfo() { return null; } @Override public void destroy() { } @Override public void onStartup(ServletContext servletContext) throws ServletException { ctx = servletContext; if (throwOnInit) { throw new ServletException(EXCEPTION_MESSAGE); } } public ServletContext getCtx() { return ctx; } } }