/*
* Copyright (C) 2012, Katy Hilgenberg.
* Special acknowledgments to: Knowledge & Data Engineering Group, University of Kassel (http://www.kde.cs.uni-kassel.de).
* Contact: sdcf@cs.uni-kassel.de
*
* This file is part of the SDCFramework (Sensor Data Collection Framework) project.
*
* The SDCFramework is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The SDCFramework 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the SDCFramework. If not, see <http://www.gnu.org/licenses/>.
*/
package de.unikassel.android.sdcframework.util.tests;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import junit.framework.TestCase;
import de.unikassel.android.sdcframework.test.TestUtils;
import de.unikassel.android.sdcframework.util.EventCollectorImpl;
import de.unikassel.android.sdcframework.util.EventDispatcherImpl;
import de.unikassel.android.sdcframework.util.facade.EventObserver;
import de.unikassel.android.sdcframework.util.facade.ObservableEvent;
import de.unikassel.android.sdcframework.util.facade.ObservableEventSource;
/**
* Test for the event dispatcher
*
* @author Katy Hilgenberg
*
*/
public class TestEventDispatcher extends TestCase
{
/**
* The internal event class extending {@linkplain ObservableEvent}.
*
* @author Katy Hilgenberg
*
*/
private class TestEvent implements ObservableEvent
{
}
/**
* Test method for
* {@link de.unikassel.android.sdcframework.util.EventDispatcherImpl#EventDispatcherImpl(de.unikassel.android.sdcframework.util.facade.EventCollector)}
* .
*/
public final void testEventDispatcherImpl()
{
// test for construction from null pointer
try
{
new EventDispatcherImpl< TestEventDispatcher.TestEvent >( null );
fail( "Construction from collector null pointer should not be allowed" );
}
catch ( InvalidParameterException e )
{}
EventCollectorImpl< TestEvent > collector =
new EventCollectorImpl< TestEventDispatcher.TestEvent >();
EventDispatcherImpl< TestEvent > dispatcher =
new EventDispatcherImpl< TestEventDispatcher.TestEvent >( collector );
assertNotNull( "Expected internal collector not null",
dispatcher.getCollector() );
assertNotNull( "Expected internal observable event source not null",
dispatcher.getEventSource() );
}
/**
* Test method for
* {@link de.unikassel.android.sdcframework.util.EventDispatcherImpl#getCollector()}
* .
*/
public final void testGetCollector()
{
EventCollectorImpl< TestEvent > collector =
new EventCollectorImpl< TestEventDispatcher.TestEvent >();
EventDispatcherImpl< TestEvent > dispatcher =
new EventDispatcherImpl< TestEventDispatcher.TestEvent >( collector );
assertSame( "Expected collector the same ", collector,
dispatcher.getCollector() );
}
/**
* Private inner class implementing an event observer for the tested instance
* of EventDispatcherImpl< TestEvent >. Does always store last observed event;
*
* @author Katy Hilgenberg
*
*/
private class TestObserver implements EventObserver< TestEvent >
{
/**
* Public event list
*/
public final ArrayList< TestEvent > events = new ArrayList< TestEvent >();
/*
* (non-Javadoc)
*
* @see
* de.unikassel.android.sdcframework.util.facade.EventObserver#onEvent(de
* .unikassel.android.sdcframework.util.facade.ObservableEventSource,
* de.unikassel.android.sdcframework.util.facade.ObservableEvent)
*/
@Override
public void onEvent(
ObservableEventSource< ? extends TestEvent > eventSource,
TestEvent observedEvent )
{
events.add( observedEvent );
}
}
/**
* Test method for event dispatching to registered observers
*/
public final void testDispatching()
{
int count = 10;
EventCollectorImpl< TestEvent > collector =
new EventCollectorImpl< TestEventDispatcher.TestEvent >();
EventDispatcherImpl< TestEvent > dispatcher =
new EventDispatcherImpl< TestEventDispatcher.TestEvent >( collector );
dispatcher.setLogging( false );
// create and register event observer
TestObserver observer = new TestObserver();
dispatcher.registerEventObserver( observer );
// enqueue events
for ( int i = 0; i < count; ++i )
{
collector.enqueue( new TestEvent() );
}
assertEquals( "Expected collector queue with " + count + " elements",
count,
dispatcher.getCollector().getEventCount() );
assertEquals( "Expected no observed events so far", 0,
observer.events.size() );
// start dispatcher and wait for empty collectors queue
dispatcher.startWork();
do
{
TestUtils.sleep( 100 );
}
while ( collector.getEventCount() > 0 );
TestUtils.sleep( 100 );
dispatcher.stopWork();
assertEquals( "Expected " + count + " observed events now", count,
observer.events.size() );
observer.events.clear();
// test clean up
for ( int i = 0; i < count; ++i )
{
collector.enqueue( new TestEvent() );
}
assertTrue( "Expected collector queue filled with elements",
dispatcher.getCollector().getEventCount() >= count - 1 );
dispatcher.doTerminate();
TestUtils.sleep( 1000 );
assertEquals( "Expected collector queuey emptied", 0,
dispatcher.getCollector().getEventCount() );
assertTrue( "Expected dispatcher terminated",
dispatcher.hasTerminated() );
assertEquals( "Expected dispatcher in terminated sate",
Thread.State.TERMINATED, dispatcher.getState() );
}
}