Added configuration options to MD-SAL
[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.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;
46
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;
53
54 import static org.junit.Assert.*;
55
56 public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataChangeListener {
57
58     private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
59     private static final String NODE_ID = "openflow:1";
60
61     private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
62
63     private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
64             NODE_ID);
65
66     private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
67             .toInstance();
68
69     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODES_INSTANCE_ID_BI = //
70     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
71             .node(Nodes.QNAME) //
72             .toInstance();
73
74     private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier.builder(NODES_INSTANCE_ID_BA) //
75             .child(Node.class, NODE_KEY).toInstance();
76
77     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
78     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
79             .node(Nodes.QNAME) //
80             .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
81             .toInstance();
82     private static final NodeRef NODE_REF = new NodeRef(NODE_INSTANCE_ID_BA);
83     private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
84
85     
86     
87     /**
88      * Test for Bug 148
89      * 
90      * @throws Exception
91      */
92     @Test
93     public void testAugmentSerialization() throws Exception {
94
95         
96         baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
97         
98         NodeBuilder nodeBuilder = new NodeBuilder();
99         nodeBuilder.setId(new NodeId(NODE_ID));
100         nodeBuilder.setKey(NODE_KEY);
101         DataModificationTransaction transaction = baDataService.beginTransaction();
102         
103         
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);
114         
115         RpcResult<TransactionStatus> result = transaction.commit().get();
116         assertEquals(TransactionStatus.COMMITED, result.getResult());
117         
118         assertNotNull(receivedChangeEvent);
119         
120         verifyNodes((Nodes) receivedChangeEvent.getUpdatedOperationalSubtree(),original);
121         assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
122         Nodes nodes = checkForNodes();
123         verifyNodes(nodes,original);
124         
125         
126         
127         testAddingNodeConnector();
128         
129         
130         
131         testNodeRemove();
132         
133         
134     }
135
136     private void testAddingNodeConnector() throws Exception {
137         
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();
148         
149         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
150         assertNotNull(node);
151         assertNotNull(node.getNodeConnector());
152         assertFalse(node.getNodeConnector().isEmpty());
153         NodeConnector readedNc = node.getNodeConnector().get(0);
154         assertNotNull(readedNc);
155         
156         
157         
158         
159     }
160
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());
166         
167         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
168         assertNull(node);
169     }
170
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());
178         
179         FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
180         FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
181         assertNotNull(fnu);
182         assertEquals(fnu.getDescription(), readedAugment.getDescription());
183         assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
184         
185     }
186
187     private void assertBindingIndependentVersion(
188             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
189         CompositeNode node = biDataService.readOperationalData(nodeId);
190         assertNotNull(node);
191     }
192
193     private Nodes checkForNodes() {
194         return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
195     }
196     
197     @Override
198     public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
199         receivedChangeEvent = change;
200     }
201
202 }