pub use super::{Users, User, Group};
use std::collections::HashMap;
use libc::{uid_t, gid_t};
pub struct MockUsers {
users: HashMap<uid_t, User>,
groups: HashMap<gid_t, Group>,
uid: uid_t,
}
impl MockUsers {
pub fn with_current_uid(current_uid: uid_t) -> MockUsers {
MockUsers {
users: HashMap::new(),
groups: HashMap::new(),
uid: current_uid,
}
}
pub fn add_user(&mut self, user: User) -> Option<User> {
self.users.insert(user.uid, user)
}
pub fn add_group(&mut self, group: Group) -> Option<Group> {
self.groups.insert(group.gid, group)
}
}
impl Users for MockUsers {
fn get_user_by_uid(&mut self, uid: uid_t) -> Option<User> {
self.users.get(&uid).cloned()
}
fn get_user_by_name(&mut self, username: &str) -> Option<User> {
self.users.values().find(|u| u.name == username).cloned()
}
fn get_group_by_gid(&mut self, gid: gid_t) -> Option<Group> {
self.groups.get(&gid).cloned()
}
fn get_group_by_name(&mut self, group_name: &str) -> Option<Group> {
self.groups.values().find(|g| g.name == group_name).cloned()
}
fn get_current_uid(&mut self) -> uid_t {
self.uid
}
fn get_current_username(&mut self) -> Option<String> {
self.users.get(&self.uid).map(|u| u.name.clone())
}
fn get_current_gid(&mut self) -> uid_t {
self.uid
}
fn get_current_groupname(&mut self) -> Option<String> {
self.groups.get(&self.uid).map(|u| u.name.clone())
}
fn get_effective_uid(&mut self) -> uid_t {
self.uid
}
fn get_effective_username(&mut self) -> Option<String> {
self.users.get(&self.uid).map(|u| u.name.clone())
}
fn get_effective_gid(&mut self) -> uid_t {
self.uid
}
fn get_effective_groupname(&mut self) -> Option<String> {
self.groups.get(&self.uid).map(|u| u.name.clone())
}
}
#[cfg(test)]
mod test {
use super::{Users, User, Group, MockUsers};
#[test]
fn current_username() {
let mut users = MockUsers::with_current_uid(1337);
users.add_user(User { uid: 1337, name: "fred".to_string(), primary_group: 101, home_dir: "/home/fred".to_string(), shell: "/bin/bash".to_string() });
assert_eq!(Some("fred".to_string()), users.get_current_username())
}
#[test]
fn no_current_username() {
let mut users = MockUsers::with_current_uid(1337);
assert_eq!(None, users.get_current_username())
}
#[test]
fn uid() {
let mut users = MockUsers::with_current_uid(0);
users.add_user(User { uid: 1337, name: "fred".to_string(), primary_group: 101, home_dir: "/home/fred".to_string(), shell: "/bin/bash".to_string() });
assert_eq!(Some("fred".to_string()), users.get_user_by_uid(1337).map(|u| u.name))
}
#[test]
fn username() {
let mut users = MockUsers::with_current_uid(1337);
users.add_user(User { uid: 1440, name: "fred".to_string(), primary_group: 101, home_dir: "/home/fred".to_string(), shell: "/bin/bash".to_string() });
assert_eq!(Some(1440), users.get_user_by_name("fred").map(|u| u.uid))
}
#[test]
fn no_username() {
let mut users = MockUsers::with_current_uid(1337);
users.add_user(User { uid: 1440, name: "fred".to_string(), primary_group: 101, home_dir: "/home/fred".to_string(), shell: "/bin/bash".to_string() });
assert_eq!(None, users.get_user_by_name("criminy").map(|u| u.uid))
}
#[test]
fn no_uid() {
let mut users = MockUsers::with_current_uid(0);
assert_eq!(None, users.get_user_by_uid(1337).map(|u| u.name))
}
#[test]
fn gid() {
let mut users = MockUsers::with_current_uid(0);
users.add_group(Group { gid: 1337, name: "fred".to_string(), members: vec![], });
assert_eq!(Some("fred".to_string()), users.get_group_by_gid(1337).map(|g| g.name))
}
#[test]
fn group_name() {
let mut users = MockUsers::with_current_uid(0);
users.add_group(Group { gid: 1337, name: "fred".to_string(), members: vec![], });
assert_eq!(Some(1337), users.get_group_by_name("fred").map(|g| g.gid))
}
#[test]
fn no_group_name() {
let mut users = MockUsers::with_current_uid(0);
users.add_group(Group { gid: 1337, name: "fred".to_string(), members: vec![], });
assert_eq!(None, users.get_group_by_name("santa").map(|g| g.gid))
}
#[test]
fn no_gid() {
let mut users = MockUsers::with_current_uid(0);
assert_eq!(None, users.get_group_by_gid(1337).map(|g| g.name))
}
}