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