use self_crypto_key::{init_key_storage, KeyStore};
init_key_storage!();
#[test]
fn test_key_generation() {
let key1 = KeyStore::generate_random_key(20);
let key2 = KeyStore::generate_random_key(20);
assert_eq!(key1.len(), 20);
assert_eq!(key2.len(), 20);
assert_ne!(key1, key2);
for ch in key1.chars() {
let code = ch as u32;
assert!(code >= 33 && code <= 126, "字符 '{}' 不在可打印范围", ch);
}
}
#[test]
fn test_bytes_generation() {
let bytes1 = KeyStore::generate_random_bytes(32);
let bytes2 = KeyStore::generate_random_bytes(32);
assert_eq!(bytes1.len(), 32);
assert_eq!(bytes2.len(), 32);
assert_ne!(bytes1, bytes2);
}
#[test]
fn test_different_lengths() {
for len in [1, 10, 32, 64, 128, 256, 512, 1024] {
let key = KeyStore::generate_random_key(len);
assert_eq!(key.len(), len, "长度 {} 的密钥生成失败", len);
}
}
#[test]
fn test_keystore_creation() {
let store = KeyStore::new();
match store {
Ok(store) => {
println!("KeyStore创建成功");
let capacity = store.capacity();
println!(" 总容量: {} 字节", capacity);
assert!(capacity > 0, "容量应该大于0");
assert!(
capacity >= 4096 && capacity <= 8192,
"容量应该在4KB到8KB之间"
);
}
Err(e) => {
println!("KeyStore创建失败: {}", e);
}
}
}
#[test]
fn test_capacity() {
if let Ok(store) = KeyStore::new() {
let capacity = store.capacity();
assert!(
capacity >= 4 * 1024 && capacity <= 8 * 1024,
"总容量应该在4KB到8KB之间"
);
}
}
#[test]
fn test_empty_key() {
let store = KeyStore::new();
if let Ok(mut store) = store {
let result = store.update("");
match result {
Ok(_) => println!("空密钥存储成功"),
Err(e) => println!("空密钥存储失败: {}", e),
}
}
}
#[test]
fn test_empty_bytes() {
let store = KeyStore::new();
if let Ok(mut store) = store {
let result = store.update_bytes(b"");
match result {
Ok(_) => println!("空bytes存储成功"),
Err(e) => println!("空bytes存储失败: {}", e),
}
}
}
#[test]
fn test_special_characters() {
let special_keys = vec![
"hello@world!",
"password#123$",
"key~with^special&chars",
"tab\there",
"new\nline",
];
let store = KeyStore::new();
if let Ok(mut store) = store {
for key in special_keys {
let result = store.update(key);
match result {
Ok(_) => println!("特殊字符密钥 '{}' 测试通过", key.escape_default()),
Err(e) => println!("特殊字符密钥失败: {}", e),
}
}
}
}
#[test]
fn test_binary_data() {
let binary_data = vec![0u8, 1, 2, 255, 254, 128, 127];
let store = KeyStore::new();
if let Ok(mut store) = store {
let result = store.update_bytes(&binary_data);
match result {
Ok(_) => println!("二进制数据存储成功"),
Err(e) => println!("二进制数据存储失败: {}", e),
}
}
}
#[test]
fn test_boundary_conditions() {
let key_min = KeyStore::generate_random_key(1);
assert_eq!(key_min.len(), 1);
let key_large = KeyStore::generate_random_key(4096);
assert_eq!(key_large.len(), 4096);
println!("边界条件测试通过");
}
#[test]
fn test_concurrent_access() {
use std::thread;
let handles: Vec<_> = (0..5)
.map(|i| {
thread::spawn(move || {
let store = KeyStore::new();
match store {
Ok(store) => {
println!("线程 {} 创建KeyStore成功, 容量: {}", i, store.capacity());
}
Err(e) => println!("线程 {} 创建KeyStore失败: {}", i, e),
}
})
})
.collect();
for handle in handles {
handle.join().unwrap();
}
println!("并发访问测试完成");
}
#[test]
fn test_large_data() {
let large_key = vec![42u8; 5000];
let store = KeyStore::new();
if let Ok(mut store) = store {
let result = store.update_bytes(&large_key);
match result {
Ok(_) => println!("大数据(5KB)存储成功"),
Err(e) => println!("大数据存储失败: {}", e),
}
}
}
#[test]
fn test_very_large_data() {
let very_large_key = vec![99u8; 8000];
let store = KeyStore::new();
if let Ok(mut store) = store {
let result = store.update_bytes(&very_large_key);
match result {
Ok(_) => println!("接近上限数据(8000字节)存储成功"),
Err(e) => println!("接近上限数据存储失败: {}", e),
}
}
}
#[test]
fn test_exceed_capacity() {
let too_large_key = vec![1u8; 10000];
let store = KeyStore::new();
if let Ok(mut store) = store {
let result = store.update_bytes(&too_large_key);
match result {
Ok(_) => panic!("不应该允许存储超出容量的数据"),
Err(e) => {
println!("正确拒绝了超出容量的数据: {}", e);
}
}
}
}
#[test]
fn test_metadata_generation() {
for i in 0..5 {
let store = KeyStore::new();
match store {
Ok(_) => println!("第 {} 次创建KeyStore成功", i),
Err(e) => println!("第 {} 次创建KeyStore失败: {}", i, e),
}
}
}
#[test]
fn test_different_data_types() {
let incremental: Vec<u8> = (0u8..=255).collect();
let test_cases = vec![
("纯文本", b"Hello World".as_slice()),
("数字", b"1234567890".as_slice()),
("混合", b"abc123!@#".as_slice()),
("全0", &[0u8; 100][..]),
("全255", &[255u8; 100][..]),
("递增", incremental.as_slice()),
];
let store = KeyStore::new();
if let Ok(mut store) = store {
for (name, data) in test_cases {
let result = store.update_bytes(data);
match result {
Ok(_) => println!("{} 数据测试通过", name),
Err(e) => println!("{} 数据测试失败: {}", name, e),
}
}
}
}
fn validate_key_string(key: &str) -> bool {
if key.is_empty() {
return true;
}
key.chars()
.all(|c| !c.is_control() || c == '\n' || c == '\t')
}
#[test]
fn test_key_validation() {
let valid_keys = vec![
"",
"simple",
"with spaces",
"special!@#$%^&*()",
"123456789",
];
for key in valid_keys {
assert!(validate_key_string(key), "密钥 '{}' 应该是有效的", key);
}
println!("密钥验证测试通过");
}