2 * Copyright (c) 2014, 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
9 package org.opendaylight.controller.cluster.datastore;
11 import static org.opendaylight.controller.md.cluster.datastore.model.TestModel.TEST_PATH;
13 import akka.actor.ActorRef;
14 import akka.actor.DeadLetter;
15 import akka.actor.Props;
16 import akka.testkit.JavaTestKit;
17 import org.junit.Assert;
18 import org.junit.Test;
19 import org.mockito.Mockito;
20 import org.opendaylight.controller.cluster.datastore.messages.DataChanged;
21 import org.opendaylight.controller.cluster.datastore.messages.DataChangedReply;
22 import org.opendaylight.controller.cluster.datastore.messages.EnableNotification;
23 import org.opendaylight.controller.md.cluster.datastore.model.CompositeModel;
24 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
25 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener;
26 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 public class DataChangeListenerTest extends AbstractActorTest {
30 @SuppressWarnings({ "rawtypes", "unchecked" })
32 public void testDataChangedWhenNotificationsAreEnabled(){
33 new JavaTestKit(getSystem()) {{
34 final AsyncDataChangeEvent mockChangeEvent = Mockito.mock(AsyncDataChangeEvent.class);
35 final AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
36 final Props props = DataChangeListener.props(mockListener, TEST_PATH);
37 final ActorRef subject = getSystem().actorOf(props, "testDataChangedNotificationsEnabled");
39 // Let the DataChangeListener know that notifications should be enabled
40 subject.tell(new EnableNotification(true), getRef());
42 subject.tell(new DataChanged(mockChangeEvent),
45 expectMsgClass(DataChangedReply.class);
47 Mockito.verify(mockListener).onDataChanged(mockChangeEvent);
51 @SuppressWarnings({ "rawtypes", "unchecked" })
53 public void testDataChangedWhenNotificationsAreDisabled(){
54 new JavaTestKit(getSystem()) {{
55 final AsyncDataChangeEvent mockChangeEvent = Mockito.mock(AsyncDataChangeEvent.class);
56 final AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
57 final Props props = DataChangeListener.props(mockListener, TEST_PATH);
58 final ActorRef subject =
59 getSystem().actorOf(props, "testDataChangedNotificationsDisabled");
61 subject.tell(new DataChanged(mockChangeEvent),
64 new Within(duration("1 seconds")) {
66 protected void run() {
69 Mockito.verify(mockListener, Mockito.never()).onDataChanged(
70 Mockito.any(AsyncDataChangeEvent.class));
76 @SuppressWarnings({ "rawtypes", "unchecked" })
78 public void testDataChangedWithNoSender(){
79 new JavaTestKit(getSystem()) {{
80 final AsyncDataChangeEvent mockChangeEvent = Mockito.mock(AsyncDataChangeEvent.class);
81 final AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
82 final Props props = DataChangeListener.props(mockListener, TEST_PATH);
83 final ActorRef subject = getSystem().actorOf(props, "testDataChangedWithNoSender");
85 getSystem().eventStream().subscribe(getRef(), DeadLetter.class);
87 subject.tell(new DataChanged(mockChangeEvent), ActorRef.noSender());
89 // Make sure no DataChangedReply is sent to DeadLetters.
91 DeadLetter deadLetter;
93 deadLetter = expectMsgClass(duration("1 seconds"), DeadLetter.class);
94 } catch (AssertionError e) {
95 // Timed out - got no DeadLetter - this is good
99 // We may get DeadLetters for other messages we don't care about.
100 Assert.assertFalse("Unexpected DataChangedReply",
101 deadLetter.message() instanceof DataChangedReply);
106 @SuppressWarnings({ "rawtypes", "unchecked" })
108 public void testDataChangedWithListenerRuntimeEx(){
109 new JavaTestKit(getSystem()) {{
110 AsyncDataChangeEvent mockChangeEvent1 = Mockito.mock(AsyncDataChangeEvent.class);
111 AsyncDataChangeEvent mockChangeEvent2 = Mockito.mock(AsyncDataChangeEvent.class);
112 AsyncDataChangeEvent mockChangeEvent3 = Mockito.mock(AsyncDataChangeEvent.class);
114 AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
115 Mockito.doThrow(new RuntimeException("mock")).when(mockListener).onDataChanged(mockChangeEvent2);
117 Props props = DataChangeListener.props(mockListener, TEST_PATH);
118 ActorRef subject = getSystem().actorOf(props, "testDataChangedWithListenerRuntimeEx");
120 // Let the DataChangeListener know that notifications should be enabled
121 subject.tell(new EnableNotification(true), getRef());
123 SchemaContext schemaContext = CompositeModel.createTestContext();
125 subject.tell(new DataChanged(mockChangeEvent1),getRef());
126 expectMsgClass(DataChangedReply.class);
128 subject.tell(new DataChanged(mockChangeEvent2),getRef());
129 expectMsgClass(DataChangedReply.class);
131 subject.tell(new DataChanged(mockChangeEvent3),getRef());
132 expectMsgClass(DataChangedReply.class);
134 Mockito.verify(mockListener).onDataChanged(mockChangeEvent1);
135 Mockito.verify(mockListener).onDataChanged(mockChangeEvent2);
136 Mockito.verify(mockListener).onDataChanged(mockChangeEvent3);