X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FShardTransactionTest.java;h=ff2ee08f94ee610afeef6a0f8d069d7adfe79952;hb=67d58d1ab50f3c3bbe19a96fb6f0d9d94211829f;hp=8f5d0c28d603c39a008f9638ece377aacdf6f1f8;hpb=63b36aa3537d77bd9be323e1113716ef2cd54098;p=controller.git 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 8f5d0c28d6..ff2ee08f94 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 @@ -5,9 +5,11 @@ import akka.actor.Props; import akka.actor.Terminated; import akka.testkit.JavaTestKit; import akka.testkit.TestActorRef; + import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; -import org.junit.Assert; + +import org.junit.BeforeClass; import org.junit.Test; import org.opendaylight.controller.cluster.datastore.exceptions.UnknownMessageException; import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier; @@ -32,11 +34,15 @@ import org.opendaylight.controller.cluster.datastore.modification.Modification; import org.opendaylight.controller.cluster.datastore.modification.WriteModification; import org.opendaylight.controller.md.cluster.datastore.model.TestModel; import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; +import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStoreConfigProperties; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import scala.concurrent.duration.Duration; + import java.util.Collections; +import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -54,17 +60,20 @@ public class ShardTransactionTest extends AbstractActorTest { ShardIdentifier.builder().memberName("member-1") .shardName("inventory").type("config").build(); + private DatastoreContext datastoreContext = new DatastoreContext(); - static { + @BeforeClass + public static void staticSetup() { store.onGlobalContextUpdated(testSchemaContext); } @Test public void testOnReceiveReadData() throws Exception { new JavaTestKit(getSystem()) {{ - final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props(store.newReadOnlyTransaction(), shard, testSchemaContext); + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props(store.newReadOnlyTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); final ActorRef subject = getSystem().actorOf(props, "testReadData"); new Within(duration("1 seconds")) { @@ -104,9 +113,10 @@ public class ShardTransactionTest extends AbstractActorTest { @Test public void testOnReceiveReadDataWhenDataNotFound() throws Exception { new JavaTestKit(getSystem()) {{ - final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props( store.newReadOnlyTransaction(), shard, testSchemaContext); + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props( store.newReadOnlyTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); final ActorRef subject = getSystem().actorOf(props, "testReadDataWhenDataNotFound"); new Within(duration("1 seconds")) { @@ -147,9 +157,10 @@ public class ShardTransactionTest extends AbstractActorTest { @Test public void testOnReceiveDataExistsPositive() throws Exception { new JavaTestKit(getSystem()) {{ - final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props(store.newReadOnlyTransaction(), shard, testSchemaContext); + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props(store.newReadOnlyTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); final ActorRef subject = getSystem().actorOf(props, "testDataExistsPositive"); new Within(duration("1 seconds")) { @@ -190,9 +201,9 @@ public class ShardTransactionTest extends AbstractActorTest { public void testOnReceiveDataExistsNegative() throws Exception { new JavaTestKit(getSystem()) {{ final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, - Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props(store.newReadOnlyTransaction(), shard, testSchemaContext); + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props(store.newReadOnlyTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); final ActorRef subject = getSystem().actorOf(props, "testDataExistsNegative"); new Within(duration("1 seconds")) { @@ -267,9 +278,10 @@ public class ShardTransactionTest extends AbstractActorTest { @Test public void testOnReceiveWriteData() throws Exception { new JavaTestKit(getSystem()) {{ - final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props(store.newWriteOnlyTransaction(), shard, TestModel.createTestContext()); + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props(store.newWriteOnlyTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); final ActorRef subject = getSystem().actorOf(props, "testWriteData"); @@ -307,9 +319,10 @@ public class ShardTransactionTest extends AbstractActorTest { @Test public void testOnReceiveMergeData() throws Exception { new JavaTestKit(getSystem()) {{ - final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props(store.newReadWriteTransaction(), shard, testSchemaContext); + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props(store.newReadWriteTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); final ActorRef subject = getSystem().actorOf(props, "testMergeData"); @@ -348,9 +361,10 @@ public class ShardTransactionTest extends AbstractActorTest { @Test public void testOnReceiveDeleteData() throws Exception { new JavaTestKit(getSystem()) {{ - final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props( store.newWriteOnlyTransaction(), shard, TestModel.createTestContext()); + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props( store.newWriteOnlyTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); final ActorRef subject = getSystem().actorOf(props, "testDeleteData"); @@ -387,9 +401,10 @@ public class ShardTransactionTest extends AbstractActorTest { @Test public void testOnReceiveReadyTransaction() throws Exception { new JavaTestKit(getSystem()) {{ - final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props( store.newReadWriteTransaction(), shard, TestModel.createTestContext()); + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props( store.newReadWriteTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); final ActorRef subject = getSystem().actorOf(props, "testReadyTransaction"); @@ -425,24 +440,26 @@ public class ShardTransactionTest extends AbstractActorTest { @Test public void testOnReceiveCloseTransaction() throws Exception { new JavaTestKit(getSystem()) {{ - final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props(store.newReadWriteTransaction(), shard, TestModel.createTestContext()); + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props(store.newReadWriteTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); final ActorRef subject = getSystem().actorOf(props, "testCloseTransaction"); watch(subject); - new Within(duration("2 seconds")) { + new Within(duration("6 seconds")) { @Override protected void run() { subject.tell(new CloseTransaction().toSerializable(), getRef()); - final String out = new ExpectMsg(duration("1 seconds"), "match hint") { + final String out = new ExpectMsg(duration("3 seconds"), "match hint") { // do not put code outside this method, will run afterwards @Override protected String match(Object in) { + System.out.println("!!!IN match 1: "+(in!=null?in.getClass():"NULL")); if (in.getClass().equals(CloseTransactionReply.SERIALIZABLE_CLASS)) { return "match"; } else { @@ -453,10 +470,11 @@ public class ShardTransactionTest extends AbstractActorTest { assertEquals("match", out); - final String termination = new ExpectMsg(duration("1 seconds"), "match hint") { + final String termination = new ExpectMsg(duration("3 seconds"), "match hint") { // do not put code outside this method, will run afterwards @Override protected String match(Object in) { + System.out.println("!!!IN match 2: "+(in!=null?in.getClass():"NULL")); if (in instanceof Terminated) { return "match"; } else { @@ -465,33 +483,54 @@ public class ShardTransactionTest extends AbstractActorTest { } }.get(); // this extracts the received message - - expectNoMsg(); + assertEquals("match", termination); } - - }; }}; + } + @Test(expected=UnknownMessageException.class) + public void testNegativePerformingWriteOperationOnReadTransaction() throws Exception { + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props(store.newReadOnlyTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); + final TestActorRef subject = TestActorRef.apply(props,getSystem()); + + subject.receive(new DeleteData(TestModel.TEST_PATH).toSerializable(), ActorRef.noSender()); } + @Test + public void testShardTransactionInactivity() { + + datastoreContext = new DatastoreContext(InMemoryDOMDataStoreConfigProperties.getDefault(), + Duration.create(500, TimeUnit.MILLISECONDS)); - @Test - public void testNegativePerformingWriteOperationOnReadTransaction() throws Exception { - try { + new JavaTestKit(getSystem()) {{ + final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, + Collections.EMPTY_MAP, new DatastoreContext())); + final Props props = ShardTransaction.props(store.newReadWriteTransaction(), shard, + testSchemaContext, datastoreContext,SHARD_IDENTIFIER.toString()); + final ActorRef subject = + getSystem().actorOf(props, "testShardTransactionInactivity"); - final ActorRef shard = getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, null)); - final Props props = - ShardTransaction.props(store.newReadOnlyTransaction(), shard, TestModel.createTestContext()); - final TestActorRef subject = TestActorRef.apply(props,getSystem()); + watch(subject); - subject.receive(new DeleteData(TestModel.TEST_PATH).toSerializable(), ActorRef.noSender()); - Assert.assertFalse(true); + // The shard Tx actor should receive a ReceiveTimeout message and self-destruct. + final String termination = new ExpectMsg(duration("3 seconds"), "match hint") { + // do not put code outside this method, will run afterwards + @Override + protected String match(Object in) { + if (in instanceof Terminated) { + return "match"; + } else { + throw noMatch(); + } + } + }.get(); // this extracts the received message - } catch (Exception cs) { - assertEquals(UnknownMessageException.class.getSimpleName(), cs.getClass().getSimpleName()); - assertTrue(cs.getMessage(), cs.getMessage().startsWith("Unknown message received ")); + assertEquals("match", termination); + }}; } - } }