Decouple YangUtils test 04/116404/5
authorClaudio David Gasparini <claudio.gasparini@pantheon.tech>
Tue, 15 Dec 2020 18:16:15 +0000 (19:16 +0100)
committerClaudio David Gasparini <claudio.gasparini@pantheon.tech>
Thu, 17 Dec 2020 08:11:42 +0000 (08:11 +0000)
from YangTextSchemaSourceSet test responsabilities.
- Remove deprecated YangUtils method for handle files

Issue-ID: CPS-21
Signed-off-by: Claudio David Gasparini <claudio.gasparini@pantheon.tech>
Change-Id: I971f818a55efd9659481bb13476dd67106cecab7

cps-service/src/main/java/org/onap/cps/utils/YangUtils.java
cps-service/src/test/groovy/org/onap/cps/utils/YangTextSchemaSourceSetSpec.groovy [new file with mode: 0644]
cps-service/src/test/groovy/org/onap/cps/utils/YangUtilsSpec.groovy
cps-service/src/test/java/org/onap/cps/TestUtils.java
cps-service/src/test/resources/invalid-empty.yang [new file with mode: 0644]

index a35533c..b96480a 100644 (file)
 
 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 (file)
index 0000000..fd1b144
--- /dev/null
@@ -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
+    }
+}
index e002b18..9237fa2 100644 (file)
 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']"])
     }
-
 }
index 3a2a4e3..4ec4e4a 100644 (file)
 
 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 (file)
index 0000000..e69de29