summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cps-service/src/main/java/org/onap/cps/utils/YangUtils.java35
-rw-r--r--cps-service/src/test/groovy/org/onap/cps/utils/YangTextSchemaSourceSetSpec.groovy55
-rw-r--r--cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy41
-rw-r--r--cps-service/src/test/java/org/onap/cps/TestUtils.java33
-rw-r--r--cps-service/src/test/resources/invalid-empty.yang0
5 files changed, 95 insertions, 69 deletions
diff --git a/cps-service/src/main/java/org/onap/cps/utils/YangUtils.java b/cps-service/src/main/java/org/onap/cps/utils/YangUtils.java
index a35533c8f2..b96480a670 100644
--- a/cps-service/src/main/java/org/onap/cps/utils/YangUtils.java
+++ b/cps-service/src/main/java/org/onap/cps/utils/YangUtils.java
@@ -19,13 +19,7 @@
package org.onap.cps.utils;
-import static com.google.common.base.Preconditions.checkArgument;
-import static org.opendaylight.yangtools.yang.common.YangConstants.RFC6020_YANG_FILE_EXTENSION;
-
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
import com.google.gson.stream.JsonReader;
-import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.Collection;
@@ -34,8 +28,6 @@ import java.util.List;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.onap.cps.api.impl.Fragment;
-import org.onap.cps.yang.YangTextSchemaSourceSet;
-import org.onap.cps.yang.YangTextSchemaSourceSetBuilder;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
@@ -53,8 +45,6 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeS
import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.parser.api.YangParserException;
-import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
public class YangUtils {
private static final Logger LOGGER = Logger.getLogger(YangUtils.class.getName());
@@ -64,30 +54,7 @@ public class YangUtils {
}
/**
- * Parse a file containing yang modules.
- *
- * @param yangModelFiles list of files containing one or more yang modules. The file has to have a .yang extension.
- * @return a SchemaContext representing the yang model
- * @throws IOException when the system as an IO issue
- * @throws YangParserException when the file does not contain a valid yang structure
- */
- @Deprecated
- public static YangTextSchemaSourceSet parseYangModelFiles(final List<File> yangModelFiles)
- throws IOException, YangParserException, ReactorException {
- final YangTextSchemaSourceSetBuilder yangModelsMapBuilder = new YangTextSchemaSourceSetBuilder();
- for (final File file :yangModelFiles) {
- final String fileNameWithExtension = file.getName();
- checkArgument(fileNameWithExtension.endsWith(RFC6020_YANG_FILE_EXTENSION),
- "Filename %s does not end with '%s'", RFC6020_YANG_FILE_EXTENSION,
- fileNameWithExtension);
- final String content = Files.asCharSource(file, Charsets.UTF_8).read();
- yangModelsMapBuilder.put(fileNameWithExtension, content);
- }
- return yangModelsMapBuilder.build();
- }
-
- /**
- * Parse a file containing json data for a certain model (schemaContext).
+ * Parse a string containing json data for a certain model (schemaContext).
*
* @param jsonData a string containing json data for the given model
* @param schemaContext the SchemaContext for the given data
diff --git a/cps-service/src/test/groovy/org/onap/cps/utils/YangTextSchemaSourceSetSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/utils/YangTextSchemaSourceSetSpec.groovy
new file mode 100644
index 0000000000..fd1b144309
--- /dev/null
+++ b/cps-service/src/test/groovy/org/onap/cps/utils/YangTextSchemaSourceSetSpec.groovy
@@ -0,0 +1,55 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 Nordix Foundation
+ * ================================================================================
+ * 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.utils
+
+import org.onap.cps.TestUtils
+import org.onap.cps.yang.YangTextSchemaSourceSetBuilder
+import org.opendaylight.yangtools.yang.common.Revision
+import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException
+import spock.lang.Specification
+import spock.lang.Unroll
+
+class YangTextSchemaSourceSetSpec extends Specification {
+
+ def 'Generating a valid YangTextSchemaSource Set '() {
+ given: 'a yang model (file)'
+ def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('bookstore.yang')
+ when: 'the content is parsed'
+ def result = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent).getSchemaContext();
+ then: 'the result contains 1 module of the correct name and revision'
+ result.modules.size() == 1
+ def optionalModule = result.findModule('stores', Revision.of('2020-09-15'))
+ optionalModule.isPresent()
+ }
+
+ @Unroll
+ def 'Generating invalid YangTextSchemaSource Set (#description).'() {
+ given: 'a file with #description'
+ def yangResourceNameToContent = TestUtils.getYangResourcesAsMap(filename)
+ when: 'the content is parsed'
+ YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent)
+ then: 'an exception is thrown'
+ thrown(expectedException)
+ where: 'the following parameters are used'
+ filename | description || expectedException
+ 'invalid.yang' | 'invalid content' || YangSyntaxErrorException
+ 'invalid-empty.yang'| 'no valid content' || YangSyntaxErrorException
+ }
+}
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 e002b180a7..9237fa29af 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
@@ -20,46 +20,20 @@
package org.onap.cps.utils
import org.onap.cps.TestUtils
+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 org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException
import spock.lang.Specification
import spock.lang.Unroll
class YangUtilsSpec extends Specification{
-
- def 'Parsing a valid Yang Model'() {
- given: 'a yang model (file)'
- def file = new File(ClassLoader.getSystemClassLoader().getResource('bookstore.yang').getFile())
- when: 'the file is parsed'
- def result = YangUtils.parseYangModelFiles(Collections.singletonList(file)).getSchemaContext()
- then: 'the result contain 1 module of the correct name and revision'
- result.modules.size() == 1
- def optionalModule = result.findModule('stores', Revision.of('2020-09-15'))
- optionalModule.isPresent()
- }
-
- @Unroll
- def 'Parsing invalid yang file (#description).'() {
- given: 'a file with #description'
- File file = new File(ClassLoader.getSystemClassLoader().getResource(filename).getFile())
- when: 'the file is parsed'
- YangUtils.parseYangModelFiles(Collections.singletonList(file))
- then: 'an exception is thrown'
- thrown(expectedException)
- where: 'the following parameters are used'
- filename | description || expectedException
- 'invalid.yang' | 'no valid content' || YangSyntaxErrorException
- 'someOtherFile.txt' | 'no .yang extension' || IllegalArgumentException
- }
-
def 'Parsing a valid Json String.'() {
given: 'a yang model (file)'
def jsonData = org.onap.cps.TestUtils.getResourceFileContent('bookstore.json')
and: 'a model for that data'
- def file = new File(ClassLoader.getSystemClassLoader().getResource('bookstore.yang').getFile())
- def schemaContext = YangUtils.parseYangModelFiles(Collections.singletonList(file)).getSchemaContext()
+ def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('bookstore.yang')
+ def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent).getSchemaContext()
when: 'the json data is parsed'
NormalizedNode<?, ?> result = YangUtils.parseJsonData(jsonData, schemaContext)
then: 'the result is a normalized node of the correct type'
@@ -69,8 +43,8 @@ class YangUtilsSpec extends Specification{
@Unroll
def 'Parsing invalid data: #description.'() {
given: 'a yang model (file)'
- def file = new File(ClassLoader.getSystemClassLoader().getResource('bookstore.yang').getFile())
- def schemaContext = YangUtils.parseYangModelFiles(Collections.singletonList(file)).getSchemaContext()
+ def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('bookstore.yang')
+ def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent).getSchemaContext()
when: 'invalid data is parsed'
YangUtils.parseJsonData(invalidJson, schemaContext)
then: 'an exception is thrown'
@@ -83,8 +57,8 @@ class YangUtilsSpec extends Specification{
def 'Breaking a Json Data Object into fragments.'() {
given: 'a Yang module'
- def file = new File(ClassLoader.getSystemClassLoader().getResource('bookstore.yang').getFile())
- def schemaContext = YangUtils.parseYangModelFiles(Collections.singletonList(file)).getSchemaContext()
+ def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('bookstore.yang')
+ def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent)getSchemaContext()
def module = schemaContext.findModule('stores', Revision.of('2020-09-15')).get()
and: 'a normalized node for that model'
def jsonData = TestUtils.getResourceFileContent('bookstore.json')
@@ -101,5 +75,4 @@ class YangUtilsSpec extends Specification{
assert result.childFragments.collect { it.xpath }
.containsAll(["/bookstore/categories[@code='01']", "/bookstore/categories[@code='02']"])
}
-
}
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 3a2a4e3a55..4ec4e4a004 100644
--- a/cps-service/src/test/java/org/onap/cps/TestUtils.java
+++ b/cps-service/src/test/java/org/onap/cps/TestUtils.java
@@ -19,14 +19,28 @@
package org.onap.cps;
+import com.google.common.collect.ImmutableMap;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
+import java.util.Map;
/**
* Common convenience methods for testing.
*/
public class TestUtils {
+
+ /**
+ * Convert a file in the test resource folder to file.
+ *
+ * @param filename to name of the file in test/resources
+ * @return the file
+ * @throws IOException when there is an IO issue
+ */
+ public static File readFile(final String filename) {
+ return new File(ClassLoader.getSystemClassLoader().getResource(filename).getFile());
+ }
+
/**
* Convert a file in the test resource folder to a string.
*
@@ -35,7 +49,24 @@ public class TestUtils {
* @throws IOException when there is an IO issue
*/
public static String getResourceFileContent(final String filename) throws IOException {
- final File file = new File(ClassLoader.getSystemClassLoader().getResource(filename).getFile());
+ final File file = readFile(filename);
return new String(Files.readAllBytes(file.toPath()));
}
+
+ /**
+ * Reads yang resources into map.
+ *
+ * @param resources list of file paths
+ * @return yang resource map where key is filename and value is file content
+ * @throws IOException when there an I/O issue
+ */
+ public static Map<String, String> getYangResourcesAsMap(final String... resources) throws IOException {
+ final ImmutableMap.Builder<String, String> yangResourceNameToContentBuilder = new ImmutableMap.Builder<>();
+ for (final String resourcePath : resources) {
+ final File file = readFile(resourcePath);
+ final String content = new String(Files.readAllBytes(file.toPath()));
+ yangResourceNameToContentBuilder.put(file.getName(), content);
+ }
+ return yangResourceNameToContentBuilder.build();
+ }
}
diff --git a/cps-service/src/test/resources/invalid-empty.yang b/cps-service/src/test/resources/invalid-empty.yang
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/cps-service/src/test/resources/invalid-empty.yang