From d15062894d6f43d7f7f2058891ec55b7c227b06f Mon Sep 17 00:00:00 2001 From: kzangeli Date: Wed, 27 May 2026 15:11:07 +0200 Subject: [PATCH 1/2] fix: correct CSource-notification validator fixtures (047_10..047_15) The shared keyword "Wait for notification and validate it" in NotificationUtils.resource carried three fixture bugs, each masking the next, so 047_10..047_15 could not pass against a conformant broker: 1. ${notification_type} read "ContextSource Notfication" (stray space + missing "i"); the type member is "ContextSourceNotification". 2. notifiedAt was checked with a fixed second-precision format (%Y-%m-%dT%H:%M:%SZ), rejecting valid RFC 3339 millisecond timestamps. Use the millis-tolerant Parse Ngsild Date instead, and drop the now-unused ${date_format}/${date_format_with_millis} variables. 3. The data loop looked up the registration id as [@id]; the notification is compacted NGSI-LD JSON where the key is [id]. The broker is correct on all three. Documented as testsuite-doubts.md #75. Co-Authored-By: Claude Opus 4.7 --- resources/NotificationUtils.resource | 13 ++++---- testsuite-doubts.md | 44 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/resources/NotificationUtils.resource b/resources/NotificationUtils.resource index 56d3bc42..328faa2f 100644 --- a/resources/NotificationUtils.resource +++ b/resources/NotificationUtils.resource @@ -11,9 +11,7 @@ Variables ${EXECDIR}/resources/variables.py *** Variables *** -${notification_type} ContextSource Notfication -${date_format} %Y-%m-%dT%H:%M:%SZ -${date_format_with_millis} %Y-%m-%dT%H:%M:%S.%fZ +${notification_type} ContextSourceNotification *** Keywords *** @@ -65,13 +63,16 @@ Wait for notification and validate it Output Notification ${notification} ${notification_headers} Wait for notification Should Be Equal ${notification}[type] ${notification_type} Should Be Equal ${notification}[subscriptionId] ${expected_subscription_id} - ${is_date}= Is Date ${notification}[notifiedAt] ${date_format} - Should Be True ${is_date} + # notifiedAt is an RFC 3339 timestamp and may carry fractional seconds + # (e.g. 2026-05-27T10:28:22.317Z). Validate with the millis-tolerant parser + # used for createdAt/modifiedAt, not a fixed second-precision format. + ${notified_at_date}= Parse Ngsild Date ${notification}[notifiedAt] + Should Not Be Equal ${notified_at_date} ${None} ${index}= Set Variable 0 FOR ${expected_context_source_registration_id} IN @{expected_context_source_registration_ids} List Should Contain Value ... ${expected_context_source_registration_ids} - ... ${notification}[data][${index}][@id] + ... ${notification}[data][${index}][id] ${index}= Evaluate ${index} + 1 END Should Be Equal '${notification_data_length}' '${expected_notification_data_length}' diff --git a/testsuite-doubts.md b/testsuite-doubts.md index 1f40798f..1c9783da 100644 --- a/testsuite-doubts.md +++ b/testsuite-doubts.md @@ -2331,3 +2331,47 @@ Verified: with the stub, the create + 201 check pass and the test proceeds exactly like `D018_02` (it then reaches the actual loop-detection / Via assertions). Implemented in branch `fix/d018-stub-forwarded-create`. +**Fix wanted:** add `... expected_status=any` to the `DELETE` call in +`Delete Context Source Registration Subscription`, matching the other +keywords in the file. **Verified:** with the one-line fix both tests pass +(and `042_01_01`, the happy-path delete, still passes). +## 75. `047_10`–`047_15` — CSource-notification validator carries three fixture bugs + +**Hit:** the CSource-notification tests `047_10_01`, `047_11_01`, +`047_11_02`, `047_12_01`, `047_13_01`, `047_14_01`, `047_15_01` all fail. +They share the keyword `Wait for notification and validate it` in +`resources/NotificationUtils.resource`, which validates the received +`ContextSourceNotification` against three things that are each wrong in +the fixture — each one masked the next until fixed: + +1. **Type literal misspelled.** `${notification_type}` read + `ContextSource Notfication` (a stray space plus a missing `i`). The + `type` member emitted by a conformant broker is `ContextSourceNotification` + (single token, per NGSI-LD TS 104-175 § 5.2.x), so the comparison could + never pass. → correct the literal. + +2. **`notifiedAt` validated with a fixed second-precision format.** The + check was `Is Date ${notification}[notifiedAt] ${date_format}` with + `${date_format}=%Y-%m-%dT%H:%M:%SZ` — no fractional seconds. `notifiedAt` + is an RFC 3339 timestamp and brokers legitimately emit milliseconds + (e.g. `2026-05-27T10:28:22.317Z`), which `strptime` then rejects. → use + the millis-tolerant `Parse Ngsild Date` (the same parser already used + for `createdAt`/`modifiedAt`, and the one hardened on `develop` for + arbitrary fractional precision). The now-unused `${date_format}` / + `${date_format_with_millis}` variables are removed. + +3. **Registration id looked up as `@id`.** The data loop read + `${notification}[data][${index}][@id]`, but the notification is normal + compacted NGSI-LD JSON — the registration identifier key is `id` + (the broker emits `id`, `type`, `information`, `endpoint`, all + compacted; `@id` is the expanded JSON-LD form, not present). → look up + `id`. + +**Impact / broker:** none — the broker is correct on all three; the +defects are entirely test-side. + +**Fix wanted:** all three corrections in the shared keyword in +`resources/NotificationUtils.resource`. **Verified:** with the three fixes +the seven tests pass (full broker run; the same dir in isolation is partly +masked by HttpCtrl-mock `Wait For Request` timeouts, but the seven are not +among the timeouts and pass cleanly). -- GitLab From 3c2d81a9b3656758dd72afb7892bafc61e47aedf Mon Sep 17 00:00:00 2001 From: kzangeli Date: Thu, 28 May 2026 11:22:43 +0200 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20rename=20`Wait=20for=20notifica?= =?UTF-8?q?tion=20and=20validate=20it`=20=E2=86=92=20`Wait=20for=20CSource?= =?UTF-8?q?=20notification=20and=20validate=20it`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses review comment on this MR (Benoît Orihuela): the keyword is CSource-specific (asserts `type=ContextSourceNotification`), so the unqualified name was confusing — it does not work for notifications from a regular subscription. Renames the keyword definition in `resources/NotificationUtils.resource` plus all 12 callers in `TP/NGSI-LD/ContextSource/.../047_*.robot`. Co-Authored-By: Claude Opus 4.7 --- .../047_02.robot | 4 ++-- .../047_03.robot | 2 +- .../047_04.robot | 2 +- .../047_08.robot | 2 +- .../047_09.robot | 2 +- .../047_10.robot | 2 +- .../047_11.robot | 2 +- .../047_12.robot | 2 +- .../047_13.robot | 2 +- .../047_14.robot | 2 +- .../047_15.robot | 2 +- .../047_16.robot | 2 +- resources/NotificationUtils.resource | 2 +- 13 files changed, 14 insertions(+), 14 deletions(-) diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_02.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_02.robot index 8b7866e0..36309b39 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_02.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_02.robot @@ -24,7 +24,7 @@ ${update_fragment_file_path}= csourceRegistrations/fra [Tags] csrsub-notification 5_11_7 ${update_fragment}= Load Test Sample ${update_fragment_file_path} ${response}= Update Context Source Registration ${context_source_registration_id} ${update_fragment} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=updated @@ -53,7 +53,7 @@ Create Initial Context Source Registration and Context Source Registration Subsc Check Response Status Code 201 ${create_csrsub_response.status_code} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} Set Suite Variable ${expected_context_source_registration_ids} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=newlyMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_03.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_03.robot index aba0140a..6c688041 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_03.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_03.robot @@ -29,7 +29,7 @@ ${subscription_payload_file_path}= csourceSubscriptions/sub ${response}= Create Context Source Registration ${context_source_registration_payload} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} @{expected_notification_data_entities}= Create List Building - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=newlyMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_04.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_04.robot index 596b6123..b69e9bcf 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_04.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_04.robot @@ -28,7 +28,7 @@ ${subscription_payload_file_path}= csourceSubscriptions/sub Set Suite Variable ${context_source_registration_id} ${response}= Create Context Source Registration ${context_source_registration_payload} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=newlyMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_08.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_08.robot index 339e067d..9f66b6ca 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_08.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_08.robot @@ -25,7 +25,7 @@ ${update_fragment_file_path}= csourceRegistrations/fra ${update_fragment}= Load Test Sample ${update_fragment_file_path} ${response}= Update Context Source Registration ${context_source_registration_id} ${update_fragment} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=updated diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_09.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_09.robot index 40edd77f..10cba3d4 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_09.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_09.robot @@ -25,7 +25,7 @@ ${update_fragment_file_path}= csourceRegistrations/fra ${update_fragment}= Load Test Sample ${update_fragment_file_path} ${response}= Update Context Source Registration ${context_source_registration_id} ${update_fragment} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=noLongerMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_10.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_10.robot index 4d14cd60..00dbe4d0 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_10.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_10.robot @@ -28,7 +28,7 @@ ${subscription_payload_file_path}= csourceSubscriptions/sub Set Suite Variable ${context_source_registration_id} ${response}= Create Context Source Registration ${context_source_registration_payload} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=newlyMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_11.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_11.robot index f94d450f..826c1a86 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_11.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_11.robot @@ -42,7 +42,7 @@ Receive cSourceNotification For Matching Context Source Registrations On Managem ${response1}= Create Context Source Registration ${context_source_registration_payload} Check Response Status Code 201 ${response1.status_code} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=newlyMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_12.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_12.robot index b957620c..8c363c09 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_12.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_12.robot @@ -28,7 +28,7 @@ ${subscription_payload_file_path}= csourceSubscriptions/sub Set Suite Variable ${context_source_registration_id} ${response}= Create Context Source Registration ${context_source_registration_payload} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=newlyMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_13.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_13.robot index 5645f358..3b0a2935 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_13.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_13.robot @@ -28,7 +28,7 @@ ${subscription_payload_file_path}= csourceSubscriptions/sub Set Suite Variable ${context_source_registration_id} ${response}= Create Context Source Registration ${context_source_registration_payload} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=newlyMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_14.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_14.robot index 4914bd29..0f075e22 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_14.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_14.robot @@ -28,7 +28,7 @@ ${subscription_payload_file_path}= csourceSubscriptions/sub Set Suite Variable ${context_source_registration_id} ${response}= Create Context Source Registration ${context_source_registration_payload} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=newlyMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_15.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_15.robot index 625b5965..ef9a1939 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_15.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_15.robot @@ -28,7 +28,7 @@ ${subscription_payload_file_path}= csourceSubscriptions/sub Set Suite Variable ${context_source_registration_id} ${response}= Create Context Source Registration ${context_source_registration_payload} @{expected_context_source_registration_ids}= Create List ${context_source_registration_id} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${expected_context_source_registration_ids} ... expected_trigger_reason=newlyMatching diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_16.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_16.robot index 25d00cc5..722b59a5 100644 --- a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_16.robot +++ b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_16.robot @@ -39,7 +39,7 @@ Receive cSourceNotification For Newly Matching Context Source Registrations ${response}= Update Context Source Registration Subscription ... ${subscription_id} ... ${subscription_update_fragment} - Wait for notification and validate it + Wait for CSource notification and validate it ... expected_subscription_id=${subscription_id} ... expected_context_source_registration_ids=${notification_csr_ids} ... expected_trigger_reason=newlyMatching diff --git a/resources/NotificationUtils.resource b/resources/NotificationUtils.resource index 328faa2f..d8da0f9c 100644 --- a/resources/NotificationUtils.resource +++ b/resources/NotificationUtils.resource @@ -38,7 +38,7 @@ Wait for notification Output Notification ${notification} ${notification_headers} Wait for notification RETURN ${notification} ${headers} -Wait for notification and validate it +Wait for CSource notification and validate it [Tags] actor_notification-receiver [Arguments] ... ${expected_subscription_id} -- GitLab