355 lines
11 KiB
Rust
355 lines
11 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).expect("mainnet: handle error");
|
|
assert_eq!(address1.len(), 32);
|
|
|
|
// 从私钥生成地址
|
|
let address2 = adapter.address_from_private_key(&private_key).expect("mainnet: handle error");
|
|
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).expect("mainnet: handle error");
|
|
|
|
// 有效地址
|
|
assert!(adapter.validate_address(&address).expect("mainnet: handle error"));
|
|
|
|
// 无效地址 - 长度不对
|
|
let invalid_address = vec![0u8; 16];
|
|
assert!(!adapter.validate_address(&invalid_address).expect("mainnet: handle error"));
|
|
}
|
|
|
|
/// 测试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).expect("mainnet: handle error");
|
|
|
|
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).expect("mainnet: handle error");
|
|
assert_eq!(signature.len(), 64);
|
|
|
|
// 验证 - 应该成功
|
|
assert!(adapter.verify(&public_key, message, &signature).expect("mainnet: handle error"));
|
|
|
|
// 验证错误的消息 - 应该失败
|
|
let wrong_message = b"This is a different message";
|
|
assert!(!adapter.verify(&public_key, wrong_message, &signature).expect("mainnet: handle error"));
|
|
|
|
// 验证错误的公钥 - 应该失败
|
|
let (_, wrong_public_key) = adapter.generate_keypair();
|
|
assert!(!adapter.verify(&wrong_public_key, message, &signature).expect("mainnet: handle error"));
|
|
}
|
|
|
|
/// 测试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).expect("mainnet: handle error");
|
|
|
|
// 编码
|
|
let encoded = adapter.encode_address(&address).expect("mainnet: handle error");
|
|
|
|
// 解码
|
|
let decoded = adapter.decode_address(&encoded).expect("mainnet: handle error");
|
|
|
|
// 应该相同
|
|
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).expect("mainnet: handle error");
|
|
|
|
// 解码
|
|
let decoded = adapter.decode_hash(&encoded).expect("mainnet: handle error");
|
|
|
|
// 应该相同
|
|
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
|
|
).expect("mainnet: handle error");
|
|
|
|
assert!(!gnacs_code.is_empty());
|
|
|
|
// 解码
|
|
let (category, jurisdiction, compliance) = adapter.decode_gnacs(&gnacs_code).expect("mainnet: handle error");
|
|
|
|
// 验证
|
|
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).expect("mainnet: handle error");
|
|
assert!(!json.is_empty());
|
|
|
|
// 反序列化
|
|
let deserialized: NACConfig = serde_json::from_str(&json).expect("mainnet: handle error");
|
|
|
|
// 验证
|
|
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).expect("mainnet: handle error");
|
|
|
|
// 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).expect("mainnet: handle error");
|
|
|
|
// 6. 验证签名
|
|
assert!(l0.verify(&public_key, asset_data, &signature).expect("mainnet: handle error"));
|
|
|
|
// 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
|
|
).expect("mainnet: handle error");
|
|
|
|
// 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.expect("mainnet: handle error"));
|
|
}
|
|
|
|
/// 测试并发安全性
|
|
#[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).expect("mainnet: handle error");
|
|
(private_key, public_key, address)
|
|
});
|
|
handles.push(handle);
|
|
}
|
|
|
|
// 等待所有任务完成
|
|
let mut addresses = vec![];
|
|
for handle in handles {
|
|
let (_, _, address) = handle.await.expect("mainnet: handle error");
|
|
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);
|
|
}
|