e21ec46e9c6cbb7dc9f6c5641729426a79729aaa
[netconf.git] / netconf / netconf-topology-singleton / src / test / java / org / opendaylight / netconf / topology / singleton / impl / actors / WriteTransactionActorTest.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.netconf.topology.singleton.impl.actors;
10
11 import static org.mockito.Mockito.timeout;
12 import static org.mockito.Mockito.verify;
13 import static org.mockito.Mockito.when;
14
15 import akka.actor.ActorSystem;
16 import akka.pattern.Patterns;
17 import akka.testkit.JavaTestKit;
18 import akka.testkit.TestActorRef;
19 import akka.testkit.TestProbe;
20 import akka.util.Timeout;
21 import com.google.common.util.concurrent.Futures;
22 import java.util.concurrent.TimeUnit;
23 import org.junit.After;
24 import org.junit.Assert;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.mockito.Mock;
28 import org.mockito.MockitoAnnotations;
29 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
30 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
31 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
32 import org.opendaylight.netconf.topology.singleton.messages.NormalizedNodeMessage;
33 import org.opendaylight.netconf.topology.singleton.messages.transactions.CancelRequest;
34 import org.opendaylight.netconf.topology.singleton.messages.transactions.DeleteRequest;
35 import org.opendaylight.netconf.topology.singleton.messages.transactions.MergeRequest;
36 import org.opendaylight.netconf.topology.singleton.messages.transactions.PutRequest;
37 import org.opendaylight.netconf.topology.singleton.messages.transactions.SubmitFailedReply;
38 import org.opendaylight.netconf.topology.singleton.messages.transactions.SubmitReply;
39 import org.opendaylight.netconf.topology.singleton.messages.transactions.SubmitRequest;
40 import org.opendaylight.yangtools.yang.common.QName;
41 import org.opendaylight.yangtools.yang.common.RpcError;
42 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
43 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
44 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
45 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
46 import scala.concurrent.Await;
47 import scala.concurrent.Future;
48 import scala.concurrent.duration.Duration;
49
50 public class WriteTransactionActorTest {
51     private static final YangInstanceIdentifier PATH = YangInstanceIdentifier.EMPTY;
52     private static final LogicalDatastoreType STORE = LogicalDatastoreType.CONFIGURATION;
53     private static final Timeout TIMEOUT = Timeout.apply(5, TimeUnit.SECONDS);
54
55     @Mock
56     private DOMDataWriteTransaction deviceWriteTx;
57     private TestProbe probe;
58     private ActorSystem system;
59     private TestActorRef<WriteTransactionActor> actorRef;
60     private NormalizedNode<?, ?> node;
61
62     @Before
63     public void setUp() throws Exception {
64         MockitoAnnotations.initMocks(this);
65         system = ActorSystem.apply();
66         probe = TestProbe.apply(system);
67         node = Builders.containerBuilder()
68                 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(QName.create("", "cont")))
69                 .build();
70         actorRef = TestActorRef.create(system, WriteTransactionActor.props(deviceWriteTx,
71                 Duration.apply(2, TimeUnit.SECONDS)), "testA");
72     }
73
74     @After
75     public void tearDown() throws Exception {
76         JavaTestKit.shutdownActorSystem(system, null, true);
77     }
78
79     @Test
80     public void testPut() throws Exception {
81         final NormalizedNodeMessage normalizedNodeMessage = new NormalizedNodeMessage(PATH, node);
82         actorRef.tell(new PutRequest(STORE, normalizedNodeMessage), probe.ref());
83         verify(deviceWriteTx).put(STORE, PATH, node);
84     }
85
86     @Test
87     public void testMerge() throws Exception {
88         final NormalizedNodeMessage normalizedNodeMessage = new NormalizedNodeMessage(PATH, node);
89         actorRef.tell(new MergeRequest(STORE, normalizedNodeMessage), probe.ref());
90         verify(deviceWriteTx).merge(STORE, PATH, node);
91     }
92
93     @Test
94     public void testDelete() throws Exception {
95         actorRef.tell(new DeleteRequest(STORE, PATH), probe.ref());
96         verify(deviceWriteTx).delete(STORE, PATH);
97     }
98
99     @Test
100     public void testCancel() throws Exception {
101         when(deviceWriteTx.cancel()).thenReturn(true);
102         final Future<Object> cancelFuture = Patterns.ask(actorRef, new CancelRequest(), TIMEOUT);
103         final Object result = Await.result(cancelFuture, TIMEOUT.duration());
104         Assert.assertTrue(result instanceof Boolean);
105         verify(deviceWriteTx).cancel();
106         Assert.assertTrue((Boolean) result);
107     }
108
109     @Test
110     public void testSubmit() throws Exception {
111         when(deviceWriteTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
112         final Future<Object> submitFuture = Patterns.ask(actorRef, new SubmitRequest(), TIMEOUT);
113         final Object result = Await.result(submitFuture, TIMEOUT.duration());
114         Assert.assertTrue(result instanceof SubmitReply);
115         verify(deviceWriteTx).submit();
116     }
117
118     @Test
119     public void testSubmitFail() throws Exception {
120         final RpcError rpcError =
121                 RpcResultBuilder.newError(RpcError.ErrorType.APPLICATION, "fail", "fail");
122         final TransactionCommitFailedException cause = new TransactionCommitFailedException("fail", rpcError);
123         when(deviceWriteTx.submit()).thenReturn(Futures.immediateFailedCheckedFuture(cause));
124         final Future<Object> submitFuture = Patterns.ask(actorRef, new SubmitRequest(), TIMEOUT);
125         final Object result = Await.result(submitFuture, TIMEOUT.duration());
126         Assert.assertTrue(result instanceof SubmitFailedReply);
127         Assert.assertEquals(cause, ((SubmitFailedReply)result).getThrowable());
128         verify(deviceWriteTx).submit();
129     }
130
131     @Test
132     public void testIdleTimeout() throws Exception {
133         final TestProbe testProbe = new TestProbe(system);
134         testProbe.watch(actorRef);
135         verify(deviceWriteTx, timeout(3000)).cancel();
136         testProbe.expectTerminated(actorRef, TIMEOUT.duration());
137     }
138
139 }