2 * Copyright (c) 2018 Inocybe Technologies and others. All rights reserved.
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
8 package org.opendaylight.netconf.topology.singleton.impl.actors;
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;
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;
42 * Adapter for write transaction tests.
44 * @author Thomas Pantelis
46 public abstract class WriteTransactionActorTestAdapter {
47 private DOMDataTreeWriteTransaction mockWriteTx;
48 private TestProbe probe;
49 private ActorRef actorRef;
50 private ActorSystem system;
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;
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);
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);
75 public void testDelete() {
76 actorRef.tell(new DeleteRequest(STORE, PATH), probe.ref());
77 verify(mockWriteTx).delete(STORE, PATH);
81 public void testCancel() {
82 when(mockWriteTx.cancel()).thenReturn(true);
83 actorRef.tell(new CancelRequest(), probe.ref());
85 verify(mockWriteTx).cancel();
86 probe.expectMsg(true);
90 public void testSubmit() {
91 doReturn(emptyFluentFuture()).when(mockWriteTx).commit();
92 actorRef.tell(new SubmitRequest(), probe.ref());
94 verify(mockWriteTx).commit();
95 probe.expectMsgClass(Success.class);
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());
106 verify(mockWriteTx).commit();
107 final Failure response = probe.expectMsgClass(Failure.class);
108 assertEquals(cause, response.cause());
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());