/******************************************************************************* * Copyright (c) 2012, 2013 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: * EclipseSource - initial API and implementation ******************************************************************************/ package org.eclipse.rap.rwt.internal.client; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.eclipse.rap.rwt.client.Client; import org.eclipse.rap.rwt.client.WebClient; import org.eclipse.rap.rwt.internal.SingletonManager; import org.eclipse.rap.rwt.internal.application.ApplicationContextImpl; import org.eclipse.rap.rwt.internal.service.ContextProvider; import org.eclipse.rap.rwt.internal.service.ServiceContext; import org.eclipse.rap.rwt.internal.service.UISessionImpl; import org.eclipse.rap.rwt.service.UISession; import org.junit.After; import org.junit.Before; import org.junit.Test; public class ClientSelector_Test { private ClientSelector clientSelector; private UISession uiSession; @Before public void setUp() { HttpServletRequest request = mock( HttpServletRequest.class ); HttpServletResponse response = mock( HttpServletResponse.class ); ApplicationContextImpl applicationContext = mock( ApplicationContextImpl.class ); ServiceContext serviceContext = new ServiceContext( request, response, applicationContext ); ContextProvider.setContext( serviceContext ); uiSession = new UISessionImpl( applicationContext, mock( HttpSession.class ) ); SingletonManager.install( uiSession ); serviceContext.setUISession( uiSession ); clientSelector = new ClientSelector(); } @After public void tearDown() { ContextProvider.disposeContext(); } @Test public void testNoClientSelectedByDefault() { assertNull( clientSelector.getSelectedClient( uiSession ) ); } @Test public void testSelectsMatchingClient() { Client client = mock( Client.class ); clientSelector.addClientProvider( mockClientProvider( true, client ) ); clientSelector.selectClient( mockRequest(), uiSession ); assertSame( client, clientSelector.getSelectedClient( uiSession ) ); } @Test public void testSelectFailsWithoutClientProviders() { try { clientSelector.selectClient( mockRequest(), uiSession ); fail(); } catch( IllegalStateException exception ) { assertEquals( "No client provider found for request", exception.getMessage() ); } } @Test public void testSelectFailsWithoutMatchingClientProviders() { clientSelector.addClientProvider( mockClientProvider( false, null ) ); try { clientSelector.selectClient( mockRequest(), uiSession ); fail(); } catch( Exception exception ) { assertEquals( "No client provider found for request", exception.getMessage() ); } } @Test public void testSelectsFirstMatchingClient() { Client expected = mock( Client.class ); clientSelector.addClientProvider( mockClientProvider( false, null ) ); clientSelector.addClientProvider( mockClientProvider( true, expected ) ); clientSelector.addClientProvider( mockClientProvider( true, mock( Client.class ) ) ); clientSelector.selectClient( mockRequest(), uiSession ); assertSame( expected, clientSelector.getSelectedClient( uiSession ) ); } @Test public void testActivateInstallsWebClientProvider() { clientSelector.activate(); clientSelector.selectClient( mockRequest(), uiSession ); assertTrue( clientSelector.getSelectedClient( uiSession ) instanceof WebClient ); } @Test public void testWebClientDoesNotOverrideOthers() { Client client = mock( Client.class ); clientSelector.addClientProvider( mockClientProvider( true, client ) ); clientSelector.activate(); clientSelector.selectClient( mockRequest(), uiSession ); assertSame( client, clientSelector.getSelectedClient( uiSession ) ); } @Test public void testFallbackToWebClient() { clientSelector.addClientProvider( mockClientProvider( false, null ) ); clientSelector.activate(); clientSelector.selectClient( mockRequest(), uiSession ); assertTrue( clientSelector.getSelectedClient( uiSession ) instanceof WebClient ); } @Test public void testCannotActivateTwice() { clientSelector.activate(); try { clientSelector.activate(); fail(); } catch( IllegalStateException exception ) { assertEquals( "ClientSelector already activated", exception.getMessage() ); } } @Test public void testCannotAddClientProviderAfterActivation() { clientSelector.activate(); try { clientSelector.addClientProvider( mock( ClientProvider.class ) ); fail(); } catch( IllegalStateException exception ) { assertEquals( "ClientSelector already activated", exception.getMessage() ); } } private static HttpServletRequest mockRequest() { return mock( HttpServletRequest.class ); } private static ClientProvider mockClientProvider( boolean accept, Client client ) { ClientProvider provider = mock( ClientProvider.class ); HttpServletRequest anyReq = any( HttpServletRequest.class ); when( Boolean.valueOf( provider.accept( anyReq ) ) ).thenReturn( Boolean.valueOf( accept ) ); when( provider.getClient() ).thenReturn( client ); return provider; } }