#![allow(dead_code)] #[path = "../../../os-waitset/readiness/waitset.rs"] mod waitset; use waitset::{Error, Interest, Kind, ObjectKey, Readiness, RegistrationId}; #[test] fn level_triggered_poll_repeats_until_source_clears() { let mut set = Readiness::::new(10); let channel = ObjectKey {kind: Kind::Channel, id: 52}; let id = set.register(10, channel, Interest::READ_CLOSED).unwrap(); assert_eq!(set.poll(10, id), Ok(None)); set.replace_level(channel, Interest::READ).unwrap(); let ready = set.snapshot(); assert_eq!(set.poll(10, id), Ok(Some(Interest::READ))); assert_eq!(set.poll(10, id), Ok(Some(Interest::READ))); assert_eq!(set.snapshot(), ready); set.replace_level(channel, Interest::from_bits(0)).unwrap(); assert_eq!(set.poll(10, id), Ok(None)); set.replace_level(channel, Interest::CLOSED).unwrap(); assert_eq!(set.poll(10, id), Ok(Some(Interest::CLOSED))); set.unregister(10, id).unwrap(); assert_eq!(set.poll(10, id), Err(Error::BadFd)); assert_eq!(set.snapshot().levels, [0, 0]); } #[test] fn readiness_filters_unrelated_bits_and_reuse_starts_clear() { let mut set = Readiness::::new(10); let object = ObjectKey {kind: Kind::File, id: 7}; let first = set.register(10, object, Interest::READ).unwrap(); set.replace_level(object, Interest::WRITE).unwrap(); assert_eq!(set.poll(10, first), Ok(None)); set.replace_level(object, Interest::from_bits(3)).unwrap(); assert_eq!(set.poll(10, first), Ok(Some(Interest::READ))); set.unregister(10, first).unwrap(); let second = set.register(10, object, Interest::READ).unwrap(); assert_ne!(first, second); assert_eq!(set.poll(10, second), Ok(None)); assert_eq!(set.poll(10, first), Err(Error::BadFd)); } #[test] fn readiness_denials_leave_snapshot_unchanged() { let mut set = Readiness::::new(10); let object = ObjectKey {kind: Kind::Task, id: 8}; let id = set.register(10, object, Interest::CLOSED).unwrap(); let before = set.snapshot(); assert_eq!(set.poll(20, id), Err(Error::Access)); assert_eq!(set.poll(10, RegistrationId::from_raw(1)), Err(Error::BadFd)); assert_eq!(set.replace_level(ObjectKey {kind: Kind::Task, id: 9}, Interest::CLOSED), Err(Error::BadFd)); assert_eq!(set.replace_level(object, Interest::from_bits(8)), Err(Error::Invalid)); assert_eq!(set.snapshot(), before); }