HostTracker hosts DB key scheme implementation
[controller.git] / opendaylight / md-sal / sal-binding-broker / src / test / java / org / opendaylight / controller / sal / binding / test / bugfix / DOMCodecBug03Test.java
1 package org.opendaylight.controller.sal.binding.test.bugfix;
2
3 import java.util.Arrays;
4 import java.util.Collections;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.concurrent.Callable;
8 import java.util.concurrent.ExecutorService;
9 import java.util.concurrent.Executors;
10 import java.util.concurrent.Future;
11
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;
41
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;
48
49 import static org.junit.Assert.*;
50
51 public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataChangeListener {
52
53     private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
54     private static final String NODE_ID = "openflow:1";
55
56     private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
57
58     private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
59             NODE_ID);
60
61     private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder() //
62             .node(Nodes.class) //
63             .toInstance();
64
65     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODES_INSTANCE_ID_BI = //
66     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
67             .node(Nodes.QNAME) //
68             .toInstance();
69
70     private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier.builder() //
71             .node(Nodes.class) //
72             .child(Node.class, NODE_KEY).toInstance();
73
74     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
75     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
76             .node(Nodes.QNAME) //
77             .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
78             .toInstance();
79     private static final NodeRef NODE_REF = new NodeRef(NODE_INSTANCE_ID_BA);
80     private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
81
82     
83     
84     /**
85      * Test for Bug 148
86      * 
87      * @throws Exception
88      */
89     @Test
90     public void testAugmentSerialization() throws Exception {
91
92         
93         baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
94         
95         NodeBuilder nodeBuilder = new NodeBuilder();
96         nodeBuilder.setId(new NodeId(NODE_ID));
97         nodeBuilder.setKey(NODE_KEY);
98         DataModificationTransaction transaction = baDataService.beginTransaction();
99         
100         
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);
111         
112         RpcResult<TransactionStatus> result = transaction.commit().get();
113         assertEquals(TransactionStatus.COMMITED, result.getResult());
114         
115         assertNotNull(receivedChangeEvent);
116         
117         verifyNodes((Nodes) receivedChangeEvent.getUpdatedOperationalSubtree(),original);
118         assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
119         Nodes nodes = checkForNodes();
120         verifyNodes(nodes,original);
121         
122         
123     }
124
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());
132         
133         FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
134         FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
135         assertNotNull(fnu);
136         assertEquals(fnu.getDescription(), readedAugment.getDescription());
137         assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
138         
139     }
140
141     private void assertBindingIndependentVersion(
142             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
143         CompositeNode node = biDataService.readOperationalData(nodeId);
144         assertNotNull(node);
145     }
146
147     private Nodes checkForNodes() {
148         return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
149     }
150     
151     @Override
152     public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
153         receivedChangeEvent = change;
154     }
155
156 }