This is an automated email from the ASF dual-hosted git repository. erickguan pushed a commit to branch ruby-source-pkg in repository https://gitbox.apache.org/repos/asf/opendal.git
commit d453841a46fbf0d72631ba0eeaf2df592b8be93d Author: QuakeWang <[email protected]> AuthorDate: Wed Jul 8 23:52:00 2026 +0800 test(behavior): cover versioned object operations Signed-off-by: QuakeWang <[email protected]> --- core/tests/behavior/async_delete.rs | 37 +++++++++++++++++++++++++++++-------- core/tests/behavior/async_read.rs | 31 +++++++++++++++++++++---------- core/tests/behavior/async_stat.rs | 9 ++++++++- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/core/tests/behavior/async_delete.rs b/core/tests/behavior/async_delete.rs index ae441cc54..933721acb 100644 --- a/core/tests/behavior/async_delete.rs +++ b/core/tests/behavior/async_delete.rs @@ -246,26 +246,47 @@ pub async fn test_delete_with_version(op: Operator) -> Result<()> { op.write(path.as_str(), content) .await .expect("write must success"); - let meta = op.stat(path.as_str()).await.expect("stat must success"); - let version = meta.version().expect("must have version"); + let first_meta = op.stat(path.as_str()).await.expect("stat must success"); + let first_version = first_meta.version().expect("must have version"); + + op.write(path.as_str(), b"second version".to_vec()) + .await + .expect("write must success"); + let second_meta = op.stat(path.as_str()).await.expect("stat must success"); + let second_version = second_meta.version().expect("must have version"); + assert_ne!(first_version, second_version); op.delete(path.as_str()).await.expect("delete must success"); assert!(!op.exists(path.as_str()).await?); - // After a simple delete, the data can still be accessed using its version. + // After a simple delete, both versions can still be accessed using their versions. + let meta = op + .stat_with(path.as_str()) + .version(first_version) + .await + .expect("stat must success"); + assert_eq!(first_version, meta.version().expect("must have version")); let meta = op .stat_with(path.as_str()) - .version(version) + .version(second_version) .await .expect("stat must success"); - assert_eq!(version, meta.version().expect("must have version")); + assert_eq!(second_version, meta.version().expect("must have version")); + + // After deleting with the version, the data is removed permanently. + op.delete_with(path.as_str()) + .version(first_version) + .await + .expect("delete must success"); + let ret = op.stat_with(path.as_str()).version(first_version).await; + assert!(ret.is_err()); + assert_eq!(ret.unwrap_err().kind(), ErrorKind::NotFound); - // After deleting with the version, the data is removed permanently op.delete_with(path.as_str()) - .version(version) + .version(second_version) .await .expect("delete must success"); - let ret = op.stat_with(path.as_str()).version(version).await; + let ret = op.stat_with(path.as_str()).version(second_version).await; assert!(ret.is_err()); assert_eq!(ret.unwrap_err().kind(), ErrorKind::NotFound); diff --git a/core/tests/behavior/async_read.rs b/core/tests/behavior/async_read.rs index feee7c730..09d3356c3 100644 --- a/core/tests/behavior/async_read.rs +++ b/core/tests/behavior/async_read.rs @@ -1069,31 +1069,42 @@ pub async fn test_read_with_version(op: Operator) -> anyhow::Result<()> { return Ok(()); } - let (path, content, _) = TEST_FIXTURE.new_file(op.clone()); - op.write(path.as_str(), content.clone()) + let (path, first_content, _) = TEST_FIXTURE.new_file(op.clone()); + op.write(path.as_str(), first_content.clone()) .await .expect("write must success"); - let meta = op.stat(path.as_str()).await.expect("stat must success"); - let version = meta.version().expect("must have version"); + let first_meta = op.stat(path.as_str()).await.expect("stat must success"); + let first_version = first_meta.version().expect("must have version"); let data = op .read_with(path.as_str()) - .version(version) + .version(first_version) .await .expect("read must success"); - assert_eq!(content, data.to_vec()); + assert_eq!(first_content, data.to_vec()); - op.write(path.as_str(), "1") + let second_content = b"second version"; + op.write(path.as_str(), second_content.to_vec()) .await .expect("write must success"); + let second_meta = op.stat(path.as_str()).await.expect("stat must success"); + let second_version = second_meta.version().expect("must have version"); + assert_ne!(first_version, second_version); // After writing new data, we can still read the first version data - let second_data = op + let first_version_data = op + .read_with(path.as_str()) + .version(first_version) + .await + .expect("read must success"); + assert_eq!(first_content, first_version_data.to_vec()); + + let second_version_data = op .read_with(path.as_str()) - .version(version) + .version(second_version) .await .expect("read must success"); - assert_eq!(content, second_data.to_vec()); + assert_eq!(second_content.to_vec(), second_version_data.to_vec()); Ok(()) } diff --git a/core/tests/behavior/async_stat.rs b/core/tests/behavior/async_stat.rs index 141200894..a204db09d 100644 --- a/core/tests/behavior/async_stat.rs +++ b/core/tests/behavior/async_stat.rs @@ -570,7 +570,7 @@ pub async fn test_stat_with_version(op: Operator) -> Result<()> { .expect("stat must success"); assert_eq!(first_meta, first_versioning_meta); - op.write(path.as_str(), content) + op.write(path.as_str(), b"second version".to_vec()) .await .expect("write must success"); let second_meta = op.stat(path.as_str()).await.expect("stat must success"); @@ -585,6 +585,13 @@ pub async fn test_stat_with_version(op: Operator) -> Result<()> { .expect("stat must success"); assert_eq!(first_meta, meta); + let meta = op + .stat_with(path.as_str()) + .version(second_version) + .await + .expect("stat must success"); + assert_eq!(second_meta, meta); + Ok(()) }
