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
11 * http://www.apache.org/licenses/LICENSE-2.0
\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
19 * SPDX-License-Identifier: Apache-2.0
\r
20 * ============LICENSE_END=========================================================
\r
23 package org.onap.cps.api.impl
\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
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
45 def dataspaceName = 'someDataspace'
\r
46 def anchorName = 'someAnchor'
\r
47 def schemaSetName = 'someSchemaSet'
\r
48 def noTimestamp = null
\r
51 cpsDataServiceImpl.cpsDataPersistenceService = mockDataStoreService
\r
52 cpsDataServiceImpl.cpsAdminService = mockCpsAdminService
\r
53 cpsDataServiceImpl.yangTextSchemaSourceSetCache = mockYangTextSchemaSourceSetCache
\r
54 cpsDataServiceImpl.notificationService = mockNotificationService
\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
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
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
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
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
113 def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed for RAN inventory.'() {
\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
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
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