/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.test.resource.transaction;
import javax.transaction.Status;
import javax.transaction.Synchronization;
import org.hibernate.resource.transaction.LocalSynchronizationException;
import org.hibernate.resource.transaction.NullSynchronizationException;
import org.hibernate.resource.transaction.internal.SynchronizationRegistryStandardImpl;
import org.hibernate.test.resource.common.SynchronizationCollectorImpl;
import org.hibernate.test.resource.common.SynchronizationErrorImpl;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
/**
* Unit tests for SynchronizationRegistryStandardImpl.
*
* @author Steve Ebersole
*/
public class SynchronizationRegistryStandardImplTests {
@Test
public void basicUsageTests() {
final SynchronizationRegistryStandardImpl registry = new SynchronizationRegistryStandardImpl();
try {
registry.registerSynchronization( null );
fail( "Was expecting NullSynchronizationException, but call succeeded" );
}
catch (NullSynchronizationException expected) {
// expected behavior
}
catch (Exception e) {
fail( "Was expecting NullSynchronizationException, but got " + e.getClass().getName() );
}
final SynchronizationCollectorImpl synchronization = new SynchronizationCollectorImpl();
assertEquals( 0, registry.getNumberOfRegisteredSynchronizations() );
registry.registerSynchronization( synchronization );
assertEquals( 1, registry.getNumberOfRegisteredSynchronizations() );
registry.registerSynchronization( synchronization );
assertEquals( 1, registry.getNumberOfRegisteredSynchronizations() );
assertEquals( 0, synchronization.getBeforeCompletionCount() );
assertEquals( 0, synchronization.getSuccessfulCompletionCount() );
assertEquals( 0, synchronization.getFailedCompletionCount() );
{
registry.notifySynchronizationsBeforeTransactionCompletion();
assertEquals( 1, synchronization.getBeforeCompletionCount() );
assertEquals( 0, synchronization.getSuccessfulCompletionCount() );
assertEquals( 0, synchronization.getFailedCompletionCount() );
registry.notifySynchronizationsAfterTransactionCompletion( Status.STATUS_COMMITTED );
assertEquals( 1, synchronization.getBeforeCompletionCount() );
assertEquals( 1, synchronization.getSuccessfulCompletionCount() );
assertEquals( 0, synchronization.getFailedCompletionCount() );
}
// after completion should clear registered synchronizations
assertEquals( 0, registry.getNumberOfRegisteredSynchronizations() );
// reset the sync
synchronization.reset();
assertEquals( 0, synchronization.getBeforeCompletionCount() );
assertEquals( 0, synchronization.getSuccessfulCompletionCount() );
assertEquals( 0, synchronization.getFailedCompletionCount() );
// re-register it
registry.registerSynchronization( synchronization );
assertEquals( 1, registry.getNumberOfRegisteredSynchronizations() );
{
registry.notifySynchronizationsAfterTransactionCompletion( Status.STATUS_ROLLEDBACK );
assertEquals( 0, synchronization.getBeforeCompletionCount() );
assertEquals( 0, synchronization.getSuccessfulCompletionCount() );
assertEquals( 1, synchronization.getFailedCompletionCount() );
// after completion should clear registered synchronizations
assertEquals( 0, registry.getNumberOfRegisteredSynchronizations() );
}
}
@Test
public void testUserSynchronizationExceptions() {
// exception in beforeCompletion
SynchronizationRegistryStandardImpl registry = new SynchronizationRegistryStandardImpl();
Synchronization synchronization = SynchronizationErrorImpl.forBefore();
registry.registerSynchronization( synchronization );
try {
registry.notifySynchronizationsBeforeTransactionCompletion();
fail( "Expecting LocalSynchronizationException, but call succeeded" );
}
catch (LocalSynchronizationException expected) {
// expected
}
catch (Exception e) {
fail( "Was expecting LocalSynchronizationException, but got " + e.getClass().getName() );
}
// exception in beforeCompletion
registry.clearSynchronizations();
registry = new SynchronizationRegistryStandardImpl();
synchronization = SynchronizationErrorImpl.forAfter();
registry.registerSynchronization( synchronization );
try {
registry.notifySynchronizationsAfterTransactionCompletion( Status.STATUS_COMMITTED );
fail( "Expecting LocalSynchronizationException, but call succeeded" );
}
catch (LocalSynchronizationException expected) {
// expected
}
catch (Exception e) {
fail( "Was expecting LocalSynchronizationException, but got " + e.getClass().getName() );
}
}
}