X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=cps-service%2Fsrc%2Ftest%2Fgroovy%2Forg%2Fonap%2Fcps%2Fapi%2Fimpl%2FE2ENetworkSliceSpec.groovy;h=d18bcf55efc89b84c6a8b5b207e72ce2d26acd57;hb=5427ef054effb1aadfaaab300282545c99c37a61;hp=22dc39ad90101cb4f6b0d7ac1948ebedc5b666d1;hpb=cd9f368b1f3c5e25e17e21649e582d84a909ac79;p=cps.git diff --git a/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy index 22dc39ad9..d18bcf55e 100755 --- a/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy +++ b/cps-service/src/test/groovy/org/onap/cps/api/impl/E2ENetworkSliceSpec.groovy @@ -1,6 +1,8 @@ -/*- +/* * ============LICENSE_START======================================================= - * Copyright (C) 2021 Nordix Foundation. All rights reserved. + * Copyright (C) 2021 Nordix Foundation. + * Modifications Copyright (C) 2021-2022 Bell Canada. + * Modifications Copyright (C) 2021 Pantheon.tech * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,24 +23,144 @@ package org.onap.cps.api.impl import org.onap.cps.TestUtils +import org.onap.cps.api.CpsAdminService +import org.onap.cps.notification.NotificationService +import org.onap.cps.spi.CpsDataPersistenceService import org.onap.cps.spi.CpsModulePersistenceService +import org.onap.cps.spi.model.Anchor +import org.onap.cps.utils.YangUtils +import org.onap.cps.yang.YangTextSchemaSourceSetBuilder import spock.lang.Specification - class E2ENetworkSliceSpec extends Specification { def mockModuleStoreService = Mock(CpsModulePersistenceService) - def objectUnderTest = new CpsModuleServiceImpl() + def mockDataStoreService = Mock(CpsDataPersistenceService) + def mockCpsAdminService = Mock(CpsAdminService) + def mockNotificationService = Mock(NotificationService) + def cpsDataServiceImpl = new CpsDataServiceImpl() + def mockYangTextSchemaSourceSetCache = Mock(YangTextSchemaSourceSetCache) + def cpsModuleServiceImpl = new CpsModuleServiceImpl(mockModuleStoreService, + mockYangTextSchemaSourceSetCache,mockCpsAdminService ) + + def dataspaceName = 'someDataspace' + def anchorName = 'someAnchor' + def schemaSetName = 'someSchemaSet' + def noTimestamp = null def setup() { - objectUnderTest.cpsModulePersistenceService = mockModuleStoreService + cpsDataServiceImpl.cpsDataPersistenceService = mockDataStoreService + cpsDataServiceImpl.cpsAdminService = mockCpsAdminService + cpsDataServiceImpl.yangTextSchemaSourceSetCache = mockYangTextSchemaSourceSetCache + cpsDataServiceImpl.notificationService = mockNotificationService } def 'E2E model can be parsed by CPS.'() { given: 'Valid yang resource as name-to-content map' - def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap('e2e/basic/ietf-inet-types.yang','e2e/basic/ietf-yang-types.yang','e2e/basic/ran-network2020-08-06.yang') + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'ietf/ietf-inet-types@2013-07-15.yang', + 'ietf/ietf-yang-types@2013-07-15.yang', + 'e2e/basic/ran-network2020-08-06.yang' + ) + when: 'Create schema set method is invoked' + cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) + then: 'Parameters are validated and processing is delegated to persistence service' + 1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) + } + + def 'E2E Coverage Area-Tracking Area & TA-Cell mapping model can be parsed by CPS.'() { + given: 'Valid yang resource as name-to-content map' + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang') when: 'Create schema set method is invoked' - objectUnderTest.createSchemaSet('someDataspace', 'someSchemaSet', yangResourcesNameToContentMap) + cpsModuleServiceImpl.createSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) + then: 'Parameters are validated and processing is delegated to persistence service' + 1 * mockModuleStoreService.storeSchemaSet(dataspaceName, schemaSetName, yangResourcesNameToContentMap) + } + + def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed by CPS.'() { + given: 'Valid yang resource as name-to-content map' + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'e2e/basic/cps-cavsta-onap-internal2021-01-28.yang') + def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext() + def dataNodeStored + and : 'a valid json is provided for the model' + def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-Cavsta-Data.txt') + and : 'all the further dependencies are mocked ' + mockCpsAdminService.getAnchor(dataspaceName, anchorName) >> + new Anchor().builder().name(anchorName).schemaSetName(schemaSetName).build() + mockYangTextSchemaSourceSetCache.get(dataspaceName, schemaSetName) >> + YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap) + mockModuleStoreService.getYangSchemaResources(dataspaceName, schemaSetName) >> schemaContext + when: 'saveData method is invoked' + cpsDataServiceImpl.saveData(dataspaceName, anchorName, jsonData, noTimestamp) then: 'Parameters are validated and processing is delegated to persistence service' - 1 * mockModuleStoreService.storeSchemaSet('someDataspace', 'someSchemaSet', yangResourcesNameToContentMap) + 1 * mockDataStoreService.storeDataNode('someDataspace', 'someAnchor', _) >> + { args -> dataNodeStored = args[2]} + def child = dataNodeStored.childDataNodes[0] + assert child.childDataNodes.size() == 1 + and: 'list of Tracking Area for a Coverage Area are stored with correct xpath and child nodes ' + def listOfTAForCoverageArea = child.childDataNodes[0] + listOfTAForCoverageArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' + + 'coverage-area[@coverageArea=\'Washington\']' + listOfTAForCoverageArea.childDataNodes[0].leaves.get('nRTAC') == 234 + and: 'list of cells in a tracking area are stored with correct xpath and child nodes ' + def listOfCellsInTrackingArea = listOfTAForCoverageArea.childDataNodes[0] + listOfCellsInTrackingArea.xpath == '/ran-coverage-area/pLMNIdList[@mcc=\'310\' and @mnc=\'410\']/' + + 'coverage-area[@coverageArea=\'Washington\']/coverageAreaTAList[@nRTAC=\'234\']' + listOfCellsInTrackingArea.childDataNodes[0].leaves.get('cellLocalId') == 15709 + } + + def 'E2E Coverage Area-Tracking Area & TA-Cell mapping data can be parsed for RAN inventory.'() { + def dataNodeStored + given: 'valid yang resource as name-to-content map' + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'e2e/basic/cps-ran-inventory@2021-01-28.yang') + def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext() + and : 'a valid json is provided for the model' + def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-inventory-data.json') + and : 'all the further dependencies are mocked ' + mockCpsAdminService.getAnchor('someDataspace', 'someAnchor') >> + new Anchor().builder().name('someAnchor').schemaSetName('someSchemaSet').build() + mockYangTextSchemaSourceSetCache.get('someDataspace', 'someSchemaSet') >> YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap) + mockModuleStoreService.getYangSchemaResources('someDataspace', 'someSchemaSet') >> schemaContext + when: 'saveData method is invoked' + cpsDataServiceImpl.saveData('someDataspace', 'someAnchor', jsonData, noTimestamp) + then: 'parameters are validated and processing is delegated to persistence service' + 1 * mockDataStoreService.storeDataNode('someDataspace', 'someAnchor', _) >> + { args -> dataNodeStored = args[2]} + and: 'the size of the tree is correct' + def cpsRanInventory = TestUtils.getFlattenMapByXpath(dataNodeStored) + assert cpsRanInventory.size() == 4 + and: 'ran-inventory contains the correct child node' + def ranInventory = cpsRanInventory.get('/ran-inventory') + def ranSlices = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']') + def sliceProfilesList = cpsRanInventory.get('/ran-inventory/ran-slices[@rannfnssiid=\'14559ead-f4fe-4c1c-a94c-8015fad3ea35\']/sliceProfilesList[@sliceProfileId=\'f33a9dd8-ae51-4acf-8073-c9390c25f6f1\']') + 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\']') + ranInventory.getChildDataNodes().size() == 1 + ranInventory.getChildDataNodes().find( {it.xpath == ranSlices.xpath}) + and: 'ranSlices contains the correct child node' + ranSlices.getChildDataNodes().size() == 1 + ranSlices.getChildDataNodes().find( {it.xpath == sliceProfilesList.xpath}) + and: 'sliceProfilesList contains the correct child node' + sliceProfilesList.getChildDataNodes().size() == 1 + sliceProfilesList.getChildDataNodes().find( {it.xpath == pLMNIdList.xpath}) + and: 'pLMNIdList contains no children' + pLMNIdList.getChildDataNodes().size() == 0 + + } + + def 'E2E RAN Schema Model.'(){ + given: 'yang resources' + def yangResourcesNameToContentMap = TestUtils.getYangResourcesAsMap( + 'ietf/ietf-inet-types@2013-07-15.yang', + 'ietf/ietf-yang-types@2013-07-15.yang', + 'e2e/basic/cps-ran-schema-model@2021-05-19.yang' + ) + and : 'json data' + def jsonData = TestUtils.getResourceFileContent('e2e/basic/cps-ran-schema-model-data-v4.json') + expect: 'schema context is built with no exception indicating the schema set being valid ' + def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourcesNameToContentMap).getSchemaContext() + and: 'data is parsed with no exception indicating the model match' + YangUtils.parseJsonData(jsonData, schemaContext) != null } }