summaryrefslogtreecommitdiffstats
path: root/tokio/tests/test_clock.rs
diff options
context:
space:
mode:
authorTudor Sidea <tudor.sidea@gmail.com>2020-03-24 07:20:07 +0200
committerGitHub <noreply@github.com>2020-03-23 22:20:07 -0700
commit57ba37c97854d32e691ea68006c8d69d58c79b23 (patch)
tree4aa882464266a2f763f7401407b12d4bf6613283 /tokio/tests/test_clock.rs
parentacf8a7da7a64bf08d578db9a9836a8e061765314 (diff)
time: fix repeated pause/resume of time (#2253)
The resume function was breaking the guarantee that Instants should never be less than any previously measured Instants when created. Altered the pause and resume function such that they will not break this guarantee. After resume, the time should continue from where it left off. Created test to prove that the advanced function still works as expected. Added additional tests for the pause/advance/resume functions.
Diffstat (limited to 'tokio/tests/test_clock.rs')
-rw-r--r--tokio/tests/test_clock.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/tokio/tests/test_clock.rs b/tokio/tests/test_clock.rs
new file mode 100644
index 00000000..891636fd
--- /dev/null
+++ b/tokio/tests/test_clock.rs
@@ -0,0 +1,50 @@
+#![warn(rust_2018_idioms)]
+#![cfg(feature = "full")]
+
+use tokio::time::{self, Duration, Instant};
+
+#[tokio::test]
+async fn resume_lets_time_move_forward_instead_of_resetting_it() {
+ let start = Instant::now();
+ time::pause();
+ time::advance(Duration::from_secs(10)).await;
+ let advanced_by_ten_secs = Instant::now();
+ assert!(advanced_by_ten_secs - start > Duration::from_secs(10));
+ assert!(advanced_by_ten_secs - start < Duration::from_secs(11));
+ time::resume();
+ assert!(advanced_by_ten_secs < Instant::now());
+ assert!(Instant::now() - advanced_by_ten_secs < Duration::from_secs(1));
+}
+
+#[tokio::test]
+async fn can_pause_after_resume() {
+ let start = Instant::now();
+ time::pause();
+ time::advance(Duration::from_secs(10)).await;
+ time::resume();
+ time::pause();
+ time::advance(Duration::from_secs(10)).await;
+ assert!(Instant::now() - start > Duration::from_secs(20));
+ assert!(Instant::now() - start < Duration::from_secs(21));
+}
+
+#[tokio::test]
+#[should_panic]
+async fn freezing_time_while_frozen_panics() {
+ time::pause();
+ time::pause();
+}
+
+#[tokio::test]
+#[should_panic]
+async fn advancing_time_when_time_is_not_frozen_panics() {
+ time::advance(Duration::from_secs(1)).await;
+}
+
+#[tokio::test]
+#[should_panic]
+async fn resuming_time_when_not_frozen_panics() {
+ time::pause();
+ time::resume();
+ time::resume();
+}