From 1839f38e054a958793ec40f524d911253086c74e Mon Sep 17 00:00:00 2001 From: DylanB95EST Date: Tue, 8 Mar 2022 17:26:34 +0000 Subject: Additional validation for names/identifiers Implementing additional regex validation for names/identifiers in CPS - Introduces a CpsValidator - Applies to relevent java public API's - Tests have been updated where necessary Issue-ID: CPS-322 Change-Id: I29ab8820bb1fe0eee247e425d6bb018bcd38f28e Signed-off-by: DylanB95EST --- ...rkCmProxyDataServiceImplRegistrationSpec.groovy | 25 +++++++++++++--------- .../impl/NetworkCmProxyDataServiceImplSpec.groovy | 4 ++-- ...orkCmProxyDataServicePropertyHandlerSpec.groovy | 12 +++++++---- .../models/CmHandleRegistrationResponseSpec.groovy | 25 ++++++++++++---------- 4 files changed, 39 insertions(+), 27 deletions(-) (limited to 'cps-ncmp-service/src/test') diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy index e7c1d0560d..cb4d5ef406 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy @@ -35,6 +35,7 @@ import org.onap.cps.ncmp.api.models.DmiPluginRegistration import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle import org.onap.cps.spi.exceptions.AlreadyDefinedException import org.onap.cps.spi.exceptions.DataNodeNotFoundException +import org.onap.cps.spi.exceptions.DataValidationException import org.onap.cps.spi.exceptions.SchemaSetNotFoundException import org.onap.cps.utils.JsonObjectMapper import spock.lang.Shared @@ -42,6 +43,7 @@ import spock.lang.Specification import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_DOES_NOT_EXIST import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_ALREADY_EXIST +import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_INVALID_ID import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.UNKNOWN_ERROR import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.Status import static org.onap.cps.spi.CascadeDeleteAllowed.CASCADE_DELETE_ALLOWED @@ -218,7 +220,7 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { def 'Create CM-Handle Error Handling: Registration fails: #scenario'() { given: 'a registration without cm-handle properties' def dmiPluginRegistration = new DmiPluginRegistration(dmiPlugin: 'my-server') - dmiPluginRegistration.createdCmHandles = [new NcmpServiceCmHandle(cmHandleID: 'cmhandle')] + dmiPluginRegistration.createdCmHandles = [new NcmpServiceCmHandle(cmHandleID: cmHandleId)] and: 'cm-handler registration fails: #scenario' mockCpsDataService.saveListElements(_, _, _, _, _) >> { throw exception } when: 'registration is updated' @@ -227,16 +229,17 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { response.getCreatedCmHandles().size() == 1 with(response.getCreatedCmHandles().get(0)) { assert it.status == Status.FAILURE - assert it.cmHandle == 'cmhandle' + assert it.cmHandle == cmHandleId assert it.registrationError == expectedError assert it.errorText == expectedErrorText } and: 'model-sync is not invoked' 0 * objectUnderTest.syncModulesAndCreateAnchor(_) where: - scenario | exception || expectedError | expectedErrorText - 'cm-handle already exist' | new AlreadyDefinedException('', new RuntimeException()) || CM_HANDLE_ALREADY_EXIST | 'cm-handle already exists' - 'unknown exception while registering cm-handle' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' + scenario | cmHandleId | exception || expectedError | expectedErrorText + 'cm-handle already exist' | 'cmhandle' | new AlreadyDefinedException('', new RuntimeException()) || CM_HANDLE_ALREADY_EXIST | 'cm-handle already exists' + 'cm-handle has invalid name' | 'cm handle with space' | new DataValidationException("", "") || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id' + 'unknown exception while registering cm-handle' | 'cmhandle' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' } def 'Create CM-Handle Error Handling: Model Sync fails'() { @@ -268,12 +271,13 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { and: 'cm-handle updates can be processed successfully' def updateOperationResponse = [CmHandleRegistrationResponse.createSuccessResponse('cm-handle-1'), CmHandleRegistrationResponse.createFailureResponse('cm-handle-2', new Exception("Failed")), - CmHandleRegistrationResponse.createFailureResponse('cm-handle-3', CM_HANDLE_DOES_NOT_EXIST)] + CmHandleRegistrationResponse.createFailureResponse('cm-handle-3', CM_HANDLE_DOES_NOT_EXIST), + CmHandleRegistrationResponse.createFailureResponse('cm handle 4', CM_HANDLE_INVALID_ID)] mockNetworkCmProxyDataServicePropertyHandler.updateCmHandleProperties(_) >> updateOperationResponse when: 'registration is updated' def response = objectUnderTest.updateDmiRegistrationAndSyncModule(dmiPluginRegistration) then: 'the response contains updateOperationResponse' - assert response.getUpdatedCmHandles().size() == 3 + assert response.getUpdatedCmHandles().size() == 4 assert response.getUpdatedCmHandles().containsAll(updateOperationResponse) } @@ -369,9 +373,10 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { assert it.errorText == expectedErrorText } where: - scenario | deleteListElementException | expectedError | expectedErrorText - 'cm-handle does not exist' | new DataNodeNotFoundException("", "", "") | CM_HANDLE_DOES_NOT_EXIST | 'cm-handle does not exist' - 'an unexpected exception' | new RuntimeException("Failed") | UNKNOWN_ERROR | 'Failed' + scenario | cmHandleId | deleteListElementException || expectedError | expectedErrorText + 'cm-handle does not exist' | 'cmhandle' | new DataNodeNotFoundException("", "", "") || CM_HANDLE_DOES_NOT_EXIST | 'cm-handle does not exist' + 'cm-handle has invalid name' | 'cm handle with space' | new DataValidationException("", "") || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id' + 'an unexpected exception' | 'cmhandle' | new RuntimeException("Failed") || UNKNOWN_ERROR | 'Failed' } def getObjectUnderTestWithModelSyncDisabled() { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy index c21d7e7742..ded4943702 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy @@ -286,9 +286,9 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { def 'Getting Yang Resources.'() { when: 'yang resources is called' - objectUnderTest.getYangResourcesModuleReferences('some cm handle') + objectUnderTest.getYangResourcesModuleReferences('some-cm-handle') then: 'CPS module services is invoked for the correct dataspace and cm handle' - 1 * mockCpsModuleService.getYangResourcesModuleReferences('NFP-Operational','some cm handle') + 1 * mockCpsModuleService.getYangResourcesModuleReferences('NFP-Operational','some-cm-handle') } def 'Get cm handle identifiers for the given module names.'() { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy index f6264f4921..7aacbda513 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy @@ -21,7 +21,10 @@ package org.onap.cps.ncmp.api.impl +import org.onap.cps.spi.exceptions.DataValidationException + import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_DOES_NOT_EXIST +import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_INVALID_ID import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.UNKNOWN_ERROR import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.Status @@ -118,7 +121,7 @@ class NetworkCmProxyDataServicePropertyHandlerSpec extends Specification { 'no original properties' | [] || 0 } - def 'Exception thrown when we try to update cmHandle'() { + def '#scenario error leads to #exception when we try to update cmHandle'() { given: 'cm handles request' def cmHandleUpdateRequest = [new NcmpServiceCmHandle(cmHandleID: cmHandleId, publicProperties: [:], dmiProperties: [:])] and: 'data node cannot be found' @@ -135,9 +138,10 @@ class NetworkCmProxyDataServicePropertyHandlerSpec extends Specification { assert it.errorText == expectedErrorText } where: - scenario | exception || expectedError | expectedErrorText - 'cmhandle does not exist' | new DataNodeNotFoundException('NCMP-Admin', 'ncmp-dmi-registry') || CM_HANDLE_DOES_NOT_EXIST | 'cm-handle does not exist' - 'unexpected error' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' + scenario | cmHandleId | exception || expectedError | expectedErrorText + 'Cm Handle does not exist' | 'cmHandleId' | new DataNodeNotFoundException('NCMP-Admin', 'ncmp-dmi-registry') || CM_HANDLE_DOES_NOT_EXIST | 'cm-handle does not exist' + 'Unknown' | 'cmHandleId' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' + 'Invalid cm handle id' | 'cmHandleId with spaces' | new DataValidationException('Name Validation Error.', cmHandleId + 'contains an invalid character') || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id' } def 'Multiple update operations in a single request'() { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponseSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponseSpec.groovy index c5ef2f446d..4476998d82 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponseSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponseSpec.groovy @@ -26,8 +26,8 @@ import spock.lang.Specification class CmHandleRegistrationResponseSpec extends Specification { - def 'Successful CmHandle Registration Response'() { - when: 'CMHandle response is created' + def 'Successful cm-handle Registration Response'() { + when: 'cm-handle response is created' def cmHandleRegistrationResponse = CmHandleRegistrationResponse.createSuccessResponse('cmHandle') then: 'a success response is returned' with(cmHandleRegistrationResponse) { @@ -39,8 +39,8 @@ class CmHandleRegistrationResponseSpec extends Specification { cmHandleRegistrationResponse.errorText == null } - def 'Failed Cm Handle Registration Response: for unexpected exception'() { - when: 'CMHandle response is created for an unexpected exception' + def 'Failed cm-handle Registration Response: for unexpected exception'() { + when: 'cm-handle response is created for an unexpected exception' def cmHandleRegistrationResponse = CmHandleRegistrationResponse.createFailureResponse('cmHandle', new Exception('unexpected error')) then: 'the response is created with expected value' @@ -51,18 +51,21 @@ class CmHandleRegistrationResponseSpec extends Specification { } } - def 'Failed Cm Handle Registration Response: for known error'() { - when: 'CMHandle response is created for known error' + def 'Failed cm-handle Registration Response: for #scenario'() { + when: 'cm-handle failure response is created for #scenario' def cmHandleRegistrationResponse = - CmHandleRegistrationResponse.createFailureResponse('cmHandle', RegistrationError.CM_HANDLE_ALREADY_EXIST) + CmHandleRegistrationResponse.createFailureResponse(cmHandleId, registrationError) then: 'the response is created with expected value' with(cmHandleRegistrationResponse) { - assert it.registrationError == RegistrationError.CM_HANDLE_ALREADY_EXIST - assert it.cmHandle == 'cmHandle' + assert it.registrationError == registrationError + assert it.cmHandle == cmHandleId assert it.status == Status.FAILURE - assert errorText == RegistrationError.CM_HANDLE_ALREADY_EXIST.errorText + assert errorText == registrationError.errorText } - + where: + scenario | cmHandleId | registrationError + 'cm-handle already exists' | 'cmHandle' | RegistrationError.CM_HANDLE_ALREADY_EXIST + 'cm-handle id is invalid' | 'cm handle' | RegistrationError.CM_HANDLE_INVALID_ID } } -- cgit 1.2.3-korg