Do not use MoreExecutors.sameThreadExecutor()
[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 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;
25
26 public class DataChangeListenerTest extends AbstractActorTest {
27
28     @SuppressWarnings({ "rawtypes", "unchecked" })
29     @Test
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");
36
37             // Let the DataChangeListener know that notifications should be enabled
38             subject.tell(new EnableNotification(true), getRef());
39
40             subject.tell(new DataChanged(mockChangeEvent),
41                     getRef());
42
43             expectMsgClass(DataChangedReply.class);
44
45             Mockito.verify(mockListener).onDataChanged(mockChangeEvent);
46         }};
47     }
48
49     @SuppressWarnings({ "rawtypes", "unchecked" })
50     @Test
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");
58
59             subject.tell(new DataChanged(mockChangeEvent),
60                     getRef());
61
62             new Within(duration("1 seconds")) {
63                 @Override
64                 protected void run() {
65                     expectNoMsg();
66
67                     Mockito.verify(mockListener, Mockito.never()).onDataChanged(
68                             Mockito.any(AsyncDataChangeEvent.class));
69                 }
70             };
71         }};
72     }
73
74     @SuppressWarnings({ "rawtypes", "unchecked" })
75     @Test
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");
82
83             getSystem().eventStream().subscribe(getRef(), DeadLetter.class);
84
85             subject.tell(new DataChanged(mockChangeEvent), ActorRef.noSender());
86
87             // Make sure no DataChangedReply is sent to DeadLetters.
88             while(true) {
89                 DeadLetter deadLetter;
90                 try {
91                     deadLetter = expectMsgClass(duration("1 seconds"), DeadLetter.class);
92                 } catch (AssertionError e) {
93                     // Timed out - got no DeadLetter - this is good
94                     break;
95                 }
96
97                 // We may get DeadLetters for other messages we don't care about.
98                 Assert.assertFalse("Unexpected DataChangedReply",
99                         deadLetter.message() instanceof DataChangedReply);
100             }
101         }};
102     }
103
104     @SuppressWarnings({ "rawtypes", "unchecked" })
105     @Test
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);
111
112             AsyncDataChangeListener mockListener = Mockito.mock(AsyncDataChangeListener.class);
113             Mockito.doThrow(new RuntimeException("mock")).when(mockListener).onDataChanged(mockChangeEvent2);
114
115             Props props = DataChangeListener.props(mockListener);
116             ActorRef subject = getSystem().actorOf(props, "testDataChangedWithListenerRuntimeEx");
117
118             // Let the DataChangeListener know that notifications should be enabled
119             subject.tell(new EnableNotification(true), getRef());
120
121             SchemaContext schemaContext = CompositeModel.createTestContext();
122
123             subject.tell(new DataChanged(mockChangeEvent1),getRef());
124             expectMsgClass(DataChangedReply.class);
125
126             subject.tell(new DataChanged(mockChangeEvent2),getRef());
127             expectMsgClass(DataChangedReply.class);
128
129             subject.tell(new DataChanged(mockChangeEvent3),getRef());
130             expectMsgClass(DataChangedReply.class);
131
132             Mockito.verify(mockListener).onDataChanged(mockChangeEvent1);
133             Mockito.verify(mockListener).onDataChanged(mockChangeEvent2);
134             Mockito.verify(mockListener).onDataChanged(mockChangeEvent3);
135         }};
136     }
137 }