/******************************************************************************* * Copyright (c) 2014 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.remote; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import org.eclipse.rap.rwt.internal.protocol.RequestMessage; import org.eclipse.rap.rwt.internal.protocol.ResponseMessage; import org.eclipse.rap.rwt.testfixture.internal.TestMessage; import org.eclipse.rap.rwt.testfixture.internal.TestResponseMessage; import org.junit.Before; import org.junit.Test; public class MessageChainElement_Test { private List<String> log; private RequestMessage message; @Before public void setUp() { log = new ArrayList<String>(); message = new TestMessage(); } @Test public void testHandleMessage_callsFilter() { MessageFilter filter = mock( MessageFilter.class ); MessageChainElement chain = mock( MessageChainElement.class ); MessageChainElement element = new MessageChainElement( filter, chain ); element.handleMessage( message ); verify( filter ).handleMessage( eq( message ), eq( chain ) ); } @Test public void testHandleMessage_returnsResultFromFilter() { ResponseMessage response = new TestResponseMessage(); MessageFilter filter = mock( MessageFilter.class ); when( filter.handleMessage( any( RequestMessage.class ), any( MessageFilterChain.class ) ) ) .thenReturn( response ); MessageChainElement element = new MessageChainElement( filter, null ); ResponseMessage result = element.handleMessage( message ); assertSame( response, result ); } @Test public void testRemove_firstElement() { MessageFilter filter1 = createLoggingFilter( "h1" ); MessageFilter filter2 = createLoggingFilter( "h2" ); MessageChainElement element = createFilterChain( filter1, filter2 ); MessageChainElement result = element.remove( filter2 ); result.handleMessage( message ); assertEquals( asList( "h1" ), log ); } @Test public void testRemove_lastElement() { MessageFilter filter1 = createLoggingFilter( "h1" ); MessageFilter filter2 = createLoggingFilter( "h2" ); MessageChainElement element = createFilterChain( filter1, filter2 ); MessageChainElement result = element.remove( filter1 ); result.handleMessage( message ); assertEquals( asList( "h2" ), log ); } @Test public void testRemove_middleElement() { MessageFilter filter1 = createLoggingFilter( "h1" ); MessageFilter filter2 = createLoggingFilter( "h2" ); MessageFilter filter3 = createLoggingFilter( "h3" ); MessageChainElement element = createFilterChain( filter1, filter2, filter3 ); MessageFilterChain result = element.remove( filter2 ); result.handleMessage( message ); assertEquals( asList( "h3", "h1" ), log ); } @Test public void testRemove_missingElement() { MessageFilter filter1 = createLoggingFilter( "h1" ); MessageChainElement element = createFilterChain( filter1 ); MessageFilter missingFilter = mock( MessageFilter.class ); MessageFilterChain result = element.remove( missingFilter ); result.handleMessage( message ); assertEquals( asList( "h1" ), log ); } @Test public void testRemove_missingElement_returnsSameInstance() { MessageChainElement element = createFilterChain( mock( MessageFilter.class ) ); MessageFilterChain result = element.remove( mock( MessageFilter.class ) ); assertSame( element, result ); } private MessageFilter createLoggingFilter( final String name ) { return new MessageFilter() { public ResponseMessage handleMessage( RequestMessage message, MessageFilterChain parent ) { log.add( name ); if( parent != null ) { return parent.handleMessage( message ); } return new TestResponseMessage(); } }; } private static MessageChainElement createFilterChain( MessageFilter... filters ) { MessageChainElement element = null; for( MessageFilter filter : filters ) { element = new MessageChainElement( filter, element ); } return element; } }