Bump upstreams to SNAPSHOTs
[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.timeout;
13 import static org.mockito.Mockito.verify;
14 import static org.mockito.Mockito.when;
15 import static org.opendaylight.mdsal.common.api.CommitInfo.emptyFluentFuture;
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.mdsal.common.api.TransactionCommitFailedException;
28 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
29 import org.opendaylight.netconf.topology.singleton.messages.NormalizedNodeMessage;
30 import org.opendaylight.netconf.topology.singleton.messages.transactions.CancelRequest;
31 import org.opendaylight.netconf.topology.singleton.messages.transactions.DeleteRequest;
32 import org.opendaylight.netconf.topology.singleton.messages.transactions.MergeRequest;
33 import org.opendaylight.netconf.topology.singleton.messages.transactions.PutRequest;
34 import org.opendaylight.netconf.topology.singleton.messages.transactions.SubmitRequest;
35 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
36 import org.opendaylight.yangtools.yang.common.ErrorTag;
37 import org.opendaylight.yangtools.yang.common.ErrorType;
38 import org.opendaylight.yangtools.yang.common.RpcError;
39 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
40
41 /**
42  * Adapter for write transaction tests.
43  *
44  * @author Thomas Pantelis
45  */
46 public abstract class WriteTransactionActorTestAdapter {
47     private DOMDataTreeWriteTransaction mockWriteTx;
48     private TestProbe probe;
49     private ActorRef actorRef;
50     private ActorSystem system;
51
52     public void init(final DOMDataTreeWriteTransaction inMockWriteTx, final ActorSystem inSystem,
53             final ActorRef inActorRef) {
54         this.mockWriteTx = inMockWriteTx;
55         this.probe = TestProbe.apply(inSystem);
56         this.actorRef = inActorRef;
57         this.system = inSystem;
58     }
59
60     @Test
61     public void testPut() {
62         final NormalizedNodeMessage normalizedNodeMessage = new NormalizedNodeMessage(PATH, NODE);
63         actorRef.tell(new PutRequest(STORE, normalizedNodeMessage), probe.ref());
64         verify(mockWriteTx).put(STORE, PATH, NODE);
65     }
66
67     @Test
68     public void testMerge() {
69         final NormalizedNodeMessage normalizedNodeMessage = new NormalizedNodeMessage(PATH, NODE);
70         actorRef.tell(new MergeRequest(STORE, normalizedNodeMessage), probe.ref());
71         verify(mockWriteTx).merge(STORE, PATH, NODE);
72     }
73
74     @Test
75     public void testDelete() {
76         actorRef.tell(new DeleteRequest(STORE, PATH), probe.ref());
77         verify(mockWriteTx).delete(STORE, PATH);
78     }
79
80     @Test
81     public void testCancel() {
82         when(mockWriteTx.cancel()).thenReturn(true);
83         actorRef.tell(new CancelRequest(), probe.ref());
84
85         verify(mockWriteTx).cancel();
86         probe.expectMsg(true);
87     }
88
89     @Test
90     public void testSubmit() {
91         doReturn(emptyFluentFuture()).when(mockWriteTx).commit();
92         actorRef.tell(new SubmitRequest(), probe.ref());
93
94         verify(mockWriteTx).commit();
95         probe.expectMsgClass(Success.class);
96     }
97
98     @Test
99     public void testSubmitFail() {
100         final RpcError rpcError =
101                 RpcResultBuilder.newError(ErrorType.APPLICATION, new ErrorTag("fail"), "fail");
102         final TransactionCommitFailedException cause = new TransactionCommitFailedException("fail", rpcError);
103         when(mockWriteTx.commit()).thenReturn(FluentFutures.immediateFailedFluentFuture(cause));
104         actorRef.tell(new SubmitRequest(), probe.ref());
105
106         verify(mockWriteTx).commit();
107         final Failure response = probe.expectMsgClass(Failure.class);
108         assertEquals(cause, response.cause());
109     }
110
111     @Test
112     public void testIdleTimeout() {
113         final TestProbe testProbe = new TestProbe(system);
114         testProbe.watch(actorRef);
115         verify(mockWriteTx, timeout(3000)).cancel();
116         testProbe.expectTerminated(actorRef, TIMEOUT.duration());
117     }
118 }