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 akka.actor.ActorRef;
12 import akka.actor.DeadLetter;
13 import akka.actor.Props;
14 import akka.testkit.JavaTestKit;
15 import org.junit.Assert;
16 import org.junit.Test;
17 import org.mockito.Mockito;
18 import org.opendaylight.controller.cluster.datastore.messages.DataChanged;
19 import org.opendaylight.controller.cluster.datastore.messages.DataChangedReply;
20 import org.opendaylight.controller.cluster.datastore.messages.EnableNotification;
21 import org.opendaylight.controller.md.cluster.datastore.model.CompositeModel;
22 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
23 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener;
24 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26 public class DataChangeListenerTest extends AbstractActorTest {
28 @SuppressWarnings({ "rawtypes", "unchecked" })
30 public void testDataChangedWhenNotificationsAreEnabled(){
31 new JavaTestKit(getSystem()) {{
32 final AsyncDataChangeEvent mockChangeEvent = Mockito.mock(AsyncDataChangeEvent.class);
33 final AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
34 final Props props = DataChangeListener.props(mockListener);
35 final ActorRef subject = getSystem().actorOf(props, "testDataChangedNotificationsEnabled");
37 // Let the DataChangeListener know that notifications should be enabled
38 subject.tell(new EnableNotification(true), getRef());
40 subject.tell(new DataChanged(mockChangeEvent),
43 expectMsgClass(DataChangedReply.class);
45 Mockito.verify(mockListener).onDataChanged(mockChangeEvent);
49 @SuppressWarnings({ "rawtypes", "unchecked" })
51 public void testDataChangedWhenNotificationsAreDisabled(){
52 new JavaTestKit(getSystem()) {{
53 final AsyncDataChangeEvent mockChangeEvent = Mockito.mock(AsyncDataChangeEvent.class);
54 final AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
55 final Props props = DataChangeListener.props(mockListener);
56 final ActorRef subject =
57 getSystem().actorOf(props, "testDataChangedNotificationsDisabled");
59 subject.tell(new DataChanged(mockChangeEvent),
62 new Within(duration("1 seconds")) {
64 protected void run() {
67 Mockito.verify(mockListener, Mockito.never()).onDataChanged(
68 Mockito.any(AsyncDataChangeEvent.class));
74 @SuppressWarnings({ "rawtypes", "unchecked" })
76 public void testDataChangedWithNoSender(){
77 new JavaTestKit(getSystem()) {{
78 final AsyncDataChangeEvent mockChangeEvent = Mockito.mock(AsyncDataChangeEvent.class);
79 final AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
80 final Props props = DataChangeListener.props(mockListener);
81 final ActorRef subject = getSystem().actorOf(props, "testDataChangedWithNoSender");
83 getSystem().eventStream().subscribe(getRef(), DeadLetter.class);
85 subject.tell(new DataChanged(mockChangeEvent), ActorRef.noSender());
87 // Make sure no DataChangedReply is sent to DeadLetters.
89 DeadLetter deadLetter;
91 deadLetter = expectMsgClass(duration("1 seconds"), DeadLetter.class);
92 } catch (AssertionError e) {
93 // Timed out - got no DeadLetter - this is good
97 // We may get DeadLetters for other messages we don't care about.
98 Assert.assertFalse("Unexpected DataChangedReply",
99 deadLetter.message() instanceof DataChangedReply);
104 @SuppressWarnings({ "rawtypes", "unchecked" })
106 public void testDataChangedWithListenerRuntimeEx(){
107 new JavaTestKit(getSystem()) {{
108 AsyncDataChangeEvent mockChangeEvent1 = Mockito.mock(AsyncDataChangeEvent.class);
109 AsyncDataChangeEvent mockChangeEvent2 = Mockito.mock(AsyncDataChangeEvent.class);
110 AsyncDataChangeEvent mockChangeEvent3 = Mockito.mock(AsyncDataChangeEvent.class);
112 AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
113 Mockito.doThrow(new RuntimeException("mock")).when(mockListener).onDataChanged(mockChangeEvent2);
115 Props props = DataChangeListener.props(mockListener);
116 ActorRef subject = getSystem().actorOf(props, "testDataChangedWithListenerRuntimeEx");
118 // Let the DataChangeListener know that notifications should be enabled
119 subject.tell(new EnableNotification(true), getRef());
121 SchemaContext schemaContext = CompositeModel.createTestContext();
123 subject.tell(new DataChanged(mockChangeEvent1),getRef());
124 expectMsgClass(DataChangedReply.class);
126 subject.tell(new DataChanged(mockChangeEvent2),getRef());
127 expectMsgClass(DataChangedReply.class);
129 subject.tell(new DataChanged(mockChangeEvent3),getRef());
130 expectMsgClass(DataChangedReply.class);
132 Mockito.verify(mockListener).onDataChanged(mockChangeEvent1);
133 Mockito.verify(mockListener).onDataChanged(mockChangeEvent2);
134 Mockito.verify(mockListener).onDataChanged(mockChangeEvent3);