From bbc7470dc555a532f7fa9cbbd139ef63a5308beb Mon Sep 17 00:00:00 2001
From: Nick Mathewson <nickm@torproject.org>
Date: Wed, 25 May 2022 11:43:09 -0400
Subject: [PATCH] More tests for ClockSkew.

---
 crates/tor-proto/src/util/skew.rs | 40 +++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/crates/tor-proto/src/util/skew.rs b/crates/tor-proto/src/util/skew.rs
index f423a92e12..35a98abb27 100644
--- a/crates/tor-proto/src/util/skew.rs
+++ b/crates/tor-proto/src/util/skew.rs
@@ -145,6 +145,8 @@ impl PartialOrd for ClockSkew {
 
 #[cfg(test)]
 mod test {
+    #![allow(clippy::unwrap_used)]
+
     use super::*;
 
     #[test]
@@ -175,4 +177,42 @@ mod test {
         );
         assert_eq!(skew, ClockSkew::None);
     }
+
+    #[test]
+    fn from_f64() {
+        use ClockSkew as CS;
+        use Duration as D;
+
+        assert_eq!(CS::from_secs_f64(0.0), Some(CS::None));
+        assert_eq!(CS::from_secs_f64(f64::MIN_POSITIVE / 2.0), Some(CS::None)); // subnormal
+        assert_eq!(CS::from_secs_f64(1.0), Some(CS::None));
+        assert_eq!(CS::from_secs_f64(-1.0), Some(CS::None));
+        assert_eq!(CS::from_secs_f64(3.0), Some(CS::Fast(D::from_secs(3))));
+        assert_eq!(CS::from_secs_f64(-3.0), Some(CS::Slow(D::from_secs(3))));
+
+        assert_eq!(CS::from_secs_f64(1.0e100), Some(CS::Fast(D::MAX)));
+        assert_eq!(CS::from_secs_f64(-1.0e100), Some(CS::Slow(D::MAX)));
+
+        assert_eq!(CS::from_secs_f64(f64::NAN), None);
+        assert_eq!(CS::from_secs_f64(f64::INFINITY), Some(CS::Fast(D::MAX)));
+        assert_eq!(CS::from_secs_f64(f64::NEG_INFINITY), Some(CS::Slow(D::MAX)));
+    }
+
+    #[test]
+    fn order() {
+        use rand::seq::SliceRandom as _;
+        use ClockSkew as CS;
+        let sorted: Vec<ClockSkew> = vec![-10.0, -5.0, 0.0, 0.0, 10.0, 20.0]
+            .into_iter()
+            .map(|n| CS::from_secs_f64(n).unwrap())
+            .collect();
+
+        let mut rng = rand::thread_rng();
+        let mut v = sorted.clone();
+        for _ in 0..100 {
+            v.shuffle(&mut rng);
+            v.sort();
+            assert_eq!(v, sorted);
+        }
+    }
 }
-- 
GitLab