Skip to content

Commit 34123ea

Browse files
author
Alan Jeffrey
committed
Added unit test for reentrancy.
1 parent ebede24 commit 34123ea

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

src/test.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ use ipc::{self, IpcOneShotServer, IpcReceiver, IpcReceiverSet, IpcSender, IpcSha
1111
use ipc::{OpaqueIpcSender};
1212
use router::ROUTER;
1313
use libc;
14+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
15+
use std::cell::RefCell;
1416
use std::io::Error;
1517
use std::iter;
1618
use std::ptr;
@@ -384,3 +386,40 @@ fn test_so_linger() {
384386
};
385387
assert_eq!(val, 42);
386388
}
389+
390+
#[derive(Clone, Debug, Eq, PartialEq)]
391+
struct HasWeirdSerializer (Option<String>);
392+
393+
thread_local! { static WEIRD_CHANNEL: RefCell<Option<IpcSender<HasWeirdSerializer>>> = RefCell::new(None) }
394+
395+
impl Serialize for HasWeirdSerializer {
396+
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
397+
where S: Serializer
398+
{
399+
if self.0.is_some() {
400+
WEIRD_CHANNEL.with(|chan| { chan.borrow().as_ref().unwrap().send(HasWeirdSerializer(None)).unwrap(); });
401+
}
402+
self.0.serialize(serializer)
403+
}
404+
}
405+
406+
impl Deserialize for HasWeirdSerializer {
407+
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
408+
where D: Deserializer
409+
{
410+
Ok(HasWeirdSerializer(try!(Deserialize::deserialize(deserializer))))
411+
}
412+
}
413+
414+
#[test]
415+
fn test_reentrant() {
416+
let null = HasWeirdSerializer(None);
417+
let hello = HasWeirdSerializer(Some(String::from("hello")));
418+
let (sender, receiver) = ipc::channel().unwrap();
419+
WEIRD_CHANNEL.with(|chan| { *chan.borrow_mut() = Some(sender.clone()); });
420+
sender.send(hello.clone()).unwrap();
421+
assert_eq!(null, receiver.recv().unwrap());
422+
assert_eq!(hello, receiver.recv().unwrap());
423+
sender.send(null.clone()).unwrap();
424+
assert_eq!(null, receiver.recv().unwrap());
425+
}

0 commit comments

Comments
 (0)