1 4 package com.tc.objectserver.tx; 5 6 import com.tc.bytes.TCByteBuffer; 7 import com.tc.exception.ImplementMe; 8 import com.tc.net.protocol.tcm.ChannelID; 9 import com.tc.object.MockTCObject; 10 import com.tc.object.ObjectID; 11 import com.tc.object.bytecode.MockClassProvider; 12 import com.tc.object.dna.impl.DNAEncoding; 13 import com.tc.object.dna.impl.ObjectStringSerializer; 14 import com.tc.object.gtx.GlobalTransactionID; 15 import com.tc.object.lockmanager.api.LockID; 16 import com.tc.object.lockmanager.api.Notify; 17 import com.tc.object.lockmanager.api.ThreadID; 18 import com.tc.object.logging.NullRuntimeLogger; 19 import com.tc.object.msg.CommitTransactionMessage; 20 import com.tc.object.msg.CommitTransactionMessageFactory; 21 import com.tc.object.tx.ClientTransaction; 22 import com.tc.object.tx.ClientTransactionImpl; 23 import com.tc.object.tx.TestClientTransaction; 24 import com.tc.object.tx.TransactionBatch; 25 import com.tc.object.tx.TransactionBatchWriter; 26 import com.tc.object.tx.TransactionContext; 27 import com.tc.object.tx.TransactionID; 28 import com.tc.object.tx.TxnBatchID; 29 import com.tc.object.tx.TxnType; 30 import com.tc.util.SequenceID; 31 32 import java.io.IOException ; 33 import java.util.Arrays ; 34 import java.util.Collection ; 35 import java.util.HashSet ; 36 import java.util.Iterator ; 37 import java.util.LinkedList ; 38 import java.util.List ; 39 import java.util.Set ; 40 41 import junit.framework.TestCase; 42 43 public class TransactionBatchTest extends TestCase { 44 45 private DNAEncoding encoding = new DNAEncoding(new MockClassProvider()); 46 47 private TransactionBatchWriter writer; 48 private TestCommitTransactionMessageFactory messageFactory; 49 50 public void setUp() throws Exception { 51 ObjectStringSerializer serializer = new ObjectStringSerializer(); 52 messageFactory = new TestCommitTransactionMessageFactory(); 53 writer = new TransactionBatchWriter(new TxnBatchID(1), serializer, encoding, messageFactory); 54 } 55 56 public void testGetMinTransaction() throws Exception { 57 LinkedList list = new LinkedList (); 58 for (int i = 0; i < 100; i++) { 59 TestClientTransaction tx = new TestClientTransaction(); 60 tx.sequenceID = new SequenceID(i); 61 tx.txID = new TransactionID(i); 62 tx.txnType = TxnType.NORMAL; 63 list.add(tx); 64 writer.addTransaction(tx); 65 } 66 67 writer.wait4AllTxns2Serialize(); 68 69 assertSame(((ClientTransaction) list.getFirst()).getSequenceID(), writer.getMinTransactionSequence()); 70 71 for (int i = 50; i < 55; i++) { 73 ClientTransaction tx = (ClientTransaction) list.remove(i); 74 writer.removeTransaction(tx.getTransactionID()); 75 assertSame(((ClientTransaction) list.getFirst()).getSequenceID(), writer.getMinTransactionSequence()); 76 } 77 78 for (Iterator i = list.iterator(); i.hasNext();) { 80 ClientTransaction tx = (ClientTransaction) i.next(); 81 assertSame(((ClientTransaction) list.getFirst()).getSequenceID(), writer.getMinTransactionSequence()); 82 i.remove(); 83 writer.removeTransaction(tx.getTransactionID()); 84 } 85 } 86 87 public void testAddAcknowledgedTransactionIDs() throws Exception { 88 Set txs = new HashSet (); 89 for (int i = 0; i < 100; i++) { 90 GlobalTransactionID txID = new GlobalTransactionID(i); 91 txs.add(txID); 92 } 93 writer.addAcknowledgedTransactionIDs(txs); 94 assertEquals(txs, writer.getAcknowledgedTransactionIDs()); 95 } 96 97 public void testSend() throws Exception { 98 assertTrue(messageFactory.messages.isEmpty()); 99 100 writer.send(); 101 102 assertEquals(1, messageFactory.messages.size()); 103 TestCommitTransactionMessage message = (TestCommitTransactionMessage) messageFactory.messages.get(0); 104 assertEquals(1, message.setBatchCalls.size()); 105 assertSame(writer, message.setBatchCalls.get(0)); 106 assertEquals(1, message.sendCalls.size()); 107 } 108 109 public void testWriteRead() throws IOException { 110 long sequence = 0; 111 ObjectStringSerializer serializer = new ObjectStringSerializer(); 112 TestCommitTransactionMessageFactory mf = new TestCommitTransactionMessageFactory(); 113 ChannelID channel = new ChannelID(69); 114 TxnBatchID batchID = new TxnBatchID(42); 115 116 List tx1Notifies = new LinkedList (); 117 LockID lid1 = new LockID("1"); 119 TransactionContext tc = new TransactionContext(lid1, TxnType.NORMAL, new LockID[] { lid1 }); 120 ClientTransaction tmp = new ClientTransactionImpl(new TransactionID(101), new NullRuntimeLogger(), null); 121 tmp.setTransactionContext(tc); 122 LockID lid2 = new LockID("2"); 123 tc = new TransactionContext(lid2, TxnType.NORMAL, new LockID[] { lid1, lid2 }); 124 ClientTransaction txn1 = new ClientTransactionImpl(new TransactionID(1), new NullRuntimeLogger(), null); 125 txn1.setTransactionContext(tc); 126 127 txn1.fieldChanged(new MockTCObject(new ObjectID(1), this), "class", "class.field", ObjectID.NULL_ID, -1); 128 txn1.createObject(new MockTCObject(new ObjectID(2), this)); 129 txn1.createRoot("root", new ObjectID(3)); 130 for (int i = 0; i < 10; i++) { 131 Notify notify = new Notify(new LockID("" + i), new ThreadID(i), i % 2 == 0); 132 tx1Notifies.add(notify); 133 txn1.addNotify(notify); 134 } 135 136 tc = new TransactionContext(new LockID("3"), TxnType.CONCURRENT, new LockID[] { new LockID("3") }); 137 ClientTransaction txn2 = new ClientTransactionImpl(new TransactionID(2), new NullRuntimeLogger(), null); 138 txn2.setTransactionContext(tc); 139 140 writer = new TransactionBatchWriter(batchID, serializer, encoding, mf); 141 142 txn1.setSequenceID(new SequenceID(++sequence)); 143 txn2.setSequenceID(new SequenceID(++sequence)); 144 writer.addTransaction(txn1); 145 writer.addTransaction(txn2); 146 writer.wait4AllTxns2Serialize(); 147 148 TransactionBatchReaderImpl reader = new TransactionBatchReaderImpl(writer.getData(), channel, new HashSet (), 149 serializer, false); 150 assertEquals(2, reader.getNumTxns()); 151 assertEquals(batchID, reader.getBatchID()); 152 153 int count = 0; 154 ServerTransaction txn; 155 while ((txn = reader.getNextTransaction()) != null) { 156 count++; 157 assertEquals(channel, txn.getChannelID()); 158 assertEquals(count, txn.getTransactionID().toLong()); 159 160 switch (count) { 161 case 1: 162 assertEquals(2, txn.getChanges().size()); 163 assertEquals(1, txn.getNewRoots().size()); 164 assertEquals("root", txn.getNewRoots().keySet().toArray()[0]); 165 assertEquals(new ObjectID(3), txn.getNewRoots().values().toArray()[0]); 166 assertEquals(2, txn.getObjectIDs().size()); 167 assertTrue(txn.getObjectIDs().containsAll(Arrays.asList(new ObjectID[] { new ObjectID(1), new ObjectID(2) }))); 168 assertEquals(TxnType.NORMAL, txn.getTransactionType()); 169 assertTrue(Arrays.equals(new LockID[] { new LockID("1"), new LockID("2") }, txn.getLockIDs())); 170 assertEquals(tx1Notifies, txn.addNotifiesTo(new LinkedList ())); 171 break; 172 case 2: 173 assertEquals(0, txn.getChanges().size()); 174 assertEquals(0, txn.getNewRoots().size()); 175 assertEquals(0, txn.getObjectIDs().size()); 176 assertEquals(TxnType.CONCURRENT, txn.getTransactionType()); 177 assertTrue(Arrays.equals(new LockID[] { new LockID("3") }, txn.getLockIDs())); 178 break; 179 default: 180 fail("count is " + count); 181 } 182 } 183 184 assertEquals(2, count); 185 186 } 187 188 private static final class TestCommitTransactionMessageFactory implements CommitTransactionMessageFactory { 189 190 public final List messages = new LinkedList (); 191 192 public CommitTransactionMessage newCommitTransactionMessage() { 193 CommitTransactionMessage rv = new TestCommitTransactionMessage(); 194 messages.add(rv); 195 return rv; 196 } 197 198 } 199 200 private static final class TestCommitTransactionMessage implements CommitTransactionMessage { 201 202 public final List setBatchCalls = new LinkedList (); 203 public final List sendCalls = new LinkedList (); 204 public ObjectStringSerializer serializer; 205 206 public void setBatch(TransactionBatch batch, ObjectStringSerializer serializer) { 207 setBatchCalls.add(batch); 208 this.serializer = serializer; 209 } 210 211 public TCByteBuffer[] getBatchData() { 212 return null; 213 } 214 215 public void send() { 216 this.sendCalls.add(new Object ()); 217 } 218 219 public ObjectStringSerializer getSerializer() { 220 return serializer; 221 } 222 223 public Collection addAcknowledgedTransactionIDsTo(Collection c) { 224 throw new ImplementMe(); 225 } 226 227 public ChannelID getChannelID() { 228 return ChannelID.NULL_ID; 229 } 230 231 } 232 233 } 234
| Popular Tags
|