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.nodes.Node;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
36 import org.opendaylight.yangtools.yang.binding.DataObject;
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
38 import org.opendaylight.yangtools.yang.common.QName;
39 import org.opendaylight.yangtools.yang.common.RpcResult;
40 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
42 import com.google.common.collect.FluentIterable;
43 import com.google.common.collect.ImmutableMap;
44 import com.google.common.util.concurrent.Futures;
45 import com.google.common.util.concurrent.ListenableFuture;
46 import com.google.common.util.concurrent.ListeningExecutorService;
47 import com.google.common.util.concurrent.MoreExecutors;
49 import static org.junit.Assert.*;
51 public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataChangeListener {
53 private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
54 private static final String NODE_ID = "openflow:1";
56 private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
58 private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
61 private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder() //
65 private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODES_INSTANCE_ID_BI = //
66 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
70 private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier.builder() //
72 .child(Node.class, NODE_KEY).toInstance();
74 private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
75 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
77 .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
79 private static final NodeRef NODE_REF = new NodeRef(NODE_INSTANCE_ID_BA);
80 private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
90 public void testAugmentSerialization() throws Exception {
93 baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
95 NodeBuilder nodeBuilder = new NodeBuilder();
96 nodeBuilder.setId(new NodeId(NODE_ID));
97 nodeBuilder.setKey(NODE_KEY);
98 DataModificationTransaction transaction = baDataService.beginTransaction();
101 FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder();
102 fnub.setHardware("Hardware Foo");
103 fnub.setManufacturer("Manufacturer Foo");
104 fnub.setSerialNumber("Serial Foo");
105 fnub.setDescription("Description Foo");
106 fnub.setSoftware("JUnit emulated");
107 FlowCapableNode fnu = fnub.build();
108 nodeBuilder.addAugmentation(FlowCapableNode.class, fnu);
109 Node original = nodeBuilder.build();
110 transaction.putOperationalData(NODE_INSTANCE_ID_BA, original);
112 RpcResult<TransactionStatus> result = transaction.commit().get();
113 assertEquals(TransactionStatus.COMMITED, result.getResult());
115 assertNotNull(receivedChangeEvent);
117 verifyNodes((Nodes) receivedChangeEvent.getUpdatedOperationalSubtree(),original);
118 assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
119 Nodes nodes = checkForNodes();
120 verifyNodes(nodes,original);
125 private void verifyNodes(Nodes nodes,Node original) {
126 assertNotNull(nodes);
127 assertNotNull(nodes.getNode());
128 assertEquals(1, nodes.getNode().size());
129 Node readedNode = nodes.getNode().get(0);
130 assertEquals(original.getId(), readedNode.getId());
131 assertEquals(original.getKey(), readedNode.getKey());
133 FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
134 FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
136 assertEquals(fnu.getDescription(), readedAugment.getDescription());
137 assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
141 private void assertBindingIndependentVersion(
142 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
143 CompositeNode node = biDataService.readOperationalData(nodeId);
147 private Nodes checkForNodes() {
148 return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
152 public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
153 receivedChangeEvent = change;