Skip to content

Commit 6feb831

Browse files
authored
chore(sails): display slice as hex w/o alloc (#953)
1 parent 7559a52 commit 6feb831

File tree

4 files changed

+114
-11
lines changed

4 files changed

+114
-11
lines changed

examples/demo/app/tests/gtest.rs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,14 @@ async fn ping_pong_low_level_works() {
165165
let demo_program = Program::from_file(&system, DEMO_WASM_PATH);
166166

167167
// Use generated `io` module to create a program
168-
demo_program.send_bytes(ADMIN_ID, demo_factory::io::Default::encode_call());
168+
let message_id = demo_program.send_bytes(ADMIN_ID, demo_factory::io::Default::encode_call());
169+
let run_result = system.run_next_block();
170+
let gas_burned = *run_result
171+
.gas_burned
172+
.get(&message_id)
173+
.expect("message not found");
174+
let wasm_size = std::fs::metadata(DEMO_WASM_PATH).unwrap().len();
175+
println!("[ping_pong_low_level_works] Init Gas: {gas_burned:>14}, Size: {wasm_size}");
169176

170177
// Use generated `io` module for encoding/decoding calls and replies
171178
// and send/receive bytes using `gtest` native means
@@ -185,6 +192,12 @@ async fn ping_pong_low_level_works() {
185192
let ping_reply = ping_pong::io::Ping::decode_reply(ping_reply_payload).unwrap();
186193

187194
assert_eq!(ping_reply, Ok("pong".to_string()));
195+
196+
let gas_burned = *run_result
197+
.gas_burned
198+
.get(&message_id)
199+
.expect("message not found");
200+
println!("[ping_pong_low_level_works] Handle Gas: {gas_burned:>14}, Size: {wasm_size}");
188201
}
189202

190203
#[tokio::test]
@@ -479,6 +492,44 @@ async fn counter_add_works_via_manual_mode() {
479492
);
480493
}
481494

495+
#[test]
496+
fn counter_add_low_level_works() {
497+
let system = System::new();
498+
system.init_logger_with_default_filter("gwasm=debug,gtest=info,sails_rs=debug");
499+
system.mint_to(ADMIN_ID, 1_000_000_000_000_000);
500+
501+
let demo_program = Program::from_file(&system, DEMO_WASM_PATH);
502+
let wasm_size = std::fs::metadata(DEMO_WASM_PATH).unwrap().len();
503+
504+
// Use generated `io` module to create a program
505+
demo_program.send_bytes(ADMIN_ID, demo_factory::io::Default::encode_call());
506+
507+
// Use generated `io` module for encoding/decoding calls and replies
508+
// and send/receive bytes using `gtest` native means
509+
let call_payload = demo_client::counter::io::Add::encode_call(10);
510+
511+
let message_id = demo_program.send_bytes(ADMIN_ID, call_payload);
512+
let run_result = system.run_next_block();
513+
514+
let reply_log_record = run_result
515+
.log()
516+
.iter()
517+
.find(|entry| entry.reply_to() == Some(message_id))
518+
.unwrap();
519+
520+
let reply_payload = reply_log_record.payload();
521+
522+
let reply = demo_client::counter::io::Add::decode_reply(reply_payload).unwrap();
523+
524+
assert_eq!(reply, 10);
525+
526+
let gas_burned = *run_result
527+
.gas_burned
528+
.get(&message_id)
529+
.expect("message not found");
530+
println!("[counter_add_low_level_works] Handle Gas: {gas_burned:>14}, Size: {wasm_size}");
531+
}
532+
482533
#[tokio::test]
483534
async fn value_fee_works() {
484535
// Arrange

rs/ethexe/ethapp/tests/gtest.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ async fn ethapp_sol_works() {
3939
Some(sails_rs::gear_core_errors::ReplyCode::Success(_))
4040
));
4141

42+
let gas_burned = *run_result
43+
.gas_burned
44+
.get(&message_id)
45+
.expect("message not found");
46+
let wasm_size = std::fs::metadata(WASM_PATH).unwrap().len();
47+
println!("[ethapp_sol_works] Init Gas: {gas_burned:>14}, Size: {wasm_size}");
48+
4249
let do_this_sig = sails_rs::solidity::selector("svc1DoThis(uint128,bool,uint32,string)");
4350
let do_this_params = (0u128, false, 42, "hello").abi_encode_sequence();
4451
let payload = [do_this_sig.as_slice(), do_this_params.as_slice()].concat();
@@ -56,6 +63,12 @@ async fn ethapp_sol_works() {
5663
let reply = u32::abi_decode(reply_payload, true);
5764

5865
assert_eq!(reply, Ok(42));
66+
67+
let gas_burned = *run_result
68+
.gas_burned
69+
.get(&message_id)
70+
.expect("message not found");
71+
println!("[ethapp_sol_works] Handle Gas: {gas_burned:>14}, Size: {wasm_size}");
5972
}
6073

6174
#[tokio::test]

rs/ethexe/ethapp_with_events/tests/gtest.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ async fn ethapp_with_events_low_level_works() {
4343
Some(sails_rs::gear_core_errors::ReplyCode::Success(_))
4444
));
4545

