Skip to content

Commit 420f346

Browse files
authored
Traits2 (#233)
* Simplistic trait * Remove irrelevant file * Rename * Delete * Add functions to initialize tests * Restore rust oracle * Add comment * Upd product uses the new syntax * Formatted
1 parent 4faa1f7 commit 420f346

File tree

7 files changed

+118
-180
lines changed

7 files changed

+118
-180
lines changed

program/rust/src/c_oracle_header.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,21 @@ include!("../bindings.rs");
1616
/// (mapping, price, product). This allows less duplicated code, because now we can create generic
1717
/// functions to perform common checks on the accounts and to load and initialize the accounts.
1818
pub trait PythAccount: Pod {
19+
/// `ACCOUNT_TYPE` is just the account discriminator, it is different for mapping, product and
20+
/// price
1921
const ACCOUNT_TYPE: u32;
22+
/// `INITIAL_SIZE` is the value that the field `size_` will take when the account is first
23+
/// initialized this one is slightly tricky because for mapping (resp. price) `size_` won't
24+
/// include the unpopulated entries of `prod_` (resp. `comp_`). At the beginning there are 0
25+
/// products (resp. 0 components) therefore `INITIAL_SIZE` will be equal to the offset of
26+
/// `prod_` (resp. `comp_`) Similarly the product account `INITIAL_SIZE` won't include any
27+
/// key values.
2028
const INITIAL_SIZE: u32;
29+
/// `minimum_size()` is the minimum size that the solana account holding the struct needs to
30+
/// have. `INITIAL_SIZE` <= `minimum_size()`
31+
fn minimum_size() -> usize {
32+
size_of::<Self>()
33+
}
2134
}
2235

2336
impl PythAccount for pc_map_table_t {
@@ -28,6 +41,9 @@ impl PythAccount for pc_map_table_t {
2841
impl PythAccount for pc_prod_t {
2942
const ACCOUNT_TYPE: u32 = PC_ACCTYPE_PRODUCT;
3043
const INITIAL_SIZE: u32 = size_of::<pc_prod_t>() as u32;
44+
fn minimum_size() -> usize {
45+
PC_PROD_ACC_SIZE as usize
46+
}
3147
}
3248

3349
impl PythAccount for pc_price_t {

program/rust/src/tests/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ mod test_add_mapping;
22
mod test_add_product;
33
mod test_init_mapping;
44
mod test_upd_product;
5+
mod test_utils;

program/rust/src/tests/test_add_mapping.rs

Lines changed: 9 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,10 @@ use crate::rust_oracle::{
1616
pubkey_equal,
1717
pubkey_is_zero,
1818
};
19+
use crate::tests::test_utils::AccountSetup;
1920
use bytemuck::bytes_of;
20-
use solana_program::account_info::AccountInfo;
21-
use solana_program::clock::Epoch;
22-
use solana_program::native_token::LAMPORTS_PER_SOL;
2321
use solana_program::program_error::ProgramError;
2422
use solana_program::pubkey::Pubkey;
25-
use solana_program::rent::Rent;
26-
use solana_program::system_program;
27-
use std::mem::size_of;
2823

2924
#[test]
3025
fn test_add_mapping() {
@@ -35,61 +30,23 @@ fn test_add_mapping() {
3530
let instruction_data = bytes_of::<cmd_hdr_t>(&hdr);
3631

3732
let program_id = Pubkey::new_unique();
38-
let funding_key = Pubkey::new_unique();
39-
let cur_mapping_key = Pubkey::new_unique();
40-
let next_mapping_key = Pubkey::new_unique();
41-
let system_program = system_program::id();
4233

43-
let mut funding_balance = LAMPORTS_PER_SOL.clone();
44-
let funding_account = AccountInfo::new(
45-
&funding_key,
46-
true,
47-
true,
48-
&mut funding_balance,
49-
&mut [],
50-
&system_program,
51-
false,
52-
Epoch::default(),
53-
);
54-
55-
let mut cur_mapping_balance =
56-
Rent::minimum_balance(&Rent::default(), size_of::<pc_map_table_t>());
57-
let mut cur_mapping_raw_data = [0u8; size_of::<pc_map_table_t>()];
58-
59-
let cur_mapping = AccountInfo::new(
60-
&cur_mapping_key,
61-
true,
62-
true,
63-
&mut cur_mapping_balance,
64-
&mut cur_mapping_raw_data,
65-
&program_id,
66-
false,
67-
Epoch::default(),
68-
);
34+
let mut funding_setup = AccountSetup::new_funding();
35+
let funding_account = funding_setup.to_account_info();
6936

37+
let mut curr_mapping_setup = AccountSetup::new::<pc_map_table_t>(&program_id);
38+
let cur_mapping = curr_mapping_setup.to_account_info();
7039
initialize_checked::<pc_map_table_t>(&cur_mapping, PC_VERSION).unwrap();
7140

41+
let mut next_mapping_setup = AccountSetup::new::<pc_map_table_t>(&program_id);
42+
let next_mapping = next_mapping_setup.to_account_info();
43+
7244
{
7345
let mut cur_mapping_data =
7446
load_checked::<pc_map_table_t>(&cur_mapping, PC_VERSION).unwrap();
7547
cur_mapping_data.num_ = PC_MAP_TABLE_SIZE;
7648
}
7749

78-
let mut next_mapping_balance =
79-
Rent::minimum_balance(&Rent::default(), size_of::<pc_map_table_t>());
80-
let mut next_mapping_raw_data = [0u8; size_of::<pc_map_table_t>()];
81-
82-
let next_mapping = AccountInfo::new(
83-
&next_mapping_key,
84-
true,
85-
true,
86-
&mut next_mapping_balance,
87-
&mut next_mapping_raw_data,
88-
&program_id,
89-
false,
90-
Epoch::default(),
91-
);
92-
9350
assert!(add_mapping(
9451
&program_id,
9552
&[
@@ -108,7 +65,7 @@ fn test_add_mapping() {
10865

10966
assert!(pubkey_equal(
11067
&cur_mapping_data.next_,
111-
&next_mapping_key.to_bytes()
68+
&next_mapping.key.to_bytes()
11269
));
11370
assert!(pubkey_is_zero(&next_mapping_data.next_));
11471
pubkey_assign(&mut cur_mapping_data.next_, &Pubkey::default().to_bytes());

program/rust/src/tests/test_add_product.rs

Lines changed: 11 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
11
use std::mem::size_of;
22

3-
use bytemuck::{
4-
bytes_of,
5-
Zeroable,
6-
};
3+
use crate::tests::test_utils::AccountSetup;
4+
use bytemuck::bytes_of;
75
use solana_program::account_info::AccountInfo;
86
use solana_program::clock::Epoch;
9-
use solana_program::native_token::LAMPORTS_PER_SOL;
107
use solana_program::program_error::ProgramError;
118
use solana_program::pubkey::Pubkey;
129
use solana_program::rent::Rent;
13-
use solana_program::system_program;
1410

1511
use crate::c_oracle_header::{
1612
cmd_hdr_t,
1713
command_t_e_cmd_add_product,
1814
pc_map_table_t,
1915
pc_prod_t,
20-
PC_ACCTYPE_MAPPING,
2116
PC_ACCTYPE_PRODUCT,
2217
PC_MAGIC,
2318
PC_MAP_TABLE_SIZE,
@@ -42,67 +37,19 @@ fn test_add_product() {
4237
let instruction_data = bytes_of::<cmd_hdr_t>(&hdr);
4338

4439
let program_id = Pubkey::new_unique();
45-
let funding_key = Pubkey::new_unique();
46-
let mkey = Pubkey::new_unique();
47-
let product_key_1 = Pubkey::new_unique();
48-
let product_key_2 = Pubkey::new_unique();
49-
50-
let system_program = system_program::id();
51-
let mut funding_balance = LAMPORTS_PER_SOL.clone();
52-
let funding_account = AccountInfo::new(
53-
&funding_key,
54-
true,
55-
true,
56-
&mut funding_balance,
57-
&mut [],
58-
&system_program,
59-
false,
60-
Epoch::default(),
61-
);
6240

63-
let mut mapping_balance = Rent::minimum_balance(&Rent::default(), size_of::<pc_map_table_t>());
64-
let mut mapping_data: pc_map_table_t = pc_map_table_t::zeroed();
65-
mapping_data.magic_ = PC_MAGIC;
66-
mapping_data.ver_ = PC_VERSION;
67-
mapping_data.type_ = PC_ACCTYPE_MAPPING;
68-
let mut mapping_bytes = bytemuck::bytes_of_mut(&mut mapping_data);
41+
let mut funding_setup = AccountSetup::new_funding();
42+
let funding_account = funding_setup.to_account_info();
6943

70-
let mapping_account = AccountInfo::new(
71-
&mkey,
72-
true,
73-
true,
74-
&mut mapping_balance,
75-
&mut mapping_bytes,
76-
&program_id,
77-
false,
78-
Epoch::default(),
79-
);
44+
let mut mapping_setup = AccountSetup::new::<pc_map_table_t>(&program_id);
45+
let mapping_account = mapping_setup.to_account_info();
46+
initialize_checked::<pc_map_table_t>(&mapping_account, PC_VERSION).unwrap();
8047

81-
let mut product_balance = Rent::minimum_balance(&Rent::default(), PC_PROD_ACC_SIZE as usize);
82-
let mut prod_raw_data = [0u8; PC_PROD_ACC_SIZE as usize];
83-
let product_account = AccountInfo::new(
84-
&product_key_1,
85-
true,
86-
true,
87-
&mut product_balance,
88-
&mut prod_raw_data,
89-
&program_id,
90-
false,
91-
Epoch::default(),
92-
);
48+
let mut product_setup = AccountSetup::new::<pc_prod_t>(&program_id);
49+
let product_account = product_setup.to_account_info();
9350

94-
let mut product_balance_2 = Rent::minimum_balance(&Rent::default(), PC_PROD_ACC_SIZE as usize);
95-
let mut prod_raw_data_2 = [0u8; PC_PROD_ACC_SIZE as usize];
96-
let product_account_2 = AccountInfo::new(
97-
&product_key_2,
98-
true,
99-
true,
100-
&mut product_balance_2,
101-
&mut prod_raw_data_2,
102-
&program_id,
103-
false,
104-
Epoch::default(),
105-
);
51+
let mut product_setup_2 = AccountSetup::new::<pc_prod_t>(&program_id);
52+
let product_account_2 = product_setup_2.to_account_info();
10653

10754
assert!(add_product(
10855
&program_id,

program/rust/src/tests/test_init_mapping.rs

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,11 @@ use crate::rust_oracle::{
1111
clear_account,
1212
init_mapping,
1313
};
14+
use crate::tests::test_utils::AccountSetup;
1415
use bytemuck::bytes_of;
15-
use solana_program::account_info::AccountInfo;
16-
use solana_program::clock::Epoch;
17-
use solana_program::native_token::LAMPORTS_PER_SOL;
1816
use solana_program::program_error::ProgramError;
1917
use solana_program::pubkey::Pubkey;
20-
use solana_program::rent::Rent;
21-
use solana_program::system_program;
2218
use std::cell::RefCell;
23-
use std::mem::size_of;
2419
use std::rc::Rc;
2520

2621
#[test]
@@ -33,35 +28,12 @@ fn test_init_mapping() {
3328

3429
let program_id = Pubkey::new_unique();
3530
let program_id_2 = Pubkey::new_unique();
36-
let funding_key = Pubkey::new_unique();
37-
let mapping_key = Pubkey::new_unique();
38-
let system_program = system_program::id();
39-
40-
let mut funding_balance = LAMPORTS_PER_SOL.clone();
41-
let mut funding_account = AccountInfo::new(
42-
&funding_key,
43-
true,
44-
true,
45-
&mut funding_balance,
46-
&mut [],
47-
&system_program,
48-
false,
49-
Epoch::default(),
50-
);
5131

52-
let mut mapping_balance = Rent::minimum_balance(&Rent::default(), size_of::<pc_map_table_t>());
53-
let mut mapping_raw_data = [0u8; size_of::<pc_map_table_t>()];
32+
let mut funding_setup = AccountSetup::new_funding();
33+
let mut funding_account = funding_setup.to_account_info();
5434

55-
let mut mapping_account = AccountInfo::new(
56-
&mapping_key,
57-
true,
58-
true,
59-
&mut mapping_balance,
60-
&mut mapping_raw_data,
61-
&program_id,
62-
false,
63-
Epoch::default(),
64-
);
35+
let mut mapping_setup = AccountSetup::new::<pc_map_table_t>(&program_id);
36+
let mut mapping_account = mapping_setup.to_account_info();
6537

6638
assert!(init_mapping(
6739
&program_id,

program/rust/src/tests/test_upd_product.rs

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
use std::mem::size_of;
22

3+
use crate::tests::test_utils::AccountSetup;
34
use solana_program::account_info::AccountInfo;
4-
use solana_program::clock::Epoch;
5-
use solana_program::native_token::LAMPORTS_PER_SOL;
65
use solana_program::program_error::ProgramError;
76
use solana_program::pubkey::Pubkey;
8-
use solana_program::rent::Rent;
9-
use solana_program::system_program;
107

118
use crate::c_oracle_header::{
129
cmd_hdr_t,
@@ -30,34 +27,12 @@ fn test_upd_product() {
3027
let mut instruction_data = [0u8; PC_PROD_ACC_SIZE as usize];
3128

3229
let program_id = Pubkey::new_unique();
33-
let funding_key = Pubkey::new_unique();
34-
let product_key = Pubkey::new_unique();
35-
36-
let system_program = system_program::id();
37-
let mut funding_balance = LAMPORTS_PER_SOL.clone();
38-
let funding_account = AccountInfo::new(
39-
&funding_key,
40-
true,
41-
true,
42-
&mut funding_balance,
43-
&mut [],
44-
&system_program,
45-
false,
46-
Epoch::default(),
47-
);
4830

49-
let mut product_balance = Rent::minimum_balance(&Rent::default(), PC_PROD_ACC_SIZE as usize);
50-
let mut prod_raw_data = [0u8; PC_PROD_ACC_SIZE as usize];
51-
let product_account = AccountInfo::new(
52-
&product_key,
53-
true,
54-
true,
55-
&mut product_balance,
56-
&mut prod_raw_data,
57-
&program_id,
58-
false,
59-
Epoch::default(),
60-
);
31+
let mut funding_setup = AccountSetup::new_funding();
32+
let funding_account = funding_setup.to_account_info();
33+
34+
let mut product_setup = AccountSetup::new::<pc_prod_t>(&program_id);
35+
let product_account = product_setup.to_account_info();
6136

6237
initialize_checked::<pc_prod_t>(&product_account, PC_VERSION).unwrap();
6338

0 commit comments

Comments
 (0)