Merge "Fixed for bug 1168 : Issue while update subnet"
[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.md.cluster.datastore.model.CompositeModel;
10 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
11 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener;
12 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
13 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
14
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.Map;
18 import java.util.Set;
19
20 import static org.junit.Assert.assertNotNull;
21 import static org.junit.Assert.assertTrue;
22
23 public class DataChangeListenerTest extends AbstractActorTest {
24
25     private static class MockDataChangedEvent implements AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> {
26        Map<YangInstanceIdentifier,NormalizedNode<?,?>> createdData = new HashMap();
27        Map<YangInstanceIdentifier,NormalizedNode<?,?>> updatedData = new HashMap();
28        Map<YangInstanceIdentifier,NormalizedNode<?,?>> originalData = new HashMap();
29
30
31
32         @Override
33         public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getCreatedData() {
34             createdData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
35             return createdData;
36         }
37
38         @Override
39         public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getUpdatedData() {
40             updatedData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
41             return updatedData;
42
43         }
44
45         @Override
46         public Set<YangInstanceIdentifier> getRemovedPaths() {
47                Set<YangInstanceIdentifier>ids = new HashSet();
48                ids.add( CompositeModel.TEST_PATH);
49               return ids;
50         }
51
52         @Override
53         public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getOriginalData() {
54           originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
55           return originalData;
56         }
57
58         @Override public NormalizedNode<?, ?> getOriginalSubtree() {
59
60
61           return originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
62         }
63
64         @Override public NormalizedNode<?, ?> getUpdatedSubtree() {
65
66           //fixme: need to have some valid data here
67           return originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
68         }
69     }
70
71     private class MockDataChangeListener implements AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>> {
72         private boolean gotIt = false;
73         private   AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change;
74
75         @Override public void onDataChanged(
76             AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change) {
77             gotIt = true;this.change=change;
78         }
79
80         public boolean gotIt() {
81             return gotIt;
82         }
83         public  AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> getChange(){
84           return change;
85         }
86     }
87
88     @Test
89     public void testDataChanged(){
90         new JavaTestKit(getSystem()) {{
91             final MockDataChangeListener listener = new MockDataChangeListener();
92             final Props props = DataChangeListener.props(CompositeModel.createTestContext(),listener,CompositeModel.FAMILY_PATH );
93             final ActorRef subject =
94                 getSystem().actorOf(props, "testDataChanged");
95
96             new Within(duration("1 seconds")) {
97                 protected void run() {
98
99                     subject.tell(
100                         new DataChanged(CompositeModel.createTestContext(),new MockDataChangedEvent()).toSerializable(),
101                         getRef());
102
103                     final Boolean out = new ExpectMsg<Boolean>("dataChanged") {
104                         // do not put code outside this method, will run afterwards
105                         protected Boolean match(Object in) {
106                             if (in.getClass().equals(DataChangedReply.SERIALIZABLE_CLASS)) {
107
108                                 return true;
109                             } else {
110                                 throw noMatch();
111                             }
112                         }
113                     }.get(); // this extracts the received message
114
115                     assertTrue(out);
116                     assertTrue(listener.gotIt());
117                     assertNotNull(listener.getChange().getCreatedData());
118                     // Will wait for the rest of the 3 seconds
119                     expectNoMsg();
120                 }
121
122
123             };
124         }};
125     }
126 }