2 * Copyright (c) 2015 Cisco Systems, Inc. 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.controller.cluster.datastore;
10 import static org.opendaylight.controller.md.cluster.datastore.model.TestModel.TEST_PATH;
12 import akka.actor.ActorRef;
13 import akka.actor.DeadLetter;
14 import akka.actor.Props;
15 import akka.testkit.JavaTestKit;
16 import com.google.common.collect.ImmutableList;
17 import org.junit.Assert;
18 import org.junit.Test;
19 import org.mockito.Matchers;
20 import org.mockito.Mockito;
21 import org.opendaylight.controller.cluster.datastore.messages.DataTreeChanged;
22 import org.opendaylight.controller.cluster.datastore.messages.DataTreeChangedReply;
23 import org.opendaylight.controller.cluster.datastore.messages.EnableNotification;
24 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener;
25 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
27 public class DataTreeChangeListenerActorTest extends AbstractActorTest {
30 public void testDataChangedWhenNotificationsAreEnabled() {
31 new JavaTestKit(getSystem()) {
33 final DataTreeCandidate mockTreeCandidate = Mockito.mock(DataTreeCandidate.class);
34 final ImmutableList<DataTreeCandidate> mockCandidates = ImmutableList.of(mockTreeCandidate);
35 final DOMDataTreeChangeListener mockListener = Mockito.mock(DOMDataTreeChangeListener.class);
36 final Props props = DataTreeChangeListenerActor.props(mockListener, TEST_PATH);
37 final ActorRef subject = getSystem().actorOf(props, "testDataTreeChangedNotificationsEnabled");
39 // Let the DataChangeListener know that notifications should be
41 subject.tell(new EnableNotification(true, "test"), getRef());
43 subject.tell(new DataTreeChanged(mockCandidates), getRef());
45 expectMsgClass(DataTreeChangedReply.class);
47 Mockito.verify(mockListener).onDataTreeChanged(mockCandidates);
53 public void testDataChangedWhenNotificationsAreDisabled() {
54 new JavaTestKit(getSystem()) {
56 final DataTreeCandidate mockTreeCandidate = Mockito.mock(DataTreeCandidate.class);
57 final ImmutableList<DataTreeCandidate> mockCandidates = ImmutableList.of(mockTreeCandidate);
58 final DOMDataTreeChangeListener mockListener = Mockito.mock(DOMDataTreeChangeListener.class);
59 final Props props = DataTreeChangeListenerActor.props(mockListener, TEST_PATH);
60 final ActorRef subject = getSystem().actorOf(props, "testDataTreeChangedNotificationsDisabled");
62 subject.tell(new DataTreeChanged(mockCandidates), getRef());
64 new Within(duration("1 seconds")) {
66 protected void run() {
69 Mockito.verify(mockListener, Mockito.never())
70 .onDataTreeChanged(Matchers.anyCollectionOf(DataTreeCandidate.class));
78 public void testDataChangedWithNoSender() {
79 new JavaTestKit(getSystem()) {
81 final DataTreeCandidate mockTreeCandidate = Mockito.mock(DataTreeCandidate.class);
82 final ImmutableList<DataTreeCandidate> mockCandidates = ImmutableList.of(mockTreeCandidate);
83 final DOMDataTreeChangeListener mockListener = Mockito.mock(DOMDataTreeChangeListener.class);
84 final Props props = DataTreeChangeListenerActor.props(mockListener, TEST_PATH);
85 final ActorRef subject = getSystem().actorOf(props, "testDataTreeChangedWithNoSender");
87 getSystem().eventStream().subscribe(getRef(), DeadLetter.class);
89 subject.tell(new DataTreeChanged(mockCandidates), ActorRef.noSender());
91 // Make sure no DataChangedReply is sent to DeadLetters.
93 DeadLetter deadLetter;
95 deadLetter = expectMsgClass(duration("1 seconds"), DeadLetter.class);
96 } catch (AssertionError e) {
97 // Timed out - got no DeadLetter - this is good
101 // We may get DeadLetters for other messages we don't care
103 Assert.assertFalse("Unexpected DataTreeChangedReply",
104 deadLetter.message() instanceof DataTreeChangedReply);
111 public void testDataChangedWithListenerRuntimeEx() {
112 new JavaTestKit(getSystem()) {
114 final DataTreeCandidate mockTreeCandidate1 = Mockito.mock(DataTreeCandidate.class);
115 final ImmutableList<DataTreeCandidate> mockCandidates1 = ImmutableList.of(mockTreeCandidate1);
116 final DataTreeCandidate mockTreeCandidate2 = Mockito.mock(DataTreeCandidate.class);
117 final ImmutableList<DataTreeCandidate> mockCandidates2 = ImmutableList.of(mockTreeCandidate2);
118 final DataTreeCandidate mockTreeCandidate3 = Mockito.mock(DataTreeCandidate.class);
119 final ImmutableList<DataTreeCandidate> mockCandidates3 = ImmutableList.of(mockTreeCandidate3);
121 final DOMDataTreeChangeListener mockListener = Mockito.mock(DOMDataTreeChangeListener.class);
122 Mockito.doThrow(new RuntimeException("mock")).when(mockListener).onDataTreeChanged(mockCandidates2);
124 Props props = DataTreeChangeListenerActor.props(mockListener, TEST_PATH);
125 ActorRef subject = getSystem().actorOf(props, "testDataTreeChangedWithListenerRuntimeEx");
127 // Let the DataChangeListener know that notifications should be
129 subject.tell(new EnableNotification(true, "test"), getRef());
131 subject.tell(new DataTreeChanged(mockCandidates1), getRef());
132 expectMsgClass(DataTreeChangedReply.class);
134 subject.tell(new DataTreeChanged(mockCandidates2), getRef());
135 expectMsgClass(DataTreeChangedReply.class);
137 subject.tell(new DataTreeChanged(mockCandidates3), getRef());
138 expectMsgClass(DataTreeChangedReply.class);
140 Mockito.verify(mockListener).onDataTreeChanged(mockCandidates1);
141 Mockito.verify(mockListener).onDataTreeChanged(mockCandidates2);
142 Mockito.verify(mockListener).onDataTreeChanged(mockCandidates3);