mirror of https://github.com/astral-sh/uv
117 lines
4.0 KiB
Rust
117 lines
4.0 KiB
Rust
use uv_keyring::{Entry, Error};
|
|
|
|
#[unsafe(no_mangle)]
|
|
extern "C" fn test() {
|
|
test_invalid_parameter();
|
|
test_empty_keyring();
|
|
test_empty_password_input();
|
|
test_round_trip_ascii_password();
|
|
test_round_trip_non_ascii_password();
|
|
test_update_password();
|
|
#[cfg(target_os = "ios")]
|
|
test_get_credential();
|
|
}
|
|
|
|
fn test_invalid_parameter() {
|
|
let entry = Entry::new("", "user");
|
|
assert!(
|
|
matches!(entry, Err(Error::Invalid(_, _))),
|
|
"Created entry with empty service"
|
|
);
|
|
let entry = Entry::new("service", "");
|
|
assert!(
|
|
matches!(entry, Err(Error::Invalid(_, _))),
|
|
"Created entry with empty user"
|
|
);
|
|
let entry = Entry::new_with_target("test", "service", "user");
|
|
assert!(
|
|
matches!(entry, Err(Error::Invalid(_, _))),
|
|
"Created entry with non-default target"
|
|
);
|
|
}
|
|
|
|
fn test_empty_keyring() {
|
|
let name = "test_empty_keyring".to_string();
|
|
let entry = Entry::new(&name, &name).expect("Failed to create entry");
|
|
assert!(matches!(entry.get_password(), Err(Error::NoEntry)))
|
|
}
|
|
|
|
fn test_empty_password_input() {
|
|
let name = "test_empty_password_input".to_string();
|
|
let entry = Entry::new(&name, &name).expect("Failed to create entry");
|
|
let in_pass = "";
|
|
entry
|
|
.set_password(in_pass)
|
|
.expect("Couldn't set empty password");
|
|
let out_pass = entry.get_password().expect("Couldn't get empty password");
|
|
assert_eq!(in_pass, out_pass);
|
|
entry
|
|
.delete_credential()
|
|
.expect("Couldn't delete credential with empty password");
|
|
assert!(
|
|
matches!(entry.get_password(), Err(Error::NoEntry)),
|
|
"Able to read a deleted password"
|
|
)
|
|
}
|
|
|
|
fn test_round_trip_ascii_password() {
|
|
let name = "test_round_trip_ascii_password".to_string();
|
|
let entry = Entry::new(&name, &name).expect("Failed to create entry");
|
|
let password = "test ascii password";
|
|
entry.set_password(password).unwrap();
|
|
let stored_password = entry.get_password().unwrap();
|
|
assert_eq!(stored_password, password);
|
|
entry.delete_credential().unwrap();
|
|
assert!(matches!(entry.get_password(), Err(Error::NoEntry)))
|
|
}
|
|
|
|
fn test_round_trip_non_ascii_password() {
|
|
let name = "test_round_trip_non_ascii_password".to_string();
|
|
let entry = Entry::new(&name, &name).expect("Failed to create entry");
|
|
let password = "このきれいな花は桜です";
|
|
entry.set_password(password).unwrap();
|
|
let stored_password = entry.get_password().unwrap();
|
|
assert_eq!(stored_password, password);
|
|
entry.delete_credential().unwrap();
|
|
assert!(matches!(entry.get_password(), Err(Error::NoEntry)))
|
|
}
|
|
|
|
fn test_update_password() {
|
|
let name = "test_update_password".to_string();
|
|
let entry = Entry::new(&name, &name).expect("Failed to create entry");
|
|
let password = "test ascii password";
|
|
entry.set_password(password).unwrap();
|
|
let stored_password = entry.get_password().unwrap();
|
|
assert_eq!(stored_password, password);
|
|
let password = "このきれいな花は桜です";
|
|
entry.set_password(password).unwrap();
|
|
let stored_password = entry.get_password().unwrap();
|
|
assert_eq!(stored_password, password);
|
|
entry.delete_credential().unwrap();
|
|
assert!(matches!(entry.get_password(), Err(Error::NoEntry)))
|
|
}
|
|
|
|
#[cfg(target_os = "ios")]
|
|
fn test_get_credential() {
|
|
use keyring::ios::IosCredential;
|
|
let name = "test_get_credential".to_string();
|
|
let entry = Entry::new(&name, &name).expect("Can't create entry for get_credential");
|
|
let credential: &IosCredential = entry
|
|
.get_credential()
|
|
.downcast_ref()
|
|
.expect("Not an iOS credential");
|
|
assert!(
|
|
credential.get_credential().is_err(),
|
|
"Platform credential shouldn't exist yet!"
|
|
);
|
|
entry
|
|
.set_password("test get password for get_credential")
|
|
.expect("Can't get password for get_credential");
|
|
assert!(credential.get_credential().is_ok());
|
|
entry.delete_credential().unwrap();
|
|
assert!(
|
|
matches!(entry.get_password(), Err(Error::NoEntry)),
|
|
"Platform credential exists after delete password"
|
|
)
|
|
}
|