diff --git a/code/ch01-03/src/object/handle.rs b/code/ch01-03/src/object/handle.rs index 614cd70..592282d 100644 --- a/code/ch01-03/src/object/handle.rs +++ b/code/ch01-03/src/object/handle.rs @@ -1,5 +1,5 @@ // ANCHOR: handle -use super::{KernelObject, Rights}; +use super::{DummyObject, KernelObject, Rights}; use alloc::sync::Arc; /// 内核对象句柄 @@ -16,3 +16,14 @@ impl Handle { } } // ANCHOR_END: handle + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn new_obj_handle() { + let obj = DummyObject::new(); + let handle1 = Handle::new(obj.clone(), Rights::BASIC); + } +} diff --git a/code/ch01-03/src/object/rights.rs b/code/ch01-03/src/object/rights.rs index 49c6842..974a2d2 100644 --- a/code/ch01-03/src/object/rights.rs +++ b/code/ch01-03/src/object/rights.rs @@ -30,6 +30,10 @@ bitflags! { const IO = Self::READ.bits | Self::WRITE.bits; const DEFAULT_CHANNEL = Self::BASIC.bits & !Self::DUPLICATE.bits | Self::IO.bits | Self::SIGNAL.bits | Self::SIGNAL_PEER.bits; + /// GET_PROPERTY | SET_PROPERTY + const PROPERTY = Self::GET_PROPERTY.bits | Self::SET_PROPERTY.bits; + /// BASIC | IO | PROPERTY | ENUMERATE | DESTROY | SIGNAL | MANAGE_PROCESS | MANAGE_THREAD + const DEFAULT_PROCESS = Self::BASIC.bits | Self::IO.bits | Self::PROPERTY.bits | Self::ENUMERATE.bits | Self::DESTROY.bits | Self::SIGNAL.bits | Self::MANAGE_PROCESS.bits | Self::MANAGE_THREAD.bits; } } // ANCHOR_END: rights diff --git a/code/ch01-03/src/task/process.rs b/code/ch01-03/src/task/process.rs index 80988f5..f1adf1d 100644 --- a/code/ch01-03/src/task/process.rs +++ b/code/ch01-03/src/task/process.rs @@ -75,3 +75,45 @@ impl Process { } // ANCHOR_END: get_object_with_rights } + +#[cfg(test)] +mod tests { + use super::*; + use alloc::format; + + #[test] + fn new_proc() { + let proc = Process::new(); + assert_eq!(proc.type_name(), "Process"); + assert_eq!(proc.name(), ""); + proc.set_name("proc1"); + assert_eq!(proc.name(), "proc1"); + assert_eq!( + format!("{:?}", proc), + format!("Process({}, \"proc1\")", proc.id()) + ); + + let obj: Arc = proc; + assert_eq!(obj.type_name(), "Process"); + assert_eq!(obj.name(), "proc1"); + obj.set_name("proc2"); + assert_eq!(obj.name(), "proc2"); + assert_eq!( + format!("{:?}", obj), + format!("Process({}, \"proc2\")", obj.id()) + ); + } + + fn proc_handle() { + let proc = Process::new(); + let handle = Handle::new(proc.clone(), Rights::DEFAULT_PROCESS); + let handle_value = proc.add_handle(handle); + + let object1: Arc = proc + .get_object_with_rights(handle_value, Rights::DEFAULT_PROCESS) + .expect("failed to get object"); + assert!(Arc::ptr_eq(&object1, &proc)); + + proc.remove_handle(handle_value); + } +}