363ae63e4a37532fda97e1986322e1c1fa1cc12c
[netconf.git] / netconf / netconf-topology-singleton / src / test / java / org / opendaylight / netconf / topology / singleton / impl / actors / WriteTransactionActorTestAdapter.java
1 /*
2  * Copyright (c) 2018 Inocybe Technologies 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 package org.opendaylight.netconf.topology.singleton.impl.actors;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.mockito.Mockito.doReturn;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.timeout;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.when;
16 import static org.opendaylight.netconf.topology.singleton.impl.actors.ReadTransactionActorTestAdapter.NODE;
17 import static org.opendaylight.netconf.topology.singleton.impl.actors.ReadTransactionActorTestAdapter.PATH;
18 import static org.opendaylight.netconf.topology.singleton.impl.actors.ReadTransactionActorTestAdapter.STORE;
19 import static org.opendaylight.netconf.topology.singleton.impl.actors.ReadTransactionActorTestAdapter.TIMEOUT;
20
21 import akka.actor.ActorRef;
22 import akka.actor.ActorSystem;
23 import akka.actor.Status.Failure;
24 import akka.actor.Status.Success;
25 import akka.testkit.TestProbe;
26 import org.junit.Test;
27 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
28 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
29 import org.opendaylight.mdsal.common.api.CommitInfo;
30 import org.opendaylight.netconf.topology.singleton.messages.NormalizedNodeMessage;
31 import org.opendaylight.netconf.topology.singleton.messages.transactions.CancelRequest;
32 import org.opendaylight.netconf.topology.singleton.messages.transactions.DeleteRequest;
33 import org.opendaylight.netconf.topology.singleton.messages.transactions.MergeRequest;
34 import org.opendaylight.netconf.topology.singleton.messages.transactions.PutRequest;
35 import org.opendaylight.netconf.topology.singleton.messages.transactions.SubmitRequest;
36 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
37 import org.opendaylight.yangtools.yang.common.RpcError;
38 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
39
40 /**
41  * Adapter for write transaction tests.
42  *
43  * @author Thomas Pantelis
44  */
45 public abstract class WriteTransactionActorTestAdapter {
46     private DOMDataWriteTransaction mockWriteTx;
47     private TestProbe probe;
48     private ActorRef actorRef;
49     private ActorSystem system;
50
51     public void init(DOMDataWriteTransaction inMockWriteTx, ActorSystem inSystem, ActorRef inActorRef) {
52         this.mockWriteTx = inMockWriteTx;
53         this.probe = TestProbe.apply(inSystem);
54         this.actorRef = inActorRef;
55         this.system = inSystem;
56     }
57
58     @Test
59     public void testPut() {
60         final NormalizedNodeMessage normalizedNodeMessage = new NormalizedNodeMessage(PATH, NODE);
61         actorRef.tell(new PutRequest(STORE, normalizedNodeMessage), probe.ref());
62         verify(mockWriteTx).put(STORE, PATH, NODE);
63     }
64
65     @Test
66     public void testMerge() {
67         final NormalizedNodeMessage normalizedNodeMessage = new NormalizedNodeMessage(PATH, NODE);
68         actorRef.tell(new MergeRequest(STORE, normalizedNodeMessage), probe.ref());
69         verify(mockWriteTx).merge(STORE, PATH, NODE);
70     }
71
72     @Test
73     public void testDelete() {
74         actorRef.tell(new DeleteRequest(STORE, PATH), probe.ref());
75         verify(mockWriteTx).delete(STORE, PATH);
76     }
77
78     @Test
79     public void testCancel() {
80         when(mockWriteTx.cancel()).thenReturn(true);
81         actorRef.tell(new CancelRequest(), probe.ref());
82
83         verify(mockWriteTx).cancel();
84         probe.expectMsg(true);
85     }
86
87     @Test
88     public void testSubmit() {
89         doReturn(FluentFutures.immediateFluentFuture(mock(CommitInfo.class))).when(mockWriteTx).commit();
90         actorRef.tell(new SubmitRequest(), probe.ref());
91
92         verify(mockWriteTx).commit();
93         probe.expectMsgClass(Success.class);
94     }
95
96     @Test
97     public void testSubmitFail() {
98         final RpcError rpcError =
99                 RpcResultBuilder.newError(RpcError.ErrorType.APPLICATION, "fail", "fail");
100         final TransactionCommitFailedException cause = new TransactionCommitFailedException("fail", rpcError);
101         when(mockWriteTx.commit()).thenReturn(FluentFutures.immediateFailedFluentFuture(cause));
102         actorRef.tell(new SubmitRequest(), probe.ref());
103
104         verify(mockWriteTx).commit();
105         final Failure response = probe.expectMsgClass(Failure.class);
106         assertEquals(cause, response.cause());
107     }
108
109     @Test
110     public void testIdleTimeout() {
111         final TestProbe testProbe = new TestProbe(system);
112         testProbe.watch(actorRef);
113         verify(mockWriteTx, timeout(3000)).cancel();
114         testProbe.expectTerminated(actorRef, TIMEOUT.duration());
115     }
116 }