use crate::hss::util::{
ARTI_KEYSTORE_POPULATION, CFG_CTOR_PATH, CFG_PATH, CTorMigrateCmd, EXPECTED_ID_KEY_PATH,
EXPECTED_UNRECOGNIZED_KEYSTORE_ENTRY, HSS_DIR_PATH, IPTS_DIR_PATH, KEYSTORE_DIR_PATH,
OnionAddressCmdBuilder, SERVICE_DIR_PATH, UNRECOGNIZED_PATH_1, UNRECOGNIZED_PATH_2,
UNRECOGNIZED_PATH_2_DIR,
};
mod util;
#[test]
fn migration_succeeds_with_empty_arti_keystore() {
let cmd = CTorMigrateCmd::new();
assert!(cmd.is_state_dir_empty());
assert!(cmd.output().unwrap().status.success());
assert!(cmd.state_dir_contains_only(&[
EXPECTED_ID_KEY_PATH,
KEYSTORE_DIR_PATH,
HSS_DIR_PATH,
SERVICE_DIR_PATH
]));
}
#[test]
fn migration_succeeds_with_full_arti_keystore_and_batch_enabled() {
let migrate_cmd = CTorMigrateCmd::new();
assert!(migrate_cmd.is_state_dir_empty());
let onion_address_cmd = OnionAddressCmdBuilder::default()
.config_path(CFG_CTOR_PATH.to_string())
.state_directory(Some(
migrate_cmd.state_dir_path().to_string_lossy().to_string(),
))
.build()
.unwrap();
let ctor_keystore_onion_address =
String::from_utf8(onion_address_cmd.output().unwrap().stdout).unwrap();
migrate_cmd.populate_state_dir();
let onion_address_cmd = OnionAddressCmdBuilder::default()
.config_path(CFG_PATH.to_string())
.state_directory(Some(
migrate_cmd.state_dir_path().to_string_lossy().to_string(),
))
.build()
.unwrap();
let arti_keystore_onion_address =
String::from_utf8(onion_address_cmd.output().unwrap().stdout).unwrap();
assert_ne!(ctor_keystore_onion_address, arti_keystore_onion_address);
assert!(migrate_cmd.state_dir_contains_only(ARTI_KEYSTORE_POPULATION));
assert!(migrate_cmd.output().unwrap().status.success());
assert!(migrate_cmd.state_dir_contains_only(&[
EXPECTED_ID_KEY_PATH,
KEYSTORE_DIR_PATH,
HSS_DIR_PATH,
SERVICE_DIR_PATH,
EXPECTED_UNRECOGNIZED_KEYSTORE_ENTRY,
IPTS_DIR_PATH,
UNRECOGNIZED_PATH_1,
UNRECOGNIZED_PATH_2_DIR,
UNRECOGNIZED_PATH_2
]));
let onion_address_cmd = OnionAddressCmdBuilder::default()
.config_path(CFG_PATH.to_string())
.state_directory(Some(
migrate_cmd.state_dir_path().to_string_lossy().to_string(),
))
.build()
.unwrap();
let arti_keystore_onion_address =
String::from_utf8(onion_address_cmd.output().unwrap().stdout).unwrap();
assert_eq!(ctor_keystore_onion_address, arti_keystore_onion_address)
}
#[test]
fn ctor_migrate_is_idempotent() {
let cmd = CTorMigrateCmd::new();
assert!(cmd.is_state_dir_empty());
assert!(cmd.output().unwrap().status.success());
assert!(cmd.state_dir_contains_only(&[
EXPECTED_ID_KEY_PATH,
KEYSTORE_DIR_PATH,
HSS_DIR_PATH,
SERVICE_DIR_PATH
]));
let output = cmd.output().unwrap();
assert!(!output.status.success());
let error = String::from_utf8(cmd.output().unwrap().stderr).unwrap();
assert!(error.contains("error: Service allium-cepa was already migrated."))
}
#[test]
fn ctor_migrate_fails_when_applied_to_unregistered_service() {
let mut cmd = CTorMigrateCmd::new();
assert!(cmd.is_state_dir_empty());
cmd.set_nickname("unregistered".to_string());
let output = cmd.output().unwrap();
assert!(!output.status.success());
let error = String::from_utf8(cmd.output().unwrap().stderr).unwrap();
assert!(error.contains("error: The service identified using `--nickname unregistered` is not configured with any recognized CTor keystore."))
}
#[test]
fn ctor_migrate_fails_without_registered_ctor_keystore() {
let mut cmd = CTorMigrateCmd::new();
assert!(cmd.is_state_dir_empty());
cmd.set_config(CFG_PATH.to_string());
let output = cmd.output().unwrap();
assert!(!output.status.success());
let error = String::from_utf8(cmd.output().unwrap().stderr).unwrap();
assert!(error.contains("error: No CTor keystore are configured."))
}
#[test]
fn ctor_migrate_aborts_correctly_without_batch_flag() {
let mut migrate_cmd = CTorMigrateCmd::new();
assert!(migrate_cmd.is_state_dir_empty());
let onion_address_cmd = OnionAddressCmdBuilder::default()
.config_path(CFG_CTOR_PATH.to_string())
.state_directory(Some(
migrate_cmd.state_dir_path().to_string_lossy().to_string(),
))
.build()
.unwrap();
let ctor_keystore_onion_address =
String::from_utf8(onion_address_cmd.output().unwrap().stdout).unwrap();
migrate_cmd.populate_state_dir();
let onion_address_cmd = OnionAddressCmdBuilder::default()
.config_path(CFG_PATH.to_string())
.state_directory(Some(
migrate_cmd.state_dir_path().to_string_lossy().to_string(),
))
.build()
.unwrap();
let arti_keystore_onion_address =
String::from_utf8(onion_address_cmd.output().unwrap().stdout).unwrap();
assert_ne!(ctor_keystore_onion_address, arti_keystore_onion_address);
migrate_cmd.set_stdin("no".to_string());
assert!(migrate_cmd.state_dir_contains_only(ARTI_KEYSTORE_POPULATION));
let output = migrate_cmd.output().unwrap();
assert!(output.status.success());
assert!(migrate_cmd.state_dir_contains_only(ARTI_KEYSTORE_POPULATION));
let onion_address_cmd = OnionAddressCmdBuilder::default()
.config_path(CFG_PATH.to_string())
.state_directory(Some(
migrate_cmd.state_dir_path().to_string_lossy().to_string(),
))
.build()
.unwrap();
let arti_keystore_onion_address =
String::from_utf8(onion_address_cmd.output().unwrap().stdout).unwrap();
assert_ne!(ctor_keystore_onion_address, arti_keystore_onion_address);
assert!(
String::from_utf8(output.stdout)
.unwrap()
.contains("Aborted.")
)
}