test.rs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. use cross_program_invocatio_native_lever::{PowerStatus, SetPowerStatus};
  2. use litesvm::LiteSVM;
  3. use solana_instruction::{AccountMeta, Instruction};
  4. use solana_keypair::{Keypair, Signer};
  5. use solana_native_token::LAMPORTS_PER_SOL;
  6. use solana_pubkey::Pubkey;
  7. use solana_transaction::Transaction;
  8. #[test]
  9. fn test_cpi() {
  10. let hand_program_id = Pubkey::new_unique();
  11. let lever_program_id = Pubkey::new_unique();
  12. let hand_program_bytes =
  13. include_bytes!("../../../target/deploy/cross_program_invocatio_native_hand.so");
  14. let lever_program_bytes =
  15. include_bytes!("../../../target/deploy/cross_program_invocatio_native_lever.so");
  16. let payer = Keypair::new();
  17. let power_account = Keypair::new();
  18. let mut svm = LiteSVM::new();
  19. svm.add_program(hand_program_id, hand_program_bytes)
  20. .unwrap();
  21. svm.add_program(lever_program_id, lever_program_bytes)
  22. .unwrap();
  23. svm.airdrop(&payer.pubkey(), LAMPORTS_PER_SOL * 10).unwrap();
  24. let data = borsh::to_vec(&PowerStatus { is_on: true }).unwrap();
  25. let initiate_lever_ix = Instruction {
  26. program_id: lever_program_id,
  27. accounts: vec![
  28. AccountMeta::new(power_account.pubkey(), true),
  29. AccountMeta::new(payer.pubkey(), true),
  30. AccountMeta::new(solana_system_interface::program::ID, false),
  31. ],
  32. data,
  33. };
  34. let tx = Transaction::new_signed_with_payer(
  35. &[initiate_lever_ix],
  36. Some(&payer.pubkey()),
  37. &[&payer, &power_account],
  38. svm.latest_blockhash(),
  39. );
  40. assert!(svm.send_transaction(tx).is_ok());
  41. let data = borsh::to_vec(&SetPowerStatus {
  42. name: "Chris".to_string(),
  43. })
  44. .unwrap();
  45. let pull_lever_ix = Instruction {
  46. program_id: hand_program_id,
  47. accounts: vec![
  48. AccountMeta::new(power_account.pubkey(), false),
  49. AccountMeta::new(lever_program_id, false),
  50. ],
  51. data,
  52. };
  53. let tx = Transaction::new_signed_with_payer(
  54. &[pull_lever_ix],
  55. Some(&payer.pubkey()),
  56. &[&payer],
  57. svm.latest_blockhash(),
  58. );
  59. assert!(svm.send_transaction(tx).is_ok());
  60. }