webauthn_rp

WebAuthn RP library.
git clone https://git.philomathiclife.com/repos/webauthn_rp
Log | Files | Refs | README

tests.rs (2469B)


      1 use super::{Equivalent, Insert, InsertRemoveExpired, MaxLenHashMap, TimedCeremony};
      2 use core::hash::{Hash, Hasher};
      3 #[cfg(not(feature = "serializable_server_state"))]
      4 use std::time::Instant;
      5 #[cfg(feature = "serializable_server_state")]
      6 use std::time::SystemTime;
      7 #[derive(Clone, Copy)]
      8 struct Ceremony {
      9     id: usize,
     10     #[cfg(not(feature = "serializable_server_state"))]
     11     exp: Instant,
     12     #[cfg(feature = "serializable_server_state")]
     13     exp: SystemTime,
     14 }
     15 impl Default for Ceremony {
     16     fn default() -> Self {
     17         Self {
     18             id: 0,
     19             #[cfg(not(feature = "serializable_server_state"))]
     20             exp: Instant::now(),
     21             #[cfg(feature = "serializable_server_state")]
     22             exp: SystemTime::now(),
     23         }
     24     }
     25 }
     26 impl PartialEq for Ceremony {
     27     fn eq(&self, other: &Self) -> bool {
     28         self.id == other.id
     29     }
     30 }
     31 impl Eq for Ceremony {}
     32 impl Hash for Ceremony {
     33     fn hash<H: Hasher>(&self, state: &mut H) {
     34         self.id.hash(state);
     35     }
     36 }
     37 impl TimedCeremony for Ceremony {
     38     #[cfg(not(feature = "serializable_server_state"))]
     39     fn expiration(&self) -> Instant {
     40         self.exp
     41     }
     42     #[cfg(feature = "serializable_server_state")]
     43     fn expiration(&self) -> SystemTime {
     44         self.exp
     45     }
     46 }
     47 impl Equivalent<Ceremony> for usize {
     48     #[inline]
     49     fn equivalent(&self, key: &Ceremony) -> bool {
     50         *self == key.id
     51     }
     52 }
     53 #[test]
     54 fn hash_map_insert_removed() {
     55     const REQ_MAX_LEN: usize = 8;
     56     let mut map = MaxLenHashMap::new(REQ_MAX_LEN);
     57     let cap = map.as_ref().capacity();
     58     let max_len = map.max_len();
     59     assert_eq!(cap >> 1u8, max_len);
     60     assert!(max_len >= REQ_MAX_LEN);
     61     let mut cer = Ceremony::default();
     62     for i in 0..max_len {
     63         assert!(map.as_ref().capacity() <= cap);
     64         cer.id = i;
     65         assert_eq!(map.insert(cer, i), Insert::Success);
     66     }
     67     assert!(map.as_ref().capacity() <= cap);
     68     assert_eq!(map.as_ref().len(), max_len);
     69     for i in 0..max_len {
     70         assert!(map.as_ref().contains_key(&i));
     71     }
     72     cer.id = cap;
     73     assert_eq!(
     74         map.insert_remove_expired(cer, 10),
     75         InsertRemoveExpired::Success
     76     );
     77     assert!(map.as_ref().capacity() <= cap);
     78     assert_eq!(map.as_ref().len(), max_len);
     79     let mut counter = 0;
     80     for i in 0..max_len {
     81         counter += usize::from(map.as_ref().contains_key(&i));
     82     }
     83     assert_eq!(counter, max_len - 1);
     84     assert!(map.as_ref().contains_key(&(max_len - 1)));
     85 }