From 263906a91a79675087474968753efbc6ecdd8b45 Mon Sep 17 00:00:00 2001 From: arielmirra Date: Thu, 11 Apr 2024 19:05:52 -0300 Subject: [PATCH] fix ibmmq validations false negatives --- .../validation/model/APIRawValidations.scala | 5 ++- .../shacl/APICustomShaclFunctions.scala | 18 ++++++++++ .../ibmmq-binding-validations-valid.yaml | 34 +++++++++++++++++++ .../ibmmq-binding-validations-valid.report | 4 +++ .../async20/ibmmq-binding-validations.report | 16 ++++----- ...c20UniquePlatformUnitValidationsTest.scala | 4 +++ 6 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations-valid.yaml create mode 100644 amf-cli/shared/src/test/resources/validations/reports/async20/ibmmq-binding-validations-valid.report diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/validation/model/APIRawValidations.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/validation/model/APIRawValidations.scala index e9bbe110f7..b9a476a2ad 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/validation/model/APIRawValidations.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/validation/model/APIRawValidations.scala @@ -1127,7 +1127,7 @@ object APIRawValidations extends CommonValidationDefinitions { owlClass = apiBinding("IBMMQServerBinding"), owlProperty = apiBinding("heartBeatInterval"), constraint = sh("pattern"), - value = "^[0-999999]$" + value = "^\\d{1,6}$" ), AMFValidation( message = "IBMMQ Channel Binding 'destinationType' field must be either 'topic' or 'queue'", @@ -1167,8 +1167,7 @@ object APIRawValidations extends CommonValidationDefinitions { message = "IBMMQ channel Binding 'maxMsgLength' field must be a number between 0-104857600 (100MB)", owlClass = apiBinding("IBMMQChannelBinding"), owlProperty = apiBinding("maxMsgLength"), - constraint = sh("pattern"), - value = "^[0-104857600]$" + constraint = shape("IBMMQMaxMsgLengthValidation") ), AMFValidation( message = "IBMMQ message Binding 'type' field must be either 'string', 'jms' or 'binary'", diff --git a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/validation/shacl/APICustomShaclFunctions.scala b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/validation/shacl/APICustomShaclFunctions.scala index 476838973f..c4a4e8e469 100644 --- a/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/validation/shacl/APICustomShaclFunctions.scala +++ b/amf-api-contract/shared/src/main/scala/amf/apicontract/internal/validation/shacl/APICustomShaclFunctions.scala @@ -812,6 +812,24 @@ object APICustomShaclFunctions extends BaseCustomShaclFunctions { ) } } + }, + new CustomShaclFunction { + override val name: String = "IBMMQMaxMsgLengthValidation" + + override def run(element: AmfObject, validate: Option[ValidationInfo] => Unit): Unit = { + val binding = element.asInstanceOf[IBMMQChannelBinding] + val length = binding.maxMsgLength.value() + val isMaxMsgLengthValid = 0 <= length && length <= 104857600 + if (!isMaxMsgLengthValid) { + validate( + validationInfo( + IBMMQChannelBindingModel.MaxMsgLength, + "IBMMQ channel Binding 'maxMsgLength' field must be a number between 0-104857600 (100MB)", + element.annotations + ) + ) + } + } } ) diff --git a/amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations-valid.yaml b/amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations-valid.yaml new file mode 100644 index 0000000000..5c294229df --- /dev/null +++ b/amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations-valid.yaml @@ -0,0 +1,34 @@ +asyncapi: 2.1.0 +info: + title: test binding + version: 1.0.0 +servers: + theName: + url: some.com + protocol: ibmmq + bindings: + ibmmq: + heartBeatInterval: 123 # 1. MUST be 0-999999 +channels: + some-channel: + bindings: + # 2. queue and topic fields MUST NOT coexist within an ibmmq channel binding + ibmmq: + destinationType: topic # 3. MUST be either topic or queue + topic: + string: normal value # 5. MUST NOT exceed 10240 characters in length + objectName: normal value # 6. MUST NOT exceed 48 characters in length + maxMsgLength: 123 # 7. MUST be 0-104,857,600 bytes (100 MB) + publish: + message: + bindings: + ibmmq: + type: string # 8. MUST be either string, jms or binary + expiry: 1 # 9. MUST be 0 or greater + + other-channel: + publish: + message: + bindings: + ibmmq: + type: jms diff --git a/amf-cli/shared/src/test/resources/validations/reports/async20/ibmmq-binding-validations-valid.report b/amf-cli/shared/src/test/resources/validations/reports/async20/ibmmq-binding-validations-valid.report new file mode 100644 index 0000000000..f556c7847d --- /dev/null +++ b/amf-cli/shared/src/test/resources/validations/reports/async20/ibmmq-binding-validations-valid.report @@ -0,0 +1,4 @@ +ModelId: file://amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations-valid.yaml +Profile: ASYNC 2.0 +Conforms: true +Number of results: 0 diff --git a/amf-cli/shared/src/test/resources/validations/reports/async20/ibmmq-binding-validations.report b/amf-cli/shared/src/test/resources/validations/reports/async20/ibmmq-binding-validations.report index 4994d47f7d..46fd9acc5f 100644 --- a/amf-cli/shared/src/test/resources/validations/reports/async20/ibmmq-binding-validations.report +++ b/amf-cli/shared/src/test/resources/validations/reports/async20/ibmmq-binding-validations.report @@ -13,6 +13,14 @@ Level: Violation Range: [(11,27)-(11,36)] Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations.yaml +- Constraint: http://a.ml/vocabularies/amf/parser#IBMMQChannelBinding-maxMsgLength-IBMMQMaxMsgLengthValidation + Message: IBMMQ channel Binding 'maxMsgLength' field must be a number between 0-104857600 (100MB) + Severity: Violation + Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations.yaml#/async-api/endpoint/some-channel/channel-bindings/bindings/ibmmq-channel + Property: http://a.ml/vocabularies/apiBinding#maxMsgLength + Range: [(16,6)-(25,0)] + Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations.yaml + - Constraint: http://a.ml/vocabularies/amf/parser#IBMMQChannelBinding-queue-IBMMQDestinationValidation Message: 'queue' and 'topic' fields MUST NOT coexist within an IBMMQ channel binding Severity: Violation @@ -53,14 +61,6 @@ Level: Violation Range: [(23,22)-(23,75)] Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations.yaml -- Constraint: http://a.ml/vocabularies/amf/parser#IBMMQChannelBinding-maxMsgLength-pattern - Message: IBMMQ channel Binding 'maxMsgLength' field must be a number between 0-104857600 (100MB) - Severity: Violation - Target: file://amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations.yaml#/async-api/endpoint/some-channel/channel-bindings/bindings/ibmmq-channel - Property: http://a.ml/vocabularies/apiBinding#maxMsgLength - Range: [(24,22)-(24,31)] - Location: file://amf-cli/shared/src/test/resources/validations/async20/validations/ibmmq-binding-validations.yaml - - Constraint: http://a.ml/vocabularies/amf/parser#IBMMQMessageBinding-messageType-in Message: IBMMQ message Binding 'type' field must be either 'string', 'jms' or 'binary' Severity: Violation diff --git a/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala b/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala index 649f4685e6..78118cf851 100644 --- a/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala +++ b/amf-cli/shared/src/test/scala/amf/validation/Async20UniquePlatformUnitValidationsTest.scala @@ -403,4 +403,8 @@ class Async20UniquePlatformUnitValidationsTest extends UniquePlatformReportGenTe test("Async 2.1+ IBMMQ validations") { validate("ibmmq-binding-validations.yaml", Some("ibmmq-binding-validations.report")) } + + test("Async 2.1+ IBMMQ validations all valid") { + validate("ibmmq-binding-validations-valid.yaml", Some("ibmmq-binding-validations-valid.report")) + } }