Fixed two-phase commit bug when change originated in DOM Broker
[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 import java.util.Collections;
3 import java.util.Map;
4
5
6 import org.junit.Test;
7 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
8 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
9 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
10 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
11 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
23 import org.opendaylight.yangtools.yang.binding.DataObject;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.common.RpcResult;
27 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
28
29
30
31 import static org.junit.Assert.*;
32
33 public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataChangeListener {
34
35     private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
36     private static final String NODE_ID = "openflow:1";
37
38     private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
39
40     private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
41             NODE_ID);
42
43     private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
44             .toInstance();
45
46
47     private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier.builder(NODES_INSTANCE_ID_BA) //
48             .child(Node.class, NODE_KEY).toInstance();
49
50     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
51     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
52             .node(Nodes.QNAME) //
53             .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
54             .toInstance();
55     private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
56
57     
58     
59     /**
60      * Test for Bug 148
61      * 
62      * @throws Exception
63      */
64     @Test
65     public void testAugmentSerialization() throws Exception {
66
67         
68         baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
69         
70         NodeBuilder nodeBuilder = new NodeBuilder();
71         nodeBuilder.setId(new NodeId(NODE_ID));
72         nodeBuilder.setKey(NODE_KEY);
73         DataModificationTransaction transaction = baDataService.beginTransaction();
74         
75         
76         FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder();
77         fnub.setHardware("Hardware Foo");
78         fnub.setManufacturer("Manufacturer Foo");
79         fnub.setSerialNumber("Serial Foo");
80         fnub.setDescription("Description Foo");
81         fnub.setSoftware("JUnit emulated");
82         FlowCapableNode fnu = fnub.build();
83         nodeBuilder.addAugmentation(FlowCapableNode.class, fnu);
84         Node original = nodeBuilder.build();
85         transaction.putOperationalData(NODE_INSTANCE_ID_BA, original);
86         
87         RpcResult<TransactionStatus> result = transaction.commit().get();
88         assertEquals(TransactionStatus.COMMITED, result.getResult());
89         
90         assertNotNull(receivedChangeEvent);
91         
92         verifyNodes((Nodes) receivedChangeEvent.getUpdatedOperationalSubtree(),original);
93         assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
94         Nodes nodes = checkForNodes();
95         verifyNodes(nodes,original);
96         
97         
98         
99         testAddingNodeConnector();
100         
101         
102         
103         testNodeRemove();
104         
105         
106     }
107
108     private void testAddingNodeConnector() throws Exception {
109         
110         NodeConnectorId ncId = new NodeConnectorId("openflow:1:bar");
111         NodeConnectorKey nodeKey = new NodeConnectorKey(ncId );
112         InstanceIdentifier<NodeConnector> ncInstanceId = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).child(NodeConnector.class, nodeKey).toInstance();
113         NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder();
114         ncBuilder.setId(ncId);
115         ncBuilder.setKey(nodeKey);
116         NodeConnector connector = ncBuilder.build();
117         DataModificationTransaction transaction = baDataService.beginTransaction();
118         transaction.putOperationalData(ncInstanceId, connector);
119         RpcResult<TransactionStatus> result = transaction.commit().get();
120         assertEquals(TransactionStatus.COMMITED, result.getResult());
121         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
122         assertNotNull(node);
123         assertNotNull(node.getNodeConnector());
124         assertFalse(node.getNodeConnector().isEmpty());
125         NodeConnector readedNc = node.getNodeConnector().get(0);
126         assertNotNull(readedNc);
127         
128         
129         
130         
131     }
132
133     private void testNodeRemove() throws Exception {
134         DataModificationTransaction transaction = baDataService.beginTransaction();
135         transaction.removeOperationalData(NODE_INSTANCE_ID_BA);
136         RpcResult<TransactionStatus> result = transaction.commit().get();
137         assertEquals(TransactionStatus.COMMITED, result.getResult());
138         
139         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
140         assertNull(node);
141     }
142
143     private void verifyNodes(Nodes nodes,Node original) {
144         assertNotNull(nodes);
145         assertNotNull(nodes.getNode());
146         assertEquals(1, nodes.getNode().size());
147         Node readedNode = nodes.getNode().get(0);
148         assertEquals(original.getId(), readedNode.getId());
149         assertEquals(original.getKey(), readedNode.getKey());
150         
151         FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
152         FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
153         assertNotNull(fnu);
154         assertEquals(fnu.getDescription(), readedAugment.getDescription());
155         assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
156         
157     }
158
159     private void assertBindingIndependentVersion(
160             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
161         CompositeNode node = biDataService.readOperationalData(nodeId);
162         assertNotNull(node);
163     }
164
165     private Nodes checkForNodes() {
166         return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
167     }
168     
169     @Override
170     public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
171         receivedChangeEvent = change;
172     }
173
174 }