close_account.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #![cfg(feature = "test-sbf")]
  2. mod setup;
  3. use {
  4. mollusk_svm::{result::Check, Mollusk},
  5. solana_sdk::{
  6. account::{AccountSharedData, ReadableAccount},
  7. program_error::ProgramError,
  8. program_pack::Pack,
  9. pubkey::Pubkey,
  10. system_instruction, system_program,
  11. },
  12. spl_token::{instruction, state::Account},
  13. };
  14. #[test]
  15. fn success_init_after_close_account() {
  16. let mollusk = Mollusk::new(&spl_token::id(), "spl_token");
  17. let owner = Pubkey::new_unique();
  18. let mint = Pubkey::new_unique();
  19. let account = Pubkey::new_unique();
  20. let decimals = 9;
  21. let owner_account = AccountSharedData::new(1_000_000_000, 0, &system_program::id());
  22. let mint_account = setup::setup_mint_account(None, None, 0, decimals);
  23. let token_account = setup::setup_token_account(&mint, &owner, 0);
  24. mollusk.process_and_validate_instruction_chain(
  25. &[
  26. instruction::close_account(&spl_token::id(), &account, &owner, &owner, &[]).unwrap(),
  27. system_instruction::create_account(
  28. &owner,
  29. &account,
  30. 1_000_000_000,
  31. Account::LEN as u64,
  32. &spl_token::id(),
  33. ),
  34. instruction::initialize_account(&spl_token::id(), &account, &mint, &owner).unwrap(),
  35. ],
  36. &[
  37. (mint, mint_account),
  38. (account, token_account),
  39. (owner, owner_account),
  40. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  41. ],
  42. &[
  43. Check::success(),
  44. // Account successfully initialized.
  45. Check::account(&account)
  46. .data(setup::setup_token_account(&mint, &owner, 0).data())
  47. .owner(&spl_token::id())
  48. .build(),
  49. ],
  50. );
  51. }
  52. #[test]
  53. fn fail_init_after_close_account() {
  54. let mollusk = Mollusk::new(&spl_token::id(), "spl_token");
  55. let owner = Pubkey::new_unique();
  56. let mint = Pubkey::new_unique();
  57. let account = Pubkey::new_unique();
  58. let decimals = 9;
  59. let owner_account = AccountSharedData::new(1_000_000_000, 0, &system_program::id());
  60. let mint_account = setup::setup_mint_account(None, None, 0, decimals);
  61. let token_account = setup::setup_token_account(&mint, &owner, 0);
  62. mollusk.process_and_validate_instruction_chain(
  63. &[
  64. instruction::close_account(&spl_token::id(), &account, &owner, &owner, &[]).unwrap(),
  65. system_instruction::transfer(&owner, &account, 1_000_000_000),
  66. instruction::initialize_account(&spl_token::id(), &account, &mint, &owner).unwrap(),
  67. ],
  68. &[
  69. (mint, mint_account),
  70. (account, token_account),
  71. (owner, owner_account),
  72. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  73. ],
  74. &[
  75. Check::err(ProgramError::InvalidAccountData),
  76. // Account not initialized.
  77. Check::account(&account)
  78. .lamports(1_000_000_000)
  79. .owner(&system_program::id())
  80. .build(),
  81. ],
  82. );
  83. }