From 11bd969f66b1227c2394d0c30589d87284cf4a3e Mon Sep 17 00:00:00 2001 From: BratSinot Date: Mon, 15 Nov 2021 23:18:10 +0300 Subject: [PATCH 1/3] Use serde_test for unit test instead of serde_json. --- Cargo.lock | 11 ++- Cargo.toml | 2 +- src/serde.rs | 189 +++++++++++++++++++++++++++++---------------------- 3 files changed, 117 insertions(+), 85 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c485a2e..6b198a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,7 +22,7 @@ dependencies = [ "proptest", "serde", "serde_derive", - "serde_json", + "serde_test", ] [[package]] @@ -672,6 +672,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_test" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82178225dbdeae2d5d190e8649287db6a3a32c6d24da22ae3146325aa353e4c" +dependencies = [ + "serde", +] + [[package]] name = "smallvec" version = "1.5.1" diff --git a/Cargo.toml b/Cargo.toml index 09ad7d9..844bea8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ once_cell = "~1" parking_lot = "~0.11" proptest = "~0.10" serde_derive = "1.0.130" -serde_json = "1.0.69" +serde_test = "1.0.130" [profile.bench] debug = true diff --git a/src/serde.rs b/src/serde.rs index e993fa1..dcdacf1 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -23,113 +23,136 @@ where #[cfg(test)] mod tests { - use crate::{ArcSwap, ArcSwapOption}; + use crate::{ArcSwap, ArcSwapAny, ArcSwapOption, RefCnt}; + use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_derive::{Deserialize, Serialize}; + use serde_test::{assert_tokens, Token}; + use std::sync::Arc; + + #[derive(Debug)] + struct ArcSwapAnyEq(ArcSwapAny); + impl PartialEq for ArcSwapAnyEq { + fn eq(&self, other: &Self) -> bool { + self.0.load().eq(&other.0.load()) + } + } + impl Eq for ArcSwapAnyEq {} + impl Serialize for ArcSwapAnyEq { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.0.load().serialize(serializer) + } + } + impl<'de, T: RefCnt + Deserialize<'de>> Deserialize<'de> for ArcSwapAnyEq { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let inner = T::deserialize(deserializer)?; + Ok(Self(ArcSwapAny::new(inner))) + } + } - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] + #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] struct Foo { field0: usize, field1: String, } - #[derive(Debug, Serialize, Deserialize)] + #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] struct Bar { - field0: ArcSwap, - field1: ArcSwapOption, + field0: ArcSwapAnyEq>, + field1: ArcSwapAnyEq>>, } #[test] - fn test_serialize() { + fn test_serialize_deserialize() { + let field0 = usize::MAX; + let field1 = "FOO_-0123456789"; + let data_orig = Foo { - field0: usize::MAX, - field1: format!("FOO_{}", i128::MIN), + field0, + field1: field1.to_string(), }; - let data = ArcSwap::from_pointee(data_orig.clone()); - let data_str = serde_json::to_string(&data).unwrap(); - let data_deser = serde_json::from_str::(&data_str).unwrap(); - assert_eq!(data_deser, data_orig); - - let data_orig = Bar { - field0: ArcSwap::from_pointee(usize::MAX), - field1: ArcSwapOption::from_pointee(format!("FOO_{}", i128::MIN)), + let data = ArcSwapAnyEq(ArcSwap::from_pointee(data_orig)); + assert_tokens( + &data, + &[ + Token::Struct { + name: "Foo", + len: 2, + }, + Token::Str("field0"), + #[cfg(target_pointer_width = "32")] + Token::U32(u32::MAX), + #[cfg(target_pointer_width = "64")] + Token::U64(u64::MAX), + Token::Str("field1"), + Token::String(field1), + Token::StructEnd, + ], + ); + + let data = Bar { + field0: ArcSwapAnyEq(ArcSwap::from_pointee(field0)), + field1: ArcSwapAnyEq(ArcSwapOption::from_pointee(field1.to_string())), }; - let data_str = serde_json::to_string(&data_orig).unwrap(); - let data_deser = serde_json::from_str::(&data_str).unwrap(); - assert_eq!(data_deser.field0.load_full(), data_orig.field0.load_full()); - assert_eq!(data_deser.field1.load_full(), data_orig.field1.load_full()); - - let data_orig = Bar { - field0: ArcSwap::from_pointee(usize::MAX), - field1: ArcSwapOption::from_pointee(None), - }; - let data_str = serde_json::to_string(&data_orig).unwrap(); - let data_deser = serde_json::from_str::(&data_str).unwrap(); - assert_eq!(data_deser.field0.load_full(), data_orig.field0.load_full()); - assert_eq!(data_deser.field1.load_full(), data_orig.field1.load_full()); + assert_tokens( + &data, + &[ + Token::Struct { + name: "Bar", + len: 2, + }, + Token::Str("field0"), + #[cfg(target_pointer_width = "32")] + Token::U32(u32::MAX), + #[cfg(target_pointer_width = "64")] + Token::U64(u64::MAX), + Token::Str("field1"), + Token::Some, + Token::String(field1), + Token::StructEnd, + ], + ); } #[test] - fn test_deserialize() { + fn test_serialize_deserialize_option() { let field0 = usize::MAX; - let field1 = format!("FOO_{}", usize::MIN); - - let str = format!(r#"{{"field0":{},"field1":"{}"}}"#, field0, field1); - let data = serde_json::from_str::>(&str).unwrap(); - assert_eq!(data.load().field0, field0); - assert_eq!(data.load().field1, field1); - - let str = format!(r#"{{"field0":{},"field1":"{}"}}"#, field0, field1); - let data = serde_json::from_str::(&str).unwrap(); - assert_eq!(data.field0.load_full().as_ref(), &field0); - assert_eq!(data.field1.load_full().as_deref(), Some(&field1)); + let field1 = "FOO_-0123456789"; - let str = format!(r#"{{"field0":{}}}"#, field0); - let data = serde_json::from_str::(&str).unwrap(); - assert_eq!(data.field0.load_full().as_ref(), &field0); - assert_eq!(data.field1.load_full().as_deref(), None); - } - - #[test] - fn test_serialize_option() { let data_orig = Foo { - field0: usize::MAX, - field1: format!("FOO_{}", i128::MIN), + field0, + field1: field1.to_string(), }; - let data = ArcSwapOption::from_pointee(data_orig.clone()); - - let data_str = serde_json::to_string(&data).unwrap(); - let data_deser = serde_json::from_str::(&data_str).unwrap(); - - assert_eq!(data_deser, data_orig); - } - - #[test] - fn test_deserialize_option() { - let field0 = usize::MAX; - let field1 = format!("FOO_{}", usize::MIN); - - let str = format!(r#"{{"field0":{},"field1":"{}"}}"#, field0, field1); - let data = serde_json::from_str::>(&str).unwrap(); - - assert_eq!(data.load_full().unwrap().field0, field0); - assert_eq!(data.load_full().unwrap().field1, field1); - } - - #[test] - fn test_serialize_option_none() { - let data = ArcSwapOption::::from_pointee(None); - - let data_str = serde_json::to_string(&data).unwrap(); - let data_deser = serde_json::from_str::>(&data_str).unwrap(); - - assert_eq!(data_deser, None); + let data = ArcSwapAnyEq(ArcSwapOption::from_pointee(data_orig)); + assert_tokens( + &data, + &[ + Token::Some, + Token::Struct { + name: "Foo", + len: 2, + }, + Token::Str("field0"), + #[cfg(target_pointer_width = "32")] + Token::U32(u32::MAX), + #[cfg(target_pointer_width = "64")] + Token::U64(u64::MAX), + Token::Str("field1"), + Token::String(field1), + Token::StructEnd, + ], + ); } #[test] - fn test_deserialize_option_none() { - let str = "null"; - let data = serde_json::from_str::>(str).unwrap(); + fn test_serialize_deserialize_option_none() { + let data = ArcSwapAnyEq(ArcSwapOption::::from_pointee(None)); - assert_eq!(data.load_full(), None); + assert_tokens(&data, &[Token::None]); } } From 9edcb621d3e9593de4a5e8cd4b3824bf80760334 Mon Sep 17 00:00:00 2001 From: BratSinot Date: Mon, 15 Nov 2021 23:33:03 +0300 Subject: [PATCH 2/3] Add usize target_pointer_width = "16". --- src/serde.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/serde.rs b/src/serde.rs index dcdacf1..f925a39 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -85,6 +85,8 @@ mod tests { len: 2, }, Token::Str("field0"), + #[cfg(target_pointer_width = "16")] + Token::U16(u16::MAX), #[cfg(target_pointer_width = "32")] Token::U32(u32::MAX), #[cfg(target_pointer_width = "64")] @@ -107,6 +109,8 @@ mod tests { len: 2, }, Token::Str("field0"), + #[cfg(target_pointer_width = "16")] + Token::U16(u16::MAX), #[cfg(target_pointer_width = "32")] Token::U32(u32::MAX), #[cfg(target_pointer_width = "64")] @@ -138,6 +142,8 @@ mod tests { len: 2, }, Token::Str("field0"), + #[cfg(target_pointer_width = "16")] + Token::U16(u16::MAX), #[cfg(target_pointer_width = "32")] Token::U32(u32::MAX), #[cfg(target_pointer_width = "64")] From e4004c36a421559178e2398537d8cda05796334a Mon Sep 17 00:00:00 2001 From: BratSinot Date: Sat, 27 Nov 2021 19:55:15 +0200 Subject: [PATCH 3/3] Simplify serde tests. --- src/serde.rs | 44 ++++++-------------------------------------- 1 file changed, 6 insertions(+), 38 deletions(-) diff --git a/src/serde.rs b/src/serde.rs index f925a39..95ecf3f 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -24,12 +24,12 @@ where #[cfg(test)] mod tests { use crate::{ArcSwap, ArcSwapAny, ArcSwapOption, RefCnt}; - use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_derive::{Deserialize, Serialize}; use serde_test::{assert_tokens, Token}; use std::sync::Arc; - #[derive(Debug)] + #[derive(Debug, Serialize, Deserialize)] + #[serde(transparent)] struct ArcSwapAnyEq(ArcSwapAny); impl PartialEq for ArcSwapAnyEq { fn eq(&self, other: &Self) -> bool { @@ -37,39 +37,22 @@ mod tests { } } impl Eq for ArcSwapAnyEq {} - impl Serialize for ArcSwapAnyEq { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - self.0.load().serialize(serializer) - } - } - impl<'de, T: RefCnt + Deserialize<'de>> Deserialize<'de> for ArcSwapAnyEq { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let inner = T::deserialize(deserializer)?; - Ok(Self(ArcSwapAny::new(inner))) - } - } #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] struct Foo { - field0: usize, + field0: u64, field1: String, } #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] struct Bar { - field0: ArcSwapAnyEq>, + field0: ArcSwapAnyEq>, field1: ArcSwapAnyEq>>, } #[test] fn test_serialize_deserialize() { - let field0 = usize::MAX; + let field0 = u64::MAX; let field1 = "FOO_-0123456789"; let data_orig = Foo { @@ -85,11 +68,6 @@ mod tests { len: 2, }, Token::Str("field0"), - #[cfg(target_pointer_width = "16")] - Token::U16(u16::MAX), - #[cfg(target_pointer_width = "32")] - Token::U32(u32::MAX), - #[cfg(target_pointer_width = "64")] Token::U64(u64::MAX), Token::Str("field1"), Token::String(field1), @@ -109,11 +87,6 @@ mod tests { len: 2, }, Token::Str("field0"), - #[cfg(target_pointer_width = "16")] - Token::U16(u16::MAX), - #[cfg(target_pointer_width = "32")] - Token::U32(u32::MAX), - #[cfg(target_pointer_width = "64")] Token::U64(u64::MAX), Token::Str("field1"), Token::Some, @@ -125,7 +98,7 @@ mod tests { #[test] fn test_serialize_deserialize_option() { - let field0 = usize::MAX; + let field0 = u64::MAX; let field1 = "FOO_-0123456789"; let data_orig = Foo { @@ -142,11 +115,6 @@ mod tests { len: 2, }, Token::Str("field0"), - #[cfg(target_pointer_width = "16")] - Token::U16(u16::MAX), - #[cfg(target_pointer_width = "32")] - Token::U32(u32::MAX), - #[cfg(target_pointer_width = "64")] Token::U64(u64::MAX), Token::Str("field1"), Token::String(field1),