ソースを参照

tests: Add process instruction checks (#19)

* Add process instruction checks

* Update mollusk git reference

* Add missing check

* Add return data checks
Fernando Otero 8 ヶ月 前
コミット
8fe3789d1d

ファイルの差分が大きいため隠しています
+ 227 - 160
Cargo.lock


+ 1 - 1
program/Cargo.toml

@@ -22,7 +22,7 @@ thiserror = "2.0"
 
 [dev-dependencies]
 lazy_static = "1.5.0"
-mollusk-svm = "0.0.13"
+mollusk-svm = { version = "0.0.13", git = "https://github.com/buffalojoec/mollusk.git" }
 proptest = "1.5"
 serial_test = "3.2.0"
 solana-sdk = "2.1.0"

+ 8 - 8
program/tests/assert_instruction_count.rs

@@ -5,7 +5,7 @@ mod setup;
 use {
     mollusk_svm::{result::Check, Mollusk},
     solana_sdk::{
-        account::{AccountSharedData, ReadableAccount},
+        account::{Account as SolanaAccount, ReadableAccount},
         program_pack::Pack,
         pubkey::Pubkey,
     },
@@ -29,7 +29,7 @@ fn initialize_mint() {
     let mint_account = {
         let space = Mint::LEN;
         let lamports = mollusk.sysvars.rent.minimum_balance(space);
-        AccountSharedData::new(lamports, space, &id())
+        SolanaAccount::new(lamports, space, &id())
     };
 
     mollusk.process_and_validate_instruction(
@@ -61,7 +61,7 @@ fn initialize_account() {
     let token_account = {
         let space = Account::LEN;
         let lamports = mollusk.sysvars.rent.minimum_balance(space);
-        AccountSharedData::new(lamports, space, &id())
+        SolanaAccount::new(lamports, space, &id())
     };
 
     mollusk.process_and_validate_instruction(
@@ -69,7 +69,7 @@ fn initialize_account() {
         &[
             (account, token_account),
             (mint, mint_account),
-            (owner, AccountSharedData::default()),
+            (owner, SolanaAccount::default()),
             mollusk.sysvars.keyed_account_for_rent_sysvar(),
         ],
         &[
@@ -99,7 +99,7 @@ fn mint_to() {
         &[
             (mint, mint_account),
             (account, token_account),
-            (owner, AccountSharedData::default()),
+            (owner, SolanaAccount::default()),
         ],
         &[
             Check::success(),
@@ -133,7 +133,7 @@ fn transfer() {
         &[
             (source, source_token_account),
             (destination, destination_token_account),
-            (owner, AccountSharedData::default()),
+            (owner, SolanaAccount::default()),
         ],
         &[
             Check::success(),
@@ -165,7 +165,7 @@ fn burn() {
         &[
             (mint, mint_account),
             (account, token_account),
-            (owner, AccountSharedData::default()),
+            (owner, SolanaAccount::default()),
         ],
         &[
             Check::success(),
@@ -194,7 +194,7 @@ fn close_account() {
         &[
             (mint, mint_account),
             (account, token_account),
-            (owner, AccountSharedData::default()),
+            (owner, SolanaAccount::default()),
         ],
         &[Check::success(), Check::account(&account).closed().build()],
     );

+ 60 - 42
program/tests/close_account.rs

@@ -5,7 +5,7 @@ mod setup;
 use {
     mollusk_svm::{result::Check, Mollusk},
     solana_sdk::{
-        account::{AccountSharedData, ReadableAccount},
+        account::{Account as SolanaAccount, ReadableAccount},
         program_error::ProgramError,
         program_pack::Pack,
         pubkey::Pubkey,
@@ -24,7 +24,7 @@ fn success_init_after_close_account() {
     let destination = Pubkey::new_unique();
     let decimals = 9;
 
-    let owner_account = AccountSharedData::new(1_000_000_000, 0, &system_program::id());
+    let owner_account = SolanaAccount::new(1_000_000_000, 0, &system_program::id());
     let mint_account = setup::setup_mint_account(None, None, 0, decimals);
     let token_account = setup::setup_token_account(&mint, &owner, 0);
 
@@ -32,36 +32,45 @@ fn success_init_after_close_account() {
 
     mollusk.process_and_validate_instruction_chain(
         &[
-            instruction::close_account(&spl_token::id(), &account, &destination, &owner, &[])
-                .unwrap(),
-            system_instruction::create_account(
-                &owner,
-                &account,
-                1_000_000_000,
-                Account::LEN as u64,
-                &spl_token::id(),
+            (
+                &instruction::close_account(&spl_token::id(), &account, &destination, &owner, &[])
+                    .unwrap(),
+                &[Check::success()],
+            ),
+            (
+                &system_instruction::create_account(
+                    &owner,
+                    &account,
+                    1_000_000_000,
+                    Account::LEN as u64,
+                    &spl_token::id(),
+                ),
+                &[Check::success()],
+            ),
+            (
+                &instruction::initialize_account(&spl_token::id(), &account, &mint, &owner)
+                    .unwrap(),
+                &[
+                    Check::success(),
+                    // Account successfully re-initialized.
+                    Check::account(&account)
+                        .data(setup::setup_token_account(&mint, &owner, 0).data())
+                        .owner(&spl_token::id())
+                        .build(),
+                    // The destination should have the lamports from the closed account.
+                    Check::account(&destination)
+                        .lamports(expected_destination_lamports)
+                        .build(),
+                ],
             ),
-            instruction::initialize_account(&spl_token::id(), &account, &mint, &owner).unwrap(),
         ],
         &[
             (mint, mint_account),
             (account, token_account),
             (owner, owner_account),
-            (destination, AccountSharedData::default()),
+            (destination, SolanaAccount::default()),
             mollusk.sysvars.keyed_account_for_rent_sysvar(),
         ],
-        &[
-            Check::success(),
-            // Account successfully re-initialized.
-            Check::account(&account)
-                .data(setup::setup_token_account(&mint, &owner, 0).data())
-                .owner(&spl_token::id())
-                .build(),
-            // The destination should have the lamports from the closed account.
-            Check::account(&destination)
-                .lamports(expected_destination_lamports)
-                .build(),
-        ],
     );
 }
 
@@ -75,7 +84,7 @@ fn fail_init_after_close_account() {
     let destination = Pubkey::new_unique();
     let decimals = 9;
 
-    let owner_account = AccountSharedData::new(1_000_000_000, 0, &system_program::id());
+    let owner_account = SolanaAccount::new(1_000_000_000, 0, &system_program::id());
     let mint_account = setup::setup_mint_account(None, None, 0, decimals);
     let token_account = setup::setup_token_account(&mint, &owner, 0);
 
@@ -83,29 +92,38 @@ fn fail_init_after_close_account() {
 
     mollusk.process_and_validate_instruction_chain(
         &[
-            instruction::close_account(&spl_token::id(), &account, &destination, &owner, &[])
-                .unwrap(),
-            system_instruction::transfer(&owner, &account, 1_000_000_000),
-            instruction::initialize_account(&spl_token::id(), &account, &mint, &owner).unwrap(),
+            (
+                &instruction::close_account(&spl_token::id(), &account, &destination, &owner, &[])
+                    .unwrap(),
+                &[Check::success()],
+            ),
+            (
+                &system_instruction::transfer(&owner, &account, 1_000_000_000),
+                &[Check::success()],
+            ),
+            (
+                &instruction::initialize_account(&spl_token::id(), &account, &mint, &owner)
+                    .unwrap(),
+                &[
+                    Check::err(ProgramError::InvalidAccountData),
+                    // Account not re-initialized.
+                    Check::account(&account)
+                        .lamports(1_000_000_000)
+                        .owner(&system_program::id())
+                        .build(),
+                    // The destination should have the lamports from the closed account.
+                    Check::account(&destination)
+                        .lamports(expected_destination_lamports)
+                        .build(),
+                ],
+            ),
         ],
         &[
             (mint, mint_account),
             (account, token_account),
             (owner, owner_account),
-            (destination, AccountSharedData::default()),
+            (destination, SolanaAccount::default()),
             mollusk.sysvars.keyed_account_for_rent_sysvar(),
         ],
-        &[
-            Check::err(ProgramError::InvalidAccountData),
-            // Account not re-initialized.
-            Check::account(&account)
-                .lamports(1_000_000_000)
-                .owner(&system_program::id())
-                .build(),
-            // The destination should have the lamports from the closed account.
-            Check::account(&destination)
-                .lamports(expected_destination_lamports)
-                .build(),
-        ],
     );
 }

ファイルの差分が大きいため隠しています
+ 201 - 41
program/tests/processor.rs


+ 7 - 10
program/tests/setup.rs

@@ -2,10 +2,7 @@
 
 use {
     solana_sdk::{
-        account::{Account as SolanaAccount, AccountSharedData},
-        program_pack::Pack,
-        pubkey::Pubkey,
-        rent::Rent,
+        account::Account as SolanaAccount, program_pack::Pack, pubkey::Pubkey, rent::Rent,
     },
     spl_token::state::{Account, AccountState, Mint},
 };
@@ -15,7 +12,7 @@ pub fn setup_mint_account(
     freeze_authority: Option<&Pubkey>,
     supply: u64,
     decimals: u8,
-) -> AccountSharedData {
+) -> SolanaAccount {
     let data = {
         let mut data = vec![0; Mint::LEN];
         let state = Mint {
@@ -32,15 +29,15 @@ pub fn setup_mint_account(
     let space = data.len();
     let lamports = Rent::default().minimum_balance(space);
 
-    AccountSharedData::from(SolanaAccount {
+    SolanaAccount {
         lamports,
         data,
         owner: spl_token::id(),
         ..Default::default()
-    })
+    }
 }
 
-pub fn setup_token_account(mint: &Pubkey, owner: &Pubkey, amount: u64) -> AccountSharedData {
+pub fn setup_token_account(mint: &Pubkey, owner: &Pubkey, amount: u64) -> SolanaAccount {
     let data = {
         let mut data = vec![0; Account::LEN];
         let state = Account {
@@ -60,10 +57,10 @@ pub fn setup_token_account(mint: &Pubkey, owner: &Pubkey, amount: u64) -> Accoun
     let space = data.len();
     let lamports = Rent::default().minimum_balance(space);
 
-    AccountSharedData::from(SolanaAccount {
+    SolanaAccount {
         lamports,
         data,
         owner: spl_token::id(),
         ..Default::default()
-    })
+    }
 }

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません