mirror of
https://github.com/facebook/sapling.git
synced 2024-10-08 07:49:11 +03:00
treestate: add basic tests for TreeState
Summary: Basic tests about serialization and add/remove/modify operations. Differential Revision: D7769657 fbshipit-source-id: 767ee8fb1d813de5bc99a5d6c81978c89c51f298
This commit is contained in:
parent
18317cc4b5
commit
6111ea14fd
@ -105,3 +105,156 @@ impl TreeState {
|
||||
self.root.watchman_clock.deref()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use rand::{ChaChaRng, Rng};
|
||||
use tempdir::TempDir;
|
||||
|
||||
#[test]
|
||||
fn test_new() {
|
||||
let dir = TempDir::new("treestate").expect("tempdir");
|
||||
let state = TreeState::open(dir.path().join("empty"), None).expect("open");
|
||||
assert!(state.get_watchman_clock().is_empty());
|
||||
assert_eq!(state.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_empty_flush() {
|
||||
let dir = TempDir::new("treestate").expect("tempdir");
|
||||
let mut state = TreeState::open(dir.path().join("empty"), None).expect("open");
|
||||
let block_id = state.flush().expect("flush");
|
||||
let state = TreeState::open(dir.path().join("empty"), block_id.into()).expect("open");
|
||||
assert!(state.get_watchman_clock().is_empty());
|
||||
assert_eq!(state.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_empty_write_as() {
|
||||
let dir = TempDir::new("treestate").expect("tempdir");
|
||||
let mut state = TreeState::open(dir.path().join("empty"), None).expect("open");
|
||||
let block_id = state.write_as(dir.path().join("as")).expect("write_as");
|
||||
let state = TreeState::open(dir.path().join("as"), block_id.into()).expect("open");
|
||||
assert!(state.get_watchman_clock().is_empty());
|
||||
assert_eq!(state.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_set_watchman_clock() {
|
||||
let dir = TempDir::new("treestate").expect("tempdir");
|
||||
let mut state = TreeState::open(dir.path().join("1"), None).expect("open");
|
||||
state.set_watchman_clock(b"foobar");
|
||||
let block_id1 = state.flush().expect("flush");
|
||||
let block_id2 = state.write_as(dir.path().join("2")).expect("write_as");
|
||||
let state = TreeState::open(dir.path().join("1"), block_id1.into()).expect("open");
|
||||
assert_eq!(state.get_watchman_clock()[..], b"foobar"[..]);
|
||||
let state = TreeState::open(dir.path().join("2"), block_id2.into()).expect("open");
|
||||
assert_eq!(state.get_watchman_clock()[..], b"foobar"[..]);
|
||||
}
|
||||
|
||||
// Some random paths extracted from fb-hgext, plus some manually added entries, shuffled.
|
||||
const SAMPLE_PATHS: [&[u8]; 22] = [
|
||||
b".fbarcanist",
|
||||
b"build/.",
|
||||
b"phabricator/phabricator_graphql_client_urllib.pyc",
|
||||
b"hgext3rd/__init__.py",
|
||||
b"hgext3rd/.git/objects/14/8f179e7e702ddedb54c53f2726e7f81b14a33f",
|
||||
b"rust/radixbuf/.git/objects/pack/pack-c0bc37a255e59f5563de9a76013303d8df46a659.idx",
|
||||
b".hg/shelved/default-106.patch",
|
||||
b"rust/radixbuf/.git/objects/20/94e0274ba1ef2ec30de884e3ca4d7093838064",
|
||||
b"rust/radixbuf/.git/hooks/prepare-commit-msg.sample",
|
||||
b"rust/radixbuf/.git/objects/b3/9acb828290b77704cc44e748d6e7d4a528d6ae",
|
||||
b"scripts/lint.py",
|
||||
b".fbarcanist/unit/MercurialTestEngine.php",
|
||||
b".hg/shelved/default-37.patch",
|
||||
b"rust/radixbuf/.git/objects/01/d8e75b3bae0819c4095ae96ebdc889e9e5d806",
|
||||
b"hgext3rd/fastannotate/error.py",
|
||||
b"rust/radixbuf/.git/objects/pack/pack-c0bc37a255e59f5563de9a76013303d8df46a659.pack",
|
||||
b"distutils_rust/__init__.py",
|
||||
b".editorconfig",
|
||||
b"rust/radixbuf/.git/objects/01/89a583d7e9aff802cdfed3ff3cc3a473253281",
|
||||
b"hgext3rd/fastannotate/commands.py",
|
||||
b"distutils_rust/__init__.pyc",
|
||||
b"rust/radixbuf/.git/objects/b3/9b2824f47b66462e92ffa4f978bc95f5fdad2e",
|
||||
];
|
||||
|
||||
fn new_treestate<P: AsRef<Path>>(path: P) -> TreeState {
|
||||
let mut state = TreeState::open(path, None).expect("open");
|
||||
let mut rng = ChaChaRng::new_unseeded();
|
||||
for path in &SAMPLE_PATHS {
|
||||
let file = rng.gen();
|
||||
state.insert(path, &file).expect("insert");
|
||||
}
|
||||
state
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_insert() {
|
||||
let dir = TempDir::new("treestate").expect("tempdir");
|
||||
let mut state = new_treestate(dir.path().join("1"));
|
||||
let mut rng = ChaChaRng::new_unseeded();
|
||||
for path in &SAMPLE_PATHS {
|
||||
let file: FileStateV2 = rng.gen();
|
||||
assert_eq!(state.get(path).unwrap().unwrap(), &file);
|
||||
}
|
||||
assert_eq!(state.len(), SAMPLE_PATHS.len());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_remove() {
|
||||
let dir = TempDir::new("treestate").expect("tempdir");
|
||||
let mut state = new_treestate(dir.path().join("1"));
|
||||
for path in &SAMPLE_PATHS {
|
||||
assert!(state.remove(path).unwrap())
|
||||
}
|
||||
for path in &SAMPLE_PATHS {
|
||||
assert!(!state.remove(path).unwrap())
|
||||
}
|
||||
assert_eq!(state.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_mut() {
|
||||
let dir = TempDir::new("treestate").expect("tempdir");
|
||||
let mut state = new_treestate(dir.path().join("1"));
|
||||
for path in &SAMPLE_PATHS {
|
||||
let file = state.get_mut(path).unwrap().unwrap();
|
||||
file.mode ^= 3;
|
||||
}
|
||||
let mut rng = ChaChaRng::new_unseeded();
|
||||
for path in &SAMPLE_PATHS {
|
||||
let mut file: FileStateV2 = rng.gen();
|
||||
file.mode ^= 3;
|
||||
assert_eq!(state.get(path).unwrap().unwrap(), &file);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_non_empty_flush() {
|
||||
let dir = TempDir::new("treestate").expect("tempdir");
|
||||
let mut state = new_treestate(dir.path().join("1"));
|
||||
let block_id = state.flush().expect("flush");
|
||||
let mut state = TreeState::open(dir.path().join("1"), block_id.into()).expect("open");
|
||||
let mut rng = ChaChaRng::new_unseeded();
|
||||
for path in &SAMPLE_PATHS {
|
||||
let file: FileStateV2 = rng.gen();
|
||||
assert_eq!(state.get(path).unwrap().unwrap(), &file);
|
||||
}
|
||||
assert_eq!(state.len(), SAMPLE_PATHS.len());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_non_empty_write_as() {
|
||||
let dir = TempDir::new("treestate").expect("tempdir");
|
||||
let mut state = new_treestate(dir.path().join("1"));
|
||||
let block_id = state.write_as(dir.path().join("as")).expect("write_as");
|
||||
let mut state = TreeState::open(dir.path().join("as"), block_id.into()).expect("open");
|
||||
let mut rng = ChaChaRng::new_unseeded();
|
||||
for path in &SAMPLE_PATHS {
|
||||
let file: FileStateV2 = rng.gen();
|
||||
assert_eq!(state.get(path).unwrap().unwrap(), &file);
|
||||
}
|
||||
assert_eq!(state.len(), SAMPLE_PATHS.len());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user