2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.sal.binding.test.bugfix;
9 import java.util.Arrays;
10 import java.util.Collections;
11 import java.util.List;
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;
44 import static org.junit.Assert.*;
46 public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataChangeListener {
48 private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
49 private static final String NODE_ID = "openflow:1";
51 private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
53 private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
56 private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
60 private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier//
61 .builder(NODES_INSTANCE_ID_BA) //
62 .child(Node.class, NODE_KEY).toInstance();
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)
73 private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
74 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
76 .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
78 private static final QName SUPPORTED_ACTIONS_QNAME = QName.create(FlowCapableNode.QNAME, SupportedActions.QNAME.getLocalName());
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() //
84 .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
85 .node(SUPPORTED_ACTIONS_QNAME) //
88 private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
98 public void testAugmentSerialization() throws Exception {
101 baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
103 NodeBuilder nodeBuilder = new NodeBuilder();
104 nodeBuilder.setId(new NodeId(NODE_ID));
105 nodeBuilder.setKey(NODE_KEY);
106 DataModificationTransaction transaction = baDataService.beginTransaction();
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);
120 RpcResult<TransactionStatus> result = transaction.commit().get();
121 assertEquals(TransactionStatus.COMMITED, result.getResult());
123 assertNotNull(receivedChangeEvent);
125 verifyNodes((Nodes) receivedChangeEvent.getUpdatedOperationalSubtree(),original);
126 assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
127 Nodes nodes = checkForNodes();
128 verifyNodes(nodes,original);
130 testAddingNodeConnector();
136 public void testAugmentNestedSerialization() throws Exception {
137 DataModificationTransaction transaction = baDataService.beginTransaction();
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 );
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);
153 CompositeNode biSupportedActions = biDataService.readOperationalData(SUPPORTED_ACTIONS_INSTANCE_ID_BI);
154 assertNotNull(biSupportedActions);
158 private void testAddingNodeConnector() throws Exception {
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);
173 assertNotNull(node.getNodeConnector());
174 assertFalse(node.getNodeConnector().isEmpty());
175 NodeConnector readedNc = node.getNodeConnector().get(0);
176 assertNotNull(readedNc);
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());
185 Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
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());
197 FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
198 FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
200 assertEquals(fnu.getDescription(), readedAugment.getDescription());
201 assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
205 private void assertBindingIndependentVersion(
206 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
207 CompositeNode node = biDataService.readOperationalData(nodeId);
211 private Nodes checkForNodes() {
212 return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
216 public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
217 receivedChangeEvent = change;