/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.util.journal.queue;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.util.queue.DefaultQueueStore;
import org.mule.runtime.core.util.xa.MuleXid;
import org.mule.tck.junit4.AbstractMuleContextTestCase;
import com.google.common.collect.Multimap;
import java.util.Collection;
import java.util.Iterator;
import javax.transaction.xa.Xid;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.Answers;
public class XaTxQueueTransactionJournalTestCase extends AbstractMuleContextTestCase {
public static final Xid TX_ID = new MuleXid(9, new byte[] {1, 2, 3, 4}, new byte[] {5, 6, 7, 8});
public static final String QUEUE_NAME = "queueName";
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
private DefaultQueueStore mockQueueInfo = mock(DefaultQueueStore.class, Answers.RETURNS_DEEP_STUBS.get());
@Before
public void setUpMocks() {
when(mockQueueInfo.getName()).thenReturn(QUEUE_NAME);
}
@Test
public void logAddAndRetrieve() throws Exception {
XaTxQueueTransactionJournal transactionJournal =
new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
transactionJournal.logAdd(TX_ID, mockQueueInfo, testEvent());
transactionJournal.close();
transactionJournal = new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
Multimap<Xid, XaQueueTxJournalEntry> allEntries = transactionJournal.getAllLogEntries();
assertThat(allEntries.size(), is(1));
assertThat(allEntries.get(TX_ID).size(), is(1));
XaQueueTxJournalEntry logEntry = allEntries.get(TX_ID).iterator().next();
assertThat(logEntry.getQueueName(), is(QUEUE_NAME));
assertThat(getPayloadAsString(((Event) logEntry.getValue()).getMessage()), is(TEST_PAYLOAD));
assertThat(logEntry.isAdd(), is(true));
}
@Test
public void logAddFirstAndRetrieve() throws Exception {
XaTxQueueTransactionJournal transactionJournal =
new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
transactionJournal.logAddFirst(TX_ID, mockQueueInfo, testEvent());
transactionJournal.close();
transactionJournal = new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
Multimap<Xid, XaQueueTxJournalEntry> allEntries = transactionJournal.getAllLogEntries();
assertThat(allEntries.size(), is(1));
assertThat(allEntries.get(TX_ID).size(), is(1));
XaQueueTxJournalEntry journalEntry = allEntries.get(TX_ID).iterator().next();
assertThat(journalEntry.getQueueName(), is(QUEUE_NAME));
assertThat(getPayloadAsString(((Event) journalEntry.getValue()).getMessage()), is(TEST_PAYLOAD));
assertThat(journalEntry.isAddFirst(), is(true));
}
@Test
public void logRemoveAndRetrieve() throws Exception {
XaTxQueueTransactionJournal transactionJournal =
new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
transactionJournal.logRemove(TX_ID, mockQueueInfo, testEvent());
transactionJournal.close();
transactionJournal = new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
Multimap<Xid, XaQueueTxJournalEntry> allEntries = transactionJournal.getAllLogEntries();
assertThat(allEntries.size(), is(1));
assertThat(allEntries.get(TX_ID).size(), is(1));
XaQueueTxJournalEntry journalEntry = allEntries.get(TX_ID).iterator().next();
assertThat(journalEntry.getQueueName(), is(QUEUE_NAME));
assertThat(getPayloadAsString(((Event) journalEntry.getValue()).getMessage()), is(TEST_PAYLOAD));
assertThat(journalEntry.isRemove(), is(true));
}
@Test
public void logCommitAndRetrieve() {
XaTxQueueTransactionJournal transactionJournal =
new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
transactionJournal.logCommit(TX_ID);
transactionJournal.close();
transactionJournal = new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
Multimap<Xid, XaQueueTxJournalEntry> allEntries = transactionJournal.getAllLogEntries();
assertThat(allEntries.size(), is(0));
}
@Test
public void logRollbackAndRetrieve() {
XaTxQueueTransactionJournal transactionJournal =
new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
transactionJournal.logRollback(TX_ID);
transactionJournal.close();
transactionJournal = new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
Multimap<Xid, XaQueueTxJournalEntry> allEntries = transactionJournal.getAllLogEntries();
assertThat(allEntries.size(), is(0));
}
@Test
public void logSeveralAddsThenCommitAndRetrieve() throws Exception {
XaTxQueueTransactionJournal transactionJournal =
new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
int numberOfOffers = 1000;
for (int i = 0; i < numberOfOffers; i++) {
transactionJournal.logAdd(TX_ID, mockQueueInfo, testEvent());
}
transactionJournal.logCommit(TX_ID);
transactionJournal.close();
transactionJournal = new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
Multimap<Xid, XaQueueTxJournalEntry> allEntries = transactionJournal.getAllLogEntries();
assertThat(allEntries.size(), is(0));
}
@Test
public void logSeveralAddsThenRetrieveAndCommit() throws Exception {
XaTxQueueTransactionJournal transactionJournal =
new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
int numberOfOffers = 1000;
for (int i = 0; i < numberOfOffers; i++) {
transactionJournal.logAdd(TX_ID, mockQueueInfo, testEvent());
}
transactionJournal.close();
transactionJournal = new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
transactionJournal.logCommit(TX_ID);
Multimap<Xid, XaQueueTxJournalEntry> allEntries = transactionJournal.getAllLogEntries();
assertThat(allEntries.size(), is(0));
}
@Test
public void logSeveralAddsAndRetrieve() throws Exception {
XaTxQueueTransactionJournal transactionJournal =
new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
int numberOfOffers = 1000;
for (int i = 0; i < numberOfOffers; i++) {
transactionJournal.logAdd(TX_ID, mockQueueInfo, testEvent());
}
transactionJournal.close();
transactionJournal = new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
Multimap<Xid, XaQueueTxJournalEntry> allEntries = transactionJournal.getAllLogEntries();
assertThat(allEntries.size(), is(numberOfOffers));
assertThat(allEntries.get(TX_ID).size(), is(numberOfOffers));
XaQueueTxJournalEntry journalEntry = allEntries.get(TX_ID).iterator().next();
assertThat(journalEntry.getQueueName(), is(QUEUE_NAME));
assertThat(getPayloadAsString(((Event) journalEntry.getValue()).getMessage()), is(TEST_PAYLOAD));
assertThat(journalEntry.isAdd(), is(true));
}
@Test
public void logAddAndPrepare() throws Exception {
XaTxQueueTransactionJournal transactionJournal =
new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
transactionJournal.logAdd(TX_ID, mockQueueInfo, testEvent());
transactionJournal.logPrepare(TX_ID);
transactionJournal.close();
transactionJournal = new XaTxQueueTransactionJournal(temporaryFolder.getRoot().getAbsolutePath(), muleContext);
Multimap<Xid, XaQueueTxJournalEntry> allEntries = transactionJournal.getAllLogEntries();
assertThat(allEntries.size(), is(2));
Collection<XaQueueTxJournalEntry> values = allEntries.values();
assertThat(values.size(), is(2));
Iterator<XaQueueTxJournalEntry> iterator = values.iterator();
XaQueueTxJournalEntry addEntry = iterator.next();
assertThat(addEntry.isAdd(), is(true));
XaQueueTxJournalEntry prepareEntry = iterator.next();
assertThat(prepareEntry.isPrepare(), is(true));
}
}