Merge "Bug 865: Fixed use of removed deprecated YANGInstanceIdentifier methods."
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / ShardTransactionFailureTest.java
1 /*
2  *
3  *  Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
4  *
5  *  This program and the accompanying materials are made available under the
6  *  terms of the Eclipse Public License v1.0 which accompanies this distribution,
7  *  and is available at http://www.eclipse.org/legal/epl-v10.html
8  *
9  */
10
11 package org.opendaylight.controller.cluster.datastore;
12
13 import akka.actor.ActorRef;
14 import akka.actor.Props;
15 import akka.testkit.TestActorRef;
16 import com.google.common.util.concurrent.ListeningExecutorService;
17 import com.google.common.util.concurrent.MoreExecutors;
18 import org.junit.BeforeClass;
19 import org.junit.Test;
20 import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
21 import org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard.ShardStats;
22 import org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeSerializer;
23 import org.opendaylight.controller.md.cluster.datastore.model.TestModel;
24 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
25 import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore;
26 import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages;
27 import org.opendaylight.controller.protobuff.messages.transaction.ShardTransactionMessages;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
29 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
30 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
31 import scala.concurrent.Await;
32 import scala.concurrent.Future;
33 import scala.concurrent.duration.Duration;
34 import java.util.Collections;
35 import java.util.concurrent.TimeUnit;
36
37 /**
38  * Covers negative test cases
39  *
40  * @author Basheeruddin Ahmed <syedbahm@cisco.com>
41  */
42 public class ShardTransactionFailureTest extends AbstractActorTest {
43     private static ListeningExecutorService storeExecutor =
44         MoreExecutors.listeningDecorator(MoreExecutors.sameThreadExecutor());
45
46     private static final InMemoryDOMDataStore store =
47         new InMemoryDOMDataStore("OPER", storeExecutor,
48             MoreExecutors.sameThreadExecutor());
49
50     private static final SchemaContext testSchemaContext =
51         TestModel.createTestContext();
52
53     private static final ShardIdentifier SHARD_IDENTIFIER =
54         ShardIdentifier.builder().memberName("member-1")
55             .shardName("inventory").type("operational").build();
56
57     private final DatastoreContext datastoreContext = DatastoreContext.newBuilder().build();
58
59     private final ShardStats shardStats = new ShardStats(SHARD_IDENTIFIER.toString(), "DataStore");
60
61     @BeforeClass
62     public static void staticSetup() {
63         store.onGlobalContextUpdated(testSchemaContext);
64     }
65
66     private ActorRef createShard(){
67         return getSystem().actorOf(Shard.props(SHARD_IDENTIFIER, Collections.EMPTY_MAP, datastoreContext,
68                 TestModel.createTestContext()));
69     }
70
71     @Test(expected = ReadFailedException.class)
72     public void testNegativeReadWithReadOnlyTransactionClosed()
73         throws Throwable {
74
75         final ActorRef shard = createShard();
76         final Props props = ShardTransaction.props(store.newReadOnlyTransaction(), shard,
77                 testSchemaContext, datastoreContext, shardStats, "txn");
78
79         final TestActorRef<ShardTransaction> subject = TestActorRef
80             .create(getSystem(), props,
81                 "testNegativeReadWithReadOnlyTransactionClosed");
82
83         ShardTransactionMessages.ReadData readData =
84             ShardTransactionMessages.ReadData.newBuilder()
85                 .setInstanceIdentifierPathArguments(
86                     NormalizedNodeMessages.InstanceIdentifier.newBuilder()
87                         .build()
88                 ).build();
89         Future<Object> future =
90             akka.pattern.Patterns.ask(subject, readData, 3000);
91         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
92
93         subject.underlyingActor().getDOMStoreTransaction().close();
94
95         future = akka.pattern.Patterns.ask(subject, readData, 3000);
96         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
97     }
98
99
100     @Test(expected = ReadFailedException.class)
101     public void testNegativeReadWithReadWriteTransactionClosed()
102         throws Throwable {
103
104         final ActorRef shard = createShard();
105         final Props props = ShardTransaction.props(store.newReadWriteTransaction(), shard,
106                 testSchemaContext, datastoreContext, shardStats, "txn");
107
108         final TestActorRef<ShardTransaction> subject = TestActorRef
109             .create(getSystem(), props,
110                 "testNegativeReadWithReadWriteTransactionClosed");
111
112         ShardTransactionMessages.ReadData readData =
113             ShardTransactionMessages.ReadData.newBuilder()
114                 .setInstanceIdentifierPathArguments(
115                     NormalizedNodeMessages.InstanceIdentifier.newBuilder()
116                         .build()
117                 ).build();
118
119         Future<Object> future =
120             akka.pattern.Patterns.ask(subject, readData, 3000);
121         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
122
123         subject.underlyingActor().getDOMStoreTransaction().close();
124
125         future = akka.pattern.Patterns.ask(subject, readData, 3000);
126         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
127     }
128
129     @Test(expected = ReadFailedException.class)
130     public void testNegativeExistsWithReadWriteTransactionClosed()
131         throws Throwable {
132
133         final ActorRef shard = createShard();
134         final Props props = ShardTransaction.props(store.newReadWriteTransaction(), shard,
135                 testSchemaContext, datastoreContext, shardStats, "txn");
136
137         final TestActorRef<ShardTransaction> subject = TestActorRef
138             .create(getSystem(), props,
139                 "testNegativeExistsWithReadWriteTransactionClosed");
140
141         ShardTransactionMessages.DataExists dataExists =
142             ShardTransactionMessages.DataExists.newBuilder()
143                 .setInstanceIdentifierPathArguments(
144                     NormalizedNodeMessages.InstanceIdentifier.newBuilder()
145                         .build()
146                 ).build();
147
148         Future<Object> future =
149             akka.pattern.Patterns.ask(subject, dataExists, 3000);
150         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
151
152         subject.underlyingActor().getDOMStoreTransaction().close();
153
154         future = akka.pattern.Patterns.ask(subject, dataExists, 3000);
155         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
156     }
157
158     @Test(expected = IllegalStateException.class)
159     public void testNegativeWriteWithTransactionReady() throws Exception {
160
161
162         final ActorRef shard = createShard();
163         final Props props = ShardTransaction.props(store.newWriteOnlyTransaction(), shard,
164                 testSchemaContext, datastoreContext, shardStats, "txn");
165
166         final TestActorRef<ShardTransaction> subject = TestActorRef
167             .create(getSystem(), props,
168                 "testNegativeWriteWithTransactionReady");
169
170         ShardTransactionMessages.ReadyTransaction readyTransaction =
171             ShardTransactionMessages.ReadyTransaction.newBuilder().build();
172
173         Future<Object> future =
174             akka.pattern.Patterns.ask(subject, readyTransaction, 3000);
175         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
176
177         ShardTransactionMessages.WriteData writeData =
178             ShardTransactionMessages.WriteData.newBuilder()
179                 .setInstanceIdentifierPathArguments(
180                     NormalizedNodeMessages.InstanceIdentifier.newBuilder()
181                         .build()).setNormalizedNode(
182                 buildNormalizedNode()
183
184             ).build();
185
186         future = akka.pattern.Patterns.ask(subject, writeData, 3000);
187         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
188     }
189
190     @Test(expected = IllegalStateException.class)
191     public void testNegativeReadWriteWithTransactionReady() throws Exception {
192
193
194         final ActorRef shard = createShard();
195         final Props props = ShardTransaction.props(store.newReadWriteTransaction(), shard,
196                 testSchemaContext, datastoreContext, shardStats, "txn");
197
198         final TestActorRef<ShardTransaction> subject = TestActorRef
199             .create(getSystem(), props,
200                 "testNegativeReadWriteWithTransactionReady");
201
202         ShardTransactionMessages.ReadyTransaction readyTransaction =
203             ShardTransactionMessages.ReadyTransaction.newBuilder().build();
204
205         Future<Object> future =
206             akka.pattern.Patterns.ask(subject, readyTransaction, 3000);
207         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
208
209         ShardTransactionMessages.WriteData writeData =
210             ShardTransactionMessages.WriteData.newBuilder()
211                 .setInstanceIdentifierPathArguments(
212                     NormalizedNodeMessages.InstanceIdentifier.newBuilder()
213                         .build()
214                 )
215                 .setNormalizedNode(buildNormalizedNode())
216                 .build();
217
218         future = akka.pattern.Patterns.ask(subject, writeData, 3000);
219         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
220     }
221
222     private NormalizedNodeMessages.Node buildNormalizedNode() {
223         return NormalizedNodeSerializer
224             .serialize(Builders.containerBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME)).build());
225     }
226
227     @Test(expected = IllegalStateException.class)
228     public void testNegativeMergeTransactionReady() throws Exception {
229
230
231         final ActorRef shard = createShard();
232         final Props props = ShardTransaction.props(store.newReadWriteTransaction(), shard,
233                 testSchemaContext, datastoreContext, shardStats, "txn");
234
235         final TestActorRef<ShardTransaction> subject = TestActorRef
236             .create(getSystem(), props, "testNegativeMergeTransactionReady");
237
238         ShardTransactionMessages.ReadyTransaction readyTransaction =
239             ShardTransactionMessages.ReadyTransaction.newBuilder().build();
240
241         Future<Object> future =
242             akka.pattern.Patterns.ask(subject, readyTransaction, 3000);
243         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
244
245         ShardTransactionMessages.MergeData mergeData =
246             ShardTransactionMessages.MergeData.newBuilder()
247                 .setInstanceIdentifierPathArguments(
248                     NormalizedNodeMessages.InstanceIdentifier.newBuilder()
249                         .build()).setNormalizedNode(
250                 buildNormalizedNode()
251
252             ).build();
253
254         future = akka.pattern.Patterns.ask(subject, mergeData, 3000);
255         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
256     }
257
258
259     @Test(expected = IllegalStateException.class)
260     public void testNegativeDeleteDataWhenTransactionReady() throws Exception {
261
262
263         final ActorRef shard = createShard();
264         final Props props = ShardTransaction.props(store.newReadWriteTransaction(), shard,
265                 testSchemaContext, datastoreContext, shardStats, "txn");
266
267         final TestActorRef<ShardTransaction> subject = TestActorRef
268             .create(getSystem(), props,
269                 "testNegativeDeleteDataWhenTransactionReady");
270
271         ShardTransactionMessages.ReadyTransaction readyTransaction =
272             ShardTransactionMessages.ReadyTransaction.newBuilder().build();
273
274         Future<Object> future =
275             akka.pattern.Patterns.ask(subject, readyTransaction, 3000);
276         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
277
278         ShardTransactionMessages.DeleteData deleteData =
279             ShardTransactionMessages.DeleteData.newBuilder()
280                 .setInstanceIdentifierPathArguments(
281                     NormalizedNodeMessages.InstanceIdentifier.newBuilder()
282                         .build()).build();
283
284         future = akka.pattern.Patterns.ask(subject, deleteData, 3000);
285         Await.result(future, Duration.create(3, TimeUnit.SECONDS));
286     }
287 }