Skip to content

Commit

Permalink
update test
Browse files Browse the repository at this point in the history
  • Loading branch information
pause125 committed Oct 24, 2023
1 parent 48afeed commit 7967076
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ crate::natives::gas_parameter::native::define_gas_parameters_for_natives!(GasPar
[.request_init_functions.per_byte, "request_init_functions.per_byte", (5 + 1) * MUL],
[.check_compatibililty_inner.base, "check_compatibililty_inner.base", (5 + 1) * MUL],
[.check_compatibililty_inner.per_byte, "check_compatibililty_inner.per_byte", (5 + 1) * MUL],
[.remap_addresses.base, "remap_addresses.base", (5 + 1) * MUL],
[.remap_addresses.per_byte, "remap_addresses.per_byte", (5 + 1) * MUL],
]);
42 changes: 7 additions & 35 deletions examples/publish_modules/sources/publish.move
Original file line number Diff line number Diff line change
Expand Up @@ -25,43 +25,15 @@ module rooch_examples::publish {
account_storage::publish_modules(ctx, account, vector::singleton(m));
}

#[test(account=@0x42)]
fun test_get_module_name(account: &signer) {
let addr = signer::address_of(account);
let ctx = context::new_test_context(addr);
// The following is the bytes and hex of the compiled module: example/counter/sources/counter.move
// with account 0x42
let module_bytes: vector<u8> = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000";
let m: MoveModule = move_module::new(module_bytes);
let name = move_module::module_name(&m);
debug::print(&name);
context::drop_test_context(ctx);
}

#[test(account=@0x42)]
fun test_verify_modules(account: &signer) {
let addr = signer::address_of(account);
let ctx = context::new_test_context(addr);
public entry fun publish_counter_example(ctx: &mut Context, account: &signer) {
account_storage::ensure_account_storage(ctx, signer::address_of(account));
// The following is the bytes and hex of the compiled module: example/counter/sources/counter.move
// with account 0x42
let module_bytes: vector<u8> = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000";
let m: MoveModule = move_module::new(module_bytes);
let modules = vector::singleton(m);
let (module_names, _module_names_with_init_fn) = move_module::sort_and_verify_modules(&modules, addr);
debug::print(&module_names);
context::drop_test_context(ctx);
}

#[test(account=@0x42)]
fun test_publish_modules(account: &signer) {
let addr = signer::address_of(account);
let ctx = context::new_test_context(addr);
account_storage::create_account_storage(&mut ctx, addr);
// The following is the bytes and hex of the compiled module: example/counter/sources/counter.move
// with account 0x42
let module_bytes: vector<u8> = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000";
let m: MoveModule = move_module::new(module_bytes);
account_storage::publish_modules(&mut ctx, account, vector::singleton(m));
context::drop_test_context(ctx);
let modules = vector::singleton(move_module::new(module_bytes));
let old_addresses = vector::singleton(@0x42);
let new_addresses = vector::singleton(signer::address_of(account));
let remapped_modules = move_module::remap_module_addresses(modules, old_addresses, new_addresses);
account_storage::publish_modules(ctx, account, remapped_modules);
}
}
1 change: 1 addition & 0 deletions moveos/moveos-stdlib/moveos-stdlib/doc/move_module.md
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ Remap addresses in module binary where the length of
i = i + 1;
};
<b>let</b> remapped_bytes = <a href="move_module.md#0x2_move_module_remap_module_addresses_inner">remap_module_addresses_inner</a>(bytes_vec, old_addresses, new_addresses);
// <b>let</b> remapped_bytes = <a href="move_module.md#0x2_move_module_remap_module_addresses_inner">remap_module_addresses_inner</a>(bytes_vec);
<b>let</b> remapped_modules = <a href="_empty">vector::empty</a>&lt;<a href="move_module.md#0x2_move_module_MoveModule">MoveModule</a>&gt;();
i = 0u64;
<b>let</b> len = <a href="_length">vector::length</a>(&remapped_bytes);
Expand Down
34 changes: 34 additions & 0 deletions moveos/moveos-stdlib/moveos-stdlib/sources/move_module.move
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ module moveos_std::move_module {
i = i + 1;
};
let remapped_bytes = remap_module_addresses_inner(bytes_vec, old_addresses, new_addresses);
// let remapped_bytes = remap_module_addresses_inner(bytes_vec);
let remapped_modules = vector::empty<MoveModule>();
i = 0u64;
let len = vector::length(&remapped_bytes);
Expand Down Expand Up @@ -143,5 +144,38 @@ module moveos_std::move_module {
context::drop_test_context(ctx);
}

#[test(account=@0x1314)]
#[expected_failure(abort_code = 0x10001, location = Self)]
fun test_address_mismatch_failure(account: &signer) {
let addr = signer::address_of(account);
let ctx = context::new_test_context(addr);
// The following is the bytes and hex of the compiled module: example/counter/sources/counter.move
// with account 0x42
let module_bytes: vector<u8> = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000";
let m: MoveModule = Self::new(module_bytes);
let modules = vector::singleton(m);
let (module_names, _module_names_with_init_fn) = Self::sort_and_verify_modules(&modules, addr);
debug::print(&module_names);
context::drop_test_context(ctx);
}

