Merge "Prevent ConfigPusher from killing its thread"
[controller.git] / opendaylight / md-sal / sal-binding-dom-it / src / test / java / org / opendaylight / controller / sal / binding / test / bugfix / DOMCodecBug03Test.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.sal.binding.test.bugfix;
9 import java.util.Arrays;
10 import java.util.Collections;
11 import java.util.List;
12 import java.util.Map;
13
14 import org.junit.Test;
15 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
16 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
17 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
18 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
19 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActions;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActionsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.supported.actions.ActionType;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.supported.actions.ActionTypeBuilder;
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.Nodes;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.SupportType;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesKey;
38 import org.opendaylight.yangtools.yang.binding.DataObject;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import org.opendaylight.yangtools.yang.common.QName;
41 import org.opendaylight.yangtools.yang.common.RpcResult;
42 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
43
44 import static org.junit.Assert.*;
45
46 public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataChangeListener {
47
48     private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
49     private static final String NODE_ID = "openflow:1";
50
51     private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
52
53     private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
54             NODE_ID);
55
56     private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
57             .toInstance();
58
59
60     private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier//
61             .builder(NODES_INSTANCE_ID_BA) //
62             .child(Node.class, NODE_KEY).toInstance();
63     
64     
65     private static final InstanceIdentifier<SupportedActions> SUPPORTED_ACTIONS_INSTANCE_ID_BA = InstanceIdentifier//
66             .builder(NODES_INSTANCE_ID_BA) //
67             .child(Node.class, NODE_KEY) //
68             .augmentation(FlowCapableNode.class) //
69             .child(SupportedActions.class)
70             .toInstance();
71     
72
73     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
74     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
75             .node(Nodes.QNAME) //
76             .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
77             .toInstance();
78     private static final QName SUPPORTED_ACTIONS_QNAME = QName.create(FlowCapableNode.QNAME, SupportedActions.QNAME.getLocalName());
79
80     
81     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier SUPPORTED_ACTIONS_INSTANCE_ID_BI = //
82             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
83                     .node(Nodes.QNAME) //
84                     .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
85                     .node(SUPPORTED_ACTIONS_QNAME) //
86                     .toInstance();
87     
88     private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
89
90     
91     
92     /**
93      * Test for Bug 148
94      * 
95      * @throws Exception
96      */
97     @Test
98     public void testAugmentSerialization() throws Exception {
99
100         
101         baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
102         
103         NodeBuilder nodeBuilder = new NodeBuilder();
104         nodeBuilder.setId(new NodeId(NODE_ID));
105         nodeBuilder.setKey(NODE_KEY);
106         DataModificationTransaction transaction = baDataService.beginTransaction();
107         
108         
109         FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder();
110         fnub.setHardware("Hardware Foo");
111         fnub.setManufacturer("Manufacturer Foo");
112         fnub.setSerialNumber("Serial Foo");
113         fnub.setDescription("Description Foo");
114         fnub.setSoftware("JUnit emulated");
115         FlowCapableNode fnu = fnub.build();
116         nodeBuilder.addAugmentation(FlowCapableNode.class, fnu);
117         Node original = nodeBuilder.build();
118         transaction.putOperationalData(NODE_INSTANCE_ID_BA, original);
119         
120         RpcResult<TransactionStatus> result = transaction.commit().get();
121         assertEquals(TransactionStatus.COMMITED, result.getResult());
122         
123         assertNotNull(receivedChangeEvent);
124         
125         verifyNodes((Nodes) receivedChangeEvent.getUpdatedOperationalSubtree(),original);
126         assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
127         Nodes nodes = checkForNodes();
128         verifyNodes(nodes,original);
129         
130         testAddingNodeConnector();
131         testNodeRemove();
132
133     }
134     
135     @Test
136     public void testAugmentNestedSerialization() throws Exception {
137         DataModificationTransaction transaction = baDataService.beginTransaction();
138         
139         SupportedActionsBuilder actions = new SupportedActionsBuilder();
140         ActionTypeBuilder action = new ActionTypeBuilder();
141         action.setAction("foo-action");
142         action.setSupportState(SupportType.Native);
143         List<ActionType> actionTypes = Collections.singletonList(action.build());
144         actions.setActionType(actionTypes );
145         
146         transaction.putOperationalData(SUPPORTED_ACTIONS_INSTANCE_ID_BA, actions.build());
147         RpcResult<TransactionStatus> putResult = transaction.commit().get();
148         assertNotNull(putResult);
149         assertEquals(TransactionStatus.COMMITED, putResult.getResult());
150         SupportedActions readedTable = (SupportedActions) baDataService.readOperationalData(SUPPORTED_ACTIONS_INSTANCE_ID_BA);
151         assertNotNull(readedTable);
152         
153         CompositeNode biSupportedActions = biDataService.readOperationalData(SUPPORTED_ACTIONS_INSTANCE_ID_BI);
154         assertNotNull(biSupportedActions);
155         
156     }
157
158     private void testAddingNodeConnector() throws Exception {
159         
160         NodeConnectorId ncId = new NodeConnectorId("openflow:1:bar");
161         NodeConnectorKey nodeKey = new NodeConnectorKey(ncId );
162         InstanceIdentifier<NodeConnector> ncInstanceId = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).child(NodeConnector.class, nodeKey).toInstance();
163         NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder();
164         ncBuilder.setId(ncId);
165         ncBuilder.setKey(nodeKey);
166         NodeConnector connector = ncBuilder.build();
167         DataModificationTransaction transaction = baDataService.beginTransaction();
168         transaction.putOperationalData(ncInstanceId, connector);
169         RpcResult<TransactionStatus> result = transaction.commit().get();
170         assertEquals(TransactionStatus.COMMITED, result.getResult());
171         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
172         assertNotNull(node);
173         assertNotNull(node.getNodeConnector());
174         assertFalse(node.getNodeConnector().isEmpty());
175         NodeConnector readedNc = node.getNodeConnector().get(0);
176         assertNotNull(readedNc);
177     }
178
179     private void testNodeRemove() throws Exception {
180         DataModificationTransaction transaction = baDataService.beginTransaction();
181         transaction.removeOperationalData(NODE_INSTANCE_ID_BA);
182         RpcResult<TransactionStatus> result = transaction.commit().get();
183         assertEquals(TransactionStatus.COMMITED, result.getResult());
184         
185         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
186         assertNull(node);
187     }
188
189     private void verifyNodes(Nodes nodes,Node original) {
190         assertNotNull(nodes);
191         assertNotNull(nodes.getNode());
192         assertEquals(1, nodes.getNode().size());
193         Node readedNode = nodes.getNode().get(0);
194         assertEquals(original.getId(), readedNode.getId());
195         assertEquals(original.getKey(), readedNode.getKey());
196         
197         FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
198         FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
199         assertNotNull(fnu);
200         assertEquals(fnu.getDescription(), readedAugment.getDescription());
201         assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
202         
203     }
204
205     private void assertBindingIndependentVersion(
206             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
207         CompositeNode node = biDataService.readOperationalData(nodeId);
208         assertNotNull(node);
209     }
210
211     private Nodes checkForNodes() {
212         return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
213     }
214     
215     @Override
216     public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
217         receivedChangeEvent = change;
218     }
219
220 }