eefa86e9035266217b64b2db9f5d197ce02c39ca
[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 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 java.time.OffsetDateTime\r
26 import org.onap.cps.TestUtils\r
27 import org.onap.cps.api.CpsAdminService\r
28 import org.onap.cps.notification.NotificationService\r
29 import org.onap.cps.spi.CpsDataPersistenceService\r
30 import org.onap.cps.spi.CpsModulePersistenceService\r
31 import org.onap.cps.spi.model.Anchor\r
32 import org.onap.cps.utils.YangUtils\r
33 import org.onap.cps.yang.YangTextSchemaSourceSetBuilder\r
34 import spock.lang.Specification\r
35 \r
36 class E2ENetworkSliceSpec extends Specification {\r
37     def mockModuleStoreService = Mock(CpsModulePersistenceService)\r
38     def mockDataStoreService = Mock(CpsDataPersistenceService)\r
39     def mockCpsAdminService = Mock(CpsAdminService)\r
40     def mockNotificationService = Mock(NotificationService)\r
41     def cpsModuleServiceImpl = new CpsModuleServiceImpl()\r
42     def cpsDataServiceImpl = new CpsDataServiceImpl()\r
43     def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache)\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         cpsModuleServiceImpl.yangTextSchemaSourceSetCache = mockYangTextSchemaSourceSetCache\r
56         cpsModuleServiceImpl.cpsModulePersistenceService = mockModuleStoreService\r
57     }\r
58 \r
59     def 'E2E model can be parsed by CPS.'() {\r
60         given: 'Valid yang resource as name-to-content map'\r
61             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
62                     'ietf/ietf-inet-types@2013-07-15.yang',\r
63                     'ietf/ietf-yang-types@2013-07-15.yang',\r
64                     'e2e/basic/ran-network2020-08-06.yang'\r
65             )\r
66         when: 'Create schema set method is invoked'\r
67             cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
68         then: 'Parameters are validated and processing is delegated to persistence service'\r
69             1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
70     }\r
71 \r
72     def 'E2E Coverage Area-Tracking Area & TA-Cell mapping model can be parsed by CPS.'() {\r
73         given: 'Valid yang resource as name-to-content map'\r
74             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
75                     'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang')\r
76         when: 'Create schema set method is invoked'\r
77             cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
78         then: 'Parameters are validated and processing is delegated to persistence service'\r
79             1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap)\r
80     }\r
81 \r
82     def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed by CPS.'() {\r
83         given: 'Valid yang resource as name-to-content map'\r
84             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
85                     'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang')\r
86             def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
87             def dataNodeStored\r
88         and : 'a valid json is provided for the model'\r
89             def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-Cavsta-Data.txt')\r
90         and : 'all the further dependencies are mocked '\r
91             mockCpsAdminService.getAnchor(dataspaceName, anchorName) >>\r
92                     new Anchor().builder().name(anchorName).schemaSetName(schemaSetName).build()\r
93             mockYangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName) >>\r
94                     YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)\r
95             mockModuleStoreService.getYangSchemaResources(dataspaceName, schemaSetName) >> schemaContext\r
96         when: 'saveData method is invoked'\r
97             cpsDataServiceImpl.saveData(dataspaceName, anchorName, jsonData, noTimestamp)\r
98         then: 'Parameters are validated and processing is delegated to persistence service'\r
99             1 * mockDataStoreService.storeDataNode('someDataspace', 'someAnchor', _) >>\r
100                     { args -> dataNodeStored = args[2]}\r
101             def child = dataNodeStored.childDataNodes[0]\r
102             assert child.childDataNodes.size() == 1\r
103         and: 'list of Tracking Area for a Coverage Area are stored with correct xpath and child nodes '\r
104             def listOfTAForCoverageArea = child.childDataNodes[0]\r
105             listOfTAForCoverageArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' +\r
106                     'coverage-area[@coverageArea=\'Washington\']'\r
107             listOfTAForCoverageArea.childDataNodes[0].leaves.get('nRTAC') == 234\r
108         and: 'list of cells in a tracking area are stored with correct xpath and child nodes '\r
109             def listOfCellsInTrackingArea = listOfTAForCoverageArea.childDataNodes[0]\r
110             listOfCellsInTrackingArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' +\r
111                     'coverage-area[@coverageArea=\'Washington\']/coverageAreaTAList[@nRTAC=\'234\']'\r
112             listOfCellsInTrackingArea.childDataNodes[0].leaves.get('cellLocalId') == 15709\r
113     }\r
114 \r
115     def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed for RAN inventory.'() {\r
116         def dataNodeStored\r
117         given: 'valid yang resource as name-to-content map'\r
118             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
119                     'e2e/basic/cps-ran-inventory@2021-01-28.yang')\r
120             def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
121         and : 'a valid json is provided for the model'\r
122             def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-inventory-data.json')\r
123         and : 'all the further dependencies are mocked '\r
124             mockCpsAdminService.getAnchor('someDataspace', 'someAnchor') >>\r
125                     new Anchor().builder().name('someAnchor').schemaSetName('someSchemaSet').build()\r
126             mockYangTextSchemaSourceSetCache.get('someDataspace', 'someSchemaSet') >> YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap)\r
127             mockModuleStoreService.getYangSchemaResources('someDataspace', 'someSchemaSet') >> schemaContext\r
128         when: 'saveData method is invoked'\r
129             cpsDataServiceImpl.saveData('someDataspace', 'someAnchor', jsonData, noTimestamp)\r
130         then: 'parameters are validated and processing is delegated to persistence service'\r
131             1 * mockDataStoreService.storeDataNode('someDataspace', 'someAnchor', _) >>\r
132                     { args -> dataNodeStored = args[2]}\r
133         and: 'the size of the tree is correct'\r
134             def cpsRanInventory = TestUtils.getFlattenMapByXpath(dataNodeStored)\r
135             assert  cpsRanInventory.size() == 4\r
136         and: 'ran-inventory contains the correct child node'\r
137             def ranInventory = cpsRanInventory.get('/ran-inventory')\r
138             def ranSlices = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']')\r
139             def sliceProfilesList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']')\r
140             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
141             ranInventory.getChildDataNodes().size() == 1\r
142             ranInventory.getChildDataNodes().find( {it.xpath == ranSlices.xpath})\r
143         and: 'ranSlices contains the correct child node'\r
144             ranSlices.getChildDataNodes().size() == 1\r
145             ranSlices.getChildDataNodes().find( {it.xpath == sliceProfilesList.xpath})\r
146         and: 'sliceProfilesList contains the correct child node'\r
147             sliceProfilesList.getChildDataNodes().size() == 1\r
148             sliceProfilesList.getChildDataNodes().find( {it.xpath == pLMNIdList.xpath})\r
149         and: 'pLMNIdList contains no children'\r
150             pLMNIdList.getChildDataNodes().size() == 0\r
151 \r
152     }\r
153 \r
154     def 'E2E RAN Schema Model.'(){\r
155         given: 'yang resources'\r
156             def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap(\r
157                     'ietf/ietf-inet-types@2013-07-15.yang',\r
158                     'ietf/ietf-yang-types@2013-07-15.yang',\r
159                     'e2e/basic/cps-ran-schema-model@2021-05-19.yang'\r
160             )\r
161         and : 'json data'\r
162             def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-schema-model-data-v4.json')\r
163         expect: 'schema context is built with no exception indicating the schema set being valid '\r
164             def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext()\r
165         and: 'data is parsed with no exception indicating the model match'\r
166             YangUtils.parseJsonData(jsonData, schemaContext) != null\r
167     }\r
168 }\r