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.sal.common.api.data.AsyncDataChangeEvent;
22 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener;
24 public class DataChangeListenerTest extends AbstractActorTest {
26 @SuppressWarnings({ "rawtypes", "unchecked" })
28 public void testDataChangedWhenNotificationsAreEnabled() {
29 new JavaTestKit(getSystem()) {
31 final AsyncDataChangeEvent mockChangeEvent = Mockito.mock(AsyncDataChangeEvent.class);
32 final AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
33 final Props props = DataChangeListener.props(mockListener);
34 final ActorRef subject = getSystem().actorOf(props, "testDataChangedNotificationsEnabled");
36 // Let the DataChangeListener know that notifications should be
38 subject.tell(new EnableNotification(true), getRef());
40 subject.tell(new DataChanged(mockChangeEvent), getRef());
42 expectMsgClass(DataChangedReply.class);
44 Mockito.verify(mockListener).onDataChanged(mockChangeEvent);
49 @SuppressWarnings({ "rawtypes", "unchecked" })
51 public void testDataChangedWhenNotificationsAreDisabled() {
52 new JavaTestKit(getSystem()) {
54 final AsyncDataChangeEvent mockChangeEvent = Mockito.mock(AsyncDataChangeEvent.class);
55 final AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
56 final Props props = DataChangeListener.props(mockListener);
57 final ActorRef subject = getSystem().actorOf(props, "testDataChangedNotificationsDisabled");
59 subject.tell(new DataChanged(mockChangeEvent), getRef());
61 new Within(duration("1 seconds")) {
63 protected void run() {
66 Mockito.verify(mockListener, Mockito.never())
67 .onDataChanged(Mockito.any(AsyncDataChangeEvent.class));
74 @SuppressWarnings({ "rawtypes", "unchecked" })
76 public void testDataChangedWithNoSender() {
77 new JavaTestKit(getSystem()) {
79 final AsyncDataChangeEvent mockChangeEvent = Mockito.mock(AsyncDataChangeEvent.class);
80 final AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
81 final Props props = DataChangeListener.props(mockListener);
82 final ActorRef subject = getSystem().actorOf(props, "testDataChangedWithNoSender");
84 getSystem().eventStream().subscribe(getRef(), DeadLetter.class);
86 subject.tell(new DataChanged(mockChangeEvent), ActorRef.noSender());
88 // Make sure no DataChangedReply is sent to DeadLetters.
90 DeadLetter deadLetter;
92 deadLetter = expectMsgClass(duration("1 seconds"), DeadLetter.class);
93 } catch (AssertionError e) {
94 // Timed out - got no DeadLetter - this is good
98 // We may get DeadLetters for other messages we don't care
100 Assert.assertFalse("Unexpected DataChangedReply", deadLetter.message() instanceof DataChangedReply);
106 @SuppressWarnings({ "rawtypes", "unchecked" })
108 public void testDataChangedWithListenerRuntimeEx() {
109 new JavaTestKit(getSystem()) {
111 final AsyncDataChangeEvent mockChangeEvent1 = Mockito.mock(AsyncDataChangeEvent.class);
112 final AsyncDataChangeEvent mockChangeEvent2 = Mockito.mock(AsyncDataChangeEvent.class);
113 final AsyncDataChangeEvent mockChangeEvent3 = Mockito.mock(AsyncDataChangeEvent.class);
115 AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
116 Mockito.doThrow(new RuntimeException("mock")).when(mockListener).onDataChanged(mockChangeEvent2);
118 Props props = DataChangeListener.props(mockListener);
119 ActorRef subject = getSystem().actorOf(props, "testDataChangedWithListenerRuntimeEx");
121 // Let the DataChangeListener know that notifications should be
123 subject.tell(new EnableNotification(true), getRef());
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);