NAC_Blockchain/nac-sdk/tests/integration.rs

355 lines
10 KiB
Rust

//! NAC SDK 集成测试
//!
//! 本测试文件包含NAC SDK所有层的集成测试
use nac_sdk::adapters::{NACAdapter, config::NACConfig};
use nac_sdk::primitives::{AssetCategory, Jurisdiction, ComplianceLevel};
/// 测试NAC适配器的创建
#[tokio::test]
async fn test_nac_adapter_creation() {
let config = NACConfig::default();
let result = NACAdapter::new(&config).await;
// 注意: 这个测试需要实际的服务端点才能通过
// 在没有服务端点的情况下,我们只验证配置是否正确
assert!(config.l1.nvm_url.starts_with("http"));
}
/// 测试L0原生层 - 密钥对生成
#[test]
fn test_l0_keypair_generation() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
let adapter = L0NativeAdapter::new();
let (private_key, public_key) = adapter.generate_keypair();
assert_eq!(private_key.len(), 32);
assert_eq!(public_key.len(), 32);
}
/// 测试L0原生层 - 地址生成
#[test]
fn test_l0_address_generation() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
let adapter = L0NativeAdapter::new();
let (private_key, public_key) = adapter.generate_keypair();
// 从公钥生成地址
let address1 = adapter.address_from_public_key(&public_key).unwrap();
assert_eq!(address1.len(), 32);
// 从私钥生成地址
let address2 = adapter.address_from_private_key(&private_key).unwrap();
assert_eq!(address2.len(), 32);
// 两个地址应该相同
assert_eq!(address1, address2);
}
/// 测试L0原生层 - 地址验证
#[test]
fn test_l0_address_validation() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
let adapter = L0NativeAdapter::new();
let (_, public_key) = adapter.generate_keypair();
let address = adapter.address_from_public_key(&public_key).unwrap();
// 有效地址
assert!(adapter.validate_address(&address).unwrap());
// 无效地址 - 长度不对
let invalid_address = vec![0u8; 16];
assert!(!adapter.validate_address(&invalid_address).unwrap());
}
/// 测试L0原生层 - SHA3-384哈希
#[test]
fn test_l0_hash_sha3_384() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
let adapter = L0NativeAdapter::new();
let data = b"Hello, NAC!";
let hash = adapter.hash_sha3_384(data);
assert_eq!(hash.len(), 48);
// 相同的数据应该产生相同的哈希
let hash2 = adapter.hash_sha3_384(data);
assert_eq!(hash, hash2);
// 不同的数据应该产生不同的哈希
let hash3 = adapter.hash_sha3_384(b"Different data");
assert_ne!(hash, hash3);
}
/// 测试L0原生层 - Merkle树根计算
#[test]
fn test_l0_merkle_root() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
let adapter = L0NativeAdapter::new();
// 创建一些哈希
let hash1 = adapter.hash_sha3_384(b"data1");
let hash2 = adapter.hash_sha3_384(b"data2");
let hash3 = adapter.hash_sha3_384(b"data3");
let hash4 = adapter.hash_sha3_384(b"data4");
let hashes = vec![hash1, hash2, hash3, hash4];
let root = adapter.merkle_root(&hashes).unwrap();
assert_eq!(root.len(), 48);
}
/// 测试L0原生层 - 签名和验证
#[test]
fn test_l0_sign_and_verify() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
let adapter = L0NativeAdapter::new();
let (private_key, public_key) = adapter.generate_keypair();
let message = b"This is a test message";
// 签名
let signature = adapter.sign(&private_key, message).unwrap();
assert_eq!(signature.len(), 64);
// 验证 - 应该成功
assert!(adapter.verify(&public_key, message, &signature).unwrap());
// 验证错误的消息 - 应该失败
let wrong_message = b"This is a different message";
assert!(!adapter.verify(&public_key, wrong_message, &signature).unwrap());
// 验证错误的公钥 - 应该失败
let (_, wrong_public_key) = adapter.generate_keypair();
assert!(!adapter.verify(&wrong_public_key, message, &signature).unwrap());
}
/// 测试L0原生层 - 编码和解码地址
#[test]
fn test_l0_encode_decode_address() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
let adapter = L0NativeAdapter::new();
let (_, public_key) = adapter.generate_keypair();
let address = adapter.address_from_public_key(&public_key).unwrap();
// 编码
let encoded = adapter.encode_address(&address).unwrap();
// 解码
let decoded = adapter.decode_address(&encoded).unwrap();
// 应该相同
assert_eq!(address, decoded);
}
/// 测试L0原生层 - 编码和解码哈希
#[test]
fn test_l0_encode_decode_hash() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
let adapter = L0NativeAdapter::new();
let data = b"test data";
let hash = adapter.hash_sha3_384(data);
// 编码
let encoded = adapter.encode_hash(&hash).unwrap();
// 解码
let decoded = adapter.decode_hash(&encoded).unwrap();
// 应该相同
assert_eq!(hash, decoded);
}
/// 测试L1协议层 - GNACS编码和解码
#[test]
fn test_l1_gnacs_encode_decode() {
use nac_sdk::adapters::l1_protocol::L1ProtocolAdapter;
use nac_sdk::adapters::config::L1Config;
let config = L1Config::default();
let adapter = L1ProtocolAdapter::new(&config);
// 编码
let gnacs_code = adapter.encode_gnacs(
AssetCategory::RealEstate,
Jurisdiction::US,
ComplianceLevel::High
).unwrap();
assert!(!gnacs_code.is_empty());
// 解码
let (category, jurisdiction, compliance) = adapter.decode_gnacs(&gnacs_code).unwrap();
// 验证
assert_eq!(category, AssetCategory::RealEstate);
assert_eq!(jurisdiction, Jurisdiction::US);
assert_eq!(compliance, ComplianceLevel::High);
}
/// 测试配置的序列化和反序列化
#[test]
fn test_config_serialization() {
let config = NACConfig::default();
// 序列化
let json = serde_json::to_string(&config).unwrap();
assert!(!json.is_empty());
// 反序列化
let deserialized: NACConfig = serde_json::from_str(&json).unwrap();
// 验证
assert_eq!(config.l1.nvm_url, deserialized.l1.nvm_url);
assert_eq!(config.l2.governance_url, deserialized.l2.governance_url);
assert_eq!(config.l3.ipfs_url, deserialized.l3.ipfs_url);
assert_eq!(config.l4.compliance_url, deserialized.l4.compliance_url);
assert_eq!(config.l5.wallet_url, deserialized.l5.wallet_url);
}
/// 测试完整的工作流程
#[test]
fn test_complete_workflow() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
use nac_sdk::adapters::l1_protocol::L1ProtocolAdapter;
use nac_sdk::adapters::config::L1Config;
// 1. 创建L0适配器
let l0 = L0NativeAdapter::new();
// 2. 生成密钥对
let (private_key, public_key) = l0.generate_keypair();
let address = l0.address_from_public_key(&public_key).unwrap();
// 3. 准备资产数据
let asset_data = b"Property at 123 Main St";
// 4. 计算哈希
let asset_hash = l0.hash_sha3_384(asset_data);
// 5. 签名
let signature = l0.sign(&private_key, asset_data).unwrap();
// 6. 验证签名
assert!(l0.verify(&public_key, asset_data, &signature).unwrap());
// 7. GNACS编码
let l1_config = L1Config::default();
let l1 = L1ProtocolAdapter::new(&l1_config);
let gnacs_code = l1.encode_gnacs(
AssetCategory::RealEstate,
Jurisdiction::US,
ComplianceLevel::High
).unwrap();
// 8. 验证所有数据
assert_eq!(address.len(), 32);
assert_eq!(asset_hash.len(), 48);
assert_eq!(signature.len(), 64);
assert!(!gnacs_code.is_empty());
}
/// 测试错误处理
#[test]
fn test_error_handling() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
let adapter = L0NativeAdapter::new();
// 测试无效的私钥
let invalid_private_key = vec![0u8; 16]; // 长度不对
let message = b"test";
let result = adapter.sign(&invalid_private_key, message);
assert!(result.is_err());
// 测试无效的地址
let invalid_address = vec![0u8; 16]; // 长度不对
let result = adapter.validate_address(&invalid_address);
assert!(result.is_ok());
assert!(!result.unwrap());
}
/// 测试并发安全性
#[tokio::test]
async fn test_concurrent_operations() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
use std::sync::Arc;
let adapter = Arc::new(L0NativeAdapter::new());
let mut handles = vec![];
// 并发生成100个密钥对
for _ in 0..100 {
let adapter_clone = Arc::clone(&adapter);
let handle = tokio::spawn(async move {
let (private_key, public_key) = adapter_clone.generate_keypair();
let address = adapter_clone.address_from_public_key(&public_key).unwrap();
(private_key, public_key, address)
});
handles.push(handle);
}
// 等待所有任务完成
let mut addresses = vec![];
for handle in handles {
let (_, _, address) = handle.await.unwrap();
addresses.push(address);
}
// 验证所有地址都是唯一的
addresses.sort();
addresses.dedup();
assert_eq!(addresses.len(), 100);
}
/// 测试性能 - 密钥对生成
#[test]
fn test_performance_keypair_generation() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
use std::time::Instant;
let adapter = L0NativeAdapter::new();
let start = Instant::now();
// 生成1000个密钥对
for _ in 0..1000 {
let _ = adapter.generate_keypair();
}
let duration = start.elapsed();
println!("生成1000个密钥对耗时: {:?}", duration);
// 平均每个密钥对应该在10ms以内
assert!(duration.as_millis() < 10000);
}
/// 测试性能 - 哈希计算
#[test]
fn test_performance_hashing() {
use nac_sdk::adapters::l0_native::L0NativeAdapter;
use std::time::Instant;
let adapter = L0NativeAdapter::new();
let data = vec![0u8; 1024]; // 1KB数据
let start = Instant::now();
// 计算10000次哈希
for _ in 0..10000 {
let _ = adapter.hash_sha3_384(&data);
}
let duration = start.elapsed();
println!("计算10000次哈希耗时: {:?}", duration);
// 平均每次哈希应该在1ms以内
assert!(duration.as_millis() < 10000);
}