1 package org.opendaylight.controller.cluster.datastore;
3 import akka.actor.ActorRef;
4 import akka.actor.Props;
5 import akka.testkit.JavaTestKit;
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;
16 import java.util.HashMap;
17 import java.util.HashSet;
21 import static org.junit.Assert.assertNotNull;
22 import static org.junit.Assert.assertTrue;
24 public class DataChangeListenerTest extends AbstractActorTest {
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<>();
34 public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getCreatedData() {
35 createdData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
40 public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getUpdatedData() {
41 updatedData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
47 public Set<YangInstanceIdentifier> getRemovedPaths() {
48 Set<YangInstanceIdentifier>ids = new HashSet();
49 ids.add( CompositeModel.TEST_PATH);
54 public Map<YangInstanceIdentifier, NormalizedNode<?, ?>> getOriginalData() {
55 originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
59 @Override public NormalizedNode<?, ?> getOriginalSubtree() {
62 return originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
65 @Override public NormalizedNode<?, ?> getUpdatedSubtree() {
67 //fixme: need to have some valid data here
68 return originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily());
72 private class MockDataChangeListener implements AsyncDataChangeListener<YangInstanceIdentifier, NormalizedNode<?, ?>> {
73 private boolean gotIt = false;
74 private AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change;
76 @Override public void onDataChanged(
77 AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change) {
78 gotIt = true;this.change=change;
81 public boolean gotIt() {
84 public AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> getChange(){
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");
97 new Within(duration("1 seconds")) {
99 protected void run() {
101 // Let the DataChangeListener know that notifications should
103 subject.tell(new EnableNotification(true), getRef());
106 new DataChanged(CompositeModel.createTestContext(),new MockDataChangedEvent()),
109 final Boolean out = new ExpectMsg<Boolean>(duration("800 millis"), "dataChanged") {
110 // do not put code outside this method, will run afterwards
112 protected Boolean match(Object in) {
113 if (in != null && in.getClass().equals(DataChangedReply.class)) {
120 }.get(); // this extracts the received message
123 assertTrue(listener.gotIt());
124 assertNotNull(listener.getChange().getCreatedData());
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");
140 new Within(duration("1 seconds")) {
142 protected void run() {
145 new DataChanged(CompositeModel.createTestContext(),new MockDataChangedEvent()),