sui_cluster_test/test_case/
shared_object_test.rs1use crate::{TestCaseImpl, TestContext, helper::ObjectChecker};
5use async_trait::async_trait;
6use sui_sdk::wallet_context::WalletContext;
7use sui_test_transaction_builder::{increment_counter, publish_basics_package_and_make_counter};
8use sui_types::effects::TransactionEffectsAPI;
9use sui_types::object::Owner;
10use tracing::info;
11
12pub struct SharedCounterTest;
13
14#[async_trait]
15impl TestCaseImpl for SharedCounterTest {
16 fn name(&self) -> &'static str {
17 "SharedCounter"
18 }
19
20 fn description(&self) -> &'static str {
21 "Test publishing basics packages and incrementing Counter (shared object)"
22 }
23
24 async fn run(&self, ctx: &mut TestContext) -> Result<(), anyhow::Error> {
25 info!("Testing shared object transactions.");
26
27 let sui_objs = ctx.get_sui_from_faucet(Some(1)).await;
28 assert!(!sui_objs.is_empty());
29
30 let wallet_context: &WalletContext = ctx.get_wallet();
31 let address = ctx.get_wallet_address();
32 let (package_ref, (counter_id, initial_counter_version, _)) =
33 publish_basics_package_and_make_counter(wallet_context).await;
34 let response = increment_counter(
35 wallet_context,
36 address,
37 None,
38 package_ref.0,
39 counter_id,
40 initial_counter_version,
41 )
42 .await;
43 assert!(
44 response.effects.status().is_ok(),
45 "Increment counter txn failed: {:?}",
46 response.effects.status(),
47 );
48
49 response
50 .effects
51 .input_consensus_objects()
52 .iter()
53 .find(|o| o.id_and_version().0 == counter_id)
54 .expect("Expect obj {counter_id} in shared_objects");
55
56 let counter_version = response
57 .effects
58 .mutated()
59 .iter()
60 .find_map(|obj| {
61 let Owner::Shared {
62 initial_shared_version,
63 } = obj.1
64 else {
65 return None;
66 };
67
68 if obj.0.0 == counter_id && initial_shared_version == initial_counter_version {
69 Some(obj.0.1)
70 } else {
71 None
72 }
73 })
74 .expect("Expect obj {counter_id} in mutated");
75
76 ctx.let_fullnode_sync(vec![response.transaction.digest()], 5)
78 .await;
79
80 let counter_object = ObjectChecker::new(counter_id)
81 .owner(Owner::Shared {
82 initial_shared_version: initial_counter_version,
83 })
84 .check_into_object(ctx.get_fullnode_client())
85 .await;
86
87 assert_eq!(
88 counter_object.version, counter_version,
89 "Expect sequence number to be 2"
90 );
91
92 Ok(())
93 }
94}