/* * 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.engine.spi; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.hibernate.LockMode; import org.hibernate.engine.internal.MutableEntityEntry; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Tests for setting and getting the enum/boolean values stored in the compressed state int. * * @author Gunnar Morling */ public class EntityEntryTest { @Test public void packedAttributesAreSetByConstructor() { EntityEntry entityEntry = createEntityEntry(); assertEquals( LockMode.OPTIMISTIC, entityEntry.getLockMode() ); assertEquals( Status.MANAGED, entityEntry.getStatus() ); assertEquals( true, entityEntry.isExistsInDatabase() ); assertEquals( true, entityEntry.isBeingReplicated() ); } @Test public void testLockModeCanBeSetAndDoesNotAffectOtherPackedAttributes() { // Given EntityEntry entityEntry = createEntityEntry(); assertEquals( LockMode.OPTIMISTIC, entityEntry.getLockMode() ); assertEquals( Status.MANAGED, entityEntry.getStatus() ); assertEquals( true, entityEntry.isExistsInDatabase() ); assertEquals( true, entityEntry.isBeingReplicated() ); // When entityEntry.setLockMode( LockMode.PESSIMISTIC_READ ); // Then assertEquals( LockMode.PESSIMISTIC_READ, entityEntry.getLockMode() ); assertEquals( Status.MANAGED, entityEntry.getStatus() ); assertEquals( true, entityEntry.isExistsInDatabase() ); assertEquals( true, entityEntry.isBeingReplicated() ); } @Test public void testStatusCanBeSetAndDoesNotAffectOtherPackedAttributes() { // Given EntityEntry entityEntry = createEntityEntry(); // When entityEntry.setStatus( Status.DELETED ); // Then assertEquals( LockMode.OPTIMISTIC, entityEntry.getLockMode() ); assertEquals( Status.DELETED, entityEntry.getStatus() ); assertEquals( true, entityEntry.isExistsInDatabase() ); assertEquals( true, entityEntry.isBeingReplicated() ); } @Test public void testPostDeleteSetsStatusAndExistsInDatabaseWithoutAffectingOtherPackedAttributes() { // Given EntityEntry entityEntry = createEntityEntry(); // When entityEntry.postDelete(); // Then assertEquals( LockMode.OPTIMISTIC, entityEntry.getLockMode() ); assertEquals( Status.GONE, entityEntry.getStatus() ); assertEquals( false, entityEntry.isExistsInDatabase() ); assertEquals( true, entityEntry.isBeingReplicated() ); } @Test public void testSerializationAndDeserializationKeepCorrectPackedAttributes() throws Exception { EntityEntry entityEntry = createEntityEntry(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream( baos ); entityEntry.serialize(oos); oos.flush(); InputStream is = new ByteArrayInputStream( baos.toByteArray() ); EntityEntry deserializedEntry = MutableEntityEntry.deserialize(new ObjectInputStream( is ), getPersistenceContextMock() ); assertEquals( LockMode.OPTIMISTIC, deserializedEntry.getLockMode() ); assertEquals( Status.MANAGED, deserializedEntry.getStatus() ); assertEquals( true, deserializedEntry.isExistsInDatabase() ); assertEquals( true, deserializedEntry.isBeingReplicated() ); } private EntityEntry createEntityEntry() { return new MutableEntityEntry( // status Status.MANAGED, // loadedState new Object[]{}, // rowId 1L, // id 42L, // version 23L, // lockMode LockMode.OPTIMISTIC, // existsInDatabase true, // persister null, // disableVersionIncrement true, getPersistenceContextMock() ); } private final PersistenceContext getPersistenceContextMock() { SessionImplementor sessionMock = mock( SessionImplementor.class ); PersistenceContext persistenceContextMock = mock( PersistenceContext.class ); when( persistenceContextMock.getSession() ).thenReturn( sessionMock ); return persistenceContextMock; } }