blob: a016fda50439a70cdfe8358d9bd5bc0d19060ce1 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.yang.runtime.impl;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.onosproject.yang.gen.v1.modulelistandkey.rev20160826.modulelistandkey.DefaultModKey;
import org.onosproject.yang.gen.v1.modulelistandkey.rev20160826.modulelistandkey.ModKey;
import org.onosproject.yang.gen.v1.modulelistandkey.rev20160826.modulelistandkey.ModKeyKeys;
import org.onosproject.yang.gen.v1.simpledatatypes.rev20131112.simpledatatypes.DefaultCont;
import org.onosproject.yang.gen.v1.simpledatatypes.rev20131112.simpledatatypes.Tpdfun0;
import org.onosproject.yang.gen.v1.yrtietfte.rev20170310.yrtietfte.DefaultTe;
import org.onosproject.yang.gen.v1.yrtietfte.rev20170310.yrtietfte.tunnelp2pproperties.DefaultState;
import org.onosproject.yang.gen.v1.yrtietfte.rev20170310.yrtietfte.tunnelsgrouping.DefaultTunnels;
import org.onosproject.yang.gen.v1.yrtietfte.rev20170310.yrtietfte.tunnelsgrouping.tunnels.DefaultTunnel;
import org.onosproject.yang.gen.v1.yrtietftetypes.rev20160320.yrtietftetypes.TunnelP2p;
import org.onosproject.yang.gen.v1.ytbietfschedule.rev20160826.YtbIetfSchedule;
import org.onosproject.yang.gen.v1.ytbietfschedule.rev20160826.ytbietfschedule.Enum1Enum;
import org.onosproject.yang.gen.v1.ytbietfschedule.rev20160826.ytbietfschedule.Enum2Enum;
import org.onosproject.yang.gen.v1.ytbmodulewithcontainer.rev20160826.ytbmodulewithcontainer.DefaultSched;
import org.onosproject.yang.gen.v1.ytbmodulewithleaflist.rev20160826.YtbModuleWithLeafList;
import org.onosproject.yang.gen.v1.ytbrpc.rev20160826.ytbrpc.content.DefaultContentInput;
import org.onosproject.yang.gen.v1.ytbrpc.rev20160826.ytbrpc.content.DefaultContentOutput;
import org.onosproject.yang.gen.v1.ytbrpc.rev20160826.ytbrpc.content.contentinput.DefaultIn;
import org.onosproject.yang.gen.v1.ytbrpc.rev20160826.ytbrpc.content.contentinput.InTypedef;
import org.onosproject.yang.gen.v1.ytbrpc.rev20160826.ytbrpc.content.contentoutput.outch.DefaultFirst;
import org.onosproject.yang.gen.v1.ytbtreebuilderforlisthavinglist.rev20160826.ytbtreebuilderforlisthavinglist.DefaultCarrier;
import org.onosproject.yang.gen.v1.ytbtreebuilderforlisthavinglist.rev20160826.ytbtreebuilderforlisthavinglist.carrier.DefaultMultiplexes;
import org.onosproject.yang.gen.v1.ytbtreebuilderforlisthavinglist.rev20160826.ytbtreebuilderforlisthavinglist.carrier.Multiplexes;
import org.onosproject.yang.gen.v1.ytbtreebuilderforlisthavinglist.rev20160826.ytbtreebuilderforlisthavinglist.carrier.multiplexes.ApplicationAreas;
import org.onosproject.yang.gen.v1.ytbtreebuilderforlisthavinglist.rev20160826.ytbtreebuilderforlisthavinglist.carrier.multiplexes.DefaultApplicationAreas;
import org.onosproject.yang.gen.v1.ytbtreebuilderforlisthavinglist.rev20160826.ytbtreebuilderforlisthavinglist.carrier.multiplexes.TypesEnum;
import org.onosproject.yang.model.DataNode;
import org.onosproject.yang.model.DefaultModelObjectData;
import org.onosproject.yang.model.InnerNode;
import org.onosproject.yang.model.KeyLeaf;
import org.onosproject.yang.model.LeafListKey;
import org.onosproject.yang.model.LeafModelObject;
import org.onosproject.yang.model.ListKey;
import org.onosproject.yang.model.ModelObjectId;
import org.onosproject.yang.model.NodeKey;
import org.onosproject.yang.model.ResourceData;
import org.onosproject.yang.model.ResourceId;
import org.onosproject.yang.model.SchemaId;
import org.onosproject.yang.runtime.mockclass.testmodule.DefaultTestNotification;
import org.onosproject.yang.runtime.mockclass.testmodule.testnotification.DefaultTestContainer;
import org.onosproject.yang.runtime.mockclass.testmodule.testrpc.DefaultTestInput;
import org.onosproject.yang.runtime.mockclass.testmodule.testrpc.DefaultTestOutput;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.onosproject.yang.gen.v1.simpledatatypes.rev20131112.simpledatatypes.Cont.LeafIdentifier.LFENUM1;
import static org.onosproject.yang.gen.v1.simpledatatypes.rev20131112.simpledatatypes.tpdfun0.Tpdfun0Enum.SUCCESSFUL_EXIT;
import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_LEAF_VALUE_NODE;
import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
import static org.onosproject.yang.runtime.impl.TestUtils.validateLeafDataNode;
/*
*
* ModelObjectId | List<ModelObject> | ResourceId | List<DN>
* Null | Null | For module | null
* Class | Null | Form module to node | null
* Class +Leaf | Null | From module to leaf | null
* Class | Class | From module to node | class
* Leaf | Null | From module to leaf | null
* Class+leaf | Object | INVALID case | -----
*/
/**
* Unit test cases for YANG tree builder with different YANG object
* configuration.
*/
public class DefaultDataTreeBuilderTest {
private final TestYangSchemaNodeProvider schemaProvider = new
TestYangSchemaNodeProvider();
@Rule
public ExpectedException thrown = ExpectedException.none();
private ResourceData rscData;
private DefaultDataTreeBuilder treeBuilder;
private DefaultYangModelRegistry registry;
private ResourceId id;
private List<NodeKey> keys;
private String nameSpace;
private SchemaId sid;
private List<DataNode> dataNodes;
private DataNode node;
private ModelObjectId mid;
private DefaultModelObjectData.Builder data;
/**
* Do the prior setup for each UT.
*/
private void setUp() {
schemaProvider.processSchemaRegistry();
registry = schemaProvider.registry();
treeBuilder = new DefaultDataTreeBuilder(registry);
}
/**
* Unit test to test resource data generation of a module with leaf
* .resource id should start form "/" and should not contain info about the
* leaf node . the list of data node should only have one entry and that
* should be for leaf.
*/
@Test
public void processModuleAndLeaf() {
setUp();
// As an application, creates the object.
LeafModelObject modelObject = new LeafModelObject();
modelObject.leafIdentifier(YtbIetfSchedule.LeafIdentifier.TIME);
List<Object> objects = new ArrayList<>();
objects.add(9);
modelObject.values(objects);
// Builds YANG tree in YTB.
data = new DefaultModelObjectData.Builder();
data.addModelObject(modelObject);
rscData = treeBuilder.getResourceData(data.build());
nameSpace = "yms:test:ytb:module:with:leaf:ietfschedule";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(1, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "time", nameSpace, SINGLE_INSTANCE_LEAF_VALUE_NODE,
true, "9");
}
/**
* Unit test to test resource data generation of a module with leaf-list
* .resource id should start form "/" and should not contain info about the
* leaf list node . the list of data node should only have 3 entry and
* that should be for leaf-list and its value.
*/
@Test
public void processModuleAndLeafList() {
setUp();
//As an application, creates the object.
LeafModelObject modelObject = new LeafModelObject();
modelObject.leafIdentifier(YtbModuleWithLeafList.LeafIdentifier.TIME);
List<Object> objects = new ArrayList<>();
objects.add(1);
objects.add(2);
objects.add(3);
modelObject.values(objects);
//Builds YANG tree in YTB.
data = new DefaultModelObjectData.Builder();
data.addModelObject(modelObject);
rscData = treeBuilder.getResourceData(data.build());
nameSpace = "yms:test:ytb:module:with:leaflist";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(1, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(3, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "time", nameSpace, MULTI_INSTANCE_LEAF_VALUE_NODE,
true, "1");
node = dataNodes.get(1);
validateDataNode(node, "time", nameSpace, MULTI_INSTANCE_LEAF_VALUE_NODE,
true, "2");
node = dataNodes.get(2);
validateDataNode(node, "time", nameSpace, MULTI_INSTANCE_LEAF_VALUE_NODE,
true, "3");
}
/**
* Unit test to test resource data generation of a module with one
* instance of list with one leaf.resource id should start form "/" and
* should not contain info about the list node. list of data node will
* only contain node of list.
*/
@Test
public void processModuleListAndKeyOneIn() {
setUp();
//As an application, creates the object.
DefaultModKey m1 = new DefaultModKey();
m1.types(1);
data = new DefaultModelObjectData.Builder();
data.addModelObject(m1);
rscData = treeBuilder.getResourceData(data.build());
nameSpace = "yms:test:ytb:tree:builder:for:list:having:list";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(1, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "modKey", nameSpace, MULTI_INSTANCE_NODE,
true, null);
DataNode dataNode = node;
Map<NodeKey, DataNode> childMap = ((InnerNode) dataNode).childNodes();
Iterator<Map.Entry<NodeKey, DataNode>> it = childMap.entrySet().iterator();
Map.Entry<NodeKey, DataNode> n = it.next();
validateDataNode(n.getValue(), "types", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE, true, "1");
Iterator<KeyLeaf> keyIt = ((ListKey) node.key()).keyLeafs().iterator();
validateLeafDataNode(keyIt.next(), "types", nameSpace, "1");
}
/**
* Unit test to test resource data generation of a module with multi
* instance of list with one leaf.resource id should start form "/" and
* should not contain info about the list node. list of data node will
* only contain list nodes
*/
@Test
public void processModuleListAndKey() {
setUp();
//As an application, creates the object.
DefaultModKey m1 = new DefaultModKey();
m1.types(1);
DefaultModKey m2 = new DefaultModKey();
m2.types(2);
DefaultModKey m3 = new DefaultModKey();
m3.types(3);
data = new DefaultModelObjectData.Builder();
data.addModelObject(m1).addModelObject(m2).addModelObject(m3);
rscData = treeBuilder.getResourceData(data.build());
nameSpace = "yms:test:ytb:tree:builder:for:list:having:list";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(1, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(3, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "modKey", nameSpace, MULTI_INSTANCE_NODE,
true, null);
DataNode dataNode = node;
Map<NodeKey, DataNode> childMap = ((InnerNode) dataNode).childNodes();
Iterator<Map.Entry<NodeKey, DataNode>> it = childMap.entrySet().iterator();
Map.Entry<NodeKey, DataNode> n = it.next();
validateDataNode(n.getValue(), "types", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE, true, "1");
Iterator<KeyLeaf> keyIt = ((ListKey) node.key()).keyLeafs().iterator();
validateLeafDataNode(keyIt.next(), "types", nameSpace, "1");
node = dataNodes.get(1);
validateDataNode(node, "modKey", nameSpace, MULTI_INSTANCE_NODE,
true, null);
dataNode = node;
childMap = ((InnerNode) dataNode).childNodes();
it = childMap.entrySet().iterator();
n = it.next();
validateDataNode(n.getValue(), "types", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE, true, "2");
keyIt = ((ListKey) node.key()).keyLeafs().iterator();
validateLeafDataNode(keyIt.next(), "types", nameSpace, "2");
node = dataNodes.get(2);
validateDataNode(node, "modKey", nameSpace, MULTI_INSTANCE_NODE,
true, null);
dataNode = node;
childMap = ((InnerNode) dataNode).childNodes();
it = childMap.entrySet().iterator();
n = it.next();
validateDataNode(n.getValue(), "types", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE, true, "3");
keyIt = ((ListKey) node.key()).keyLeafs().iterator();
validateLeafDataNode(keyIt.next(), "types", nameSpace, "3");
}
/**
* Unit test to test resource data generation of a module with multi
* instance of list with one leaf.resource id should start form "/" and
* should contain info about the list node as its part of model object
* identifier. list of data node will only contain leaf nodes because we
* have added list node objects in model object list.
*/
@Test
public void processModuleListAndKeyListModId() {
setUp();
data = new DefaultModelObjectData.Builder();
LeafModelObject object = new LeafModelObject();
object.leafIdentifier(ModKey.LeafIdentifier.TYPES);
List<Object> objects = new ArrayList<>();
objects.add(1);
object.values(objects);
data.addModelObject(object);
object = new LeafModelObject();
object.leafIdentifier(ModKey.LeafIdentifier.TYPES);
objects = new ArrayList<>();
objects.add(2);
object.values(objects);
data.addModelObject(object);
object = new LeafModelObject();
object.leafIdentifier(ModKey.LeafIdentifier.TYPES);
objects = new ArrayList<>();
objects.add(3);
object.values(objects);
data.addModelObject(object);
ModKeyKeys keyKeys = new ModKeyKeys();
keyKeys.types(10);
mid = ModelObjectId.builder()
.addChild(DefaultModKey.class, keyKeys).build();
data.identifier(mid);
rscData = treeBuilder.getResourceData(data.build());
id = rscData.resourceId();
nameSpace = "yms:test:ytb:tree:builder:for:list:having:list";
keys = id.nodeKeys();
assertThat(2, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("modKey", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
ListKey listKey = (ListKey) keys.get(1);
Iterator<KeyLeaf> it = listKey.keyLeafs().iterator();
assertThat(1, is(listKey.keyLeafs().size()));
KeyLeaf keyLeaf = it.next();
sid = keyLeaf.leafSchema();
assertThat("types", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
assertThat(10, is(keyLeaf.leafValue()));
dataNodes = rscData.dataNodes();
assertThat(3, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "types", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "1");
node = dataNodes.get(1);
validateDataNode(node, "types", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "2");
node = dataNodes.get(2);
validateDataNode(node, "types", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "3");
}
/**
* Unit test to test resource data generation of a module with multi
* instance of list with one leaf.resource id should start form "/" and
* should contain info about the list node and leaf node as these are part
* of model object identifier. list of data node not contain anything
* because in case of leaf being a part of model object identifier we
* can't have any model object in model object list. so we will not
* generate any data node.
*/
@Test
public void processModuleListAndKeyLeafModId() {
setUp();
data = new DefaultModelObjectData
.Builder();
ModKeyKeys keyKeys = new ModKeyKeys();
keyKeys.types(10);
mid = ModelObjectId.builder()
.addChild(DefaultModKey.class, keyKeys)
.addChild(ModKey.LeafIdentifier.TYPES).build();
data.identifier(mid);
rscData = treeBuilder.getResourceData(data.build());
id = rscData.resourceId();
nameSpace = "yms:test:ytb:tree:builder:for:list:having:list";
keys = id.nodeKeys();
assertThat(3, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("modKey", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
ListKey listKey = (ListKey) keys.get(1);
Iterator<KeyLeaf> it = listKey.keyLeafs().iterator();
assertThat(1, is(listKey.keyLeafs().size()));
KeyLeaf keyLeaf = it.next();
sid = keyLeaf.leafSchema();
assertThat("types", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
assertThat(10, is(keyLeaf.leafValue()));
sid = keys.get(2).schemaId();
assertThat("types", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
assertThat(true, is(rscData.dataNodes().isEmpty()));
}
/**
* Unit test to test resource data generation of a module node with leaf
* and multi instance leaf-list of enum types. resource identifier will
* only contain module info "/" and will not contain leaf info. data
* nodes will be for leaf and leaf-list. enum is an non data node so it
* will not have a data node created for him. for each instance of
* leaf-list one leaf instance data node will be added to data node list.
*/
@Test
public void processWithTypeEnum() {
setUp();
data = new DefaultModelObjectData.Builder();
//As an application, creates the object.
LeafModelObject object = new LeafModelObject();
object.leafIdentifier(YtbIetfSchedule.LeafIdentifier.TIME);
List<Object> objects = new ArrayList<>();
objects.add(9);
object.values(objects);
data.addModelObject(object);
object = new LeafModelObject();
object.leafIdentifier(YtbIetfSchedule.LeafIdentifier.ENUM1);
objects = new ArrayList<>();
objects.add(Enum1Enum.HUNDRED);
object.values(objects);
data.addModelObject(object);
object = new LeafModelObject();
object.leafIdentifier(YtbIetfSchedule.LeafIdentifier.ENUM2);
objects = new ArrayList<>();
objects.add(Enum2Enum.HUNDRED_100);
objects.add(Enum2Enum.TEN_10);
objects.add(Enum2Enum.THOUSAND_1000);
object.values(objects);
data.addModelObject(object);
rscData = treeBuilder.getResourceData(data.build());
nameSpace = "yms:test:ytb:module:with:leaf:ietfschedule";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(1, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(5, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "time", nameSpace, SINGLE_INSTANCE_LEAF_VALUE_NODE,
true, "9");
node = dataNodes.get(1);
validateDataNode(node, "enum1", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE,
true, "hundred");
node = dataNodes.get(2);
validateDataNode(node, "enum2", nameSpace,
MULTI_INSTANCE_LEAF_VALUE_NODE,
true, "hundred-100");
node = dataNodes.get(3);
validateDataNode(node, "enum2", nameSpace, MULTI_INSTANCE_LEAF_VALUE_NODE,
true, "ten-10");
node = dataNodes.get(4);
validateDataNode(node, "enum2", nameSpace, MULTI_INSTANCE_LEAF_VALUE_NODE,
true, "thousand-1000");
}
/**
* Unit test case for a module with container node in it. As model object
* identifier is null so resource identifier should start from "/" and
* should not contain any other info. Data node list should contain info
* about container node.
*/
@Test
public void processModuleWithContainer() {
setUp();
// As an application, creates the object.
//Creates container object with leaf of decimal type.
BigDecimal dec = BigDecimal.valueOf(98989);
DefaultSched sched = new DefaultSched();
sched.predict(dec);
// Builds YANG tree in YTB.
data = new DefaultModelObjectData.Builder();
data.addModelObject(sched);
rscData = treeBuilder.getResourceData(data.build());
nameSpace = "yms:test:ytb:module:with:container";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(1, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "sched", nameSpace, SINGLE_INSTANCE_NODE,
true, null);
Map<NodeKey, DataNode> child = ((InnerNode) node).childNodes();
assertThat(1, is(child.size()));
Iterator<Map.Entry<NodeKey, DataNode>> it = ((InnerNode) node)
.childNodes().entrySet().iterator();
Map.Entry<NodeKey, DataNode> n = it.next();
validateDataNode(n.getValue(), "predict", nameSpace, SINGLE_INSTANCE_LEAF_VALUE_NODE,
true, "98989");
}
/**
* Unit test case for a module with container node in it. As model object
* identifier is having container so resource identifier should start from
* "/" and it will have container node in it.and should not contain any
* other info. Data node list should contain info about container node's
* leaf node.
*/
@Test
public void processModuleWithContainerModId() {
setUp();
data = new DefaultModelObjectData.Builder();
//As an application, creates the object.
LeafModelObject object = new LeafModelObject();
object.leafIdentifier(DefaultSched.LeafIdentifier.PREDICT);
List<Object> objects = new ArrayList<>();
objects.add(BigDecimal.valueOf(98989));
object.values(objects);
data.addModelObject(object);
// Builds YANG tree in YTB.
mid = ModelObjectId.builder().addChild(DefaultSched.class).build();
data.identifier(mid);
rscData = treeBuilder.getResourceData(data.build());
nameSpace = "yms:test:ytb:module:with:container";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(2, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("sched", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "predict", nameSpace, SINGLE_INSTANCE_LEAF_VALUE_NODE,
true, "98989");
}
/**
* Unit test to process a module with a list and another list as child of
* the list. Model object is null so resource id will be from "/". and
* data nodes will be created from the first child node. that is container.
*/
@Test
public void processTreeBuilderForListHavingList() {
setUp();
// Creates two binary leaf -lists for two list app areas.
List<byte[]> destArea1 = new ArrayList<>();
byte[] arr = new byte[]{1, 6, 3};
byte[] arr1 = new byte[]{2, 7, 4};
destArea1.add(arr);
destArea1.add(arr1);
List<byte[]> destArea2 = new ArrayList<>();
byte[] arr2 = new byte[]{3, 8, 4};
byte[] arr3 = new byte[]{5, 6, 1};
destArea2.add(arr2);
destArea2.add(arr3);
//Creates two app areas list.
ApplicationAreas appArea1 = new DefaultApplicationAreas();
appArea1.destinationAreas(destArea1);
ApplicationAreas appArea2 = new DefaultApplicationAreas();
appArea2.destinationAreas(destArea2);
List<ApplicationAreas> applicationAreasList = new ArrayList<>();
applicationAreasList.add(appArea1);
applicationAreasList.add(appArea2);
//Adds two lists under the multiplex list for content 1.
DefaultMultiplexes mpx1 = new DefaultMultiplexes();
mpx1.types(TypesEnum.TIME_DIVISION);
mpx1.applicationAreas(applicationAreasList);
//Creates two binary leaf -lists for two list app areas.
List<byte[]> destArea3 = new ArrayList<>();
byte[] arrB = new byte[]{0, 0, 1};
byte[] arr1B = new byte[]{1, 0, 0};
destArea3.add(arrB);
destArea3.add(arr1B);
List<byte[]> destArea4 = new ArrayList<>();
byte[] arr2B = new byte[]{7, 7, 7};
byte[] arr3B = new byte[]{0, 1};
destArea4.add(arr2B);
destArea4.add(arr3B);
//Creates two app areas list.
ApplicationAreas appArea3 = new DefaultApplicationAreas();
appArea3.destinationAreas(destArea3);
ApplicationAreas appArea4 = new DefaultApplicationAreas();
appArea4.destinationAreas(destArea4);
List<ApplicationAreas> applicationAreasListB = new ArrayList<>();
applicationAreasListB.add(appArea3);
applicationAreasListB.add(appArea4);
//Adds two lists under the multiplex list for content 2.
DefaultMultiplexes mpx2 = new DefaultMultiplexes();
mpx2.types(TypesEnum.FREQUENCY_DIVISION);
mpx2.applicationAreas(applicationAreasListB);
List<Multiplexes> multiplexList = new ArrayList<>();
multiplexList.add(mpx1);
multiplexList.add(mpx2);
//Sets it in the container carrier.
DefaultCarrier carrier = new DefaultCarrier();
carrier.multiplexes(multiplexList);
data = new DefaultModelObjectData.Builder();
data.addModelObject(carrier);
rscData = treeBuilder.getResourceData(data.build());
nameSpace = "yms:test:ytb:tree:builder:for:list:having:list";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(1, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "carrier", nameSpace,
SINGLE_INSTANCE_NODE, true, null);
Map<NodeKey, DataNode> child = ((InnerNode) node).childNodes();
assertThat(2, is(child.size()));
Iterator<Map.Entry<NodeKey, DataNode>> it1 = child.entrySet()
.iterator();
Map.Entry<NodeKey, DataNode> n = it1.next();
validateDataNode(n.getValue(), "multiplexes", nameSpace,
MULTI_INSTANCE_NODE, true, null);
NodeKey key = n.getKey();
assertThat(true, is(key instanceof ListKey));
ListKey listKey = (ListKey) key;
List<KeyLeaf> keyLeaves = listKey.keyLeafs();
assertThat(1, is(keyLeaves.size()));
validateLeafDataNode(keyLeaves.get(0), "types", nameSpace,
"time-division");
node = n.getValue();
child = ((InnerNode) node).childNodes();
assertThat(2, is(child.size()));
Iterator<Map.Entry<NodeKey, DataNode>> it = child.entrySet().iterator();
n = it.next();
validateDataNode(n.getValue(), "types", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE, true, "time-division");
n = it.next();
validateDataNode(n.getValue(), "application-areas", nameSpace,
MULTI_INSTANCE_NODE, true, null);
node = n.getValue();
child = ((InnerNode) node).childNodes();
assertThat(2, is(child.size()));
it = child.entrySet().iterator();
n = it.next();
key = n.getKey();
assertThat(true, is(key instanceof LeafListKey));
LeafListKey leafListKey = (LeafListKey) key;
assertThat("AwgE", is(leafListKey.value()));
sid = key.schemaId();
assertThat("destination-areas", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
n = it.next();
key = n.getKey();
assertThat(true, is(key instanceof LeafListKey));
leafListKey = (LeafListKey) key;
assertThat("BQYB", is(leafListKey.value()));
sid = key.schemaId();
assertThat("destination-areas", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
//Check for max2.
n = it1.next();
validateDataNode(n.getValue(), "multiplexes", nameSpace,
MULTI_INSTANCE_NODE, true, null);
key = n.getKey();
assertThat(true, is(key instanceof ListKey));
listKey = (ListKey) key;
keyLeaves = listKey.keyLeafs();
assertThat(1, is(keyLeaves.size()));
validateLeafDataNode(keyLeaves.get(0), "types", nameSpace,
"frequency-division");
node = n.getValue();
child = ((InnerNode) node).childNodes();
assertThat(2, is(child.size()));
it = child.entrySet().iterator();
n = it.next();
validateDataNode(n.getValue(), "types", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE, true, "frequency-division");
n = it.next();
validateDataNode(n.getValue(), "application-areas", nameSpace,
MULTI_INSTANCE_NODE, true, null);
node = n.getValue();
child = ((InnerNode) node).childNodes();
assertThat(2, is(child.size()));
it = child.entrySet().iterator();
n = it.next();
key = n.getKey();
assertThat(true, is(key instanceof LeafListKey));
leafListKey = (LeafListKey) key;
assertThat("BwcH", is(leafListKey.value()));
sid = key.schemaId();
assertThat("destination-areas", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
n = it.next();
key = n.getKey();
assertThat(true, is(key instanceof LeafListKey));
leafListKey = (LeafListKey) key;
assertThat("AAE=", is(leafListKey.value()));
sid = key.schemaId();
assertThat("destination-areas", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
}
/**
* Unit test to process a module with notification. for notification we
* must add notification class in model object id. the resource
* identifier will contain "/ and notification node in it. and
* notification does not have any child not or leaf node datanodes will
* be empty.
*/
@Test
public void processNotification() {
MoIdToRscIdTest ut = new MoIdToRscIdTest();
ut.addMockModWithNotification();
data = new DefaultModelObjectData.Builder();
mid = ModelObjectId.builder()
.addChild(DefaultTestNotification.class).build();
data.identifier(mid);
registry = ut.reg;
DefaultDataTreeBuilder builder = new DefaultDataTreeBuilder(registry);
rscData = builder.getResourceData(data.build());
nameSpace = "testNamespace";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(2, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("test-notification", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(0, is(dataNodes.size()));
}
/**
* Unit test to process a module with notification. for notification we
* must add notification class in model object id. the resource
* identifier will contain "/ and notification node in it. and
* notification's child node will be in data node list.
*/
@Test
public void processNotificationWithContainer() {
MoIdToRscIdTest ut = new MoIdToRscIdTest();
ut.addMockModWithNotification();
data = new DefaultModelObjectData.Builder();
mid = ModelObjectId.builder()
.addChild(DefaultTestNotification.class).build();
data.identifier(mid);
data.addModelObject(new DefaultTestContainer());
registry = ut.reg;
DefaultDataTreeBuilder builder = new DefaultDataTreeBuilder(registry);
rscData = builder.getResourceData(data.build());
nameSpace = "testNamespace";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(2, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("test-notification", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "test-container", nameSpace,
SINGLE_INSTANCE_NODE,
true, null);
}
/**
* Unit test for a module containing rpc. Model object contains input
* class so resource identifier will start from "/" and will go till
* input node. it will contains rpc node as well. as object is given for
* input node so data node will be empty.
*/
@Test
public void processRpcWithInput() {
MoIdToRscIdTest ut = new MoIdToRscIdTest();
ut.addMockModWithRpc();
data = new DefaultModelObjectData.Builder();
mid = ModelObjectId.builder()
.addChild(DefaultTestInput.class).build();
data.identifier(mid);
registry = ut.reg;
DefaultDataTreeBuilder builder = new DefaultDataTreeBuilder(registry);
rscData = builder.getResourceData(data.build());
nameSpace = "testNamespace";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(3, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("test-rpc", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
sid = keys.get(2).schemaId();
assertThat("input", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(0, is(dataNodes.size()));
}
/**
* Unit test for a module containing rpc. Model object contains input
* class so resource identifier will start from "/" and will go till
* rpc node.as object is given for input node so data node will be having
* input node.
*/
@Test
public void processRpcWithInputDataNode() {
MoIdToRscIdTest ut = new MoIdToRscIdTest();
ut.addMockModWithRpc();
DefaultTestInput input = new DefaultTestInput();
input.testContainer(new DefaultTestContainer());
data = new DefaultModelObjectData.Builder();
data.addModelObject(input);
registry = ut.reg;
DefaultDataTreeBuilder builder = new DefaultDataTreeBuilder(registry);
rscData = builder.getResourceData(data.build());
nameSpace = "testNamespace";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(2, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("test-rpc", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "input", nameSpace,
SINGLE_INSTANCE_NODE,
true, null);
}
/**
* Unit test for a module containing rpc. Model object contains input
* class so resource identifier will start from "/" and will go till
* rpc node.as object is given for output node so data node will be having
* input node.
*/
@Test
public void processRpcWithOutputDataNode() {
MoIdToRscIdTest ut = new MoIdToRscIdTest();
ut.addMockModWithRpc();
data = new DefaultModelObjectData.Builder();
data.addModelObject(new DefaultTestOutput());
registry = ut.reg;
DefaultDataTreeBuilder builder = new DefaultDataTreeBuilder(registry);
rscData = builder.getResourceData(data.build());
nameSpace = "testNamespace";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(2, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("test-rpc", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "output", nameSpace,
SINGLE_INSTANCE_NODE,
true, null);
}
/**
* Unit test for a module containing rpc. Model object contains input
* class so resource identifier will start from "/" and will go till
* input node. it will contains rpc node as well. as object is given for
* input node so data node will be for container node.
*/
@Test
public void processRpcWithInputModId() {
MoIdToRscIdTest ut = new MoIdToRscIdTest();
ut.addMockModWithRpc();
data = new DefaultModelObjectData.Builder();
mid = ModelObjectId.builder()
.addChild(DefaultTestInput.class).build();
data.identifier(mid);
data.addModelObject(new org.onosproject.yang.runtime.mockclass
.testmodule.testrpc.testinput.DefaultTestContainer());
registry = ut.reg;
DefaultDataTreeBuilder builder = new DefaultDataTreeBuilder(registry);
rscData = builder.getResourceData(data.build());
nameSpace = "testNamespace";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(3, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("test-rpc", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
sid = keys.get(2).schemaId();
assertThat("input", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "test-container", nameSpace,
SINGLE_INSTANCE_NODE,
true, null);
}
/**
* Unit test for leaf node with enumeration type.
*/
@Test
public void processEnumeration() {
setUp();
data = new DefaultModelObjectData.Builder();
ModelObjectId.Builder moIdBdlr = ModelObjectId.builder()
.addChild(DefaultCont.class);
LeafModelObject mo = new LeafModelObject();
mo.leafIdentifier(LFENUM1);
mo.addValue(new Tpdfun0(SUCCESSFUL_EXIT));
data.addModelObject(mo);
data.identifier(moIdBdlr.build());
DefaultDataTreeBuilder builder = new DefaultDataTreeBuilder(registry);
rscData = builder.getResourceData(data.build());
nameSpace = "simple:data:types";
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(2, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("cont", is(sid.name()));
assertThat(nameSpace, is(sid.namespace()));
dataNodes = rscData.dataNodes();
assertThat(1, is(dataNodes.size()));
node = dataNodes.get(0);
validateDataNode(node, "lfenum1", nameSpace,
SINGLE_INSTANCE_LEAF_VALUE_NODE,
true, "successful exit");
}
/**
* Unit test for identity-ref.
*/
@Test
public void processIdentityRef() {
setUp();
DefaultState state = new DefaultState();
state.type(TunnelP2p.class);
DefaultTunnel tunnel = new DefaultTunnel();
tunnel.state(state);
DefaultTunnels tunnels = new DefaultTunnels();
tunnels.addToTunnel(tunnel);
DefaultTe te = new DefaultTe();
te.tunnels(tunnels);
data = new DefaultModelObjectData.Builder();
data.addModelObject(te);
DefaultDataTreeBuilder builder = new DefaultDataTreeBuilder(registry);
rscData = builder.getResourceData(data.build());
DataNode node = rscData.dataNodes().get(0);
String ns = "urn:ietf:params:xml:ns:yang:ietf-te";
validateDataNode(node, "te", ns, SINGLE_INSTANCE_NODE, true, null);
NodeKey key = NodeKey.builder().schemaId("tunnels", ns).build();
DataNode childNode = ((InnerNode) node).childNodes().get(key);
key = NodeKey.builder().schemaId("tunnel", ns).build();
childNode = ((InnerNode) childNode).childNodes().get(key);
key = NodeKey.builder().schemaId("state", ns).build();
childNode = ((InnerNode) childNode).childNodes().get(key);
key = NodeKey.builder().schemaId("type", ns).build();
childNode = ((InnerNode) childNode).childNodes().get(key);
validateDataNode(childNode, "type", ns, SINGLE_INSTANCE_LEAF_VALUE_NODE,
false, "tunnel-p2p");
}
/**
* Unit test for RPC with grouping and augment in file.
*/
@Test
public void processRpc() {
setUp();
InTypedef typedef = new InTypedef("con-leaf");
DefaultIn con = new DefaultIn();
DefaultContentInput input = new DefaultContentInput();
con.conIn(typedef);
input.in(con);
data = new DefaultModelObjectData.Builder();
data.addModelObject(input);
rscData = treeBuilder.getResourceData(data.build());
String ns = "yms:test:ytb:ytb:rpc";
List<DataNode> inDn = rscData.dataNodes();
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(2, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("content", is(sid.name()));
assertThat(ns, is(sid.namespace()));
DataNode node = inDn.get(0);
validateDataNode(node, "input", ns, SINGLE_INSTANCE_NODE, true, null);
List<Short> ll = new LinkedList<>();
DefaultFirst first = new DefaultFirst();
DefaultContentOutput output = new DefaultContentOutput();
ll.add((short) 9);
first.call(ll);
output.outCh(first);
data = new DefaultModelObjectData.Builder();
data.addModelObject(output);
rscData = treeBuilder.getResourceData(data.build());
inDn = rscData.dataNodes();
id = rscData.resourceId();
keys = id.nodeKeys();
assertThat(2, is(keys.size()));
sid = keys.get(0).schemaId();
assertThat("/", is(sid.name()));
assertThat(null, is(sid.namespace()));
sid = keys.get(1).schemaId();
assertThat("content", is(sid.name()));
assertThat(ns, is(sid.namespace()));
node = inDn.get(0);
validateDataNode(node, "output", ns, SINGLE_INSTANCE_NODE, true, null);
}
}