@@ -556,6 +556,7 @@ mod tests {
556556 use std:: sync:: Arc ;
557557 use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
558558
559+ use super :: CanSleep ;
559560 use crate :: actor:: context:: ActorContext ;
560561 use parking_lot:: Mutex as DropMutex ;
561562 use rivet_util:: async_counter:: AsyncCounter ;
@@ -840,4 +841,90 @@ mod tests {
840841 yield_now ( ) . await ;
841842 assert ! ( waiter. await . expect( "websocket idle waiter should join" ) ) ;
842843 }
844+
845+ #[ tokio:: test( start_paused = true ) ]
846+ async fn sleep_before_started_errors_with_actor_starting ( ) {
847+ let ctx = ActorContext :: new_for_sleep_tests ( "actor-sleep-before-started" ) ;
848+
849+ let err = ctx
850+ . sleep ( )
851+ . expect_err ( "sleep should fail before started is set" ) ;
852+ let rivet_err = rivet_error:: RivetError :: extract ( & err) ;
853+ assert_eq ! ( rivet_err. group( ) , "actor" ) ;
854+ assert_eq ! ( rivet_err. code( ) , "starting" ) ;
855+ }
856+
857+ #[ tokio:: test( start_paused = true ) ]
858+ async fn destroy_before_started_errors_with_actor_starting ( ) {
859+ let ctx = ActorContext :: new_for_sleep_tests ( "actor-destroy-before-started" ) ;
860+
861+ let err = ctx
862+ . destroy ( )
863+ . expect_err ( "destroy should fail before started is set" ) ;
864+ let rivet_err = rivet_error:: RivetError :: extract ( & err) ;
865+ assert_eq ! ( rivet_err. group( ) , "actor" ) ;
866+ assert_eq ! ( rivet_err. code( ) , "starting" ) ;
867+ }
868+
869+ #[ tokio:: test( start_paused = true ) ]
870+ async fn double_sleep_errors_with_actor_stopping ( ) {
871+ let ctx = ActorContext :: new_for_sleep_tests ( "actor-double-sleep" ) ;
872+ ctx. set_sleep_started ( true ) ;
873+
874+ ctx. sleep ( )
875+ . expect ( "first sleep call should be accepted after startup" ) ;
876+
877+ let err = ctx
878+ . sleep ( )
879+ . expect_err ( "second sleep call should fail as already requested" ) ;
880+ let rivet_err = rivet_error:: RivetError :: extract ( & err) ;
881+ assert_eq ! ( rivet_err. group( ) , "actor" ) ;
882+ assert_eq ! ( rivet_err. code( ) , "stopping" ) ;
883+ }
884+
885+ #[ tokio:: test( start_paused = true ) ]
886+ async fn double_destroy_errors_with_actor_stopping ( ) {
887+ let ctx = ActorContext :: new_for_sleep_tests ( "actor-double-destroy" ) ;
888+ ctx. set_sleep_started ( true ) ;
889+
890+ ctx. destroy ( )
891+ . expect ( "first destroy call should be accepted after startup" ) ;
892+
893+ let err = ctx
894+ . destroy ( )
895+ . expect_err ( "second destroy call should fail as already requested" ) ;
896+ let rivet_err = rivet_error:: RivetError :: extract ( & err) ;
897+ assert_eq ! ( rivet_err. group( ) , "actor" ) ;
898+ assert_eq ! ( rivet_err. code( ) , "stopping" ) ;
899+ }
900+
901+ #[ tokio:: test( start_paused = true ) ]
902+ #[ allow( deprecated) ]
903+ async fn set_prevent_sleep_is_a_deprecated_noop ( ) {
904+ let ctx = ActorContext :: new_for_sleep_tests ( "actor-prevent-sleep-noop" ) ;
905+ ctx. set_sleep_started ( true ) ;
906+ ctx. set_ready ( true ) ;
907+
908+ ctx. set_prevent_sleep ( true ) ;
909+ assert ! (
910+ !ctx. prevent_sleep( ) ,
911+ "prevent_sleep must stay false because the stub is a no-op"
912+ ) ;
913+ // The sleep predicate ignores prevent_sleep entirely.
914+ assert_eq ! ( ctx. can_sleep( ) . await , CanSleep :: Yes ) ;
915+
916+ ctx. set_prevent_sleep ( false ) ;
917+ assert_eq ! ( ctx. can_sleep( ) . await , CanSleep :: Yes ) ;
918+ }
919+
920+ #[ tokio:: test( start_paused = true ) ]
921+ async fn shutdown_deadline_token_cancels_on_request ( ) {
922+ let ctx = ActorContext :: new_for_sleep_tests ( "actor-shutdown-deadline" ) ;
923+
924+ let token = ctx. shutdown_deadline_token ( ) ;
925+ assert ! ( !token. is_cancelled( ) ) ;
926+
927+ ctx. cancel_shutdown_deadline ( ) ;
928+ assert ! ( token. is_cancelled( ) ) ;
929+ }
843930}
0 commit comments