Skip to content

Commit 3f5b888

Browse files
authored
Merge pull request #3699 from albinsuresh/fix/clear-entity-twin-data-with-empty-message
fix: clear entity twin data in entity store with empty retained message
2 parents c440c03 + 38a6a0c commit 3f5b888

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

crates/core/tedge_agent/src/entity_manager/server.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ impl Server for EntityStoreServer {
149149
}
150150

151151
impl EntityStoreServer {
152-
async fn process_mqtt_message(&mut self, message: MqttMessage) {
152+
pub(crate) async fn process_mqtt_message(&mut self, message: MqttMessage) {
153153
if let Ok((topic_id, channel)) = self.mqtt_schema.entity_channel_of(&message.topic) {
154154
if let Channel::EntityMetadata = channel {
155155
self.process_entity_registration(topic_id, message.payload_bytes())
@@ -219,7 +219,11 @@ impl EntityStoreServer {
219219
}
220220

221221
if let Channel::EntityTwinData { fragment_key } = channel {
222-
let fragment_value = serde_json::from_slice(message.payload_bytes())?;
222+
let fragment_value = if message.payload().is_empty() {
223+
Value::Null
224+
} else {
225+
serde_json::from_slice(message.payload_bytes())?
226+
};
223227
let twin_message = EntityTwinMessage::new(topic_id, fragment_key, fragment_value);
224228
self.entity_store.update_twin_fragment(twin_message)?;
225229
}

crates/core/tedge_agent/src/entity_manager/tests.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use tedge_actors::Sender;
1818
use tedge_actors::Server;
1919
use tedge_api::entity::EntityMetadata;
2020
use tedge_api::entity::EntityType;
21+
use tedge_api::mqtt_topics::EntityTopicId;
2122
use tedge_mqtt_ext::test_helpers::assert_received_contains_str;
2223
use tedge_mqtt_ext::MqttConnection;
2324
use tedge_mqtt_ext::MqttConnector;
@@ -191,6 +192,27 @@ async fn delete_entity_tree_clears_entities_bottom_up() {
191192
.await;
192193
}
193194

195+
#[tokio::test]
196+
async fn clear_entity_twin_data() {
197+
let (mut entity_store, _mqtt_box, _mqtt_sender) = entity::server("device-under-test");
198+
199+
entity_store
200+
.process_mqtt_message(MqttMessage::from(("te/device/main///twin/x", "9")).with_retain())
201+
.await;
202+
let entity = entity_store
203+
.get(&"device/main//".parse::<EntityTopicId>().unwrap())
204+
.unwrap();
205+
assert_eq!(entity.twin_data.get("x"), Some(&9.into()));
206+
207+
entity_store
208+
.process_mqtt_message(MqttMessage::from(("te/device/main///twin/x", "")).with_retain())
209+
.await;
210+
let entity = entity_store
211+
.get(&"device/main//".parse::<EntityTopicId>().unwrap())
212+
.unwrap();
213+
assert_eq!(entity.twin_data.get("x"), None);
214+
}
215+
194216
proptest! {
195217
//#![proptest_config(proptest::prelude::ProptestConfig::with_cases(1000))]
196218
#[test]

0 commit comments

Comments
 (0)