-
Notifications
You must be signed in to change notification settings - Fork 87
/
Copy pathtest_state_migration.rs
115 lines (102 loc) · 3.19 KB
/
test_state_migration.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use aurora_engine::parameters::NewCallArgs;
use aurora_engine::prelude::U256;
use aurora_engine::types;
use borsh::BorshSerialize;
use near_sdk_sim::{ExecutionResult, UserAccount};
use std::fs;
use std::path::Path;
use std::process::Command;
// TODO: it would be nice to include this under src/tests but right now this is not possible.
// The issue is a linker error (arising from multiple dependencies on near-vm-logic I think).
near_sdk_sim::lazy_static_include::lazy_static_include_bytes! {
EVM_WASM_BYTES => "release.wasm"
}
#[test]
fn test_state_migration() {
let aurora = deploy_evm();
// do upgrade
let upgraded_contract_bytes = contract_bytes();
aurora
.call("stage_upgrade", &upgraded_contract_bytes)
.assert_success();
aurora.call("deploy_upgrade", &[]).assert_success();
// upgraded contract as some_new_fancy_function
let result = aurora.call("some_new_fancy_function", &[]);
result.assert_success();
let some_numbers: [u32; 7] = result.unwrap_borsh();
assert_eq!(some_numbers, [3, 1, 4, 1, 5, 9, 2]);
}
fn deploy_evm() -> AuroraAccount {
let aurora_config = AuroraConfig::default();
let main_account = near_sdk_sim::init_simulator(None);
let contract_account = main_account.deploy(
&aurora_config.code,
aurora_config.account_id.clone(),
5 * near_sdk_sim::STORAGE_AMOUNT,
);
let new_args = NewCallArgs {
chain_id: types::u256_to_arr(&U256::from(aurora_config.chain_id)),
owner_id: main_account.account_id.clone(),
bridge_prover_id: "prover.near".to_string(),
upgrade_delay_blocks: 1,
};
main_account
.call(
contract_account.account_id.clone(),
"new",
&new_args.try_to_vec().unwrap(),
near_sdk_sim::DEFAULT_GAS,
0,
)
.assert_success();
AuroraAccount {
user: main_account,
contract: contract_account,
}
}
struct AuroraAccount {
user: UserAccount,
contract: UserAccount,
}
impl AuroraAccount {
fn call(&self, method: &str, args: &[u8]) -> ExecutionResult {
self.user.call(
self.contract.account_id.clone(),
method,
args,
near_sdk_sim::DEFAULT_GAS,
0,
)
}
}
struct AuroraConfig {
code: Vec<u8>,
chain_id: u64,
account_id: String,
}
impl Default for AuroraConfig {
fn default() -> Self {
Self {
code: EVM_WASM_BYTES.to_vec(),
chain_id: 1313161556, // NEAR betanet
account_id: "aurora".to_string(),
}
}
}
fn contract_bytes() -> Vec<u8> {
let base_path = Path::new("etc").join("state-migration-test");
let output_path = base_path
.join("target/wasm32-unknown-unknown/release/aurora_engine_state_migration_test.wasm");
compile(base_path);
fs::read(output_path).unwrap()
}
fn compile<P: AsRef<Path>>(source_path: P) {
let output = Command::new("cargo")
.current_dir(source_path)
.args(&["build", "--target", "wasm32-unknown-unknown", "--release"])
.output()
.unwrap();
if !output.status.success() {
panic!("{}", String::from_utf8(output.stderr).unwrap());
}
}