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_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        // Verify fullnode observes the txn
77        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}