use crate::keytypes::User;
use super::utils;
use super::utils::kernel::*;
#[test]
fn invalid_keyring() {
let mut keyring = utils::invalid_keyring();
let err = keyring.add_keyring("invalid_keyring").unwrap_err();
assert_eq!(err, errno::Errno(libc::EINVAL));
}
#[test]
fn unlinked_keyring() {
let mut keyring = utils::new_test_keyring();
let mut unlinked_keyring = keyring.add_keyring("unlinked_keyring_unlinked").unwrap();
keyring.unlink_keyring(&unlinked_keyring).unwrap();
utils::wait_for_keyring_gc(&unlinked_keyring);
let err = unlinked_keyring
.add_keyring("unlinked_keyring")
.unwrap_err();
assert_eq!(err, errno::Errno(libc::ENOKEY));
}
#[test]
fn not_a_keyring() {
let mut keyring = utils::new_test_keyring();
let payload = &b"payload"[..];
let key = keyring
.add_key::<User, _, _>("not_a_keyring_key", payload)
.unwrap();
let mut not_a_keyring = utils::key_as_keyring(&key);
let err = not_a_keyring.add_keyring("not_a_keyring").unwrap_err();
assert_eq!(err, errno::Errno(libc::ENOTDIR));
}
#[test]
fn empty_keyring_description() {
let mut keyring = utils::new_test_keyring();
let err = keyring.add_keyring("").unwrap_err();
assert_eq!(err, errno::Errno(libc::EINVAL));
}
#[test]
fn max_keyring_description() {
let mut keyring = utils::new_test_keyring();
let maxdesc: String = "a".repeat(*PAGE_SIZE - 1);
let res = keyring.add_keyring(maxdesc.as_ref());
if KEY_INFO.maxbytes < *PAGE_SIZE {
assert_eq!(res.unwrap_err(), errno::Errno(libc::EDQUOT));
} else {
let keyring = res.unwrap();
assert_eq!(keyring.description().unwrap().description, maxdesc);
keyring.invalidate().unwrap();
}
}
#[test]
fn overlong_keyring_description() {
let mut keyring = utils::new_test_keyring();
let maxdesc: String = "a".repeat(*PAGE_SIZE);
let err = keyring.add_keyring(maxdesc.as_ref()).unwrap_err();
assert_eq!(err, errno::Errno(libc::EINVAL));
}
#[test]
fn new_keyring() {
let mut keyring = utils::new_test_keyring();
let new_keyring = keyring.add_keyring("new_keyring").unwrap();
let (keys, keyrings) = keyring.read().unwrap();
assert_eq!(keys.len(), 0);
assert_eq!(keyrings.len(), 1);
assert_eq!(keyrings[0], new_keyring);
}
#[test]
fn duplicate_keyring_names() {
let mut keyring = utils::new_test_keyring();
let new_keyring1 = keyring.add_keyring("duplicate_keyring_names").unwrap();
let new_keyring2 = keyring.add_keyring("duplicate_keyring_names").unwrap();
assert_ne!(new_keyring1, new_keyring2);
let (keys, keyrings) = keyring.read().unwrap();
assert!(keys.is_empty());
assert_eq!(1, keyrings.len());
assert_eq!(new_keyring2, keyrings[0]);
utils::wait_for_keyring_gc(&new_keyring1);
let err = new_keyring1.description().unwrap_err();
assert_eq!(err, errno::Errno(libc::ENOKEY));
}