/** * Copyright (C) 2000-2016 Atomikos <info@atomikos.com> * * LICENSE CONDITIONS * * See http://www.atomikos.com/Main/WhichLicenseApplies for details. */ package com.atomikos.icatch.admin.imp; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import com.atomikos.icatch.admin.AdminTransaction; import com.atomikos.icatch.admin.imp.LogControlImp; import com.atomikos.recovery.AdminLog; import com.atomikos.recovery.CoordinatorLogEntry; import com.atomikos.recovery.ParticipantLogEntry; import com.atomikos.recovery.TxState; public class LogControlImpTestJUnit { private static final String TID = "TID"; private LogControlImp sut; private AdminLog adminLog; private AdminTransaction adminTransaction; private ParticipantLogEntry[] participantDetails = new ParticipantLogEntry[2]; @Before public void configure() { adminLog = Mockito.mock(AdminLog.class); sut = new LogControlImp(adminLog); participantDetails[0] = new ParticipantLogEntry(TID, "one", 1000, "one", TxState.COMMITTING); participantDetails[1] = new ParticipantLogEntry(TID, "two", 1000, "two", TxState.COMMITTING); } @Test public void testGetAdminTransactions() throws Exception { givenPendingTransactionInLog(); whenGetAdminTransactions(); thenActiveCoordinatorsRetrievedFromAdminLog(); } @Test public void testGetTid() throws Exception { givenPendingTransactionInLog(); whenGetAdminTransactions(); thenAdminTransactionHasCorrectTid(); } @Test public void testGetFilteredAdminTransactions() throws Exception { givenPendingTransactionInLog(); whenGetFilteredAdminTransactions(); thenActiveCoordinatorsRetrievedFromAdminLog(); } @Test public void testGetState() throws Exception { givenPendingTransactionInLog(); whenGetAdminTransactions(); thenAdminTransactionHasCorrectState(); } @Test public void testWasNotCommitted() throws Exception { givenPendingTransactionInLog(false); whenGetAdminTransactions(); thenAdminTransactionWasCommitted(false); } @Test public void testWasCommitted() throws Exception { givenPendingTransactionInLog(true); whenGetAdminTransactions(); thenAdminTransactionWasCommitted(true); } @Test public void testGetParticipantDetails() throws Exception { givenPendingTransactionInLog(); whenGetAdminTransactions(); thenAdminTransactionHasCorrectParticipantDetails(); } @Test public void testForceForget() { givenPendingTransactionInLog(true); whenForceForget(); thenCoordinatorWasRemovedFromAdminLog(); } private void thenCoordinatorWasRemovedFromAdminLog() { Mockito.verify(adminLog, Mockito.times(1)).remove(adminTransaction.getTid()); } private void whenForceForget() { whenGetAdminTransactions(); adminTransaction.forceForget(); } private void thenAdminTransactionHasCorrectParticipantDetails() { Assert.assertEquals(2, adminTransaction.getParticipantDetails().length); Assert.assertEquals(participantDetails[0].toString(), adminTransaction.getParticipantDetails()[0]); Assert.assertEquals(participantDetails[1].toString(), adminTransaction.getParticipantDetails()[1]); } private void thenAdminTransactionWasCommitted(boolean value) { Assert.assertEquals(value, adminTransaction.wasCommitted()); } private void givenPendingTransactionInLog(boolean wasCommitted) { CoordinatorLogEntry[] result = new CoordinatorLogEntry[1]; result[0] = new CoordinatorLogEntry(TID, wasCommitted, participantDetails); Mockito.when(adminLog.getCoordinatorLogEntries()).thenReturn(result); } private void thenAdminTransactionHasCorrectState() { Assert.assertEquals(TxState.COMMITTING, adminTransaction.getState()); } private void whenGetFilteredAdminTransactions() { AdminTransaction[] adminTransactions = sut.getAdminTransactions(TID); adminTransaction = adminTransactions[0]; } private void thenAdminTransactionHasCorrectTid() { Assert.assertEquals(TID, adminTransaction.getTid()); } private void thenActiveCoordinatorsRetrievedFromAdminLog() { Mockito.verify(adminLog, Mockito.times(1)).getCoordinatorLogEntries(); Assert.assertNotNull(adminTransaction); } private void whenGetAdminTransactions() { AdminTransaction[] adminTransactions = sut.getAdminTransactions(); adminTransaction = adminTransactions[0]; } private void givenPendingTransactionInLog() { CoordinatorLogEntry[] result = new CoordinatorLogEntry[1]; result[0] = new CoordinatorLogEntry(TID, participantDetails); Mockito.when(adminLog.getCoordinatorLogEntries()).thenReturn(result); } }