From dc72e1d6e51b79c3cda921a7941e70ae99039b31 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Fri, 8 Dec 2023 11:47:42 +0000 Subject: [PATCH] [transactional-test-runner] read-only shared inputs (#15268) ## Description Add the ability to specify a transction input that is a read-only shared object (So I can test what transaction effects look like when a transaction includes one of these). ## Test Plan Tested in a follow-up PR that uses this in one of its tests. --- .../sui-transactional-test-runner/src/args.rs | 37 +++++++++++++++++++ .../src/test_adapter.rs | 3 ++ 2 files changed, 40 insertions(+) diff --git a/crates/sui-transactional-test-runner/src/args.rs b/crates/sui-transactional-test-runner/src/args.rs index 403747dc538a1..2a5bcd53d0156 100644 --- a/crates/sui-transactional-test-runner/src/args.rs +++ b/crates/sui-transactional-test-runner/src/args.rs @@ -207,6 +207,7 @@ pub enum SuiExtraValueArgs { Object(FakeID, Option), Digest(String), Receiving(FakeID, Option), + ImmShared(FakeID, Option), } pub enum SuiValue { @@ -215,6 +216,7 @@ pub enum SuiValue { ObjVec(Vec<(FakeID, Option)>), Digest(String), Receiving(FakeID, Option), + ImmShared(FakeID, Option), } impl SuiExtraValueArgs { @@ -232,6 +234,13 @@ impl SuiExtraValueArgs { Ok(SuiExtraValueArgs::Receiving(fake_id, version)) } + fn parse_read_shared_value<'a, I: Iterator>( + parser: &mut MoveCLParser<'a, ValueToken, I>, + ) -> anyhow::Result { + let (fake_id, version) = Self::parse_receiving_or_object_value(parser, "immshared")?; + Ok(SuiExtraValueArgs::ImmShared(fake_id, version)) + } + fn parse_digest_value<'a, I: Iterator>( parser: &mut MoveCLParser<'a, ValueToken, I>, ) -> anyhow::Result { @@ -287,6 +296,7 @@ impl SuiValue { SuiValue::ObjVec(_) => panic!("unexpected nested Sui object vector in args"), SuiValue::Digest(_) => panic!("unexpected nested Sui package digest in args"), SuiValue::Receiving(_, _) => panic!("unexpected nested Sui receiving object in args"), + SuiValue::ImmShared(_, _) => panic!("unexpected nested Sui shared object in args"), } } @@ -297,6 +307,7 @@ impl SuiValue { SuiValue::ObjVec(_) => panic!("unexpected nested Sui object vector in args"), SuiValue::Digest(_) => panic!("unexpected nested Sui package digest in args"), SuiValue::Receiving(_, _) => panic!("unexpected nested Sui receiving object in args"), + SuiValue::ImmShared(_, _) => panic!("unexpected nested Sui shared object in args"), } } @@ -330,6 +341,27 @@ impl SuiValue { Ok(ObjectArg::Receiving(obj.compute_object_reference())) } + fn read_shared_arg( + fake_id: FakeID, + version: Option, + test_adapter: &SuiTestAdapter, + ) -> anyhow::Result { + let obj = Self::resolve_object(fake_id, version, test_adapter)?; + let id = obj.id(); + if let Owner::Shared { + initial_shared_version, + } = obj.owner + { + Ok(ObjectArg::SharedObject { + id, + initial_shared_version, + mutable: false, + }) + } else { + bail!("{fake_id} is not a shared object.") + } + } + fn object_arg( fake_id: FakeID, version: Option, @@ -361,6 +393,9 @@ impl SuiValue { SuiValue::Receiving(fake_id, version) => { CallArg::Object(Self::receiving_arg(fake_id, version, test_adapter)?) } + SuiValue::ImmShared(fake_id, version) => { + CallArg::Object(Self::read_shared_arg(fake_id, version, test_adapter)?) + } SuiValue::ObjVec(_) => bail!("obj vec is not supported as an input"), SuiValue::Digest(pkg) => { let pkg = Symbol::from(pkg); @@ -401,6 +436,7 @@ impl ParsableValue for SuiExtraValueArgs { (ValueToken::Ident, "object") => Some(Self::parse_object_value(parser)), (ValueToken::Ident, "digest") => Some(Self::parse_digest_value(parser)), (ValueToken::Ident, "receiving") => Some(Self::parse_receiving_value(parser)), + (ValueToken::Ident, "immshared") => Some(Self::parse_read_shared_value(parser)), _ => None, } } @@ -435,6 +471,7 @@ impl ParsableValue for SuiExtraValueArgs { SuiExtraValueArgs::Object(id, version) => Ok(SuiValue::Object(id, version)), SuiExtraValueArgs::Digest(pkg) => Ok(SuiValue::Digest(pkg)), SuiExtraValueArgs::Receiving(id, version) => Ok(SuiValue::Receiving(id, version)), + SuiExtraValueArgs::ImmShared(id, version) => Ok(SuiValue::ImmShared(id, version)), } } } diff --git a/crates/sui-transactional-test-runner/src/test_adapter.rs b/crates/sui-transactional-test-runner/src/test_adapter.rs index 5543c5581f990..909e415500d7f 100644 --- a/crates/sui-transactional-test-runner/src/test_adapter.rs +++ b/crates/sui-transactional-test-runner/src/test_adapter.rs @@ -937,6 +937,9 @@ impl<'a> MoveTestAdapter<'a> for SuiTestAdapter<'a> { SuiValue::Digest(_) => bail!("digest is not supported as an input"), SuiValue::ObjVec(_) => bail!("obj vec is not supported as an input"), SuiValue::Receiving(_, _) => bail!("receiving is not supported as an input"), + SuiValue::ImmShared(_, _) => { + bail!("read-only shared object is not supported as an input") + } }; let value = NumericalAddress::new(value.into_bytes(), NumberFormat::Hex); self.compiled_state