fn test_db_difference()

in merkledb/src/tests.rs [239:284]


    fn test_db_difference() {
        // create db1 which is "hello world" "pika"
        let mut mdb = MerkleMemDB::default();
        let h1 = compute_data_hash("hello world".as_bytes());
        let h2 = compute_data_hash("pikachu".as_bytes());
        let chunks = [ChunkInfo { hash: h1, length: 11 }, ChunkInfo { hash: h2, length: 7 }];

        let nodes: Vec<_> = chunks.iter().map(|x| mdb.add_chunk(x).0).collect();
        let f1hash = *mdb.merge_to_file(&nodes).hash();

        // create db1 which is "hello world" "pika" "poo"
        // but "hello world" and "pika" are merged first
        let h3 = compute_data_hash("poo".as_bytes());
        let mut mdb2 = MerkleMemDB::default();
        let chunks = [ChunkInfo { hash: h1, length: 11 }, ChunkInfo { hash: h2, length: 7 }];

        let nodes: Vec<_> = chunks.iter().map(|x| mdb2.add_chunk(x).0).collect();
        let f1node = mdb2.merge_to_file(&nodes);
        let append_poo: Vec<_> = vec![f1node, mdb2.add_chunk(&ChunkInfo { hash: h3, length: 3 }).0];
        let f2node = mdb2.merge_to_file(&append_poo);
        let f2hash = *f2node.hash();
        mdb2.only_file_invariant_checks();

        let mut diff = MerkleMemDB::default();
        diff.difference(&mdb2, &mdb);
        eprintln!("Old: {:?}\n", mdb);
        eprintln!("New: {:?}\n", mdb2);
        eprintln!("Diff: {:?}\n", diff);

        // diff should contain h3, f2hash and f1hash
        // (seq number is 4 cos id 0 is reserved)
        assert_eq!(diff.get_sequence_number(), 4);

        // check that these two nodes are there
        diff.find_node(&h3).unwrap();
        diff.find_node(&f2hash).unwrap();
        diff.find_node(&f1hash).unwrap();

        mdb.union_with(&diff);
        mdb.union_finalize().unwrap();

        eprintln!("Union: {:?}\n", mdb);

        mdb.only_file_invariant_checks();
        assert_eq!(mdb.get_sequence_number(), mdb2.get_sequence_number());
    }