Skip to content

Commit ed93ef7

Browse files
committed
test(rivetkit-core): cover sleep/destroy guards and prevent_sleep no-op
1 parent e4395f8 commit ed93ef7

1 file changed

Lines changed: 87 additions & 0 deletions

File tree

  • rivetkit-rust/packages/rivetkit-core/src/actor

rivetkit-rust/packages/rivetkit-core/src/actor/sleep.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)