Skip to content

Commit

Permalink
Add tag namespace collision test
Browse files Browse the repository at this point in the history
Confirm that tags with names that could possibly collide with tag namespace
names are really distinct and don't collide.

Signed-off-by: J Robert Ray <jrray@jrray.org>
  • Loading branch information
jrray committed May 16, 2023
1 parent c6d2b95 commit 22f16d6
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
7 changes: 7 additions & 0 deletions crates/spfs/src/fixtures.rs
Original file line number Diff line number Diff line change
Expand Up @@ -273,3 +273,10 @@ fn generate_subtree(root: &std::path::Path, max_depth: i32) {
}
}
}

#[fixture]
pub fn random_digest() -> spfs_encoding::Digest {
let mut thread_rng = rand::thread_rng();
let random_bytes: [u8; spfs_encoding::DIGEST_SIZE] = thread_rng.gen();
spfs_encoding::Digest::from_bytes(&random_bytes).unwrap()
}
50 changes: 50 additions & 0 deletions crates/spfs/src/storage/tag_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -366,3 +366,53 @@ async fn test_tag_in_namespace(
}]
);
}

#[rstest]
#[case::fs(tmprepo("fs"))]
#[tokio::test]
async fn test_tag_in_namespace_name_collision(
#[case]
#[future]
tmprepo: TempRepo,
) {
init_logging();
let tmprepo = tmprepo.await;

// It should be possible to have these distinct tags at the same time:
//
// | namespace | tag name |
// | --------- | ----------- |
// | none | foo/bar/baz |
// | foo | bar/baz |
// | foo/bar | baz |

let repo_in_foo = tmprepo.with_tag_namespace("foo").await;
let repo_in_foo_bar = tmprepo.with_tag_namespace("foo/bar").await;

let foo_bar_baz = random_digest();
let bar_baz = random_digest();
let baz = random_digest();

let spec_foo_bar_baz = tracking::TagSpec::parse("foo/bar/baz").unwrap();
tmprepo
.push_tag(&spec_foo_bar_baz, &foo_bar_baz)
.await
.unwrap();

let spec_bar_baz = tracking::TagSpec::parse("bar/baz").unwrap();
repo_in_foo.push_tag(&spec_bar_baz, &bar_baz).await.unwrap();

let spec_baz = tracking::TagSpec::parse("baz").unwrap();
repo_in_foo_bar.push_tag(&spec_baz, &baz).await.unwrap();

// Now confirm these can be read back.

let tag = repo_in_foo_bar.resolve_tag(&spec_baz).await.unwrap();
assert_eq!(tag.target, baz);

let tag = repo_in_foo.resolve_tag(&spec_bar_baz).await.unwrap();
assert_eq!(tag.target, bar_baz);

let tag = tmprepo.resolve_tag(&spec_foo_bar_baz).await.unwrap();
assert_eq!(tag.target, foo_bar_baz);
}

0 comments on commit 22f16d6

Please sign in to comment.