public void testWriteRead() throws IOException { long sequence = 0; ObjectStringSerializer serializer = new ObjectStringSerializer(); TestCommitTransactionMessageFactory mf = new TestCommitTransactionMessageFactory(); ChannelID channel = new ChannelID(69); TxnBatchID batchID = new TxnBatchID(42); List tx1Notifies = new LinkedList(); // A nested transaction (all this buys us is more than 1 lock in a txn) LockID lid1 = new LockID("1"); TransactionContext tc = new TransactionContext(lid1, TxnType.NORMAL, new LockID[] {lid1}); ClientTransaction tmp = new ClientTransactionImpl(new TransactionID(101), new NullRuntimeLogger(), null); tmp.setTransactionContext(tc); LockID lid2 = new LockID("2"); tc = new TransactionContext(lid2, TxnType.NORMAL, new LockID[] {lid1, lid2}); ClientTransaction txn1 = new ClientTransactionImpl(new TransactionID(1), new NullRuntimeLogger(), null); txn1.setTransactionContext(tc); txn1.fieldChanged( new MockTCObject(new ObjectID(1), this), "class", "class.field", ObjectID.NULL_ID, -1); txn1.createObject(new MockTCObject(new ObjectID(2), this)); txn1.createRoot("root", new ObjectID(3)); for (int i = 0; i < 10; i++) { Notify notify = new Notify(new LockID("" + i), new ThreadID(i), i % 2 == 0); tx1Notifies.add(notify); txn1.addNotify(notify); } tc = new TransactionContext(new LockID("3"), TxnType.CONCURRENT, new LockID[] {new LockID("3")}); ClientTransaction txn2 = new ClientTransactionImpl(new TransactionID(2), new NullRuntimeLogger(), null); txn2.setTransactionContext(tc); writer = new TransactionBatchWriter(batchID, serializer, encoding, mf); txn1.setSequenceID(new SequenceID(++sequence)); txn2.setSequenceID(new SequenceID(++sequence)); writer.addTransaction(txn1); writer.addTransaction(txn2); writer.wait4AllTxns2Serialize(); TransactionBatchReaderImpl reader = new TransactionBatchReaderImpl( gidGenerator, writer.getData(), channel, new HashSet(), serializer, new ActiveServerTransactionFactory()); assertEquals(2, reader.getNumTxns()); assertEquals(batchID, reader.getBatchID()); int count = 0; ServerTransaction txn; while ((txn = reader.getNextTransaction()) != null) { count++; assertEquals(channel, txn.getChannelID()); assertEquals(count, txn.getTransactionID().toLong()); switch (count) { case 1: assertEquals(2, txn.getChanges().size()); assertEquals(1, txn.getNewRoots().size()); assertEquals("root", txn.getNewRoots().keySet().toArray()[0]); assertEquals(new ObjectID(3), txn.getNewRoots().values().toArray()[0]); assertEquals(2, txn.getObjectIDs().size()); assertTrue( txn.getObjectIDs() .containsAll(Arrays.asList(new ObjectID[] {new ObjectID(1), new ObjectID(2)}))); assertEquals(TxnType.NORMAL, txn.getTransactionType()); assertTrue( Arrays.equals(new LockID[] {new LockID("1"), new LockID("2")}, txn.getLockIDs())); assertEquals(tx1Notifies, txn.getNotifies()); break; case 2: assertEquals(0, txn.getChanges().size()); assertEquals(0, txn.getNewRoots().size()); assertEquals(0, txn.getObjectIDs().size()); assertEquals(TxnType.CONCURRENT, txn.getTransactionType()); assertTrue(Arrays.equals(new LockID[] {new LockID("3")}, txn.getLockIDs())); break; default: fail("count is " + count); } } assertEquals(2, count); }