/* * Copyright 2000-2016 Vaadin Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.vaadin.server.communication; import java.io.IOException; import java.util.Properties; import java.util.concurrent.atomic.AtomicInteger; import javax.servlet.ServletConfig; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; import com.vaadin.server.DefaultDeploymentConfiguration; import com.vaadin.server.ErrorEvent; import com.vaadin.server.ErrorHandler; import com.vaadin.server.LegacyCommunicationManager; import com.vaadin.server.MockServletConfig; import com.vaadin.server.UIClassSelectionEvent; import com.vaadin.server.UICreateEvent; import com.vaadin.server.UIProvider; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinServlet; import com.vaadin.server.VaadinServletRequest; import com.vaadin.server.VaadinServletResponse; import com.vaadin.server.VaadinServletService; import com.vaadin.tests.util.AlwaysLockedVaadinSession; import com.vaadin.ui.UI; public class ServletUIInitHandlerTest { public static class CommunicationMock { public final UI ui; public final ServletConfig servletConfig; public final VaadinServlet servlet; public final DefaultDeploymentConfiguration deploymentConfiguration; public final VaadinServletService service; public final AlwaysLockedVaadinSession session; public CommunicationMock(final UI ui) throws Exception { servletConfig = new MockServletConfig(); servlet = new VaadinServlet(); servlet.init(servletConfig); deploymentConfiguration = new DefaultDeploymentConfiguration( UI.class, new Properties()); service = new VaadinServletService(servlet, deploymentConfiguration); session = new AlwaysLockedVaadinSession(service); LegacyCommunicationManager communicationManager = new LegacyCommunicationManager( session); session.setCommunicationManager(communicationManager); session.setConfiguration(deploymentConfiguration); session.addUIProvider(new UIProvider() { @Override public Class<? extends UI> getUIClass( UIClassSelectionEvent event) { return ui.getClass(); } @Override public UI createInstance(UICreateEvent event) { return ui; } }); this.ui = ui; } public VaadinRequest createInitRequest() { return new VaadinServletRequest( Mockito.mock(HttpServletRequest.class), service) { @Override public String getMethod() { return "POST"; } @Override public String getParameter(String name) { if (UIInitHandler.BROWSER_DETAILS_PARAMETER.equals(name)) { return "1"; } return super.getParameter(name); } }; } } @Test public void errorHandlerForInitException() throws Exception { final AtomicInteger pre = new AtomicInteger(0); final AtomicInteger errorHandlerCalls = new AtomicInteger(0); UI ui = new UI() { @Override protected void init(VaadinRequest request) { pre.incrementAndGet(); throw new RuntimeException("Exception produced in init()"); } }; ui.setErrorHandler(new ErrorHandler() { @Override public void error(ErrorEvent event) { errorHandlerCalls.incrementAndGet(); } }); CommunicationMock mock = new CommunicationMock(ui); VaadinRequest initRequest = mock.createInitRequest(); ServletUIInitHandler servletUIInitHandler = new ServletUIInitHandler(); servletUIInitHandler.handleRequest(mock.session, initRequest, new VaadinServletResponse( Mockito.mock(HttpServletResponse.class), mock.service) { @Override public ServletOutputStream getOutputStream() throws IOException { return new ServletOutputStream() { @Override public void write(int b) throws IOException { } }; } }); Assert.assertEquals(1, pre.getAndIncrement()); Assert.assertEquals(1, errorHandlerCalls.getAndIncrement()); Assert.assertEquals(mock.session, ui.getSession()); } @Test public void initExceptionNoErrorHandler() throws Exception { final AtomicInteger pre = new AtomicInteger(0); UI ui = new UI() { @Override protected void init(VaadinRequest request) { pre.incrementAndGet(); throw new RuntimeException("Exception produced in init()"); } }; CommunicationMock mock = new CommunicationMock(ui); VaadinRequest initRequest = mock.createInitRequest(); ServletUIInitHandler servletUIInitHandler = new ServletUIInitHandler(); servletUIInitHandler.handleRequest(mock.session, initRequest, new VaadinServletResponse( Mockito.mock(HttpServletResponse.class), mock.service) { @Override public ServletOutputStream getOutputStream() throws IOException { return new ServletOutputStream() { @Override public void write(int b) throws IOException { } }; } }); Assert.assertEquals(1, pre.getAndIncrement()); // Default error handler only logs the exception Assert.assertEquals(mock.session, ui.getSession()); } }