d18bcf55efc89b84c6a8b5b207e72ce2d26acd57
[cps.git] / cps-service / src / test / groovy / org / onap / cps / api / impl / E2ENetworkSliceSpec.groovy
1 /*\r
2  * ============LICENSE_START=======================================================\r
3  * Copyright (C) 2021 Nordix Foundation.\r
4  * Modifications Copyright (C) 2021-2022 Bell Canada.\r
5  * Modifications Copyright (C) 2021 Pantheon.tech\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  *\r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  *\r
19  * SPDX-License-Identifier: Apache-2.0\r
20  * ============LICENSE_END=========================================================\r
21  */\r
22 \r
23 package org.onap.cps.api.impl\r
24 \r
25 import org.onap.cps.TestUtils\r
26 import org.onap.cps.api.CpsAdminService\r
27 import org.onap.cps.notification.NotificationService\r
28 import org.onap.cps.spi.CpsDataPersistenceService\r
29 import org.onap.cps.spi.CpsModulePersistenceService\r
30 import org.onap.cps.spi.model.Anchor\r
31 import org.onap.cps.utils.YangUtils\r
32 import org.onap.cps.yang.YangTextSchemaSourceSetBuilder\r
33 import spock.lang.Specification\r
34 \r
35 class E2ENetworkSliceSpec extends Specification {\r
36     def mockModuleStoreService = Mock(CpsModulePersistenceService)\r
37     def mockDataStoreService = Mock(CpsDataPersistenceService)\r
38     def mockCpsAdminService = Mock(CpsAdminService)\r
39     def mockNotificationService = Mock(NotificationService)\r
40     def cpsDataServiceImpl = new CpsDataServiceImpl()\r
41     def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache)\r
42     def cpsModuleServiceImpl = new CpsModuleServiceImpl(mockModuleStoreService,\r
43             mockYangTextSchemaSourceSetCache,mockCpsAdminService )\r
44 \r
45     def dataspaceName = 'someDataspace'\r
46     def anchorName = 'someAnchor'\r
47     def schemaSetName = 'someSchemaSet'\r
48     def noTimestamp = null\r
49 \r
50     def setup() {\r
51         cpsDataServiceImpl.cpsDataPersistenceService = mockDataStoreService\r
52         cpsDataServiceImpl.cpsAdminService = mockCpsAdminService\r
53         cpsDataServiceImpl.yangTextSchemaSourceSetCache = mockYangTextSchemaSourceSetCache\r
54         cpsDataServiceImpl.notificationService = mockNotificationService\r
55     }\r
56 \r
57     def 'E2E model can be parsed by CPS.'() {\r
58         given: 'Valid yang resource as name-to-content map'\r
59             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
60                     'ietf/ietf-inet-types@2013-07-15.yang',\r
61                     'ietf/ietf-yang-types@2013-07-15.yang',\r
62                     'e2e/basic/ran-network2020-08-06.yang'\r
63             )\r
64         when: 'Create schema set method is invoked'\r
65             cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
66         then: 'Parameters are validated and processing is delegated to persistence service'\r
67             1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
68     }\r
69 \r
70     def 'E2E Coverage Area-Tracking Area & TA-Cell mapping model can be parsed by CPS.'() {\r
71         given: 'Valid yang resource as name-to-content map'\r
72             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
73                     'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang')\r
74         when: 'Create schema set method is invoked'\r
75             cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
76         then: 'Parameters are validated and processing is delegated to persistence service'\r
77             1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
78     }\r
79 \r
80     def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed by CPS.'() {\r
81         given: 'Valid yang resource as name-to-content map'\r
82             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
83                     'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang')\r
84             def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
85             def dataNodeStored\r
86         and : 'a valid json is provided for the model'\r
87             def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-Cavsta-Data.txt')\r
88         and : 'all the further dependencies are mocked '\r
89             mockCpsAdminService.getAnchor(dataspaceName, anchorName) >>\r
90                     new Anchor().builder().name(anchorName).schemaSetName(schemaSetName).build()\r
91             mockYangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName) >>\r
92                     YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)\r
93             mockModuleStoreService.getYangSchemaResources(dataspaceName, schemaSetName) >> schemaContext\r
94         when: 'saveData method is invoked'\r
95             cpsDataServiceImpl.saveData(dataspaceName, anchorName, jsonData, noTimestamp)\r
96         then: 'Parameters are validated and processing is delegated to persistence service'\r
97             1 * mockDataStoreService.storeDataNode('someDataspace', 'someAnchor', _) >>\r
98                     { args -> dataNodeStored = args[2]}\r
99             def child = dataNodeStored.childDataNodes[0]\r
100             assert child.childDataNodes.size() == 1\r
101         and: 'list of Tracking Area for a Coverage Area are stored with correct xpath and child nodes '\r
102             def listOfTAForCoverageArea = child.childDataNodes[0]\r
103             listOfTAForCoverageArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' +\r
104                     'coverage-area[@coverageArea=\'Washington\']'\r
105             listOfTAForCoverageArea.childDataNodes[0].leaves.get('nRTAC') == 234\r
106         and: 'list of cells in a tracking area are stored with correct xpath and child nodes '\r
107             def listOfCellsInTrackingArea = listOfTAForCoverageArea.childDataNodes[0]\r
108             listOfCellsInTrackingArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' +\r
109                     'coverage-area[@coverageArea=\'Washington\']/coverageAreaTAList[@nRTAC=\'234\']'\r
110             listOfCellsInTrackingArea.childDataNodes[0].leaves.get('cellLocalId') == 15709\r
111     }\r
112 \r
113     def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed for RAN inventory.'() {\r
114         def dataNodeStored\r
115         given: 'valid yang resource as name-to-content map'\r
116             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
117                     'e2e/basic/cps-ran-inventory@2021-01-28.yang')\r
118             def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
119         and : 'a valid json is provided for the model'\r
120             def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-inventory-data.json')\r
121         and : 'all the further dependencies are mocked '\r
122             mockCpsAdminService.getAnchor('someDataspace', 'someAnchor') >>\r
123                     new Anchor().builder().name('someAnchor').schemaSetName('someSchemaSet').build()\r
124             mockYangTextSchemaSourceSetCache.get('someDataspace', 'someSchemaSet') >> YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)\r
125             mockModuleStoreService.getYangSchemaResources('someDataspace', 'someSchemaSet') >> schemaContext\r
126         when: 'saveData method is invoked'\r
127             cpsDataServiceImpl.saveData('someDataspace', 'someAnchor', jsonData, noTimestamp)\r
128         then: 'parameters are validated and processing is delegated to persistence service'\r
129             1 * mockDataStoreService.storeDataNode('someDataspace', 'someAnchor', _) >>\r
130                     { args -> dataNodeStored = args[2]}\r
131         and: 'the size of the tree is correct'\r
132             def cpsRanInventory = TestUtils.getFlattenMapByXpath(dataNodeStored)\r
133             assert  cpsRanInventory.size() == 4\r
134         and: 'ran-inventory contains the correct child node'\r
135             def ranInventory = cpsRanInventory.get('/ran-inventory')\r
136             def ranSlices = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']')\r
137             def sliceProfilesList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']')\r
138             def pLMNIdList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']')\r
139             ranInventory.getChildDataNodes().size() == 1\r
140             ranInventory.getChildDataNodes().find( {it.xpath == ranSlices.xpath})\r
141         and: 'ranSlices contains the correct child node'\r
142             ranSlices.getChildDataNodes().size() == 1\r
143             ranSlices.getChildDataNodes().find( {it.xpath == sliceProfilesList.xpath})\r
144         and: 'sliceProfilesList contains the correct child node'\r
145             sliceProfilesList.getChildDataNodes().size() == 1\r
146             sliceProfilesList.getChildDataNodes().find( {it.xpath == pLMNIdList.xpath})\r
147         and: 'pLMNIdList contains no children'\r
148             pLMNIdList.getChildDataNodes().size() == 0\r
149 \r
150     }\r
151 \r
152     def 'E2E RAN Schema Model.'(){\r
153         given: 'yang resources'\r
154             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
155                     'ietf/ietf-inet-types@2013-07-15.yang',\r
156                     'ietf/ietf-yang-types@2013-07-15.yang',\r
157                     'e2e/basic/cps-ran-schema-model@2021-05-19.yang'\r
158             )\r
159         and : 'json data'\r
160             def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-schema-model-data-v4.json')\r
161         expect: 'schema context is built with no exception indicating the schema set being valid '\r
162             def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
163         and: 'data is parsed with no exception indicating the model match'\r
164             YangUtils.parseJsonData(jsonData, schemaContext) != null\r
165     }\r
166 }\r