/**
* Copyright 2014 Comcast Cable Communications Management, LLC
*
* This file is part of CATS.
*
* CATS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CATS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CATS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.comcast.cats.event;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.Test;
import com.comcast.cats.configuration.CatsContext;
import com.comcast.cats.event.impl.CatsEventDispatcherImpl;
/**
* Integration test for {@link CatsEventDispatcher} and
* {@link CatsEventDispatcherImpl} <br>
* <br>
* <br>
*
* @author subinsugunan
*
*/
public class CatsEventDispatcherIT
{
private static String serverBase = "http://localhost:8080/";
private static CatsContext ctx;
private static CatsEventDispatcher catsEventDispatcher;
static final Logger logger = LoggerFactory.getLogger( CatsEventDispatcherIT.class );
public CatsEventDispatcherIT()
{
System.setProperty( "cats.server.url", serverBase );
ctx = new CatsContext();
assertNotNull( ctx );
ctx.refresh();
catsEventDispatcher = ( CatsEventDispatcher ) ctx.getBean( CatsEventDispatcherImpl.class );
assertNotNull( catsEventDispatcher );
}
/**
* Basic test to make sure the action performed method is getting called.
*/
@Test
public void testSendCatsEvent()
{
DummyCatsEventHandler dummyHandler = new DummyCatsEventHandler();
catsEventDispatcher.addListener( dummyHandler, CatsEventType.VIDEO );
CatsEvent vEvt = new VideoEvent( 1, "1", null );
// CatsEvent tEvt = new TraceEvent(2,"2",null);
int eventCounter = 3;
for ( int i = 0; i < eventCounter; i++ )
{
catsEventDispatcher.sendCatsEvent( vEvt );
}
assertEquals( eventCounter, dummyHandler.getActionPerformedCounter() );
}
/**
* Test null condition.
*/
@Test( expected = IllegalArgumentException.class )
public void testSendNullCatsEvent()
{
catsEventDispatcher.sendCatsEvent( null );
}
/**
* This method will check whether the handler is added as a listener or not.
*
*/
@Test
public void testAddListener()
{
try
{
DummyCatsEventHandler dummyHandler = new DummyCatsEventHandler();
catsEventDispatcher.addListener( dummyHandler, CatsEventType.VIDEO );
Field fieldListenersMap = CatsEventDispatcherImpl.class.getDeclaredField( "listeners" );
fieldListenersMap.setAccessible( true );
assertFalse( fieldListenersMap.getName().isEmpty() );
@SuppressWarnings( "unchecked" )
Map< CatsEventHandler, List< CatsEventType >> listeners = ( Map< CatsEventHandler, List< CatsEventType >> ) fieldListenersMap
.get( catsEventDispatcher );
int noOfListenersAdded = 1;
assertEquals( noOfListenersAdded, listeners.size() );
}
catch ( Exception e )
{
fail( e.getMessage() );
}
}
/**
* This method will check whether duplicate handler can be added as a
* listener or not.
*
*/
@Test
public void testAddDuplicateListener()
{
try
{
DummyCatsEventHandler dummyHandler = new DummyCatsEventHandler();
catsEventDispatcher.addListener( dummyHandler, CatsEventType.VIDEO );
// Duplicate entries
catsEventDispatcher.addListener( dummyHandler, CatsEventType.VIDEO );
catsEventDispatcher.addListener( dummyHandler, CatsEventType.VIDEO );
catsEventDispatcher.addListener( dummyHandler, CatsEventType.VIDEO );
Field fieldListenersMap = CatsEventDispatcherImpl.class.getDeclaredField( "listeners" );
fieldListenersMap.setAccessible( true );
assertFalse( fieldListenersMap.getName().isEmpty() );
@SuppressWarnings( "unchecked" )
Map< CatsEventHandler, List< CatsEventType >> listeners = ( Map< CatsEventHandler, List< CatsEventType >> ) fieldListenersMap
.get( catsEventDispatcher );
int noOfListenersAdded = 1;
assertEquals( noOfListenersAdded, listeners.size() );
}
catch ( Exception e )
{
fail( e.getMessage() );
}
}
/**
* This method will check whether the same handler can be used for a list of
* events.
*
*/
@Test
public void testAddListenerList()
{
try
{
DummyCatsEventHandler dummyHandler = new DummyCatsEventHandler();
List< CatsEventType > types = new ArrayList< CatsEventType >();
types.add( CatsEventType.TRACE );
types.add( CatsEventType.VIDEO );
types.add( CatsEventType.VIDEO_CTRL );
catsEventDispatcher.addListener( dummyHandler, types );
Field fieldListenersMap = CatsEventDispatcherImpl.class.getDeclaredField( "listeners" );
fieldListenersMap.setAccessible( true );
assertFalse( fieldListenersMap.getName().isEmpty() );
@SuppressWarnings( "unchecked" )
Map< CatsEventHandler, List< CatsEventType >> listeners = ( Map< CatsEventHandler, List< CatsEventType >> ) fieldListenersMap
.get( catsEventDispatcher );
int noOfListenersAdded = 1;
assertEquals( noOfListenersAdded, listeners.size() );
CatsEvent vEvt = new VideoEvent( 1, "1", null );
CatsEvent tEvt = new TraceEvent( 2, "2", null );
CatsEvent vcEvt = new VideoCtrlEvent( 3, "3", null );
int eventCounter = 3;
for ( int i = 0; i < eventCounter; i++ )
{
catsEventDispatcher.sendCatsEvent( vEvt );// 3
catsEventDispatcher.sendCatsEvent( tEvt );// 3
}
catsEventDispatcher.sendCatsEvent( vcEvt );// 1
// 3+3+1=7
assertEquals( 7, dummyHandler.getActionPerformedCounter() );
}
catch ( Exception e )
{
fail( e.getMessage() );
}
}
/**
* This method will check whether the same handler can be used for all
* events.
*
*/
@Test
public void testAddAllListenerList()
{
try
{
DummyCatsEventHandler dummyHandler = new DummyCatsEventHandler();
List< CatsEventType > types = new ArrayList< CatsEventType >();
types.add( CatsEventType.ALL );
catsEventDispatcher.addListener( dummyHandler, types );
Field fieldListenersMap = CatsEventDispatcherImpl.class.getDeclaredField( "listeners" );
fieldListenersMap.setAccessible( true );
assertFalse( fieldListenersMap.getName().isEmpty() );
@SuppressWarnings( "unchecked" )
Map< CatsEventHandler, List< CatsEventType >> listeners = ( Map< CatsEventHandler, List< CatsEventType >> ) fieldListenersMap
.get( catsEventDispatcher );
int noOfListenersAdded = 1;
assertEquals( noOfListenersAdded, listeners.size() );
CatsEvent vEvt = new VideoEvent( 1, "1", null );
CatsEvent tEvt = new TraceEvent( 2, "2", null );
CatsEvent vcEvt = new VideoCtrlEvent( 3, "3", null );
int eventCounter = 3;
for ( int i = 0; i < eventCounter; i++ )
{
catsEventDispatcher.sendCatsEvent( vEvt );// 3
catsEventDispatcher.sendCatsEvent( tEvt );// 3
}
catsEventDispatcher.sendCatsEvent( vcEvt );// 1
// 3+3+1=7
assertEquals( 7, dummyHandler.getActionPerformedCounter() );
}
catch ( Exception e )
{
fail( e.getMessage() );
}
}
/**
* Test basic removal operation.
*
*/
@Test
public void testRemoveListener()
{
try
{
DummyCatsEventHandler dummyHandler = new DummyCatsEventHandler();
catsEventDispatcher.addListener( dummyHandler, CatsEventType.VIDEO );
Field fieldListenersMap = CatsEventDispatcherImpl.class.getDeclaredField( "listeners" );
fieldListenersMap.setAccessible( true );
assertFalse( fieldListenersMap.getName().isEmpty() );
@SuppressWarnings( "unchecked" )
Map< CatsEventHandler, List< CatsEventType >> listeners = ( Map< CatsEventHandler, List< CatsEventType >> ) fieldListenersMap
.get( catsEventDispatcher );
int noOfListenersAdded = 1;
assertEquals( noOfListenersAdded, listeners.size() );
catsEventDispatcher.removeListener( dummyHandler );
noOfListenersAdded = 0;
assertEquals( noOfListenersAdded, listeners.size() );
}
catch ( Exception e )
{
fail( e.getMessage() );
}
}
}