2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2022 Nordix Foundation
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.cps.ncmp.api.impl
23 import com.fasterxml.jackson.databind.ObjectMapper
24 import org.onap.cps.ncmp.api.NetworkCmProxyCmHandlerQueryService
25 import org.onap.cps.spi.CpsAdminPersistenceService
26 import org.onap.cps.spi.CpsDataPersistenceService
27 import org.onap.cps.spi.model.Anchor
28 import org.onap.cps.spi.model.CmHandleQueryParameters
29 import org.onap.cps.spi.model.ConditionProperties
30 import org.onap.cps.spi.model.DataNode
31 import org.onap.cps.utils.JsonObjectMapper
32 import spock.lang.Specification
34 import java.util.stream.Collectors
36 class NetworkCmProxyCmHandlerQueryServiceSpec extends Specification {
38 def cpsDataPersistenceService = Mock(CpsDataPersistenceService)
39 def cpsAdminPersistenceService = Mock(CpsAdminPersistenceService)
41 NetworkCmProxyCmHandlerQueryService objectUnderTest = new NetworkCmProxyCmHandlerQueryServiceImpl(
42 cpsDataPersistenceService, cpsAdminPersistenceService, new JsonObjectMapper(new ObjectMapper())
45 def 'Retrieve cm handles with public properties when #scenario.'() {
46 given: 'a condition property'
47 def cmHandleQueryParameters = new CmHandleQueryParameters()
48 def conditionProperties = new ConditionProperties()
49 conditionProperties.conditionName = 'hasAllProperties'
50 conditionProperties.conditionParameters = publicProperties
51 cmHandleQueryParameters.setCmHandleQueryParameters([conditionProperties])
54 when: 'the service is invoked'
55 def returnedCmHandles = objectUnderTest.queryCmHandles(cmHandleQueryParameters)
56 then: 'the correct expected cm handles are returned'
57 returnedCmHandles.stream().map(d -> d.leaves.get('id').toString()).collect(Collectors.toList()) == expectedCmHandleIds
58 where: 'the following data is used'
59 scenario | publicProperties || expectedCmHandleIds
60 'single matching property' | [['Contact' : 'newemailforstore@bookstore.com']] || ['PNFDemo', 'PNFDemo2', 'PNFDemo4']
61 'public property dont match' | [['wont_match' : 'wont_match']] || []
62 '2 properties, only one match (and)' | [['Contact' : 'newemailforstore@bookstore.com'], ['Contact2': 'newemailforstore2@bookstore.com']] || ['PNFDemo4']
63 '2 properties, no match (and)' | [['Contact' : 'newemailforstore@bookstore.com'], ['Contact2': '']] || []
66 def 'Retrieve cm handles with module names when #scenario.'() {
67 given: 'a condition property'
68 def cmHandleQueryParameters = new CmHandleQueryParameters()
69 def conditionProperties = new ConditionProperties()
70 conditionProperties.conditionName = 'hasAllModules'
71 conditionProperties.conditionParameters = moduleNames
72 cmHandleQueryParameters.setCmHandleQueryParameters([conditionProperties])
75 when: 'the service is invoked'
76 def returnedCmHandles = objectUnderTest.queryCmHandles(cmHandleQueryParameters)
77 then: 'the correct expected cm handles are returned'
78 returnedCmHandles.stream().map(d -> d.leaves.get('id').toString()).collect(Collectors.toList()) == expectedCmHandleIds
79 where: 'the following data is used'
80 scenario | moduleNames || expectedCmHandleIds
81 'single matching module name' | [['moduleName' : 'MODULE-NAME-001']] || ['PNFDemo2', 'PNFDemo3', 'PNFDemo']
82 'module name dont match' | [['moduleName' : 'MODULE-NAME-004']] || []
83 '2 module names, only one match (and)' | [['moduleName' : 'MODULE-NAME-002'], ['moduleName': 'MODULE-NAME-003']] || ['PNFDemo4']
84 '2 module names, no match (and)' | [['moduleName' : 'MODULE-NAME-002'], ['moduleName': 'MODULE-NAME-004']] || []
87 def 'Retrieve cm handles with combined queries when #scenario.'() {
88 given: 'condition properties'
89 def cmHandleQueryParameters = new CmHandleQueryParameters()
90 def conditionProperties1 = new ConditionProperties()
91 conditionProperties1.conditionName = 'hasAllProperties'
92 conditionProperties1.conditionParameters = publicProperties
93 def conditionProperties2 = new ConditionProperties()
94 conditionProperties2.conditionName = 'hasAllModules'
95 conditionProperties2.conditionParameters = moduleNames
96 cmHandleQueryParameters.setCmHandleQueryParameters([conditionProperties1,conditionProperties2])
99 when: 'the service is invoked'
100 def returnedCmHandles = objectUnderTest.queryCmHandles(cmHandleQueryParameters)
101 then: 'the correct expected cm handles are returned'
102 returnedCmHandles.stream().map(d -> d.leaves.get('id').toString()).collect(Collectors.toList()) == expectedCmHandleIds
103 where: 'the following data is used'
104 scenario | moduleNames | publicProperties || expectedCmHandleIds
105 'particularly intersect' | [['moduleName' : 'MODULE-NAME-001']] | [['Contact' : 'newemailforstore@bookstore.com']] || ['PNFDemo2', 'PNFDemo']
106 'empty intersect' | [['moduleName' : 'MODULE-NAME-004']] | [['Contact' : 'newemailforstore@bookstore.com']] || []
107 'total intersect' | [['moduleName' : 'MODULE-NAME-002']] | [['Contact2' : 'newemailforstore2@bookstore.com']] || ['PNFDemo4']
110 def 'Retrieve cm handles when the query is empty.'() {
111 given: 'mock services'
113 when: 'the service is invoked'
114 def cmHandleQueryParameters = new CmHandleQueryParameters()
115 def returnedCmHandles = objectUnderTest.queryCmHandles(cmHandleQueryParameters)
116 then: 'the correct expected cm handles are returned'
117 returnedCmHandles.stream().map(d -> d.leaves.get('id').toString()).collect(Collectors.toList()) == ['PNFDemo', 'PNFDemo2', 'PNFDemo3', 'PNFDemo4']
120 void mockResponses() {
121 def pNFDemo = new DataNode(xpath: 'cmHandle/id[\'PNFDemo\']', leaves: ['id':'PNFDemo'])
122 def pNFDemo2 = new DataNode(xpath: 'cmHandle/id[\'PNFDemo2\']', leaves: ['id':'PNFDemo2'])
123 def pNFDemo3 = new DataNode(xpath: 'cmHandle/id[\'PNFDemo3\']', leaves: ['id':'PNFDemo3'])
124 def pNFDemo4 = new DataNode(xpath: 'cmHandle/id[\'PNFDemo4\']', leaves: ['id':'PNFDemo4'])
126 cpsDataPersistenceService.queryDataNodes(_, _, '//public-properties[@name=\'Contact\' and @value=\'newemailforstore@bookstore.com\']/ancestor::cm-handles', _)
127 >> [pNFDemo, pNFDemo2, pNFDemo4]
128 cpsDataPersistenceService.queryDataNodes(_, _, '//public-properties[@name=\'wont_match\' and @value=\'wont_match\']/ancestor::cm-handles', _)
130 cpsDataPersistenceService.queryDataNodes(_, _, '//public-properties[@name=\'Contact2\' and @value=\'newemailforstore2@bookstore.com\']/ancestor::cm-handles', _)
132 cpsDataPersistenceService.queryDataNodes(_, _, '//public-properties[@name=\'Contact2\' and @value=\'\']/ancestor::cm-handles', _)
134 cpsDataPersistenceService.queryDataNodes(_, _, '//public-properties/ancestor::cm-handles', _)
135 >> [pNFDemo, pNFDemo2, pNFDemo3, pNFDemo4]
136 cpsDataPersistenceService.queryDataNodes(_, _, '//cm-handles[@id=\'PNFDemo\']', _) >> [pNFDemo]
137 cpsDataPersistenceService.queryDataNodes(_, _, '//cm-handles[@id=\'PNFDemo2\']', _) >> [pNFDemo2]
138 cpsDataPersistenceService.queryDataNodes(_, _, '//cm-handles[@id=\'PNFDemo3\']', _) >> [pNFDemo3]
139 cpsDataPersistenceService.queryDataNodes(_, _, '//cm-handles[@id=\'PNFDemo4\']', _) >> [pNFDemo4]
141 cpsAdminPersistenceService.queryAnchors(_, ['MODULE-NAME-001']) >> [new Anchor(name: 'PNFDemo2'), new Anchor(name: 'PNFDemo3'), new Anchor(name: 'PNFDemo')]
142 cpsAdminPersistenceService.queryAnchors(_, ['MODULE-NAME-004']) >> []
143 cpsAdminPersistenceService.queryAnchors(_, ['MODULE-NAME-003', 'MODULE-NAME-002']) >> [new Anchor(name: 'PNFDemo4')]
144 cpsAdminPersistenceService.queryAnchors(_, ['MODULE-NAME-002', 'MODULE-NAME-003']) >> [new Anchor(name: 'PNFDemo4')]
145 cpsAdminPersistenceService.queryAnchors(_, ['MODULE-NAME-004', 'MODULE-NAME-002']) >> []
146 cpsAdminPersistenceService.queryAnchors(_, ['MODULE-NAME-002', 'MODULE-NAME-004']) >> []
147 cpsAdminPersistenceService.queryAnchors(_, ['MODULE-NAME-002']) >> [new Anchor(name: 'PNFDemo2'), new Anchor(name: 'PNFDemo4')]