From c380078bf45fcebe1af6299d75539cd6ba37f7d3 Mon Sep 17 00:00:00 2001 From: Jim Crossley Date: Mon, 26 Sep 2022 12:14:57 -0400 Subject: [PATCH] Fix off-by-one bug in Event serializer (#191) Fixes #189 Added breaking tests for both V03 and V10 to confirm bug and changed the logic slightly to clarify intent Signed-off-by: Jim Crossley --- Cargo.toml | 1 + src/event/message.rs | 14 ++++++++++++++ src/event/v03/format.rs | 23 +++++++++++++---------- src/event/v10/format.rs | 26 +++++++++++++------------- 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 60148af..3fe6432 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -69,6 +69,7 @@ rstest = "0.6" claim = "0.3.1" version-sync = "0.9.2" serde_yaml = "0.8" +rmp-serde = "1" # runtime dev-deps actix-rt = { version = "^2" } diff --git a/src/event/message.rs b/src/event/message.rs index 240b741..1ad1d17 100644 --- a/src/event/message.rs +++ b/src/event/message.rs @@ -199,6 +199,13 @@ mod tests { Ok(()) } + #[test] + fn message_v03_msgpack() { + let buff = rmp_serde::to_vec(&fixtures::v03::full_json_data()).unwrap(); + let event = rmp_serde::from_slice::(buff.as_slice()).unwrap(); + assert_eq!(event, fixtures::v03::full_json_data(),); + } + #[test] fn message_v10_roundtrip_structured() -> Result<()> { assert_eq!( @@ -231,4 +238,11 @@ mod tests { ); Ok(()) } + + #[test] + fn message_v10_msgpack() { + let buff = rmp_serde::to_vec(&fixtures::v10::full_json_data()).unwrap(); + let event = rmp_serde::from_slice::(buff.as_slice()).unwrap(); + assert_eq!(event, fixtures::v10::full_json_data(),); + } } diff --git a/src/event/v03/format.rs b/src/event/v03/format.rs index 542b8de..aa553de 100644 --- a/src/event/v03/format.rs +++ b/src/event/v03/format.rs @@ -68,16 +68,19 @@ impl crate::event::format::EventFormatSerializer, serializer: S, ) -> Result<::Ok, ::Error> { - let num = - 3 + if attributes.datacontenttype.is_some() { - 1 - } else { - 0 - } + if attributes.schemaurl.is_some() { 1 } else { 0 } - + if attributes.subject.is_some() { 1 } else { 0 } - + if attributes.time.is_some() { 1 } else { 0 } - + if data.is_some() { 1 } else { 0 } - + extensions.len(); + let num = 4 + + [ + attributes.datacontenttype.is_some(), + attributes.schemaurl.is_some(), + attributes.subject.is_some(), + attributes.time.is_some(), + data.is_some(), + ] + .iter() + .filter(|&b| *b) + .count() + + extensions.len(); + let mut state = serializer.serialize_map(Some(num))?; state.serialize_entry("specversion", "0.3")?; state.serialize_entry("id", &attributes.id)?; diff --git a/src/event/v10/format.rs b/src/event/v10/format.rs index 11f4f47..f7874a1 100644 --- a/src/event/v10/format.rs +++ b/src/event/v10/format.rs @@ -69,19 +69,19 @@ impl crate::event::format::EventFormatSerializer, serializer: S, ) -> Result<::Ok, ::Error> { - let num = - 3 + if attributes.datacontenttype.is_some() { - 1 - } else { - 0 - } + if attributes.dataschema.is_some() { - 1 - } else { - 0 - } + if attributes.subject.is_some() { 1 } else { 0 } - + if attributes.time.is_some() { 1 } else { 0 } - + if data.is_some() { 1 } else { 0 } - + extensions.len(); + let num = 4 + + [ + attributes.datacontenttype.is_some(), + attributes.dataschema.is_some(), + attributes.subject.is_some(), + attributes.time.is_some(), + data.is_some(), + ] + .iter() + .filter(|&b| *b) + .count() + + extensions.len(); + let mut state = serializer.serialize_map(Some(num))?; state.serialize_entry("specversion", "1.0")?; state.serialize_entry("id", &attributes.id)?;