sui_cluster_test/test_case/
shared_object_test.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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        // Verify fullnode observes the txn
84        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}