1 package org.opendaylight.controller.sal.binding.test.bugfix;
3 import java.util.Arrays;
4 import java.util.Collections;
7 import java.util.concurrent.Callable;
8 import java.util.concurrent.ExecutorService;
9 import java.util.concurrent.Executors;
10 import java.util.concurrent.Future;
12 import org.junit.Test;
13 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
14 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
15 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
16 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
17 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.Flow;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
40 import org.opendaylight.yangtools.yang.binding.DataObject;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
43 import org.opendaylight.yangtools.yang.common.QName;
44 import org.opendaylight.yangtools.yang.common.RpcResult;
45 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
47 import com.google.common.collect.FluentIterable;
48 import com.google.common.collect.ImmutableMap;
49 import com.google.common.util.concurrent.Futures;
50 import com.google.common.util.concurrent.ListenableFuture;
51 import com.google.common.util.concurrent.ListeningExecutorService;
52 import com.google.common.util.concurrent.MoreExecutors;
54 import static org.junit.Assert.*;
56 public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataChangeListener {
58 private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
59 private static final String NODE_ID = "openflow:1";
61 private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
63 private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
66 private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
69 private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODES_INSTANCE_ID_BI = //
70 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
74 private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier.builder(NODES_INSTANCE_ID_BA) //
75 .child(Node.class, NODE_KEY).toInstance();
77 private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
78 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
80 .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
82 private static final NodeRef NODE_REF = new NodeRef(NODE_INSTANCE_ID_BA);
83 private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
93 public void testAugmentSerialization() throws Exception {
96 baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
98 NodeBuilder nodeBuilder = new NodeBuilder();
99 nodeBuilder.setId(new NodeId(NODE_ID));
100 nodeBuilder.setKey(NODE_KEY);
101 DataModificationTransaction transaction = baDataService.beginTransaction();
104 FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder();
105 fnub.setHardware("Hardware Foo");
106 fnub.setManufacturer("Manufacturer Foo");
107 fnub.setSerialNumber("Serial Foo");
108 fnub.setDescription("Description Foo");
109 fnub.setSoftware("JUnit emulated");
110 FlowCapableNode fnu = fnub.build();
111 nodeBuilder.addAugmentation(FlowCapableNode.class, fnu);
112 Node original = nodeBuilder.build();
113 transaction.putOperationalData(NODE_INSTANCE_ID_BA, original);
115 RpcResult<TransactionStatus> result = transaction.commit().get();
116 assertEquals(TransactionStatus.COMMITED, result.getResult());
118 assertNotNull(receivedChangeEvent);
120 verifyNodes((Nodes) receivedChangeEvent.getUpdatedOperationalSubtree(),original);
121 assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
122 Nodes nodes = checkForNodes();
123 verifyNodes(nodes,original);
127 testAddingNodeConnector();
136 private void testAddingNodeConnector() throws Exception {
138 NodeConnectorId ncId = new NodeConnectorId("openflow:1:bar");
139 NodeConnectorKey nodeKey = new NodeConnectorKey(ncId );
140 InstanceIdentifier<NodeConnector> ncInstanceId = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).child(NodeConnector.class, nodeKey).toInstance();
141 NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder();
142 ncBuilder.setId(ncId);
143 ncBuilder.setKey(nodeKey);
144 NodeConnector connector = ncBuilder.build();
145 DataModificationTransaction transaction = baDataService.beginTransaction();
146 transaction.putOperationalData(ncInstanceId, connector);
147 RpcResult<TransactionStatus> result = transaction.commit().get();
149 Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
151 assertNotNull(node.getNodeConnector());
152 assertFalse(node.getNodeConnector().isEmpty());
153 NodeConnector readedNc = node.getNodeConnector().get(0);
154 assertNotNull(readedNc);
161 private void testNodeRemove() throws Exception {
162 DataModificationTransaction transaction = baDataService.beginTransaction();
163 transaction.removeOperationalData(NODE_INSTANCE_ID_BA);
164 RpcResult<TransactionStatus> result = transaction.commit().get();
165 assertEquals(TransactionStatus.COMMITED, result.getResult());
167 Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
171 private void verifyNodes(Nodes nodes,Node original) {
172 assertNotNull(nodes);
173 assertNotNull(nodes.getNode());
174 assertEquals(1, nodes.getNode().size());
175 Node readedNode = nodes.getNode().get(0);
176 assertEquals(original.getId(), readedNode.getId());
177 assertEquals(original.getKey(), readedNode.getKey());
179 FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
180 FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
182 assertEquals(fnu.getDescription(), readedAugment.getDescription());
183 assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
187 private void assertBindingIndependentVersion(
188 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
189 CompositeNode node = biDataService.readOperationalData(nodeId);
193 private Nodes checkForNodes() {
194 return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
198 public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
199 receivedChangeEvent = change;