/******************************************************************************* * 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 java.util.ArrayList; import java.util.List; import org.eclipse.rap.json.JsonArray; import org.eclipse.rap.json.JsonValue; 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 MessageChainReference_Test { private MessageChainReference reference; @Before public void setUp() { LoggingFilter defaultHandler = new LoggingFilter( "default" ); reference = new MessageChainReference( new MessageChainElement( defaultHandler, null ) ); } @Test public void testHandleMessage_callsDefaultHandler() { ResponseMessage response = reference.get().handleMessage( new TestMessage() ); assertEquals( asList( "default" ), getLog( response ) ); } @Test public void testAdd_addsHandlersToChain() { reference.add( new LoggingFilter( "custom1" ) ); reference.add( new LoggingFilter( "custom2" ) ); ResponseMessage response = reference.get().handleMessage( new TestMessage() ); assertEquals( asList( "custom2", "custom1", "default" ), getLog( response ) ); } @Test public void testRemove_removesFirstHandlerFromChain() { MessageFilter filter = new LoggingFilter( "custom" ); reference.add( filter ); reference.remove( filter ); ResponseMessage response = reference.get().handleMessage( new TestMessage() ); assertEquals( asList( "default" ), getLog( response ) ); } @Test public void testRemove_removesEmbeddedHandlerFromChain() { reference.add( new LoggingFilter( "custom1" ) ); MessageFilter filter = new LoggingFilter( "custom2" ); reference.add( filter ); reference.add( new LoggingFilter( "custom3" ) ); reference.remove( filter ); ResponseMessage response = reference.get().handleMessage( new TestMessage() ); assertEquals( asList( "custom3", "custom1", "default" ), getLog( response ) ); } @Test public void testRemove_filterCanRemoveItself() { reference.add( new LoggingFilter( "custom" ) { @Override public ResponseMessage handleMessage( RequestMessage message, MessageFilterChain parent ) { reference.remove( this ); return super.handleMessage( message, parent ); } } ); ResponseMessage response1 = reference.get().handleMessage( new TestMessage() ); ResponseMessage response2 = reference.get().handleMessage( new TestMessage() ); assertEquals( asList( "custom", "default" ), getLog( response1 ) ); assertEquals( asList( "default" ), getLog( response2 ) ); } private static List<String> getLog( ResponseMessage response ) { List<String> list = new ArrayList<String>(); for( JsonValue element : response.getHead().get( "log" ).asArray() ) { list.add( element.asString() ); } return list; } private static class LoggingFilter implements MessageFilter { private final String name; private LoggingFilter( String name ) { this.name = name; } public ResponseMessage handleMessage( RequestMessage request, MessageFilterChain chain ) { if( request.getHead().get( "log" ) == null ) { request.getHead().add( "log", new JsonArray() ); } request.getHead().get( "log" ).asArray().add( name ); if( chain == null ) { TestResponseMessage response = new TestResponseMessage(); response.getHead().add( "log", request.getHead().get( "log" ) ); return response; } return chain.handleMessage( request ); } } }