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:
Jun Wu 2018-05-22 23:31:33 -07:00 committed by Facebook Github Bot
parent 18317cc4b5
commit 6111ea14fd

View File

@ -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());
}
}