@@ -15,7 +15,7 @@ use std::sync::atomic::{
1515 AtomicUsize , Ordering ,
1616} ;
1717use std:: sync:: { Arc , Weak as ArcWeak } ;
18- use std:: time:: { Duration , UNIX_EPOCH } ;
18+ use std:: time:: { Duration , SystemTime , UNIX_EPOCH } ;
1919
2020#[ cfg( target_arch = "x86_64" ) ]
2121use std:: sync:: atomic:: { AtomicI64 , AtomicU64 } ;
@@ -199,6 +199,19 @@ macro_rules! declare_error_tests {
199199 assert_de_tokens_error:: <$target>( $tokens, $expected) ;
200200 }
201201 ) +
202+ } ;
203+
204+ ( $(
205+ $( #[ $cfg: meta] ) *
206+ $name: ident<$target: ty> { $tokens: expr, $expected: expr, }
207+ ) +) => {
208+ $(
209+ $( #[ $cfg] ) *
210+ #[ test]
211+ fn $name( ) {
212+ assert_de_tokens_error:: <$target>( $tokens, $expected) ;
213+ }
214+ ) +
202215 }
203216}
204217
@@ -1614,4 +1627,35 @@ declare_error_tests! {
16141627 ] ,
16151628 "overflow deserializing Duration" ,
16161629 }
1630+ test_systemtime_overflow_seq<SystemTime > {
1631+ & [
1632+ Token :: Seq { len: Some ( 2 ) } ,
1633+ Token :: U64 ( u64 :: max_value( ) ) ,
1634+ Token :: U32 ( 1_000_000_000 ) ,
1635+ Token :: SeqEnd ,
1636+ ] ,
1637+ "overflow deserializing SystemTime epoch offset" ,
1638+ }
1639+ test_systemtime_overflow_struct<SystemTime > {
1640+ & [
1641+ Token :: Struct { name: "SystemTime" , len: 2 } ,
1642+ Token :: Str ( "secs_since_epoch" ) ,
1643+ Token :: U64 ( u64 :: max_value( ) ) ,
1644+
1645+ Token :: Str ( "nanos_since_epoch" ) ,
1646+ Token :: U32 ( 1_000_000_000 ) ,
1647+ Token :: StructEnd ,
1648+ ] ,
1649+ "overflow deserializing SystemTime epoch offset" ,
1650+ }
1651+ #[ cfg( systemtime_checked_add) ]
1652+ test_systemtime_overflow<SystemTime > {
1653+ & [
1654+ Token :: Seq { len: Some ( 2 ) } ,
1655+ Token :: U64 ( u64 :: max_value( ) ) ,
1656+ Token :: U32 ( 0 ) ,
1657+ Token :: SeqEnd ,
1658+ ] ,
1659+ "overflow deserializing SystemTime" ,
1660+ }
16171661}
0 commit comments