sui_cluster_test/test_case/
shared_object_test.rs1use crate::{TestCaseImpl, TestContext, helper::ObjectChecker};
5use async_trait::async_trait;
6use sui_json_rpc_types::{SuiExecutionStatus, SuiTransactionBlockEffectsAPI};
7use sui_sdk::wallet_context::WalletContext;
8use sui_test_transaction_builder::{increment_counter, publish_basics_package_and_make_counter};
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_eq!(
44 *response.effects.as_ref().unwrap().status(),
45 SuiExecutionStatus::Success,
46 "Increment counter txn failed: {:?}",
47 *response.effects.as_ref().unwrap().status()
48 );
49
50 response
51 .effects
52 .as_ref()
53 .unwrap()
54 .shared_objects()
55 .iter()
56 .find(|o| o.object_id == counter_id)
57 .expect("Expect obj {counter_id} in shared_objects");
58
59 let counter_version = response
60 .effects
61 .as_ref()
62 .unwrap()
63 .mutated()
64 .iter()
65 .find_map(|obj| {
66 let Owner::Shared {
67 initial_shared_version,
68 } = obj.owner
69 else {
70 return None;
71 };
72
73 if obj.reference.object_id == counter_id
74 && initial_shared_version == initial_counter_version
75 {
76 Some(obj.reference.version)
77 } else {
78 None
79 }
80 })
81 .expect("Expect obj {counter_id} in mutated");
82
83 ctx.let_fullnode_sync(vec![response.digest], 5).await;
85
86 let counter_object = ObjectChecker::new(counter_id)
87 .owner(Owner::Shared {
88 initial_shared_version: initial_counter_version,
89 })
90 .check_into_object(ctx.get_fullnode_client())
91 .await;
92
93 assert_eq!(
94 counter_object.version, counter_version,
95 "Expect sequence number to be 2"
96 );
97
98 Ok(())
99 }
100}