BUG-2138: Create DistributedShardFrontend
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / ShardTransactionFailureTest.java
1 /*
2  * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.cluster.datastore;
10
11 import akka.actor.ActorRef;
12 import akka.actor.Props;
13 import akka.testkit.TestActorRef;
14 import java.util.concurrent.TimeUnit;
15 import org.junit.Test;
16 import org.mockito.Mockito;
17 import org.opendaylight.controller.cluster.access.concepts.MemberName;
18 import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
19 import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats;
20 import org.opendaylight.controller.cluster.datastore.messages.DataExists;
21 import org.opendaylight.controller.cluster.datastore.messages.ReadData;
22 import org.opendaylight.controller.md.cluster.datastore.model.TestModel;
23 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
25 import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
26 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
27 import scala.concurrent.Await;
28 import scala.concurrent.Future;
29 import scala.concurrent.duration.Duration;
30
31 /**
32  * Covers negative test cases.
33  *
34  * @author Basheeruddin Ahmed
35  */
36 public class ShardTransactionFailureTest extends AbstractActorTest {
37     private static final SchemaContext TEST_SCHEMA_CONTEXT = TestModel.createTestContext();
38     private static final TransactionType RO = TransactionType.READ_ONLY;
39     private static final TransactionType RW = TransactionType.READ_WRITE;
40
41     private static final Shard MOCK_SHARD = Mockito.mock(Shard.class);
42
43     private static final ShardDataTree STORE = new ShardDataTree(MOCK_SHARD, TEST_SCHEMA_CONTEXT, TreeType.OPERATIONAL);
44
45     private static final ShardIdentifier SHARD_IDENTIFIER =
46         ShardIdentifier.create("inventory", MemberName.forName("member-1"), "operational");
47
48     private final DatastoreContext datastoreContext = DatastoreContext.newBuilder().build();
49
50     private final ShardStats shardStats = new ShardStats(SHARD_IDENTIFIER.toString(), "DataStore", null);
51
52     private ActorRef createShard() {
53         ActorRef shard = getSystem().actorOf(Shard.builder().id(SHARD_IDENTIFIER).datastoreContext(datastoreContext)
54                 .schemaContext(TestModel.createTestContext()).props());
55         ShardTestKit.waitUntilLeader(shard);
56         return shard;
57     }
58
59     @Test(expected = ReadFailedException.class)
60     public void testNegativeReadWithReadOnlyTransactionClosed() throws Exception {
61
62         final ActorRef shard = createShard();
63         final Props props = ShardTransaction.props(RO, STORE.newReadOnlyTransaction(nextTransactionId()), shard,
64                 datastoreContext, shardStats);
65
66         final TestActorRef<ShardTransaction> subject = TestActorRef.create(getSystem(), props,
67                 "testNegativeReadWithReadOnlyTransactionClosed");
68
69         Future<Object> future = akka.pattern.Patterns.ask(subject,
70                 new ReadData(YangInstanceIdentifier.EMPTY, DataStoreVersions.CURRENT_VERSION), 3000);
71         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
72
73         subject.underlyingActor().getDOMStoreTransaction().abort();
74
75         future = akka.pattern.Patterns.ask(subject, new ReadData(YangInstanceIdentifier.EMPTY,
76                 DataStoreVersions.CURRENT_VERSION), 3000);
77         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
78     }
79
80
81     @Test(expected = ReadFailedException.class)
82     public void testNegativeReadWithReadWriteTransactionClosed() throws Exception {
83
84         final ActorRef shard = createShard();
85         final Props props = ShardTransaction.props(RW, STORE.newReadWriteTransaction(nextTransactionId()), shard,
86                 datastoreContext, shardStats);
87
88         final TestActorRef<ShardTransaction> subject = TestActorRef.create(getSystem(), props,
89                 "testNegativeReadWithReadWriteTransactionClosed");
90
91         Future<Object> future = akka.pattern.Patterns.ask(subject,
92                 new ReadData(YangInstanceIdentifier.EMPTY, DataStoreVersions.CURRENT_VERSION), 3000);
93         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
94
95         subject.underlyingActor().getDOMStoreTransaction().abort();
96
97         future = akka.pattern.Patterns.ask(subject, new ReadData(YangInstanceIdentifier.EMPTY,
98                 DataStoreVersions.CURRENT_VERSION), 3000);
99         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
100     }
101
102     @Test(expected = ReadFailedException.class)
103     public void testNegativeExistsWithReadWriteTransactionClosed() throws Exception {
104
105         final ActorRef shard = createShard();
106         final Props props = ShardTransaction.props(RW, STORE.newReadWriteTransaction(nextTransactionId()), shard,
107                 datastoreContext, shardStats);
108
109         final TestActorRef<ShardTransaction> subject = TestActorRef.create(getSystem(), props,
110                 "testNegativeExistsWithReadWriteTransactionClosed");
111
112         Future<Object> future = akka.pattern.Patterns.ask(subject,
113                 new DataExists(YangInstanceIdentifier.EMPTY, DataStoreVersions.CURRENT_VERSION), 3000);
114         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
115
116         subject.underlyingActor().getDOMStoreTransaction().abort();
117
118         future = akka.pattern.Patterns.ask(subject,
119                 new DataExists(YangInstanceIdentifier.EMPTY, DataStoreVersions.CURRENT_VERSION), 3000);
120         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
121     }
122 }