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%2FShardTest.java;h=431a266b148478a49766bd8f0cc173bc7b2e4062;hp=b5a341d95c950dd859e755d135be2c3354388dbc;hb=4caeacba93677c05dd79bc4cb7058f021fa1e88b;hpb=a6690c65b0b60e9aeddc488267b7ee2ba0132c67 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java index b5a341d95c..431a266b14 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/datastore/ShardTest.java @@ -2,97 +2,228 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.Props; +import akka.event.Logging; import akka.testkit.JavaTestKit; +import junit.framework.Assert; import org.junit.Test; +import org.opendaylight.controller.cluster.datastore.messages.CreateTransaction; import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionChain; import org.opendaylight.controller.cluster.datastore.messages.CreateTransactionChainReply; +import org.opendaylight.controller.cluster.datastore.messages.EnableNotification; +import org.opendaylight.controller.cluster.datastore.messages.PeerAddressResolved; import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListener; import org.opendaylight.controller.cluster.datastore.messages.RegisterChangeListenerReply; import org.opendaylight.controller.cluster.datastore.messages.UpdateSchemaContext; +import org.opendaylight.controller.md.cluster.datastore.model.SchemaContextHelper; import org.opendaylight.controller.md.cluster.datastore.model.TestModel; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.controller.protobuff.messages.transaction.ShardTransactionMessages.CreateTransactionReply; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import static org.junit.Assert.assertTrue; - -public class ShardTest extends AbstractActorTest{ - @Test - public void testOnReceiveCreateTransactionChain() throws Exception { - new JavaTestKit(getSystem()) {{ - final Props props = Props.create(Shard.class); - final ActorRef subject = getSystem().actorOf(props, "testCreateTransactionChain"); - - new Within(duration("1 seconds")) { - protected void run() { - - subject.tell(new CreateTransactionChain(), getRef()); - - final String out = new ExpectMsg("match hint") { - // do not put code outside this method, will run afterwards - protected String match(Object in) { - if (in instanceof CreateTransactionChainReply) { - CreateTransactionChainReply reply = (CreateTransactionChainReply) in; - return reply.getTransactionChainPath().toString(); - } else { - throw noMatch(); - } - } - }.get(); // this extracts the received message - - assertTrue(out.matches("akka:\\/\\/test\\/user\\/testCreateTransactionChain\\/\\$.*")); - // Will wait for the rest of the 3 seconds - expectNoMsg(); - } - - - }; - }}; - } - - @Test - public void testOnReceiveRegisterListener() throws Exception { - new JavaTestKit(getSystem()) {{ - final Props props = Props.create(Shard.class); - final ActorRef subject = getSystem().actorOf(props, "testRegisterChangeListener"); +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; - new Within(duration("1 seconds")) { - protected void run() { - - subject.tell(new UpdateSchemaContext(TestModel.createTestContext()), getRef()); +import static junit.framework.Assert.assertFalse; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; - subject.tell(new RegisterChangeListener(InstanceIdentifier.builder().build(), noOpDataChangeListener() , AsyncDataBroker.DataChangeScope.BASE), getRef()); +public class ShardTest extends AbstractActorTest { + @Test + public void testOnReceiveCreateTransactionChain() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = Shard.props("config", Collections.EMPTY_MAP); + final ActorRef subject = + getSystem().actorOf(props, "testCreateTransactionChain"); + + + // Wait for a specific log message to show up + final boolean result = + new JavaTestKit.EventFilter(Logging.Info.class + ) { + protected Boolean run() { + return true; + } + }.from(subject.path().toString()) + .message("Switching from state Candidate to Leader") + .occurrences(1).exec(); + + Assert.assertEquals(true, result); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell(new CreateTransactionChain().toSerializable(), getRef()); + + final String out = new ExpectMsg(duration("1 seconds"), "match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in.getClass().equals(CreateTransactionChainReply.SERIALIZABLE_CLASS)){ + CreateTransactionChainReply reply = + CreateTransactionChainReply.fromSerializable(getSystem(),in); + return reply.getTransactionChainPath() + .toString(); + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertEquals("Unexpected transaction path " + out, + "akka://test/user/testCreateTransactionChain/$a", + out); + + expectNoMsg(); + } + + + }; + }}; + } + + @Test + public void testOnReceiveRegisterListener() throws Exception { + new JavaTestKit(getSystem()) {{ + final Props props = Shard.props("config", Collections.EMPTY_MAP); + final ActorRef subject = + getSystem().actorOf(props, "testRegisterChangeListener"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell( + new UpdateSchemaContext(SchemaContextHelper.full()), + getRef()); + + subject.tell(new RegisterChangeListener(TestModel.TEST_PATH, + getRef().path(), AsyncDataBroker.DataChangeScope.BASE), + getRef()); + + final Boolean notificationEnabled = new ExpectMsg("enable notification") { + // do not put code outside this method, will run afterwards + protected Boolean match(Object in) { + if(in instanceof EnableNotification){ + return ((EnableNotification) in).isEnabled(); + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertFalse(notificationEnabled); + + final String out = new ExpectMsg(duration("1 seconds"), "match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in.getClass().equals(RegisterChangeListenerReply.class)) { + RegisterChangeListenerReply reply = + (RegisterChangeListenerReply) in; + return reply.getListenerRegistrationPath() + .toString(); + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertTrue(out.matches( + "akka:\\/\\/test\\/user\\/testRegisterChangeListener\\/\\$.*")); + } + + + }; + }}; + } + + @Test + public void testCreateTransaction(){ + new JavaTestKit(getSystem()) {{ + final Props props = Shard.props("config", Collections.EMPTY_MAP); + final ActorRef subject = + getSystem().actorOf(props, "testCreateTransaction"); + + + // Wait for a specific log message to show up + final boolean result = + new JavaTestKit.EventFilter(Logging.Info.class + ) { + protected Boolean run() { + return true; + } + }.from(subject.path().toString()) + .message("Switching from state Candidate to Leader") + .occurrences(1).exec(); + + Assert.assertEquals(true, result); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell( + new UpdateSchemaContext(TestModel.createTestContext()), + getRef()); + + subject.tell(new CreateTransaction("txn-1", TransactionProxy.TransactionType.READ_ONLY.ordinal() ).toSerializable(), + getRef()); + + final String out = new ExpectMsg(duration("1 seconds"), "match hint") { + // do not put code outside this method, will run afterwards + protected String match(Object in) { + if (in instanceof CreateTransactionReply) { + CreateTransactionReply reply = + (CreateTransactionReply) in; + return reply.getTransactionActorPath() + .toString(); + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message + + assertTrue("Unexpected transaction path " + out, + out.contains("akka://test/user/testCreateTransaction/shard-txn-1")); + expectNoMsg(); + } + + + }; + }}; + } + + @Test + public void testPeerAddressResolved(){ + new JavaTestKit(getSystem()) {{ + Map peerAddresses = new HashMap<>(); + peerAddresses.put("member-2", null); + final Props props = Shard.props("config", peerAddresses); + final ActorRef subject = + getSystem().actorOf(props, "testPeerAddressResolved"); + + new Within(duration("1 seconds")) { + protected void run() { + + subject.tell( + new PeerAddressResolved("member-2", "akka://foobar"), + getRef()); + + expectNoMsg(); + } + + + }; + }}; + } + + private AsyncDataChangeListener> noOpDataChangeListener() { + return new AsyncDataChangeListener>() { + @Override + public void onDataChanged( + AsyncDataChangeEvent> change) { - final String out = new ExpectMsg("match hint") { - // do not put code outside this method, will run afterwards - protected String match(Object in) { - if (in instanceof RegisterChangeListenerReply) { - RegisterChangeListenerReply reply = (RegisterChangeListenerReply) in; - return reply.getListenerRegistrationPath().toString(); - } else { - throw noMatch(); - } } - }.get(); // this extracts the received message - - assertTrue(out.matches("akka:\\/\\/test\\/user\\/testRegisterChangeListener\\/\\$.*")); - // Will wait for the rest of the 3 seconds - expectNoMsg(); - } - - - }; - }}; - } - - private AsyncDataChangeListener> noOpDataChangeListener(){ - return new AsyncDataChangeListener>() { - @Override - public void onDataChanged(AsyncDataChangeEvent> change) { - - } - }; - } -} \ No newline at end of file + }; + } +}