46+
let gas_burned = *run_result
47+
.gas_burned
48+
.get(&message_id)
49+
.expect("message not found");
50+
let wasm_size = std::fs::metadata(WASM_PATH).unwrap().len();
51+
println!("[ethapp_with_events_low_level_works] Init Gas: {gas_burned:>14}, Size: {wasm_size}");
52+
4653
let do_this_sig = sails_rs::solidity::selector("svc1DoThis(uint128,bool,uint32,string)");
4754
let do_this_params = (0u128, false, 42, "hello").abi_encode_sequence();
4855
let payload = [do_this_sig.as_slice(), do_this_params.as_slice()].concat();
@@ -62,6 +69,14 @@ async fn ethapp_with_events_low_level_works() {
6269

6370
assert_eq!(reply, Ok(42));
6471

72+
let gas_burned = *run_result
73+
.gas_burned
74+
.get(&message_id)
75+
.expect("message not found");
76+
println!(
77+
"[ethapp_with_events_low_level_works] Handle Gas: {gas_burned:>14}, Size: {wasm_size}"
78+
);
79+
6580
// assert event
6681
const ETH_EVENT_ADDR: ActorId = ActorId::new([
6782
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,

rs/src/gstd/mod.rs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,42 @@ impl<T> From<(T, ValueUnit)> for CommandReply<T> {
6767

6868
pub fn unknown_input_panic(message: &str, input: &[u8]) -> ! {
6969
let mut __input = input;
70-
let input: String = crate::Decode::decode(&mut __input).unwrap_or_else(|_| {
71-
if input.len() <= 8 {
72-
format!("0x{}", crate::hex::encode(input))
70+
match String::decode(&mut __input) {
71+
Ok(s) => panic!("{}: {}", message, s),
72+
Err(_) => panic!("{}: {}", message, HexSlice(input)),
73+
}
74+
}
75+
76+
struct HexSlice<T: AsRef<[u8]>>(T);
77+
78+
impl<T: AsRef<[u8]>> core::fmt::Display for HexSlice<T> {
79+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
80+
let slice = self.0.as_ref();
81+
let len = slice.len();
82+
let precision = f.precision().unwrap_or(4);
83+
84+
f.write_str("0x")?;
85+
if len <= precision * 2 {
86+
for byte in slice {
87+
write!(f, "{:02x}", byte)?;
88+
}
7389
} else {
74-
format!(
75-
"0x{}..{}",
76-
crate::hex::encode(&input[..4]),
77-
crate::hex::encode(&input[input.len() - 4..])
78-
)
90+
for byte in &slice[..precision] {
91+
write!(f, "{:02x}", byte)?;
92+
}
93+
f.write_str("..")?;
94+
for byte in &slice[len - precision..] {
95+
write!(f, "{:02x}", byte)?;
96+
}
7997
}
80-
});
81-
panic!("{}: {}", message, input)
98+
Ok(())
99+
}
100+
}
101+
102+
impl<T: AsRef<[u8]>> core::fmt::Debug for HexSlice<T> {
103+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
104+
core::fmt::Display::fmt(self, f)
105+
}
82106
}
83107

84108
pub trait InvocationIo {

0 commit comments

Comments
 (0)