#![ cfg(not( target_arch = "wasm32" )) ]
mod common;
use
{
common :: { actors::*, import::* } ,
std :: { panic::AssertUnwindSafe } ,
};
#[async_std::test]
async fn mb_closed() -> Result<(), DynError >
{
let (mut addr, mb) = Addr::builder( "mb_closed" ).build();
let (trigger_tx, trigger_rx) = oneshot::channel();
let mb_task = async move
{
mb.start( Sum(5) ).await;
trigger_tx.send(()).expect( "send trigger" );
};
let mb_handle = AsyncStd.spawn_handle( mb_task )?;
addr.call( Add(10) ).await?;
drop( mb_handle );
assert!( trigger_rx.await.is_err() );
match addr.send( Add(10) ).await
{
Ok (_) => panic!( "Addr::send should fail" ),
Err(e) => match e
{
ThesErr::MailboxClosed{..} => {}
_ => panic!( "Wrong error returned: {:?}", e ),
}
}
Ok(())
}
#[ derive( Actor ) ] struct Panic;
struct Void;
impl Message for Void { type Return = (); }
impl Handler<Void> for Panic
{
fn handle( &mut self, _: Void ) -> Return<'_, ()>
{
panic!();
}
}
#[async_std::test]
async fn mb_closed_before_response() -> Result<(), DynError >
{
let (mut addr, mb) = Addr::builder( "mb_closed_before_response" ).build();
let mb_task = async move
{
let _ = AssertUnwindSafe( mb.start( Panic ) ).catch_unwind().await;
};
AsyncStd.spawn( mb_task )?;
match addr.call( Void ).await
{
Ok (_) => panic!( "Call should fail" ),
Err(e) => match e
{
ThesErr::ActorStoppedBeforeResponse{..} => {}
_ => panic!( "Wrong error returned: {:?}", e ),
}
}
Ok(())
}