use signer_core::{SignerCrypted, SignerServer, SignerUser};
use signer_remote::{
create_memory_meta,
generate_new_account,
transfer::signer_transfer_message::{
ChannelDevice, ClientToTransferMessage, TransferToClientMessage,
},
};
use tokio; use std::sync::Arc;
use tokio::sync::Mutex;
#[tokio::test]
async fn test_generate_new_account() {
let (keys, user) = generate_new_account().expect("生成账户失败");
assert!(!keys.pub_key.is_empty());
assert!(!keys.prv_key.is_empty());
assert_eq!(user.pub_key, keys.pub_key);
assert_eq!(user.username, "New User");
assert!(user.avatar.is_none());
assert!(user.servers.is_empty());
assert!(user.update_time > 0);
}
#[tokio::test]
async fn test_create_memory_meta() {
let (keys, _user) = generate_new_account().expect("生成账户失败");
let _meta = create_memory_meta(keys).await.expect("创建内存 Meta 失败");
}
#[tokio::test]
async fn test_signer_transfer_client_callbacks() {
let device_list_log = Arc::new(Mutex::new(Vec::new()));
let device_list_log_clone = Arc::clone(&device_list_log);
let on_device_list_update = move |devices: Vec<ChannelDevice>| {
let device_list_log_clone_inner = Arc::clone(&device_list_log_clone);
tokio::spawn(async move {
let mut log = device_list_log_clone_inner.lock().await;
log.push(devices);
});
};
let transfer_log = Arc::new(Mutex::new(Vec::new()));
let transfer_log_clone = Arc::clone(&transfer_log);
let on_receive_transfer = move |from_device_id: String, encrypted_summary: String| {
let transfer_log_clone_inner = Arc::clone(&transfer_log_clone);
tokio::spawn(async move {
let mut log = transfer_log_clone_inner.lock().await;
log.push((from_device_id, encrypted_summary));
});
};
let mock_device_a = ChannelDevice {
device_id: "device_a_id".to_string(),
user_info: SignerUser {
pub_key: "pub_key_a".to_string(),
username: "User A".to_string(),
update_time: 1000,
..Default::default()
},
};
let mock_device_b = ChannelDevice {
device_id: "device_b_id".to_string(),
user_info: SignerUser {
pub_key: "pub_key_b".to_string(),
username: "User B".to_string(),
update_time: 1001,
..Default::default()
},
};
let mock_devices = vec![mock_device_a, mock_device_b];
on_device_list_update(mock_devices.clone());
tokio::time::sleep(tokio::time::Duration::from_millis(10)).await;
{
let log = device_list_log.lock().await;
assert_eq!(log.len(), 1);
assert_eq!(log[0], mock_devices);
}
let mock_from_device_id = "device_a_id".to_string();
let mock_encrypted_summary = "base64_encoded_summary_data".to_string();
on_receive_transfer(mock_from_device_id.clone(), mock_encrypted_summary.clone());
tokio::time::sleep(tokio::time::Duration::from_millis(10)).await;
{
let log = transfer_log.lock().await;
assert_eq!(log.len(), 1);
assert_eq!(log[0].0, mock_from_device_id);
assert_eq!(log[0].1, mock_encrypted_summary);
}
}
#[test]
fn test_message_serialization() {
let user_info = SignerUser {
pub_key: "test_pub_key".to_string(),
username: "Test User".to_string(),
update_time: 1234567890,
servers: vec![SignerServer {
addr: "https://example.com/api".to_string(),
}],
..Default::default()
};
let join_msg_create = ClientToTransferMessage::JoinChannel {
channel_id: None,
user_info: user_info.clone(),
};
let serialized_create =
serde_json::to_string(&join_msg_create).expect("序列化 JoinChannel (创建) 消息失败");
let deserialized_create: ClientToTransferMessage =
serde_json::from_str(&serialized_create).expect("反序列化 JoinChannel (创建) 消息失败");
assert_eq!(join_msg_create, deserialized_create);
let join_msg_join = ClientToTransferMessage::JoinChannel {
channel_id: Some("channel_123".to_string()),
user_info: user_info.clone(),
};
let serialized_join =
serde_json::to_string(&join_msg_join).expect("序列化 JoinChannel (加入) 消息失败");
let deserialized_join: ClientToTransferMessage =
serde_json::from_str(&serialized_join).expect("反序列化 JoinChannel (加入) 消息失败");
assert_eq!(join_msg_join, deserialized_join);
let accept_msg = ClientToTransferMessage::AcceptTransfer {
target_device_id: "device_456".to_string(),
encrypted_summary: SignerCrypted {
sender_pub_key: format!("sender_pub_key"),
receiver_pub_key: format!("receiver_pub_key"),
cipher_text: format!("cipher_text"),
nonce: format!("nonce"),
_marker: std::marker::PhantomData,
},
};
let serialized_accept =
serde_json::to_string(&accept_msg).expect("序列化 AcceptTransfer 消息失败");
let deserialized_accept: ClientToTransferMessage =
serde_json::from_str(&serialized_accept).expect("反序列化 AcceptTransfer 消息失败");
assert_eq!(accept_msg, deserialized_accept);
let channel_device = ChannelDevice {
device_id: "device_789".to_string(),
user_info: user_info.clone(),
};
let channel_joined_msg = TransferToClientMessage::ChannelJoined {
channel_id: "channel_123".to_string(),
devices: vec![channel_device.clone()],
};
let serialized_joined =
serde_json::to_string(&channel_joined_msg).expect("序列化 ChannelJoined 消息失败");
let deserialized_joined: TransferToClientMessage =
serde_json::from_str(&serialized_joined).expect("反序列化 ChannelJoined 消息失败");
assert_eq!(channel_joined_msg, deserialized_joined);
let device_list_update_msg = TransferToClientMessage::DeviceListUpdate {
devices: vec![channel_device.clone()],
};
let serialized_update =
serde_json::to_string(&device_list_update_msg).expect("序列化 DeviceListUpdate 消息失败");
let deserialized_update: TransferToClientMessage =
serde_json::from_str(&serialized_update).expect("反序列化 DeviceListUpdate 消息失败");
assert_eq!(device_list_update_msg, deserialized_update);
let transfer_started_msg = TransferToClientMessage::TransferStarted {
target_device_id: "device_456".to_string(),
};
let serialized_started =
serde_json::to_string(&transfer_started_msg).expect("序列化 TransferStarted 消息失败");
let deserialized_started: TransferToClientMessage =
serde_json::from_str(&serialized_started).expect("反序列化 TransferStarted 消息失败");
assert_eq!(transfer_started_msg, deserialized_started);
let receive_transfer_msg = TransferToClientMessage::ReceiveTransfer {
from_device_id: "device_123".to_string(),
encrypted_summary: SignerCrypted {
sender_pub_key: format!("sender_pub_key"),
receiver_pub_key: format!("receiver_pub_key"),
cipher_text: format!("cipher_text"),
nonce: format!("nonce"),
_marker: std::marker::PhantomData,
},
};
let serialized_receive =
serde_json::to_string(&receive_transfer_msg).expect("序列化 ReceiveTransfer 消息失败");
let deserialized_receive: TransferToClientMessage =
serde_json::from_str(&serialized_receive).expect("反序列化 ReceiveTransfer 消息失败");
assert_eq!(receive_transfer_msg, deserialized_receive);
}