@@ -49,6 +49,8 @@ func setupExportTreeBasic(t require.TestingT) *ImmutableTree {
4949 require .NoError (t , err )
5050 _ , _ , err = tree .Remove ([]byte ("z" ))
5151 require .NoError (t , err )
52+ _ , err = tree .Set ([]byte ("abc" ), []byte {6 })
53+ require .NoError (t , err )
5254 _ , version , err := tree .SaveVersion ()
5355 require .NoError (t , err )
5456
@@ -162,10 +164,12 @@ func TestExporter(t *testing.T) {
162164
163165 expect := []* ExportNode {
164166 {Key : []byte ("a" ), Value : []byte {1 }, Version : 1 , Height : 0 },
167+ {Key : []byte ("abc" ), Value : []byte {6 }, Version : 3 , Height : 0 },
168+ {Key : []byte ("abc" ), Value : nil , Version : 3 , Height : 1 },
165169 {Key : []byte ("b" ), Value : []byte {2 }, Version : 3 , Height : 0 },
166- {Key : []byte ("b" ), Value : nil , Version : 3 , Height : 1 },
167170 {Key : []byte ("c" ), Value : []byte {3 }, Version : 3 , Height : 0 },
168- {Key : []byte ("c" ), Value : nil , Version : 3 , Height : 2 },
171+ {Key : []byte ("c" ), Value : nil , Version : 3 , Height : 1 },
172+ {Key : []byte ("b" ), Value : nil , Version : 3 , Height : 2 },
169173 {Key : []byte ("d" ), Value : []byte {4 }, Version : 2 , Height : 0 },
170174 {Key : []byte ("e" ), Value : []byte {5 }, Version : 3 , Height : 0 },
171175 {Key : []byte ("e" ), Value : nil , Version : 3 , Height : 1 },
@@ -188,6 +192,41 @@ func TestExporter(t *testing.T) {
188192 assert .Equal (t , expect , actual )
189193}
190194
195+ func TestExporterCompress (t * testing.T ) {
196+ tree := setupExportTreeBasic (t )
197+
198+ expect := []* ExportNode {
199+ {Key : []byte {0 , 'a' }, Value : []byte {1 }, Version : 1 , Height : 0 },
200+ {Key : []byte {1 , 'b' , 'c' }, Value : []byte {6 }, Version : 3 , Height : 0 },
201+ {Key : nil , Value : nil , Version : 0 , Height : 1 },
202+ {Key : []byte {0 , 'b' }, Value : []byte {2 }, Version : 3 , Height : 0 },
203+ {Key : []byte {0 , 'c' }, Value : []byte {3 }, Version : 3 , Height : 0 },
204+ {Key : nil , Value : nil , Version : 0 , Height : 1 },
205+ {Key : nil , Value : nil , Version : 0 , Height : 2 },
206+ {Key : []byte {0 , 'd' }, Value : []byte {4 }, Version : 2 , Height : 0 },
207+ {Key : []byte {0 , 'e' }, Value : []byte {5 }, Version : 3 , Height : 0 },
208+ {Key : nil , Value : nil , Version : 0 , Height : 1 },
209+ {Key : nil , Value : nil , Version : 0 , Height : 3 },
210+ }
211+
212+ actual := make ([]* ExportNode , 0 , len (expect ))
213+ innerExporter , err := tree .Export ()
214+ require .NoError (t , err )
215+ defer innerExporter .Close ()
216+
217+ exporter := NewCompressExporter (innerExporter )
218+ for {
219+ node , err := exporter .Next ()
220+ if err == ErrorExportDone {
221+ break
222+ }
223+ require .NoError (t , err )
224+ actual = append (actual , node )
225+ }
226+
227+ assert .Equal (t , expect , actual )
228+ }
229+
191230func TestExporter_Import (t * testing.T ) {
192231 testcases := map [string ]* ImmutableTree {
193232 "empty tree" : NewImmutableTree (db .NewMemDB (), 0 , false ),
@@ -200,50 +239,66 @@ func TestExporter_Import(t *testing.T) {
200239
201240 for desc , tree := range testcases {
202241 tree := tree
203- t .Run (desc , func (t * testing.T ) {
204- t .Parallel ()
205-
206- exporter , err := tree .Export ()
207- require .NoError (t , err )
208- defer exporter .Close ()
209-
210- newTree , err := NewMutableTree (db .NewMemDB (), 0 , false )
211- require .NoError (t , err )
212- importer , err := newTree .Import (tree .Version ())
213- require .NoError (t , err )
214- defer importer .Close ()
215-
216- for {
217- item , err := exporter .Next ()
218- if err == ErrorExportDone {
219- err = importer .Commit ()
220- require .NoError (t , err )
221- break
242+ for _ , compress := range []bool {false , true } {
243+ if compress {
244+ desc += "-compress"
245+ }
246+ compress := compress
247+ t .Run (desc , func (t * testing.T ) {
248+ t .Parallel ()
249+
250+ innerExporter , err := tree .Export ()
251+ require .NoError (t , err )
252+ defer innerExporter .Close ()
253+
254+ exporter := NodeExporter (innerExporter )
255+ if compress {
256+ exporter = NewCompressExporter (innerExporter )
222257 }
258+
259+ newTree , err := NewMutableTree (db .NewMemDB (), 0 , false )
223260 require .NoError (t , err )
224- err = importer . Add ( item )
261+ innerImporter , err := newTree . Import ( tree . Version () )
225262 require .NoError (t , err )
226- }
263+ defer innerImporter . Close ()
227264
228- treeHash , err := tree . Hash ( )
229- require . NoError ( t , err )
230- newTreeHash , err := newTree . Hash ( )
231- require . NoError ( t , err )
265+ importer := NodeImporter ( innerImporter )
266+ if compress {
267+ importer = NewCompressImporter ( innerImporter )
268+ }
232269
233- require .Equal (t , treeHash , newTreeHash , "Tree hash mismatch" )
234- require .Equal (t , tree .Size (), newTree .Size (), "Tree size mismatch" )
235- require .Equal (t , tree .Version (), newTree .Version (), "Tree version mismatch" )
270+ for {
271+ item , err := exporter .Next ()
272+ if err == ErrorExportDone {
273+ err = innerImporter .Commit ()
274+ require .NoError (t , err )
275+ break
276+ }
277+ require .NoError (t , err )
278+ err = importer .Add (item )
279+ require .NoError (t , err )
280+ }
236281
237- tree .Iterate (func (key , value []byte ) bool { //nolint:errcheck
238- index , _ , err := tree .GetWithIndex (key )
282+ treeHash , err := tree .Hash ()
239283 require .NoError (t , err )
240- newIndex , newValue , err := newTree .GetWithIndex ( key )
284+ newTreeHash , err := newTree .Hash ( )
241285 require .NoError (t , err )
242- require .Equal (t , index , newIndex , "Index mismatch for key %v" , key )
243- require .Equal (t , value , newValue , "Value mismatch for key %v" , key )
244- return false
286+
287+ require .Equal (t , treeHash , newTreeHash , "Tree hash mismatch" )
288+ require .Equal (t , tree .Size (), newTree .Size (), "Tree size mismatch" )
289+ require .Equal (t , tree .Version (), newTree .Version (), "Tree version mismatch" )
290+
291+ tree .Iterate (func (key , value []byte ) bool { //nolint:errcheck
292+ index , _ , err := tree .GetWithIndex (key )
293+ require .NoError (t , err )
294+ newIndex , newValue , err := newTree .GetWithIndex (key )
295+ require .NoError (t , err )
296+ require .Equal (t , index , newIndex , "Index mismatch for key %v" , key )
297+ require .Equal (t , value , newValue , "Value mismatch for key %v" , key )
298+ return false
299+ })
245300 })
246- })
301+ }
247302 }
248303}
249304
0 commit comments