package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorRef; import akka.actor.Props; import akka.testkit.JavaTestKit; import org.junit.Test; import org.opendaylight.controller.cluster.datastore.messages.DataChanged; import org.opendaylight.controller.cluster.datastore.messages.DataChangedReply; import org.opendaylight.controller.md.cluster.datastore.model.CompositeModel; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeListener; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; public class DataChangeListenerTest extends AbstractActorTest { private static class MockDataChangedEvent implements AsyncDataChangeEvent> { Map> createdData = new HashMap(); Map> updatedData = new HashMap(); Map> originalData = new HashMap(); @Override public Map> getCreatedData() { createdData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily()); return createdData; } @Override public Map> getUpdatedData() { updatedData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily()); return updatedData; } @Override public Set getRemovedPaths() { Setids = new HashSet(); ids.add( CompositeModel.TEST_PATH); return ids; } @Override public Map> getOriginalData() { originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily()); return originalData; } @Override public NormalizedNode getOriginalSubtree() { return originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily()); } @Override public NormalizedNode getUpdatedSubtree() { //fixme: need to have some valid data here return originalData.put(CompositeModel.FAMILY_PATH, CompositeModel.createFamily()); } } private class MockDataChangeListener implements AsyncDataChangeListener> { private boolean gotIt = false; private AsyncDataChangeEvent> change; @Override public void onDataChanged( AsyncDataChangeEvent> change) { gotIt = true;this.change=change; } public boolean gotIt() { return gotIt; } public AsyncDataChangeEvent> getChange(){ return change; } } @Test public void testDataChanged(){ new JavaTestKit(getSystem()) {{ final MockDataChangeListener listener = new MockDataChangeListener(); final Props props = DataChangeListener.props(CompositeModel.createTestContext(),listener,CompositeModel.FAMILY_PATH ); final ActorRef subject = getSystem().actorOf(props, "testDataChanged"); new Within(duration("1 seconds")) { protected void run() { subject.tell( new DataChanged(CompositeModel.createTestContext(),new MockDataChangedEvent()).toSerializable(), getRef()); final Boolean out = new ExpectMsg("dataChanged") { // do not put code outside this method, will run afterwards protected Boolean match(Object in) { if (in.getClass().equals(DataChangedReply.SERIALIZABLE_CLASS)) { return true; } else { throw noMatch(); } } }.get(); // this extracts the received message assertTrue(out); assertTrue(listener.gotIt()); assertNotNull(listener.getChange().getCreatedData()); // Will wait for the rest of the 3 seconds expectNoMsg(); } }; }}; } }