/******************************************************************************* * Copyright (c) 2015 EclipseSource and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Holger Staudacher - initial API and implementation ******************************************************************************/ package com.eclipsesource.jaxrs.publisher.internal; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.IOException; import javax.servlet.FilterConfig; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.servlet.ServletContainer; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public class ServletContainerBridge_Test { RootApplication application; private ServletContainerBridge bridge; private ServletConfig config; private ServletContext context; @Before public void setUp() { application = mock( RootApplication.class ); bridge = new ServletContainerBridge( application ); config = mock(ServletConfig.class); context = mock(ServletContext.class); when(config.getServletContext()).thenReturn( context ); } @Test public void testCreateServletContainer() { ServletContainer container = bridge.getServletContainer(); assertNotNull( container ); } @Test public void testCreateServletContainerOnce() { ServletContainer container = bridge.getServletContainer(); ServletContainer container2 = bridge.getServletContainer(); assertSame( container, container2 ); } @Test public void testDestroyCreatesNewContainer() throws ServletException { ServletContainerBridge actualBridge = spy( bridge ); ServletContainer container = mock( ServletContainer.class ); ServletContainer container1 = actualBridge.getServletContainer(); when( actualBridge.getServletContainer() ).thenReturn( container ); when( application.isDirty() ).thenReturn( true ); actualBridge.init(config); actualBridge.run(); verify( container ).init( config ); actualBridge.destroy(); Mockito.reset( actualBridge ); ServletContainer container2 = actualBridge.getServletContainer(); assertNotSame( container1, container2 ); } @Test public void testCallsDestroyDoesNotFail() { bridge.destroy(); } @Test public void testRunInitOnDirty() throws ServletException { ServletContainerBridge actualBridge = spy( bridge ); ServletContainer container = mock( ServletContainer.class ); when( actualBridge.getServletContainer() ).thenReturn( container ); when( application.isDirty() ).thenReturn( true ); actualBridge.init( config ); actualBridge.run(); verify( container ).init( config ); } @Test public void testRunReloadsOnlyOnDirty() throws ServletException { ServletContainerBridge actualBridge = spy( bridge ); ServletContainer container = mock( ServletContainer.class ); when( actualBridge.getServletContainer() ).thenReturn( container ); when( application.isDirty() ).thenReturn( false ); actualBridge.run(); verify( container, never() ).init(any(FilterConfig.class)); verify( container, never() ).reload( any( ResourceConfig.class ) ); } @Test public void testRunSetsDirtyToFalseAfterRun() throws ServletException { ServletContainerBridge actualBridge = spy( bridge ); ServletContainer container = new ServletContainer(); ServletContainer spyContainer = spy( container ); doAnswer( new Answer<Object>() { @Override public Object answer( InvocationOnMock invocation ) throws Throwable { application.setDirty( false ); return null; } } ).when( spyContainer ).init( config ); when( actualBridge.getServletContainer() ).thenReturn( spyContainer ); when( application.isDirty() ).thenReturn( true ); actualBridge.init( config ); actualBridge.run(); verify( application ).setDirty( false ); } @Test public void testRunReloadAfterInit() throws ServletException { ServletContainerBridge actualBridge = spy( bridge ); ServletContainer container = mock( ServletContainer.class ); when( actualBridge.getServletContainer() ).thenReturn( container ); when( application.isDirty() ).thenReturn( true ); when( actualBridge.isJerseyReady() ).thenReturn( true ); actualBridge.run(); verify( container, never() ).init(any(FilterConfig.class)); verify( container).reload( any( ResourceConfig.class ) ); } @Test public void testServiceWhenNotReady() throws ServletException, IOException { ServletContainerBridge actualBridge = spy( bridge ); HttpServletResponse response = mock( HttpServletResponse.class ); assertFalse( actualBridge.isJerseyReady() ); actualBridge.service( mock(ServletRequest.class), response ); verify( response ).sendError( eq( HttpServletResponse.SC_SERVICE_UNAVAILABLE ), any( String.class ) ); } @Test public void testServiceWhenReady() throws ServletException, IOException { ServletContainerBridge actualBridge = spy( bridge ); ServletContainer container = mock( ServletContainer.class ); when( actualBridge.getServletContainer() ).thenReturn( container ); when( actualBridge.isJerseyReady() ).thenReturn( true ); ServletRequest request = mock(ServletRequest.class); ServletResponse response = mock(ServletResponse.class); actualBridge.service( request, response ); verify(container).service(request, response); } }