mod test_pvxs_remote_string_get_put {
use pvxs_sys::{Context, NTScalarMetadataBuilder, PvxsError, Server};
#[test]
fn test_pv_remote_string_get_put() {
let timeout = 5.0;
let initial_value = "Remote string PV";
let name = "remote:string";
let srv = Server::start_from_env().expect("Failed to create server from env");
srv.create_pv_string(name, initial_value, NTScalarMetadataBuilder::new())
.expect("Failed to create pv:string on server");
let mut ctx = Context::from_env().expect("Failed to create client context from env");
let first_get: Result<pvxs_sys::Value, PvxsError> = ctx.get(name, timeout);
match first_get {
Ok(value) => {
assert_eq!(value.get_field_string("value").unwrap(), initial_value);
}
Err(e) => assert!(false, "Failed to get value from remote pv: {:?}", e),
}
srv.stop_drop().expect("Failed to stop server");
let failed_get: Result<pvxs_sys::Value, PvxsError> = ctx.get(name, timeout);
match failed_get {
Ok(_) => assert!(
false,
"Expected error when getting from stopped server, but got Ok"
),
Err(e) => {
assert!(e.to_string().contains("Timeout") || e.to_string().contains("Error"));
}
}
let srv = Server::start_from_env().expect("Failed to restart server");
srv.create_pv_string(name, initial_value, NTScalarMetadataBuilder::new())
.expect("Failed to create pv:string on server");
let new_value = "Updated remote string";
match ctx.put_string(name, new_value, 5.0) {
Ok(_) => (),
Err(e) => assert!(false, "Failed to put new value to remote pv: {:?}", e),
}
let second_get: Result<pvxs_sys::Value, PvxsError> = ctx.get(name, timeout);
match second_get {
Ok(value) => {
assert_eq!(value.get_field_string("value").unwrap(), new_value);
}
Err(e) => assert!(false, "Failed to get value from remote pv: {:?}", e),
}
srv.stop_drop().expect("Failed to stop server");
}
#[test]
fn test_pv_remote_string_encoding() {
let timeout = 5.0;
let name = "remote:string:encoding";
let srv = Server::start_from_env().expect("Failed to create server from env");
srv.create_pv_string(name, "", NTScalarMetadataBuilder::new())
.expect("Failed to create pv:string on server");
let mut ctx = Context::from_env().expect("Failed to create client context from env");
let test_strings = vec![
"Simple ASCII",
"Numbers: 1234567890",
"Punctuation: !@#$%^&*()",
"Unicode: αβγδ ελληνικά",
"Chinese: 你好世界",
"Emoji: 🚀🌟💡",
"Mixed: Hello 世界 🌍!",
];
for test_string in test_strings {
match ctx.put_string(name, test_string, timeout) {
Ok(_) => {
let value = ctx.get(name, timeout).expect("Failed to get string value");
let retrieved = value.get_field_string("value").unwrap();
assert_eq!(
retrieved, test_string,
"String encoding not preserved for: {}",
test_string
);
}
Err(e) => {
assert!(
false,
"Failed to put string '{}' to remote pv: {:?}",
test_string, e
);
}
}
}
srv.stop_drop().expect("Failed to stop server");
}
}