X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FShardTransactionTest.java;h=c6b5cb44026f42690fffc89289a50c13fe1c59aa;hp=69dd706f37cb3bd8c1e7c75d91ec05e2b0fe1f13;hb=3927509ec3ecfa32a51b725d2b7155d425f5b877;hpb=2eac38c80e07108767d43609eff41881d9d6f361 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java index 69dd706f37..c6b5cb4402 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTransactionTest.java @@ -14,10 +14,14 @@ import java.util.Collections; import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Test; +import org.mockito.InOrder; +import org.mockito.Mockito; import org.opendaylight.controller.cluster.datastore.ShardWriteTransaction.GetCompositeModificationReply; import org.opendaylight.controller.cluster.datastore.exceptions.UnknownMessageException; import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats; +import org.opendaylight.controller.cluster.datastore.messages.BatchedModifications; +import org.opendaylight.controller.cluster.datastore.messages.BatchedModificationsReply; import org.opendaylight.controller.cluster.datastore.messages.CloseTransaction; import org.opendaylight.controller.cluster.datastore.messages.CloseTransactionReply; import org.opendaylight.controller.cluster.datastore.messages.CreateSnapshot; @@ -46,11 +50,12 @@ import org.opendaylight.controller.md.cluster.datastore.model.TestModel; import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; import org.opendaylight.controller.protobuff.messages.transaction.ShardTransactionMessages; import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransaction; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import scala.concurrent.duration.Duration; public class ShardTransactionTest extends AbstractActorTest { @@ -250,8 +255,8 @@ public class ShardTransactionTest extends AbstractActorTest { "testOnReceiveWriteData"); transaction.tell(new WriteData(TestModel.TEST_PATH, - ImmutableNodes.containerNode(TestModel.TEST_QNAME)).toSerializable( - DataStoreVersions.HELIUM_2_VERSION), getRef()); + ImmutableNodes.containerNode(TestModel.TEST_QNAME), DataStoreVersions.HELIUM_2_VERSION). + toSerializable(), getRef()); expectMsgClass(duration("5 seconds"), ShardTransactionMessages.WriteDataReply.class); @@ -259,7 +264,7 @@ public class ShardTransactionTest extends AbstractActorTest { // unserialized write transaction.tell(new WriteData(TestModel.TEST_PATH, - ImmutableNodes.containerNode(TestModel.TEST_QNAME)), + ImmutableNodes.containerNode(TestModel.TEST_QNAME), DataStoreVersions.CURRENT_VERSION), getRef()); expectMsgClass(duration("5 seconds"), WriteDataReply.class); @@ -293,8 +298,8 @@ public class ShardTransactionTest extends AbstractActorTest { "testMergeData"); transaction.tell(new MergeData(TestModel.TEST_PATH, - ImmutableNodes.containerNode(TestModel.TEST_QNAME)).toSerializable( - DataStoreVersions.HELIUM_2_VERSION), getRef()); + ImmutableNodes.containerNode(TestModel.TEST_QNAME), DataStoreVersions.HELIUM_2_VERSION). + toSerializable(), getRef()); expectMsgClass(duration("5 seconds"), ShardTransactionMessages.MergeDataReply.class); @@ -302,7 +307,7 @@ public class ShardTransactionTest extends AbstractActorTest { //unserialized merge transaction.tell(new MergeData(TestModel.TEST_PATH, - ImmutableNodes.containerNode(TestModel.TEST_QNAME)), + ImmutableNodes.containerNode(TestModel.TEST_QNAME), DataStoreVersions.CURRENT_VERSION), getRef()); expectMsgClass(duration("5 seconds"), MergeDataReply.class); @@ -335,20 +340,73 @@ public class ShardTransactionTest extends AbstractActorTest { final ActorRef transaction = newTransactionActor(store.newWriteOnlyTransaction(), "testDeleteData"); - transaction.tell(new DeleteData(TestModel.TEST_PATH).toSerializable( - DataStoreVersions.HELIUM_2_VERSION), getRef()); + transaction.tell(new DeleteData(TestModel.TEST_PATH, DataStoreVersions.HELIUM_2_VERSION). + toSerializable(), getRef()); expectMsgClass(duration("5 seconds"), ShardTransactionMessages.DeleteDataReply.class); assertModification(transaction, DeleteModification.class); //unserialized - transaction.tell(new DeleteData(TestModel.TEST_PATH), getRef()); + transaction.tell(new DeleteData(TestModel.TEST_PATH, DataStoreVersions.CURRENT_VERSION), getRef()); expectMsgClass(duration("5 seconds"), DeleteDataReply.class); }}; } + @Test + public void testOnReceiveBatchedModifications() throws Exception { + new JavaTestKit(getSystem()) {{ + + DOMStoreWriteTransaction mockWriteTx = Mockito.mock(DOMStoreWriteTransaction.class); + final ActorRef transaction = newTransactionActor(mockWriteTx, "testOnReceiveBatchedModifications"); + + YangInstanceIdentifier writePath = TestModel.TEST_PATH; + NormalizedNode writeData = ImmutableContainerNodeBuilder.create().withNodeIdentifier( + new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME)). + withChild(ImmutableNodes.leafNode(TestModel.DESC_QNAME, "foo")).build(); + + YangInstanceIdentifier mergePath = TestModel.OUTER_LIST_PATH; + NormalizedNode mergeData = ImmutableContainerNodeBuilder.create().withNodeIdentifier( + new YangInstanceIdentifier.NodeIdentifier(TestModel.OUTER_LIST_QNAME)).build(); + + YangInstanceIdentifier deletePath = TestModel.TEST_PATH; + + BatchedModifications batched = new BatchedModifications(DataStoreVersions.CURRENT_VERSION); + batched.addModification(new WriteModification(writePath, writeData)); + batched.addModification(new MergeModification(mergePath, mergeData)); + batched.addModification(new DeleteModification(deletePath)); + + transaction.tell(batched, getRef()); + + BatchedModificationsReply reply = expectMsgClass(duration("5 seconds"), BatchedModificationsReply.class); + assertEquals("getNumBatched", 3, reply.getNumBatched()); + + JavaTestKit verification = new JavaTestKit(getSystem()); + transaction.tell(new ShardWriteTransaction.GetCompositedModification(), verification.getRef()); + + CompositeModification compositeModification = verification.expectMsgClass(duration("5 seconds"), + GetCompositeModificationReply.class).getModification(); + + assertEquals("CompositeModification size", 3, compositeModification.getModifications().size()); + + WriteModification write = (WriteModification)compositeModification.getModifications().get(0); + assertEquals("getPath", writePath, write.getPath()); + assertEquals("getData", writeData, write.getData()); + + MergeModification merge = (MergeModification)compositeModification.getModifications().get(1); + assertEquals("getPath", mergePath, merge.getPath()); + assertEquals("getData", mergeData, merge.getData()); + + DeleteModification delete = (DeleteModification)compositeModification.getModifications().get(2); + assertEquals("getPath", deletePath, delete.getPath()); + + InOrder inOrder = Mockito.inOrder(mockWriteTx); + inOrder.verify(mockWriteTx).write(writePath, writeData); + inOrder.verify(mockWriteTx).merge(mergePath, mergeData); + inOrder.verify(mockWriteTx).delete(deletePath); + }}; + } @Test public void testOnReceiveReadyTransaction() throws Exception { @@ -412,10 +470,10 @@ public class ShardTransactionTest extends AbstractActorTest { } @Test - public void testOnReceiveCloseTransaction() throws Exception { + public void testReadWriteTxOnReceiveCloseTransaction() throws Exception { new JavaTestKit(getSystem()) {{ final ActorRef transaction = newTransactionActor(store.newReadWriteTransaction(), - "testCloseTransaction"); + "testReadWriteTxOnReceiveCloseTransaction"); watch(transaction); @@ -426,6 +484,35 @@ public class ShardTransactionTest extends AbstractActorTest { }}; } + @Test + public void testWriteOnlyTxOnReceiveCloseTransaction() throws Exception { + new JavaTestKit(getSystem()) {{ + final ActorRef transaction = newTransactionActor(store.newWriteOnlyTransaction(), + "testWriteTxOnReceiveCloseTransaction"); + + watch(transaction); + + transaction.tell(new CloseTransaction().toSerializable(), getRef()); + + expectMsgClass(duration("3 seconds"), CloseTransactionReply.SERIALIZABLE_CLASS); + expectTerminated(duration("3 seconds"), transaction); + }}; + } + + @Test + public void testReadOnlyTxOnReceiveCloseTransaction() throws Exception { + new JavaTestKit(getSystem()) {{ + final ActorRef transaction = newTransactionActor(store.newReadOnlyTransaction(), + "testReadOnlyTxOnReceiveCloseTransaction"); + + watch(transaction); + + transaction.tell(new CloseTransaction().toSerializable(), getRef()); + + expectMsgClass(duration("3 seconds"), Terminated.class); + }}; + } + @Test(expected=UnknownMessageException.class) public void testNegativePerformingWriteOperationOnReadTransaction() throws Exception { final ActorRef shard = createShard(); @@ -434,15 +521,15 @@ public class ShardTransactionTest extends AbstractActorTest { DataStoreVersions.CURRENT_VERSION); final TestActorRef transaction = TestActorRef.apply(props,getSystem()); - transaction.receive(new DeleteData(TestModel.TEST_PATH).toSerializable( - DataStoreVersions.CURRENT_VERSION), ActorRef.noSender()); + transaction.receive(new DeleteData(TestModel.TEST_PATH, DataStoreVersions.CURRENT_VERSION). + toSerializable(), ActorRef.noSender()); } @Test public void testShardTransactionInactivity() { datastoreContext = DatastoreContext.newBuilder().shardTransactionIdleTimeout( - Duration.create(500, TimeUnit.MILLISECONDS)).build(); + 500, TimeUnit.MILLISECONDS).build(); new JavaTestKit(getSystem()) {{ final ActorRef transaction = newTransactionActor(store.newReadWriteTransaction(),