package com.vaadin.tests.server.component.ui; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.easymock.EasyMock; import org.junit.Test; import com.vaadin.server.DefaultDeploymentConfiguration; import com.vaadin.server.DefaultUIProvider; import com.vaadin.server.DeploymentConfiguration; import com.vaadin.server.UIClassSelectionEvent; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinService; import com.vaadin.server.VaadinSession; import com.vaadin.tests.util.AlwaysLockedVaadinSession; import com.vaadin.ui.UI; public class CustomUIClassLoaderTest { /** * Stub root */ public static class MyUI extends UI { @Override protected void init(VaadinRequest request) { // Nothing to see here } } /** * Dummy ClassLoader that just saves the name of the requested class before * delegating to the default implementation. */ public class LoggingClassLoader extends ClassLoader { private final List<String> requestedClasses = new ArrayList<>(); @Override protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { requestedClasses.add(name); return super.loadClass(name, resolve); } } /** * Tests that a UI class can be loaded even if no classloader has been * provided. * * @throws Exception * if thrown */ @Test public void testWithDefaultClassLoader() throws Exception { VaadinSession application = createStubApplication(); application.setConfiguration(createConfigurationMock()); DefaultUIProvider uiProvider = new DefaultUIProvider(); Class<? extends UI> uiClass = uiProvider .getUIClass(new UIClassSelectionEvent( createRequestMock(getClass().getClassLoader()))); assertEquals(MyUI.class, uiClass); } private static DeploymentConfiguration createConfigurationMock() { Properties properties = new Properties(); properties.put(VaadinSession.UI_PARAMETER, MyUI.class.getName()); return new DefaultDeploymentConfiguration(CustomUIClassLoaderTest.class, properties); } private static VaadinRequest createRequestMock(ClassLoader classloader) { // Mock a VaadinService to give the passed classloader VaadinService configurationMock = EasyMock .createMock(VaadinService.class); EasyMock.expect(configurationMock.getDeploymentConfiguration()) .andReturn(createConfigurationMock()); EasyMock.expect(configurationMock.getClassLoader()) .andReturn(classloader); // Mock a VaadinRequest to give the mocked vaadin service VaadinRequest requestMock = EasyMock.createMock(VaadinRequest.class); EasyMock.expect(requestMock.getService()).andReturn(configurationMock); EasyMock.expect(requestMock.getService()).andReturn(configurationMock); EasyMock.expect(requestMock.getService()).andReturn(configurationMock); EasyMock.replay(configurationMock, requestMock); return requestMock; } /** * Tests that the ClassLoader passed in the ApplicationStartEvent is used to * load UI classes. * * @throws Exception * if thrown */ @Test public void testWithClassLoader() throws Exception { LoggingClassLoader loggingClassLoader = new LoggingClassLoader(); DefaultUIProvider uiProvider = new DefaultUIProvider(); Class<? extends UI> uiClass = uiProvider .getUIClass(new UIClassSelectionEvent( createRequestMock(loggingClassLoader))); assertEquals(MyUI.class, uiClass); assertEquals(1, loggingClassLoader.requestedClasses.size()); assertEquals(MyUI.class.getName(), loggingClassLoader.requestedClasses.get(0)); } private VaadinSession createStubApplication() { return new AlwaysLockedVaadinSession(null) { @Override public DeploymentConfiguration getConfiguration() { return createConfigurationMock(); } }; } }