580a0ab97bcbec82d7399b2b87526c3b5f767ecb
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / DataChangeListenerTest.java
1 /*
2  * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.controller.cluster.datastore;
10
11 import static org.opendaylight.controller.md.cluster.datastore.model.TestModel.TEST_PATH;
12
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;
27
28 public class DataChangeListenerTest extends AbstractActorTest {
29
30     @SuppressWarnings({ "rawtypes", "unchecked" })
31     @Test
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");
38
39             // Let the DataChangeListener know that notifications should be enabled
40             subject.tell(new EnableNotification(true), getRef());
41
42             subject.tell(new DataChanged(mockChangeEvent),
43                     getRef());
44
45             expectMsgClass(DataChangedReply.class);
46
47             Mockito.verify(mockListener).onDataChanged(mockChangeEvent);
48         }};
49     }
50
51     @SuppressWarnings({ "rawtypes", "unchecked" })
52     @Test
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");
60
61             subject.tell(new DataChanged(mockChangeEvent),
62                     getRef());
63
64             new Within(duration("1 seconds")) {
65                 @Override
66                 protected void run() {
67                     expectNoMsg();
68
69                     Mockito.verify(mockListener, Mockito.never()).onDataChanged(
70                             Mockito.any(AsyncDataChangeEvent.class));
71                 }
72             };
73         }};
74     }
75
76     @SuppressWarnings({ "rawtypes", "unchecked" })
77     @Test
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");
84
85             getSystem().eventStream().subscribe(getRef(), DeadLetter.class);
86
87             subject.tell(new DataChanged(mockChangeEvent), ActorRef.noSender());
88
89             // Make sure no DataChangedReply is sent to DeadLetters.
90             while(true) {
91                 DeadLetter deadLetter;
92                 try {
93                     deadLetter = expectMsgClass(duration("1 seconds"), DeadLetter.class);
94                 } catch (AssertionError e) {
95                     // Timed out - got no DeadLetter - this is good
96                     break;
97                 }
98
99                 // We may get DeadLetters for other messages we don't care about.
100                 Assert.assertFalse("Unexpected DataChangedReply",
101                         deadLetter.message() instanceof DataChangedReply);
102             }
103         }};
104     }
105
106     @SuppressWarnings({ "rawtypes", "unchecked" })
107     @Test
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);
113
114             AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
115             Mockito.doThrow(new RuntimeException("mock")).when(mockListener).onDataChanged(mockChangeEvent2);
116
117             Props props = DataChangeListener.props(mockListener, TEST_PATH);
118             ActorRef subject = getSystem().actorOf(props, "testDataChangedWithListenerRuntimeEx");
119
120             // Let the DataChangeListener know that notifications should be enabled
121             subject.tell(new EnableNotification(true), getRef());
122
123             SchemaContext schemaContext = CompositeModel.createTestContext();
124
125             subject.tell(new DataChanged(mockChangeEvent1),getRef());
126             expectMsgClass(DataChangedReply.class);
127
128             subject.tell(new DataChanged(mockChangeEvent2),getRef());
129             expectMsgClass(DataChangedReply.class);
130
131             subject.tell(new DataChanged(mockChangeEvent3),getRef());
132             expectMsgClass(DataChangedReply.class);
133
134             Mockito.verify(mockListener).onDataChanged(mockChangeEvent1);
135             Mockito.verify(mockListener).onDataChanged(mockChangeEvent2);
136             Mockito.verify(mockListener).onDataChanged(mockChangeEvent3);
137         }};
138     }
139 }