Pengujian Lengkap
tests/cpi_test.rs
use litesvm::LiteSVM;use solana_sdk::{instruction::{AccountMeta, Instruction},pubkey::Pubkey,signature::{Keypair, Signer},transaction::Transaction,system_program,};#[test]fn test_cross_program_invocation() {let mut svm = LiteSVM::new();// Deploy both programslet caller_program = Pubkey::new_unique();let callee_program = Pubkey::new_unique();svm.add_program(caller_program,include_bytes!("../target/deploy/caller.so")).unwrap();svm.add_program(callee_program,include_bytes!("../target/deploy/callee.so")).unwrap();// Setup accountslet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10_000_000_000).unwrap();// Create instruction that will trigger CPIlet instruction = Instruction {program_id: caller_program,accounts: vec![AccountMeta::new(payer.pubkey(), true),AccountMeta::new_readonly(callee_program, false),AccountMeta::new_readonly(system_program::id(), false),],data: vec![1], // Instruction to trigger CPI};let tx = Transaction::new_signed_with_payer(&[instruction],Some(&payer.pubkey()),&[&payer],svm.latest_blockhash(),);let result = svm.send_transaction(tx).unwrap();// Verify both programs were invokedassert!(result.logs.iter().any(|log|log.contains(&format!("Program {} invoke", caller_program))));assert!(result.logs.iter().any(|log|log.contains(&format!("Program {} invoke", callee_program))));println!("CPI successful!");println!("Logs showing both programs:");for log in &result.logs {if log.contains("invoke") {println!(" {}", log);}}}
Poin-Poin Utama
- Beberapa Program: Deploy semua program yang terlibat dalam rantai Cross Program Invocation
- ID Program: Masukkan ID program yang dipanggil sebagai akun dalam instruksi
- System Program: Sering diperlukan untuk operasi Cross Program Invocation (transfer, pembuatan akun, dll.)
- Verifikasi Log: Periksa log untuk memastikan semua program dalam rantai panggilan telah dieksekusi
Untuk informasi deployment yang lebih lengkap, baca bagian ini.
Memahami Log Cross Program Invocation
Saat Cross Program Invocation terjadi, Anda akan melihat log seperti:
Program A invoke [1]Program B invoke [2]Program B successProgram A success
Angka dalam tanda kurung menunjukkan kedalaman pemanggilan.
Is this page helpful?