KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > objectserver > tx > TransactionBatchTest


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

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 JavaDoc;
33 import java.util.Arrays JavaDoc;
34 import java.util.Collection JavaDoc;
35 import java.util.HashSet JavaDoc;
36 import java.util.Iterator JavaDoc;
37 import java.util.LinkedList JavaDoc;
38 import java.util.List JavaDoc;
39 import java.util.Set JavaDoc;
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 JavaDoc {
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 JavaDoc {
57     LinkedList JavaDoc list = new LinkedList JavaDoc();
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     // remove some from the middle and make sure the min is constant
72
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     // now remove the leastmost transaction and make sure the min increases.
79
for (Iterator JavaDoc 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 JavaDoc {
88     Set JavaDoc txs = new HashSet JavaDoc();
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 JavaDoc {
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 JavaDoc {
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 JavaDoc tx1Notifies = new LinkedList JavaDoc();
117     // A nested transaction (all this buys us is more than 1 lock in a txn)
118
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 JavaDoc(),
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 JavaDoc()));
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 JavaDoc messages = new LinkedList JavaDoc();
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 JavaDoc setBatchCalls = new LinkedList JavaDoc();
203     public final List JavaDoc sendCalls = new LinkedList JavaDoc();
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 JavaDoc());
217     }
218
219     public ObjectStringSerializer getSerializer() {
220       return serializer;
221     }
222
223     public Collection JavaDoc addAcknowledgedTransactionIDsTo(Collection JavaDoc c) {
224       throw new ImplementMe();
225     }
226
227     public ChannelID getChannelID() {
228       return ChannelID.NULL_ID;
229     }
230
231   }
232
233 }
234
Popular Tags