diff options
author | 2025-02-20 11:16:11 +0000 | |
---|---|---|
committer | 2025-02-27 11:35:18 +0000 | |
commit | b3dfa9ba4771b3d98bbfbdb870b8ed063d4dd2ce (patch) | |
tree | d5981045a29094f191164797b6a0d1f243c7b851 /cps-ri | |
parent | 138cae7d9d060c0f194eccb213fa2aa4cbac7105 (diff) |
Change order of CM Handle Reference lookup depending on special character
- implemented new algorithm using validator to rule out standard id / prefer alternate id
- moved validator imp to cps-service (not in RI) TBC!!!
- changed order of characters tested in validator to fail fast (on '=')
- added Boolean variation validator method to reduce overhead and prevent logic based on exceptions
- improved integration test to cover all scenarios
- add performance test for alternate id look up (report only)
- ensured all performance test use alternate ids it '='
- added small groovy tests to restore cps-ri code coverage to 0.31
Issue-ID: CPS-2605
Change-Id: Id9c22bb69904b7f5d376b7f8319332428435333e
Signed-off-by: ToineSiebelink <toine.siebelink@est.tech>
Signed-off-by: seanbeirne <sean.beirne@est.tech>
Diffstat (limited to 'cps-ri')
3 files changed, 30 insertions, 150 deletions
diff --git a/cps-ri/src/main/java/org/onap/cps/ri/utils/CpsValidatorImpl.java b/cps-ri/src/main/java/org/onap/cps/ri/utils/CpsValidatorImpl.java deleted file mode 100644 index 9e89c8aed9..0000000000 --- a/cps-ri/src/main/java/org/onap/cps/ri/utils/CpsValidatorImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * Copyright (C) 2022-2023 Nordix Foundation - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.cps.ri.utils; - -import com.google.common.collect.Lists; -import java.util.Arrays; -import java.util.Collection; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.onap.cps.api.exceptions.DataValidationException; -import org.onap.cps.api.parameters.PaginationOption; -import org.onap.cps.utils.CpsValidator; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class CpsValidatorImpl implements CpsValidator { - - private static final char[] UNSUPPORTED_NAME_CHARACTERS = "!\" #$%&'()*+,./\\:;<=>?@[]^`{|}~".toCharArray(); - - @Override - public void validateNameCharacters(final String... names) { - validateNameCharacters(Arrays.asList(names)); - } - - @Override - public void validateNameCharacters(final Iterable<String> names) { - for (final String name : names) { - final Collection<Character> charactersOfName = Lists.charactersOf(name); - for (final char unsupportedCharacter : UNSUPPORTED_NAME_CHARACTERS) { - if (charactersOfName.contains(unsupportedCharacter)) { - throw new DataValidationException("Name or ID Validation Error.", - name + " invalid token encountered at position " - + (name.indexOf(unsupportedCharacter) + 1)); - } - } - } - } - - @Override - public void validatePaginationOption(final PaginationOption paginationOption) { - if (PaginationOption.NO_PAGINATION == paginationOption) { - return; - } - - if (!paginationOption.isValidPaginationOption()) { - throw new DataValidationException("Pagination validation error.", - "Invalid page index or size"); - } - } -} diff --git a/cps-ri/src/test/groovy/org/onap/cps/ri/CpsModulePersistenceServiceImplSpec.groovy b/cps-ri/src/test/groovy/org/onap/cps/ri/CpsModulePersistenceServiceImplSpec.groovy index 9abfdbeb33..4bf8c7ca09 100644 --- a/cps-ri/src/test/groovy/org/onap/cps/ri/CpsModulePersistenceServiceImplSpec.groovy +++ b/cps-ri/src/test/groovy/org/onap/cps/ri/CpsModulePersistenceServiceImplSpec.groovy @@ -1,7 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (c) 2021 Bell Canada. - * Modifications Copyright (C) 2022-2023 Nordix Foundation + * Modifications Copyright (C) 2022-2025 Nordix Foundation * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ package org.onap.cps.ri import org.hibernate.exception.ConstraintViolationException +import org.onap.cps.ri.models.DataspaceEntity import org.onap.cps.ri.models.SchemaSetEntity import org.onap.cps.ri.repository.DataspaceRepository import org.onap.cps.ri.repository.ModuleReferenceRepository @@ -30,7 +31,6 @@ import org.onap.cps.api.exceptions.DuplicatedYangResourceException import org.onap.cps.api.model.ModuleReference import org.springframework.dao.DataIntegrityViolationException import spock.lang.Specification - import java.sql.SQLException /** @@ -101,4 +101,32 @@ class CpsModulePersistenceServiceImplSpec extends Specification { noExceptionThrown() } + def 'Get yang schema resources.' () { + given: 'mocked methods for dataspace and schema set repositories' + mockDataspaceRepository.getByName('someDataspaceName') >> new DataspaceEntity() + mockSchemaSetRepository.getByDataspaceAndName(_,_) >> new SchemaSetEntity(yangResources: []) + when: 'the get yang schema resources method is called' + def result = objectUnderTest.getYangSchemaResources('someDataspaceName', 'someSchemaSetName') + then: 'an empty map is returned' + assert result.isEmpty() + } + + def 'Get yang module references with just dataspace name.' () { + given: 'mocked method return yang resource repository' + mockYangResourceRepository.findAllModuleReferencesByDataspace('someDataspaceName') >> [] + when: 'the get yang resource module reference method is called with 1 parameter' + def result = objectUnderTest.getYangResourceModuleReferences('someDataspaceName') + then: 'an empty collection is returned' + assert result.isEmpty() + } + + def 'Get yang module references with dataspace name and anchor.' () { + given: 'mocked method return yang resource repository' + mockYangResourceRepository.findAllModuleReferencesByDataspaceAndAnchor('someDataspaceName', 'someAnchorName') >> [] + when: 'the get yang resource module reference method is called with 2 parameters' + def result = objectUnderTest.getYangResourceModuleReferences('someDataspaceName','someAnchorName') + then: 'an empty collection is returned' + assert result.isEmpty() + } + } diff --git a/cps-ri/src/test/groovy/org/onap/cps/ri/utils/CpsValidatorImplSpec.groovy b/cps-ri/src/test/groovy/org/onap/cps/ri/utils/CpsValidatorImplSpec.groovy deleted file mode 100644 index f7c4798772..0000000000 --- a/cps-ri/src/test/groovy/org/onap/cps/ri/utils/CpsValidatorImplSpec.groovy +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * Copyright (C) 2022-2023 Nordix Foundation - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.cps.ri.utils - - -import org.onap.cps.api.parameters.PaginationOption -import org.onap.cps.api.exceptions.DataValidationException -import spock.lang.Specification - -class CpsValidatorImplSpec extends Specification { - - def objectUnderTest = new CpsValidatorImpl() - - def 'Validating a valid string.'() { - when: 'the string is validated using a valid name' - objectUnderTest.validateNameCharacters('name-with-no-spaces') - then: 'no exception is thrown' - noExceptionThrown() - } - - def 'Validating an invalid string.'() { - when: 'the string is validated using an invalid name' - objectUnderTest.validateNameCharacters(name) - then: 'a data validation exception is thrown' - def exceptionThrown = thrown(DataValidationException) - and: 'the error was encountered at the following index in #scenario' - assert exceptionThrown.getDetails().contains(expectedErrorMessage) - where: 'the following names are used' - scenario | name || expectedErrorMessage - 'position 5' | 'name with spaces' || 'name with spaces invalid token encountered at position 5' - 'position 9' | 'nameWith Space' || 'nameWith Space invalid token encountered at position 9' - } - - def 'Validating a list of valid names.'() { - given: 'a list of valid names' - def names = ['valid-name', 'another-valid-name'] - when: 'a list of strings is validated' - objectUnderTest.validateNameCharacters(names) - then: 'no exception is thrown' - noExceptionThrown() - } - - def 'Validating a list of names with invalid names.'() { - given: 'a list of names with an invalid name' - def names = ['valid-name', 'name with spaces'] - when: 'a list of strings is validated' - objectUnderTest.validateNameCharacters(names) - then: 'a data validation exception is thrown' - thrown(DataValidationException) - } - - def 'Validate Pagination option with invalid page index and size.'() { - when: 'the pagination option is validated using invalid options' - objectUnderTest.validatePaginationOption(new PaginationOption(-5, -2)) - then: 'a data validation exception is thrown' - def exceptionThrown = thrown(DataValidationException) - and: 'the error was encountered at the following index in #scenario' - assert exceptionThrown.getDetails().contains("Invalid page index or size") - } -} |