diff --git a/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_02.robot b/TP/NGSI-LD/ContextSource/RegistrationSubscription/ContextSourceRegistrationSubscriptionNotificationBehaviour/047_02.robot index 8b7866e0e0fa56aba910057a95a6590f9b035378..36309b3904d27ced2663215d23d9056a3d3c6253 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 aba0140ad1ee1d5d801849c59126b76322de8e42..6c6880410601ca1d431454c58a9894bce1132313 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 596b6123e9d45ddef7e1f45811d76ea8567e65a8..b69e9bcf8e8fb9ee3a503dfd09a76f41ef98e308 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 339e067d6de0839c8a757b62133f7792c3462425..9f66b6cac4b91ff895f1412e956e82ce111ed867 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 40edd77fa6bf929ecdb033b8d4e739825c11cec6..10cba3d44275d845002ab502c95b3dc0f8249dd8 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 4d14cd60ae50bf07b9411f50bd73def87c3d8852..00dbe4d0713e0cace8fb5717e4e87dabb4d9c711 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 f94d450fa90228268f43ce9c80fd65509638396d..826c1a8694245e648fc46945f7785d295a165d45 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 b957620c152fd39faae92ae274a4f9c25f9ff4ef..8c363c09acca5a9ceb80bbc502fae7cb5acc5345 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 5645f358b37e81b5032280c5e9ebb91d8b1e5184..3b0a293584daf2d1187273e39964be903f5917d2 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 4914bd29b504b0282255a86504788dfe2db55381..0f075e227e9db093b6602bb1971dbdf8310a091b 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 625b596526512130558fdc39546ef5971a4fa4a4..ef9a19395353f70a07bfa65cf72285869e9e8f59 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 25d00cc5613cb4a68b4f13d352d55ba530e509c1..722b59a5a24f6ab4267a8470a4b0310df99d087b 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 56d3bc42d1489ecf181ebe727e501533fd19d6f6..d8da0f9cfc784103ea2b37fff929d6e662d723ed 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 *** @@ -40,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} @@ -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 1f40798fc107cb19cc3ac2f46ed4768284c94690..1c9783dac0400ef8b2654e64affc409bb53f02bc 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).