package org.neo4j.kernel.impl.event;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.event.ErrorState;
import org.neo4j.graphdb.event.KernelEventHandler;
import org.neo4j.kernel.EmbeddedGraphDatabase;
public class TestKernelEvents
{
private static final Object RESOURCE1 = new Object();
private static final Object RESOURCE2 = new Object();
@Test
public void testRegisterUnregisterHandlers()
{
GraphDatabaseService graphDb = new EmbeddedGraphDatabase( "target/var/neodb" );
KernelEventHandler handler1 = new DummyKernelEventHandler( RESOURCE1 )
{
public ExecutionOrder orderComparedTo( KernelEventHandler other )
{
return ExecutionOrder.DOESNT_MATTER;
}
};
KernelEventHandler handler2 = new DummyKernelEventHandler( RESOURCE2 )
{
public ExecutionOrder orderComparedTo( KernelEventHandler other )
{
return ExecutionOrder.DOESNT_MATTER;
}
};
try
{
graphDb.unregisterKernelEventHandler( handler1 );
fail( "Shouldn't be able to do unregister on a "
+ "unregistered handler" );
}
catch ( IllegalStateException e )
{ /* Good */
}
graphDb.registerKernelEventHandler( handler1 );
graphDb.registerKernelEventHandler( handler1 );
graphDb.unregisterKernelEventHandler( handler1 );
try
{
graphDb.unregisterKernelEventHandler( handler1 );
fail( "Shouldn't be able to do unregister on a "
+ "unregistered handler" );
}
catch ( IllegalStateException e )
{ /* Good */
}
graphDb.registerKernelEventHandler( handler1 );
graphDb.registerKernelEventHandler( handler2 );
graphDb.unregisterKernelEventHandler( handler1 );
graphDb.unregisterKernelEventHandler( handler2 );
graphDb.shutdown();
}
@Test
public void testShutdownEvents()
{
GraphDatabaseService graphDb = new EmbeddedGraphDatabase( "target/var/neodb" );
DummyKernelEventHandler handler1 = new DummyKernelEventHandler( RESOURCE1 )
{
public ExecutionOrder orderComparedTo( KernelEventHandler other )
{
if ( ((DummyKernelEventHandler) other).resource == RESOURCE2 )
{
return ExecutionOrder.AFTER;
}
return ExecutionOrder.DOESNT_MATTER;
}
};
DummyKernelEventHandler handler2 = new DummyKernelEventHandler( RESOURCE1 )
{
public ExecutionOrder orderComparedTo( KernelEventHandler other )
{
if ( ((DummyKernelEventHandler) other).resource == RESOURCE1 )
{
return ExecutionOrder.BEFORE;
}
return ExecutionOrder.DOESNT_MATTER;
}
};
graphDb.registerKernelEventHandler( handler1 );
graphDb.registerKernelEventHandler( handler2 );
graphDb.shutdown();
assertEquals( Integer.valueOf( 0 ), handler2.beforeShutdown );
assertEquals( Integer.valueOf( 1 ), handler1.beforeShutdown );
}
private static abstract class DummyKernelEventHandler implements KernelEventHandler
{
private static int counter;
private Integer beforeShutdown, kernelPanic;
private final Object resource;
DummyKernelEventHandler( Object resource )
{
this.resource = resource;
}
public void beforeShutdown()
{
beforeShutdown = counter++;
}
public Object getResource()
{
return this.resource;
}
public void kernelPanic( ErrorState error )
{
kernelPanic = counter++;
}
}
}