pub struct System(/* private fields */);
Expand description
The testing environment which simulates the chain state and its transactions but somehow the real on-chain execution environment could be different.
use gtest::System;
// Create a new testing environment.
let system = System::new();
// Init logger with "gwasm" target set to `debug` level.
system.init_logger();
Implementations§
source§impl System
impl System
sourcepub fn new() -> Self
pub fn new() -> Self
Create a new testing environment.
§Panics
Only one instance in the current thread of the System
is possible to
create. Instantiation of the other one leads to runtime panic.
sourcepub fn init_logger(&self)
pub fn init_logger(&self)
Init logger with “gwasm” target set to debug
level.
sourcepub fn init_verbose_logger(&self)
pub fn init_verbose_logger(&self)
Init logger with “gwasm” and “gtest” targets set to debug
level.
sourcepub fn init_logger_with_default_filter<'a>(
&self,
default_filter: impl Into<Cow<'a, str>>,
)
pub fn init_logger_with_default_filter<'a>( &self, default_filter: impl Into<Cow<'a, str>>, )
Init logger with default_filter
as default filter.
sourcepub fn run_next_block(&self) -> BlockRunResult
pub fn run_next_block(&self) -> BlockRunResult
Run next block.
Block execution model is the following:
- increase the block number, update the timestamp
- process tasks from the task pool
- process messages in the queue.
The system is always initialized with a 0 block number. Current block number in the system is the number of the already executed block, therefore block execution starts with a block info update (block number increase, timestamp update). For example, if current block number is 2, it means that messages and tasks on 2 were executed, so the method goes to block number 3 and executes tasks and messages for the updated block number.
Task processing basically tries to execute the scheduled to the specific block tasks:
- delayed sending
- waking message
- removing from the mailbox
- removing reservations
- removing stalled wait message.
Messages processing executes messages until either queue becomes empty or block gas allowance is fully consumed.
sourcepub fn run_next_block_with_allowance(&self, allowance: Gas) -> BlockRunResult
pub fn run_next_block_with_allowance(&self, allowance: Gas) -> BlockRunResult
Runs blocks same as Self::run_next_block
, but with limited
allowance.
sourcepub fn run_to_block(&self, bn: u32) -> Vec<BlockRunResult>
pub fn run_to_block(&self, bn: u32) -> Vec<BlockRunResult>
Runs blocks same as Self::run_next_block
, but executes blocks to
block number bn
including it.
sourcepub fn run_scheduled_tasks(&self, amount: u32) -> Vec<BlockRunResult>
pub fn run_scheduled_tasks(&self, amount: u32) -> Vec<BlockRunResult>
Runs amount
of blocks only with processing task pool, without
processing the message queue.
sourcepub fn block_height(&self) -> u32
pub fn block_height(&self) -> u32
Return the current block height of the testing environment.
sourcepub fn block_timestamp(&self) -> u64
pub fn block_timestamp(&self) -> u64
Return the current block timestamp of the testing environment.
sourcepub fn get_program<ID: Into<ProgramIdWrapper>>(
&self,
id: ID,
) -> Option<Program<'_>>
pub fn get_program<ID: Into<ProgramIdWrapper>>( &self, id: ID, ) -> Option<Program<'_>>
Returns a Program
by id
.
sourcepub fn last_program(&self) -> Option<Program<'_>>
pub fn last_program(&self) -> Option<Program<'_>>
Returns last added program.
sourcepub fn is_active_program<ID: Into<ProgramIdWrapper>>(&self, id: ID) -> bool
pub fn is_active_program<ID: Into<ProgramIdWrapper>>(&self, id: ID) -> bool
Detect if a program is active with given id
.
An active program means that the program could be called,
instead, if returns false
it means that the program has
exited or terminated that it can’t be called anymore.
sourcepub fn submit_local_code_file<P: AsRef<Path>>(&self, code_path: P) -> CodeId
pub fn submit_local_code_file<P: AsRef<Path>>(&self, code_path: P) -> CodeId
Saves code to the storage and returns its code hash
Same as [‘submit_code_file’], but the path is provided as relative to the current directory.
sourcepub fn submit_code_file<P: AsRef<Path>>(&self, code_path: P) -> CodeId
pub fn submit_code_file<P: AsRef<Path>>(&self, code_path: P) -> CodeId
Saves code from file to the storage and returns its code hash
See also System::submit_code
sourcepub fn submit_code(&self, binary: impl Into<Vec<u8>>) -> CodeId
pub fn submit_code(&self, binary: impl Into<Vec<u8>>) -> CodeId
Saves code to the storage and returns its code hash
This method is mainly used for providing a proper program from program
creation logic. In order to successfully create a new program with
gstd::prog::create_program_bytes_with_gas
function, developer should
provide to the function “child’s” code hash. Code for that code hash
must be in storage at the time of the function call. So this method
stores the code in storage.
sourcepub fn submitted_code(&self, code_id: CodeId) -> Option<Vec<u8>>
pub fn submitted_code(&self, code_id: CodeId) -> Option<Vec<u8>>
Returns previously submitted code by its code hash.
sourcepub fn get_mailbox<ID: Into<ProgramIdWrapper>>(
&self,
id: ID,
) -> ActorMailbox<'_>
pub fn get_mailbox<ID: Into<ProgramIdWrapper>>( &self, id: ID, ) -> ActorMailbox<'_>
Extract mailbox of user with given id
.
The mailbox contains messages from the program that are waiting for user action.
sourcepub fn mint_to<ID: Into<ProgramIdWrapper>>(&self, id: ID, value: Value)
pub fn mint_to<ID: Into<ProgramIdWrapper>>(&self, id: ID, value: Value)
Mint balance to user with given id
and value
.
sourcepub fn transfer(
&self,
from: impl Into<ProgramIdWrapper>,
to: impl Into<ProgramIdWrapper>,
value: Value,
keep_alive: bool,
)
pub fn transfer( &self, from: impl Into<ProgramIdWrapper>, to: impl Into<ProgramIdWrapper>, value: Value, keep_alive: bool, )
Transfer balance from user with given from
id to user with given to
id.
sourcepub fn balance_of<ID: Into<ProgramIdWrapper>>(&self, id: ID) -> Value
pub fn balance_of<ID: Into<ProgramIdWrapper>>(&self, id: ID) -> Value
Returns balance of user with given id
.
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for System
impl !RefUnwindSafe for System
impl !Send for System
impl !Sync for System
impl Unpin for System
impl !UnwindSafe for System
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
§fn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
fn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
§fn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
fn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
§impl<T> Conv for T
impl<T> Conv for T
§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
§fn deserialize(
&self,
deserializer: &mut D,
) -> Result<With<T, W>, <D as Fallible>::Error>
fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<T> IsType<T> for T
impl<T> IsType<T> for T
§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for T
§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T
. Read more§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.§impl<T> TryConv for T
impl<T> TryConv for T
§impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
type Error = <U as TryFromKey<T>>::Error
fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>
§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from
.§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T
.