summaryrefslogtreecommitdiffstats
path: root/cps-service/src/test
diff options
context:
space:
mode:
authorRuslan Kashapov <ruslan.kashapov@pantheon.tech>2021-02-08 11:02:39 +0200
committerRuslan Kashapov <ruslan.kashapov@pantheon.tech>2021-02-09 18:43:07 +0200
commit9c6175cbf9ef0f2bfcd84e24974858c32d6ba587 (patch)
treef29b894849446207fb196215e1e081848d077243 /cps-service/src/test
parent1f64d85f1cd85653a34b8656c67f4cc2565808e7 (diff)
Data fragment update by xpath - parsing and validation
Issue-ID: CPS-58 Change-Id: I6363c39d7046afc3b20dcd1224d6399b043c4386 Signed-off-by: Ruslan Kashapov <ruslan.kashapov@pantheon.tech>
Diffstat (limited to 'cps-service/src/test')
-rw-r--r--cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy56
-rw-r--r--cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy42
-rw-r--r--cps-service/src/test/java/org/onap/cps/TestUtils.java22
3 files changed, 105 insertions, 15 deletions
diff --git a/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy
index d881e77ad..dca648b04 100644
--- a/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy
+++ b/cps-service/src/test/groovy/org/onap/cps/model/DataNodeBuilderSpec.groovy
@@ -1,7 +1,25 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Pantheon.tech
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
package org.onap.cps.model
import org.onap.cps.TestUtils
-import org.onap.cps.spi.model.DataNode
import org.onap.cps.spi.model.DataNodeBuilder
import org.onap.cps.utils.YangUtils
import org.onap.cps.yang.YangTextSchemaSourceSetBuilder
@@ -17,16 +35,16 @@ class DataNodeBuilderSpec extends Specification {
'/test-tree/branch[@name=\'Right\']/nest': [name: 'Big', birds: ['Owl', 'Raven', 'Crow']]
]
- def 'Converting Normalized Node (tree) to a DataNode (tree).'() {
- given: 'a Yang module'
+ def 'Converting NormalizedNode (tree) to a DataNode (tree).'() {
+ given: 'the schema context for expected model'
def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('test-tree.yang')
def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent) getSchemaContext()
- and: 'a normalized node for that model'
+ and: 'the json data parsed into normalized node object'
def jsonData = TestUtils.getResourceFileContent('test-tree.json')
def normalizedNode = YangUtils.parseJsonData(jsonData, schemaContext)
- when: 'the normalized node is converted to a DataNode (tree)'
+ when: 'the normalized node is converted to a data node'
def result = new DataNodeBuilder().withNormalizedNodeTree(normalizedNode).build()
- def mappedResult = treeToFlatMapByXpath(new HashMap<>(), result)
+ def mappedResult = TestUtils.getFlattenMapByXpath(result)
then: '5 DataNode objects with unique xpath were created in total'
mappedResult.size() == 5
and: 'all expected xpaths were built'
@@ -37,6 +55,26 @@ class DataNodeBuilderSpec extends Specification {
}
}
+ def 'Converting NormalizedNode (tree) to a DataNode (tree) for known parent node.'() {
+ given: 'a schema context for expected model'
+ def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('test-tree.yang')
+ def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent) getSchemaContext()
+ and: 'the json data parsed into normalized node object'
+ def jsonData = '{ "branch": [{ "name": "Branch", "nest": { "name": "Nest", "birds": ["bird"] } }] }'
+ def normalizedNode = YangUtils.parseJsonData(jsonData, schemaContext, "/test-tree")
+ when: 'the normalized node is converted to a data node with parent node xpath defined'
+ def result = new DataNodeBuilder()
+ .withNormalizedNodeTree(normalizedNode)
+ .withParentNodeXpath("/test-tree")
+ .build()
+ def mappedResult = TestUtils.getFlattenMapByXpath(result)
+ then: '2 DataNode objects with unique xpath were created in total'
+ mappedResult.size() == 2
+ and: 'all expected xpaths were built'
+ mappedResult.keySet()
+ .containsAll(['/test-tree/branch[@name=\'Branch\']', '/test-tree/branch[@name=\'Branch\']/nest'])
+ }
+
def static assertLeavesMaps(actualLeavesMap, expectedLeavesMap) {
expectedLeavesMap.each { key, value ->
{
@@ -51,10 +89,4 @@ class DataNodeBuilderSpec extends Specification {
}
}
- def treeToFlatMapByXpath(Map<String, DataNode> flatMap, DataNode dataNodeTree) {
- flatMap.put(dataNodeTree.getXpath(), dataNodeTree)
- dataNodeTree.getChildDataNodes()
- .forEach(childDataNode -> treeToFlatMapByXpath(flatMap, childDataNode))
- return flatMap
- }
}
diff --git a/cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy
index e6e5d6a36..826cdd8c7 100644
--- a/cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy
+++ b/cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy
@@ -1,6 +1,7 @@
/*
* ============LICENSE_START=======================================================
* Copyright (C) 2020 Nordix Foundation
+ * Modifications Copyright (C) 2021 Pantheon.tech
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,14 +21,14 @@
package org.onap.cps.utils
import org.onap.cps.TestUtils
+import org.onap.cps.spi.exceptions.DataValidationException
import org.onap.cps.yang.YangTextSchemaSourceSetBuilder
import org.opendaylight.yangtools.yang.common.QName
-import org.opendaylight.yangtools.yang.common.Revision
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode
import spock.lang.Specification
import spock.lang.Unroll
-class YangUtilsSpec extends Specification{
+class YangUtilsSpec extends Specification {
def 'Parsing a valid Json String.'() {
given: 'a yang model (file)'
def jsonData = org.onap.cps.TestUtils.getResourceFileContent('bookstore.json')
@@ -48,10 +49,45 @@ class YangUtilsSpec extends Specification{
when: 'invalid data is parsed'
YangUtils.parseJsonData(invalidJson, schemaContext)
then: 'an exception is thrown'
- thrown(IllegalStateException)
+ thrown(DataValidationException)
where: 'the following invalid json is provided'
invalidJson | description
'{incomplete json' | 'incomplete json'
'{"test:bookstore": {"address": "Parnell st." }}' | 'json with un-modelled data'
}
+
+ @Unroll
+ def 'Parsing json data fragment by xpath for #scenario.'() {
+ given: 'schema context'
+ def yangResourcesMap = TestUtils.getYangResourcesAsMap('test-tree.yang')
+ def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesMap).getSchemaContext()
+ when: 'json string is parsed'
+ def result = YangUtils.parseJsonData(jsonData, schemaContext, parentNodeXpath)
+ then: 'result represents a node of expected type'
+ result.nodeType == QName.create('org:onap:cps:test:test-tree', '2020-02-02', nodeName)
+ where:
+ scenario | jsonData | parentNodeXpath || nodeName
+ 'list element as container' | '{ "branch": { "name": "B", "nest": { "name": "N", "birds": ["bird"] } } }' | '/test-tree' || 'branch'
+ 'list element within list' | '{ "branch": [{ "name": "B", "nest": { "name": "N", "birds": ["bird"] } }] }' | '/test-tree' || 'branch'
+ 'container element' | '{ "nest": { "name": "N", "birds": ["bird"] } }' | '/test-tree/branch[@name=\'Branch\']' || 'nest'
+ }
+
+ @Unroll
+ def 'Parsing json data fragment by xpath error scenario: #scenario.'() {
+ given: 'schema context'
+ def yangResourcesMap = TestUtils.getYangResourcesAsMap('test-tree.yang')
+ def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesMap).getSchemaContext()
+ when: 'json string is parsed'
+ YangUtils.parseJsonData('{"nest": {"name" : "Nest", "birds": ["bird"]}}', schemaContext,
+ parentNodeXpath)
+ then: 'expected exception is thrown'
+ thrown(DataValidationException)
+ where:
+ scenario | parentNodeXpath
+ 'xpath has no identifiers' | '/'
+ 'xpath has no valid identifiers' | '/[@name=\'Name\']'
+ 'invalid parent path' | '/test-bush'
+ 'another invalid parent path' | '/test-tree/branch[@name=\'Branch\']/nest/name/last-name'
+ 'fragment does not belong to parent' | '/test-tree/'
+ }
}
diff --git a/cps-service/src/test/java/org/onap/cps/TestUtils.java b/cps-service/src/test/java/org/onap/cps/TestUtils.java
index 4ec4e4a00..bf59e1713 100644
--- a/cps-service/src/test/java/org/onap/cps/TestUtils.java
+++ b/cps-service/src/test/java/org/onap/cps/TestUtils.java
@@ -1,6 +1,7 @@
/*
* ============LICENSE_START=======================================================
* Copyright (C) 2020 Nordix Foundation
+ * Modifications Copyright (C) 2021 Pantheon.tech
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,6 +25,7 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Map;
+import org.onap.cps.spi.model.DataNode;
/**
* Common convenience methods for testing.
@@ -69,4 +71,24 @@ public class TestUtils {
}
return yangResourceNameToContentBuilder.build();
}
+
+ /**
+ * Represents given data node object as flatten map by xpath.
+ * For easy finding child node within hierarchy.
+ *
+ * @param dataNode data node representing a root of tree structure
+ * @return the map containing all the data nodes from given structure where key is xpath, value is datanode object
+ */
+ public static Map<String, DataNode> getFlattenMapByXpath(final DataNode dataNode) {
+ final ImmutableMap.Builder<String, DataNode> dataNodeMapBuilder = ImmutableMap.builder();
+ buildFlattenMapByXpath(dataNode, dataNodeMapBuilder);
+ return dataNodeMapBuilder.build();
+ }
+
+ private static void buildFlattenMapByXpath(final DataNode dataNode,
+ final ImmutableMap.Builder<String, DataNode> dataNodeMapBuilder) {
+ dataNodeMapBuilder.put(dataNode.getXpath(), dataNode);
+ dataNode.getChildDataNodes()
+ .forEach(childDataNode -> buildFlattenMapByXpath(childDataNode, dataNodeMapBuilder));
+ }
}