Skip to content

Commit 51ff971

Browse files
authored
p-token: Add more tests (#84)
Add more tests
1 parent 27992e4 commit 51ff971

File tree

2 files changed

+156
-0
lines changed

2 files changed

+156
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
mod setup;
2+
3+
use {
4+
setup::TOKEN_PROGRAM_ID,
5+
solana_keypair::Keypair,
6+
solana_program_pack::Pack,
7+
solana_program_test::{tokio, ProgramTest},
8+
solana_signer::Signer,
9+
solana_system_interface::instruction::create_account,
10+
solana_transaction::Transaction,
11+
spl_token::state::AccountState,
12+
};
13+
14+
#[tokio::test]
15+
async fn initialize_immutable_owner() {
16+
let context = ProgramTest::new("pinocchio_token_program", TOKEN_PROGRAM_ID, None)
17+
.start_with_context()
18+
.await;
19+
20+
// Given an uninitialize account.
21+
22+
let account = Keypair::new();
23+
24+
let account_size = 165;
25+
let rent = context.banks_client.get_rent().await.unwrap();
26+
27+
// When we execute the initialize_immutable_owner instruction.
28+
29+
let instructions = vec![
30+
create_account(
31+
&context.payer.pubkey(),
32+
&account.pubkey(),
33+
rent.minimum_balance(account_size),
34+
account_size as u64,
35+
&TOKEN_PROGRAM_ID,
36+
),
37+
spl_token::instruction::initialize_immutable_owner(&TOKEN_PROGRAM_ID, &account.pubkey())
38+
.unwrap(),
39+
];
40+
41+
let tx = Transaction::new_signed_with_payer(
42+
&instructions,
43+
Some(&context.payer.pubkey()),
44+
&[&context.payer, &account],
45+
context.last_blockhash,
46+
);
47+
context.banks_client.process_transaction(tx).await.unwrap();
48+
49+
// Then the instruction should succeed.
50+
51+
let account = context
52+
.banks_client
53+
.get_account(account.pubkey())
54+
.await
55+
.unwrap();
56+
57+
assert!(account.is_some());
58+
59+
let account = account.unwrap();
60+
let account = spl_token::state::Account::unpack_unchecked(&account.data).unwrap();
61+
62+
assert_eq!(account.state, AccountState::Uninitialized);
63+
}

p-token/tests/sync_native.rs

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
mod setup;
2+
3+
use {
4+
crate::setup::TOKEN_PROGRAM_ID,
5+
mollusk_svm::{result::Check, Mollusk},
6+
pinocchio_token_interface::{
7+
native_mint,
8+
state::{
9+
account::Account as TokenAccount, account_state::AccountState, load_mut_unchecked,
10+
},
11+
},
12+
solana_account::Account,
13+
solana_program_pack::Pack,
14+
solana_program_test::tokio,
15+
solana_pubkey::Pubkey,
16+
solana_rent::Rent,
17+
solana_sdk_ids::bpf_loader_upgradeable,
18+
};
19+
20+
fn create_token_account(
21+
mint: &Pubkey,
22+
owner: &Pubkey,
23+
is_native: bool,
24+
amount: u64,
25+
program_owner: &Pubkey,
26+
) -> Account {
27+
let space = size_of::<TokenAccount>();
28+
let mut lamports = Rent::default().minimum_balance(space);
29+
30+
let mut data: Vec<u8> = vec![0u8; space];
31+
let token = unsafe { load_mut_unchecked::<TokenAccount>(data.as_mut_slice()).unwrap() };
32+
token.set_account_state(AccountState::Initialized);
33+
token.mint = *mint.as_array();
34+
token.owner = *owner.as_array();
35+
token.set_amount(amount);
36+
token.set_native(is_native);
37+
38+
if is_native {
39+
token.set_native_amount(lamports);
40+
lamports = lamports.saturating_add(amount);
41+
}
42+
43+
Account {
44+
lamports,
45+
data,
46+
owner: *program_owner,
47+
executable: false,
48+
..Default::default()
49+
}
50+
}
51+
52+
/// Creates a Mollusk instance with the default feature set, excluding the
53+
/// `bpf_account_data_direct_mapping` feature.
54+
fn mollusk() -> Mollusk {
55+
let mut mollusk = Mollusk::default();
56+
mollusk.add_program(
57+
&TOKEN_PROGRAM_ID,
58+
"pinocchio_token_program",
59+
&bpf_loader_upgradeable::id(),
60+
);
61+
mollusk
62+
}
63+
64+
#[tokio::test]
65+
async fn sync_native() {
66+
let native_mint = Pubkey::new_from_array(native_mint::ID);
67+
let authority_key = Pubkey::new_unique();
68+
69+
// native account
70+
// - amount: 1_000_000_000
71+
// - lamports: 2_000_000_000
72+
let source_account_key = Pubkey::new_unique();
73+
let mut source_account =
74+
create_token_account(&native_mint, &authority_key, true, 0, &TOKEN_PROGRAM_ID);
75+
source_account.lamports += 2_000_000_000;
76+
77+
let instruction =
78+
spl_token::instruction::sync_native(&TOKEN_PROGRAM_ID, &source_account_key).unwrap();
79+
80+
// Executes the sync_native instruction.
81+
82+
let result = mollusk().process_and_validate_instruction_chain(
83+
&[(&instruction, &[Check::success()])],
84+
&[(source_account_key, source_account)],
85+
);
86+
87+
result.resulting_accounts.iter().for_each(|(key, account)| {
88+
if *key == source_account_key {
89+
let token_account = spl_token::state::Account::unpack(&account.data).unwrap();
90+
assert_eq!(token_account.amount, 2_000_000_000);
91+
}
92+
});
93+
}

0 commit comments

Comments
 (0)