@@ -1387,7 +1387,7 @@ mod tests {
13871387 use anyhow:: Result ;
13881388 use rand:: seq:: SliceRandom ;
13891389 use rand:: thread_rng;
1390- use std:: collections:: BTreeMap ;
1390+ use std:: collections:: HashMap ;
13911391
13921392 fn string_to_vec_u8 ( input : & str ) -> Vec < u8 > {
13931393 input. as_bytes ( ) . to_vec ( )
@@ -1555,27 +1555,24 @@ mod tests {
15551555 Ok ( ( ) )
15561556 }
15571557
1558- /*
1559- @TODO: Get this working. Currently inconsistent and canonical test is failing as well
1560-
1558+ // @TODO: Increase record sizes
15611559 #[ test]
15621560 fn diffs ( ) -> Result < ( ) > {
15631561 let mut storage =
15641562 SqlRepoReader :: new ( None , "did:example:123456789abcdefghi" . to_string ( ) , None ) ;
1565- let mapping = generate_bulk_data_keys(10 , Some(&mut storage))?;
1563+ let mapping = generate_bulk_data_keys ( 4 , Some ( & mut storage) ) ?;
15661564 let mut mst = MST :: create ( storage. clone ( ) , None , None ) ?;
1567- let mut to_diff = mst.clone();
1568-
15691565 let entries = mapping
15701566 . iter ( )
15711567 . map ( |e| ( e. 0 . clone ( ) , e. 1 . clone ( ) ) )
15721568 . collect :: < Vec < ( String , Cid ) > > ( ) ;
15731569
15741570 for entry in & entries {
15751571 mst = mst. add ( & entry. 0 , entry. 1 , None ) ?;
1576- to_diff = to_diff.add(&entry.0, entry.1, None)?;
15771572 }
15781573
1574+ let mut to_diff = mst. clone ( ) ;
1575+
15791576 let to_add = generate_bulk_data_keys ( 2 , Some ( & mut storage) ) ?
15801577 . into_iter ( )
15811578 . map ( |e| ( e. 0 , e. 1 ) )
@@ -1591,9 +1588,9 @@ mod tests {
15911588 let to_edit = entries[ 2 ..3 ] . to_vec ( ) ;
15921589 let to_del = entries[ 3 ..4 ] . to_vec ( ) ;
15931590
1594- let mut expected_adds: BTreeMap <String, DataAdd> = BTreeMap ::new();
1595- let mut expected_updates: BTreeMap <String, DataUpdate> = BTreeMap ::new();
1596- let mut expected_dels: BTreeMap <String, DataDelete> = BTreeMap ::new();
1591+ let mut expected_adds: HashMap < String , DataAdd > = HashMap :: new ( ) ;
1592+ let mut expected_updates: HashMap < String , DataUpdate > = HashMap :: new ( ) ;
1593+ let mut expected_dels: HashMap < String , DataDelete > = HashMap :: new ( ) ;
15971594
15981595 for entry in & to_add {
15991596 to_diff = to_diff. add ( & entry. 0 , entry. 1 , None ) ?;
@@ -1638,6 +1635,81 @@ mod tests {
16381635 assert_eq ! ( diff. updates, expected_updates) ;
16391636 assert_eq ! ( diff. deletes, expected_dels) ;
16401637
1638+ // ensure we correctly report all added CIDs
1639+ for mut entry in to_diff. walk ( ) {
1640+ let cid: Cid = match entry {
1641+ NodeEntry :: MST ( ref mut entry) => entry. get_pointer ( ) ?,
1642+ NodeEntry :: Leaf ( ref entry) => entry. value . clone ( ) ,
1643+ } ;
1644+ let found = mst. storage . blocks . has ( cid)
1645+ || diff. new_mst_blocks . has ( cid)
1646+ || diff. new_leaf_cids . has ( cid) ;
1647+ assert ! ( found)
1648+ }
1649+
1650+ Ok ( ( ) )
1651+ }
1652+
1653+ /// computes "simple" tree root CID
1654+ #[ test]
1655+ fn simple_tree_diffs ( ) -> Result < ( ) > {
1656+ let cid1 = Cid :: try_from ( "bafyreie5cvv4h45feadgeuwhbcutmh6t2ceseocckahdoe6uat64zmz454" ) ?;
1657+ let storage = SqlRepoReader :: new ( None , "did:example:123456789abcdefghi" . to_string ( ) , None ) ;
1658+ let mut mst = MST :: create ( storage, None , None ) ?;
1659+
1660+ let mut mst = mst. add ( & "com.example.record/3jqfcqzm3fp2j" . to_string ( ) , cid1, None ) ?; // level 0
1661+ let mut mst = mst. add ( & "com.example.record/3jqfcqzm3fr2j" . to_string ( ) , cid1, None ) ?; // level 0
1662+ let mut mst = mst. add ( & "com.example.record/3jqfcqzm3fs2j" . to_string ( ) , cid1, None ) ?; // level 1
1663+ let mut to_diff = mst. clone ( ) ;
1664+ let mut expected_adds: HashMap < String , DataAdd > = HashMap :: new ( ) ;
1665+ let mut expected_updates: HashMap < String , DataUpdate > = HashMap :: new ( ) ;
1666+ let mut expected_dels: HashMap < String , DataDelete > = HashMap :: new ( ) ;
1667+
1668+ to_diff = to_diff. add ( & "com.example.record/3jqfcqzm3ft2j" . to_string ( ) , cid1, None ) ?; // level 0
1669+ expected_adds. insert (
1670+ "com.example.record/3jqfcqzm3ft2j" . to_string ( ) ,
1671+ DataAdd {
1672+ key : "com.example.record/3jqfcqzm3ft2j" . to_string ( ) ,
1673+ cid : cid1,
1674+ } ,
1675+ ) ;
1676+ to_diff = to_diff. add ( & "com.example.record/3jqfcqzm4fc2j" . to_string ( ) , cid1, None ) ?; // level 0
1677+ expected_adds. insert (
1678+ "com.example.record/3jqfcqzm4fc2j" . to_string ( ) ,
1679+ DataAdd {
1680+ key : "com.example.record/3jqfcqzm4fc2j" . to_string ( ) ,
1681+ cid : cid1,
1682+ } ,
1683+ ) ;
1684+ let updated = random_cid ( & mut None ) ?;
1685+ to_diff = to_diff. update ( & "com.example.record/3jqfcqzm3fs2j" , updated) ?;
1686+ expected_updates. insert (
1687+ "com.example.record/3jqfcqzm3fs2j" . to_string ( ) ,
1688+ DataUpdate {
1689+ key : "com.example.record/3jqfcqzm3fs2j" . to_string ( ) ,
1690+ prev : cid1,
1691+ cid : updated,
1692+ } ,
1693+ ) ;
1694+
1695+ to_diff = to_diff. delete ( & "com.example.record/3jqfcqzm3fr2j" . to_string ( ) ) ?;
1696+ expected_dels. insert (
1697+ "com.example.record/3jqfcqzm3fr2j" . to_string ( ) ,
1698+ DataDelete {
1699+ key : "com.example.record/3jqfcqzm3fr2j" . to_string ( ) ,
1700+ cid : cid1,
1701+ } ,
1702+ ) ;
1703+
1704+ let diff = DataDiff :: of ( & mut to_diff, Some ( & mut mst) ) ?;
1705+ assert_eq ! ( diff. add_list( ) . len( ) , 2 ) ;
1706+ assert_eq ! ( diff. update_list( ) . len( ) , 1 ) ;
1707+ assert_eq ! ( diff. delete_list( ) . len( ) , 1 ) ;
1708+
1709+ assert_eq ! ( diff. adds, expected_adds) ;
1710+ assert_eq ! ( diff. updates, expected_updates) ;
1711+ assert_eq ! ( diff. deletes, expected_dels) ;
1712+
16411713 // ensure we correctly report all added CIDs
16421714 let mut blockstore = mst. storage . clone ( ) ;
16431715 for mut entry in to_diff. walk ( ) {
@@ -1651,7 +1723,7 @@ mod tests {
16511723 }
16521724
16531725 Ok ( ( ) )
1654- } */
1726+ }
16551727
16561728 #[ test]
16571729 fn test_leading_zeros ( ) -> Result < ( ) > {
0 commit comments