#[test(account=@0x1314)]
fun test_remap_address(account: &signer) {
let addr = signer::address_of(account);
let ctx = context::new_test_context(addr);
// The following is the bytes and hex of the compiled module: example/counter/sources/counter.move
// with account 0x42
let module_bytes: vector<u8> = x"a11ceb0b060000000b010006020608030e26043406053a32076c7d08e9014006a902220acb02050cd002560da6030200000101010200030c00020400000005000100000600010000070201000008030400010907080108010a09010108010b0a0b0108040605060606010708010002070801060c0106080101030107080001080002070801050107090003070801060c090002060801050106090007636f756e7465720f6163636f756e745f73746f7261676507636f6e7465787407436f756e74657207436f6e7465787408696e63726561736509696e6372656173655f04696e69740576616c756511676c6f62616c5f626f72726f775f6d75740e676c6f62616c5f6d6f76655f746f0d676c6f62616c5f626f72726f77000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000020520000000000000000000000000000000000000000000000000000000000000004200020108030001040001030b0011010201010000050d0b00070038000c010a01100014060100000000000000160b010f0015020200000001060b000b0106000000000000000012003801020301000001060b000700380210001402000000";
let m: MoveModule = Self::new(module_bytes);
let modules = vector::singleton(m);
let new_addresses = vector::singleton(addr);
let old_addresses = vector::singleton(@0x42);
let remapped_modules = Self::remap_module_addresses(modules, old_addresses, new_addresses);
// In `sort_and_verify_modules`, addresses of modules are ensured to be the same with signer address
// So if the remapping is failed, the verification will fail
let (module_names, _module_names_with_init_fn) = Self::sort_and_verify_modules(&remapped_modules, addr);
debug::print(&module_names);
context::drop_test_context(ctx);
}

}
31 changes: 18 additions & 13 deletions moveos/moveos-stdlib/src/natives/moveos_stdlib/move_module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ use std::collections::{BTreeSet, HashMap, VecDeque};
const E_ADDRESS_NOT_MATCH_WITH_SIGNER: u64 = 1;
const E_MODULE_VERIFICATION_ERROR: u64 = 2;
const E_MODULE_INCOMPATIBLE: u64 = 3;
const _E_LENTH_NOT_MATCH: u64 = 4;
const E_LENTH_NOT_MATCH: u64 = 4;

/// The native module context.
#[derive(Tid)]
Expand Down Expand Up @@ -290,12 +290,23 @@ fn remap_module_addresses_inner(
_ty_args: Vec<Type>,
mut args: VecDeque<Value>,
) -> PartialVMResult<NativeResult> {
debug_assert!(args.len() == 3, "Wrong number of arguments");
let mut cost = gas_params.base;
let new_address_vec = pop_arg!(args, Vec<Value>);
let old_address_vec = pop_arg!(args, Vec<Value>);
let new_address_vec = pop_arg!(args, Vector);
let old_address_vec = pop_arg!(args, Vector);
let num_addresses = new_address_vec.elem_views().len();
if num_addresses != old_address_vec.elem_views().len() {
return Ok(NativeResult::err(
cost,
moveos_types::move_std::error::invalid_argument(E_LENTH_NOT_MATCH),
));
};
let num_addresses = num_addresses as u64;
let new_addresses = new_address_vec.unpack(&Type::Address, num_addresses)?;
let old_addresses = old_address_vec.unpack(&Type::Address, num_addresses)?;

let address_mapping: HashMap<AccountAddress, AccountAddress> =
zip_eq(old_address_vec, new_address_vec)
zip_eq(old_addresses, new_addresses)
.map(|(a, b)| {
Ok((
a.value_as::<AccountAddress>()?,
Expand All @@ -321,19 +332,13 @@ fn remap_module_addresses_inner(
module_remap_addresses(m, &address_mapping)?;
let mut binary: Vec<u8> = vec![];
m.serialize(&mut binary).map_err(|e| {
PartialVMError::new(StatusCode::INTERNAL_TYPE_ERROR).with_message(e.to_string())
PartialVMError::new(StatusCode::VALUE_SERIALIZATION_ERROR).with_message(e.to_string())
})?;
let value = Value::vector_u8(binary);
remapped_bubdles.push(value);
}

Ok(NativeResult::ok(
cost,
smallvec![Vector::pack(
&Type::Vector(Box::new(Type::U8)),
remapped_bubdles
)?],
))
let output_modules = Vector::pack(&Type::Vector(Box::new(Type::U8)), remapped_bubdles)?;
Ok(NativeResult::ok(cost, smallvec![output_modules]))
}

fn module_remap_constant_addresses(value: &mut MoveValue, f: &dyn Fn(&mut AccountAddress)) {
Expand Down

0 comments on commit 7967076

Please sign in to comment.