Merge "Hotfix for resolving of remote yang schemas."
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / DataChangeListenerTest.java
1 package org.opendaylight.controller.cluster.datastore;
2
3 import akka.actor.ActorRef;
4 import akka.actor.Props;
5 import akka.testkit.JavaTestKit;
6 import org.junit.Test;
7 import org.opendaylight.controller.cluster.datastore.messages.DataChanged;
8 import org.opendaylight.controller.cluster.datastore.messages.DataChangedReply;
9 import org.opendaylight.controller.cluster.datastore.messages.EnableNotification;
10 import org.opendaylight.controller.md.cluster.datastore.model.CompositeModel;
11 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
12 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener;
13 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
14 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
15
16 import java.util.HashMap;
17 import java.util.HashSet;
18 import java.util.Map;
19 import java.util.Set;
20
21 import static org.junit.Assert.assertNotNull;
22 import static org.junit.Assert.assertTrue;
23
24 public class DataChangeListenerTest extends AbstractActorTest {
25
26     private static class MockDataChangedEvent implements AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> {
27        Map<YangInstanceIdentifier,NormalizedNode<?,?>> createdData = new HashMap<>();
28        Map<YangInstanceIdentifier,NormalizedNode<?,?>> updatedData = new HashMap<>();
29        Map<YangInstanceIdentifier,NormalizedNode<?,?>> originalData = new HashMap<>();
30
31
32
33         @Override
34         public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getCreatedData() {
35             createdData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
36             return createdData;
37         }
38
39         @Override
40         public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getUpdatedData() {
41             updatedData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
42             return updatedData;
43
44         }
45
46         @Override
47         public Set<YangInstanceIdentifier> getRemovedPaths() {
48                Set<YangInstanceIdentifier>ids = new HashSet();
49                ids.add( CompositeModel.TEST_PATH);
50               return ids;
51         }
52
53         @Override
54         public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getOriginalData() {
55           originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
56           return originalData;
57         }
58
59         @Override public NormalizedNode<?, ?> getOriginalSubtree() {
60
61
62           return originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
63         }
64
65         @Override public NormalizedNode<?, ?> getUpdatedSubtree() {
66
67           //fixme: need to have some valid data here
68           return originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
69         }
70     }
71
72     private class MockDataChangeListener implements AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>> {
73         private boolean gotIt = false;
74         private   AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change;
75
76         @Override public void onDataChanged(
77             AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change) {
78             gotIt = true;this.change=change;
79         }
80
81         public boolean gotIt() {
82             return gotIt;
83         }
84         public  AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> getChange(){
85           return change;
86         }
87     }
88
89     @Test
90     public void testDataChangedWhenNotificationsAreEnabled(){
91         new JavaTestKit(getSystem()) {{
92             final MockDataChangeListener listener = new MockDataChangeListener();
93             final Props props = DataChangeListener.props(listener);
94             final ActorRef subject =
95                 getSystem().actorOf(props, "testDataChangedNotificationsEnabled");
96
97             new Within(duration("1 seconds")) {
98                 @Override
99                 protected void run() {
100
101                     // Let the DataChangeListener know that notifications should
102                     // be enabled
103                     subject.tell(new EnableNotification(true), getRef());
104
105                     subject.tell(
106                         new DataChanged(CompositeModel.createTestContext(),new MockDataChangedEvent()),
107                         getRef());
108
109                     final Boolean out = new ExpectMsg<Boolean>(duration("800 millis"), "dataChanged") {
110                         // do not put code outside this method, will run afterwards
111                         @Override
112                         protected Boolean match(Object in) {
113                             if (in != null && in.getClass().equals(DataChangedReply.class)) {
114
115                                 return true;
116                             } else {
117                                 throw noMatch();
118                             }
119                         }
120                     }.get(); // this extracts the received message
121
122                     assertTrue(out);
123                     assertTrue(listener.gotIt());
124                     assertNotNull(listener.getChange().getCreatedData());
125
126                     expectNoMsg();
127                 }
128             };
129         }};
130     }
131
132     @Test
133     public void testDataChangedWhenNotificationsAreDisabled(){
134         new JavaTestKit(getSystem()) {{
135             final MockDataChangeListener listener = new MockDataChangeListener();
136             final Props props = DataChangeListener.props(listener);
137             final ActorRef subject =
138                 getSystem().actorOf(props, "testDataChangedNotificationsDisabled");
139
140             new Within(duration("1 seconds")) {
141                 @Override
142                 protected void run() {
143
144                     subject.tell(
145                         new DataChanged(CompositeModel.createTestContext(),new MockDataChangedEvent()),
146                         getRef());
147
148                     expectNoMsg();
149                 }
150             };
151         }};
152     }
153 }