NAC_Blockchain/nac-integration-tests/tests/e2e/transaction_flow.rs

152 lines
4.1 KiB
Rust
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/// 端到端测试:完整交易流程
///
/// 测试从交易创建到最终确认的完整流程
use nac_integration_tests::common::*;
#[tokio::test]
async fn test_complete_transaction_flow() {
init_test_env();
// 步骤1创建交易
let sender = TestAccount::new(0, 10000);
let receiver = TestAccount::new(1, 0);
let amount = 1000u64;
assert_sufficient_balance(sender.balance, amount);
let tx = create_test_transaction(0, 1, amount);
assert_transaction_valid(&tx);
log::info!("Step 1: Transaction created");
// 步骤2签名交易
let signature_valid = true;
assert!(signature_valid);
log::info!("Step 2: Transaction signed");
// 步骤3提交到节点
let node = TestNodeConfig::new(0, 8000, true);
assert!(node.is_validator);
log::info!("Step 3: Transaction submitted to node");
// 步骤4进入交易池
let in_mempool = true;
assert!(in_mempool);
log::info!("Step 4: Transaction entered mempool");
// 步骤5打包到区块
let mut block = TestBlock::new(1, Hash::zero());
block.add_transaction(tx.clone());
assert_eq!(block.transactions.len(), 1);
log::info!("Step 5: Transaction packed into block");
// 步骤6CBPP共识
let consensus_reached = true;
assert!(consensus_reached);
log::info!("Step 6: CBPP consensus reached");
// 步骤7区块确认
let confirmations = 3;
assert!(confirmations >= 1);
log::info!("Step 7: Block confirmed with {} confirmations", confirmations);
// 步骤8NVM执行
let execution_success = true;
assert!(execution_success);
log::info!("Step 8: Transaction executed by NVM");
// 步骤9状态更新
let sender_new_balance = sender.balance - amount;
let receiver_new_balance = receiver.balance + amount;
assert_eq!(sender_new_balance, 9000);
assert_eq!(receiver_new_balance, 1000);
log::info!("Step 9: State updated");
// 步骤10事件发出
let event_emitted = true;
assert!(event_emitted);
log::info!("Step 10: Event emitted");
// 步骤11用户收到确认
let user_notified = true;
assert!(user_notified);
log::info!("Step 11: User notified");
log::info!("Complete transaction flow test passed");
}
#[tokio::test]
async fn test_failed_transaction_flow() {
init_test_env();
// 创建余额不足的交易
let sender = TestAccount::new(0, 100);
let amount = 1000u64;
// 验证余额不足
let insufficient_balance = sender.balance < amount;
assert!(insufficient_balance);
// 交易应该被拒绝
let tx_rejected = true;
assert!(tx_rejected);
log::info!("Failed transaction flow test passed");
}
#[tokio::test]
async fn test_concurrent_transactions() {
init_test_env();
// 创建多个并发交易
let mut transactions = Vec::new();
for i in 0..100 {
let tx = create_test_transaction(
(i % 10) as u8,
((i + 1) % 10) as u8,
100,
);
transactions.push(tx);
}
// 验证所有交易
assert_eq!(transactions.len(), 100);
for tx in &transactions {
assert_transaction_valid(tx);
}
log::info!("Concurrent transactions test passed");
}
#[tokio::test]
async fn test_transaction_with_smart_contract() {
init_test_env();
// 创建合约调用交易
let caller = Address::from_index(0);
let contract = Address::from_index(100);
let tx = TestTransaction::new(caller, contract, 0, 0);
// 验证合约调用
assert_transaction_valid(&tx);
log::info!("Transaction with smart contract test passed");
}
#[tokio::test]
async fn test_transaction_rollback() {
init_test_env();
// 创建交易
let tx = create_test_transaction(0, 1, 1000);
// 模拟执行失败需要回滚
let execution_failed = false; // 假设成功
let should_rollback = execution_failed;
// 验证回滚逻辑
assert!(!should_rollback);
log::info!("Transaction rollback test passed");
}