/*
* Bitronix Transaction Manager
*
* Copyright (c) 2010, Bitronix Software.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package bitronix.tm.utils;
import junit.framework.TestCase;
import bitronix.tm.resource.common.ResourceBean;
import bitronix.tm.internal.XAResourceHolderState;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.List;
/**
*
* @author lorban
*/
public class SchedulerTest extends TestCase {
public void testNaturalOrdering() throws Exception {
Scheduler resourceScheduler = new Scheduler();
XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs2 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs3 = new XAResourceHolderState(null, new MockResourceBean(0));
XAResourceHolderState xarhs4 = new XAResourceHolderState(null, new MockResourceBean(10));
resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs2, xarhs2.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs3, xarhs3.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs4, xarhs4.getTwoPcOrderingPosition());
assertEquals("a Scheduler with 5 object(s) in 3 position(s)", resourceScheduler.toString());
/* testing natural order priorities */
assertEquals(5, resourceScheduler.size());
Set priorities = resourceScheduler.getNaturalOrderPositions();
assertEquals(3, priorities.size());
Iterator it = priorities.iterator();
Object key0 = it.next();
Object key1 = it.next();
Object key2 = it.next();
assertFalse(it.hasNext());
List list0 = resourceScheduler.getByNaturalOrderForPosition(key0);
assertEquals(1, list0.size());
assertTrue(xarhs3 == list0.get(0));
List list1 = resourceScheduler.getByNaturalOrderForPosition(key1);
assertEquals(3, list1.size());
assertTrue(xarhs0 == list1.get(0));
assertTrue(xarhs1 == list1.get(1));
assertTrue(xarhs2 == list1.get(2));
List list2 = resourceScheduler.getByNaturalOrderForPosition(key2);
assertEquals(1, list2.size());
assertTrue(xarhs4 == list2.get(0));
}
public void testReverseOrdering() throws Exception {
Scheduler resourceScheduler = new Scheduler();
XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs2 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs3 = new XAResourceHolderState(null, new MockResourceBean(0));
XAResourceHolderState xarhs4 = new XAResourceHolderState(null, new MockResourceBean(10));
resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs2, xarhs2.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs3, xarhs3.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs4, xarhs4.getTwoPcOrderingPosition());
assertEquals("a Scheduler with 5 object(s) in 3 position(s)", resourceScheduler.toString());
Set reverseOrderPriorities = resourceScheduler.getReverseOrderPositions();
assertEquals(3, reverseOrderPriorities.size());
Iterator itReverse = reverseOrderPriorities.iterator();
Object key0r = itReverse.next();
Object key1r = itReverse.next();
Object key2r = itReverse.next();
assertFalse(itReverse.hasNext());
List list0r = resourceScheduler.getByReverseOrderForPosition(key0r);
assertEquals(1, list0r.size());
assertTrue(xarhs4 == list0r.get(0));
List list1r = resourceScheduler.getByReverseOrderForPosition(key1r);
assertEquals(3, list1r.size());
assertTrue(xarhs2 == list1r.get(0));
assertTrue(xarhs1 == list1r.get(1));
assertTrue(xarhs0 == list1r.get(2));
List list2r = resourceScheduler.getByReverseOrderForPosition(key2r);
assertEquals(1, list2r.size());
assertTrue(xarhs3 == list2r.get(0));
}
public void testIterator() {
Scheduler resourceScheduler = new Scheduler();
XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs2 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs3 = new XAResourceHolderState(null, new MockResourceBean(0));
XAResourceHolderState xarhs4 = new XAResourceHolderState(null, new MockResourceBean(10));
resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs2, xarhs2.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs3, xarhs3.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs4, xarhs4.getTwoPcOrderingPosition());
assertEquals("a Scheduler with 5 object(s) in 3 position(s)", resourceScheduler.toString());
Iterator it = resourceScheduler.iterator();
assertTrue(it.hasNext());
assertTrue(xarhs3 == it.next());
assertTrue(xarhs0 == it.next());
assertTrue(xarhs1 == it.next());
assertTrue(xarhs2 == it.next());
assertTrue(xarhs4 == it.next());
assertFalse(it.hasNext());
it = resourceScheduler.iterator();
assertTrue(it.hasNext());
assertTrue(xarhs3 == it.next());
it.remove();
assertTrue(xarhs0 == it.next());
it.remove();
assertTrue(xarhs1 == it.next());
it.remove();
assertTrue(xarhs2 == it.next());
it.remove();
assertTrue(xarhs4 == it.next());
it.remove();
assertFalse(it.hasNext());
assertEquals(0, resourceScheduler.size());
}
public void testReverseIterator() {
Scheduler resourceScheduler = new Scheduler();
XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs2 = new XAResourceHolderState(null, new MockResourceBean(1));
XAResourceHolderState xarhs3 = new XAResourceHolderState(null, new MockResourceBean(0));
XAResourceHolderState xarhs4 = new XAResourceHolderState(null, new MockResourceBean(10));
resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs2, xarhs2.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs3, xarhs3.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs4, xarhs4.getTwoPcOrderingPosition());
assertEquals("a Scheduler with 5 object(s) in 3 position(s)", resourceScheduler.toString());
Iterator it = resourceScheduler.reverseIterator();
assertTrue(it.hasNext());
assertTrue(xarhs4 == it.next());
assertTrue(xarhs0 == it.next());
assertTrue(xarhs1 == it.next());
assertTrue(xarhs2 == it.next());
assertTrue(xarhs3 == it.next());
assertFalse(it.hasNext());
}
public void testRemove() {
Scheduler resourceScheduler = new Scheduler();
XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(0));
XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(1));
resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition());
resourceScheduler.remove(xarhs0);
resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition());
Iterator it = resourceScheduler.iterator();
assertTrue(it.hasNext());
assertTrue(xarhs0 == it.next());
it.remove();
assertTrue(xarhs1 == it.next());
it.remove();
}
public void testReverseRemove() {
Scheduler resourceScheduler = new Scheduler();
XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(0));
XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(1));
resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition());
resourceScheduler.remove(xarhs0);
resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition());
Iterator it = resourceScheduler.reverseIterator();
assertTrue(it.hasNext());
assertTrue(xarhs1 == it.next());
it.remove();
assertTrue(xarhs0 == it.next());
it.remove();
}
public void testHasNext() {
Scheduler resourceScheduler = new Scheduler();
XAResourceHolderState xarhs0 = new XAResourceHolderState(null, new MockResourceBean(0));
XAResourceHolderState xarhs1 = new XAResourceHolderState(null, new MockResourceBean(10));
resourceScheduler.add(xarhs0, xarhs0.getTwoPcOrderingPosition());
resourceScheduler.add(xarhs1, xarhs1.getTwoPcOrderingPosition());
Iterator it = resourceScheduler.iterator();
for (int i=0; i<10 ;i++) {
assertTrue(it.hasNext());
}
it.next();
for (int i=0; i<10 ;i++) {
assertTrue(it.hasNext());
}
it.next();
for (int i=0; i<10 ;i++) {
assertFalse(it.hasNext());
}
try {
it.next();
fail("expected NoSuchElementException");
} catch (NoSuchElementException ex) {
// expected
}
}
private static int counter = 0;
private static int incCounter() {
return counter++;
}
private class MockResourceBean extends ResourceBean {
private int number;
private int commitOrderingPosition;
private MockResourceBean(int commitOrderingPosition) {
this.number = incCounter();
this.commitOrderingPosition = commitOrderingPosition;
}
public int getTwoPcOrderingPosition() {
return commitOrderingPosition;
}
public String toString() {
return "a MockResourceBean #" + number;
}
}
}