diff --git a/server/src/subscriptions/subscription.rs b/server/src/subscriptions/subscription.rs index 74a2eb92b..b22836a08 100644 --- a/server/src/subscriptions/subscription.rs +++ b/server/src/subscriptions/subscription.rs @@ -222,6 +222,10 @@ impl Subscription { if !address_space.node_exists(&item_to_create.item_to_monitor.node_id) { Self::monitored_item_create_error(StatusCode::BadNodeIdUnknown) } else { + + // TODO validate the attribute id for the type of node + // TODO validate the index range for the node + // Create a monitored item, if possible let monitored_item_id = self.next_monitored_item_id; match MonitoredItem::new(now, monitored_item_id, timestamps_to_return, item_to_create) { diff --git a/server/src/tests/services/monitored_item.rs b/server/src/tests/services/monitored_item.rs index 99172d0ce..d742552e3 100644 --- a/server/src/tests/services/monitored_item.rs +++ b/server/src/tests/services/monitored_item.rs @@ -405,6 +405,30 @@ fn monitored_item_event_filter() { assert_eq!(monitored_item.tick(&now, &address_space, false, false), TickResult::NoChange); } +/// Test to ensure create monitored items returns an error for an unknown node id +#[test] +fn unknown_node_id() { + do_subscription_service_test(|server_state, session, address_space, ss: SubscriptionService, mis: MonitoredItemService| { + // Create subscription + let subscription_id = { + let request = create_subscription_request(0, 0); + let response: CreateSubscriptionResponse = supported_message_as!(ss.create_subscription(server_state, session, &request).unwrap(), CreateSubscriptionResponse); + response.subscription_id + }; + + let request = create_monitored_items_request(subscription_id, vec![ + NodeId::new(1, var_name(1)), + NodeId::new(99, "Doesn't exist") + ]); + + let response: CreateMonitoredItemsResponse = supported_message_as!(mis.create_monitored_items(server_state, session, &address_space, &request).unwrap(), CreateMonitoredItemsResponse); + let results = response.results.unwrap(); + assert_eq!(results.len(), 2); + assert_eq!(results.get(0).as_ref().unwrap().status_code, StatusCode::Good); + assert_eq!(results.get(1).as_ref().unwrap().status_code, StatusCode::BadNodeIdUnknown); + }); +} + #[test] fn monitored_item_triggers() { do_subscription_service_test(|server_state, session, address_space, ss: SubscriptionService, mis: MonitoredItemService| {