@@ -226,6 +226,7 @@ func TestSnapshot(t *testing.T) {
226
226
assert .Equal (i , val )
227
227
}
228
228
229
+ // Now remove the values from the original.
229
230
for i := 0 ; i < 100 ; i ++ {
230
231
ctrie .Remove ([]byte (strconv .Itoa (i )))
231
232
}
@@ -237,6 +238,7 @@ func TestSnapshot(t *testing.T) {
237
238
assert .Equal (i , val )
238
239
}
239
240
241
+ // New Ctrie and snapshot.
240
242
ctrie = New (nil )
241
243
for i := 0 ; i < 100 ; i ++ {
242
244
ctrie .Insert ([]byte (strconv .Itoa (i )), i )
@@ -266,32 +268,77 @@ func TestSnapshot(t *testing.T) {
266
268
_ , ok = ctrie .Lookup ([]byte ("bat" ))
267
269
assert .False (ok )
268
270
269
- snapshot = ctrie .ReadOnlySnapshot ()
271
+ // Ensure snapshots-of-snapshots work as expected.
272
+ snapshot2 := snapshot .Snapshot ()
273
+ for i := 0 ; i < 100 ; i ++ {
274
+ _ , ok := snapshot2 .Lookup ([]byte (strconv .Itoa (i )))
275
+ assert .False (ok )
276
+ }
277
+ val , ok = snapshot2 .Lookup ([]byte ("bat" ))
278
+ assert .True (ok )
279
+ assert .Equal ("man" , val )
280
+
281
+ snapshot2 .Remove ([]byte ("bat" ))
282
+ _ , ok = snapshot2 .Lookup ([]byte ("bat" ))
283
+ assert .False (ok )
284
+ val , ok = snapshot .Lookup ([]byte ("bat" ))
285
+ assert .True (ok )
286
+ assert .Equal ("man" , val )
287
+ }
288
+
289
+ func TestReadOnlySnapshot (t * testing.T ) {
290
+ assert := assert .New (t )
291
+ ctrie := New (nil )
292
+ for i := 0 ; i < 100 ; i ++ {
293
+ ctrie .Insert ([]byte (strconv .Itoa (i )), i )
294
+ }
295
+
296
+ snapshot := ctrie .ReadOnlySnapshot ()
297
+
298
+ // Ensure snapshot contains expected keys.
299
+ for i := 0 ; i < 100 ; i ++ {
300
+ val , ok := snapshot .Lookup ([]byte (strconv .Itoa (i )))
301
+ assert .True (ok )
302
+ assert .Equal (i , val )
303
+ }
304
+
305
+ for i := 0 ; i < 50 ; i ++ {
306
+ ctrie .Remove ([]byte (strconv .Itoa (i )))
307
+ }
308
+
309
+ // Ensure snapshot was unaffected by removals.
270
310
for i := 0 ; i < 100 ; i ++ {
271
311
val , ok := snapshot .Lookup ([]byte (strconv .Itoa (i )))
272
312
assert .True (ok )
273
313
assert .Equal (i , val )
274
314
}
275
315
276
316
// Ensure read-only snapshots panic on writes.
277
- defer func () {
278
- assert .NotNil (recover ())
317
+ func () {
318
+ defer func () {
319
+ assert .NotNil (recover ())
320
+ }()
321
+ snapshot .Remove ([]byte ("blah" ))
279
322
}()
280
- snapshot .Remove ([]byte ("blah" ))
281
323
282
324
// Ensure snapshots-of-snapshots work as expected.
283
325
snapshot2 := snapshot .Snapshot ()
326
+ for i := 50 ; i < 100 ; i ++ {
327
+ ctrie .Remove ([]byte (strconv .Itoa (i )))
328
+ }
284
329
for i := 0 ; i < 100 ; i ++ {
285
330
val , ok := snapshot2 .Lookup ([]byte (strconv .Itoa (i )))
286
331
assert .True (ok )
287
332
assert .Equal (i , val )
288
333
}
289
- snapshot2 .Remove ([]byte ("0" ))
290
- _ , ok = snapshot2 .Lookup ([]byte ("0" ))
291
- assert .False (ok )
292
- val , ok = snapshot .Lookup ([]byte ("0" ))
293
- assert .True (ok )
294
- assert .Equal (0 , val )
334
+
335
+ // Ensure snapshots of read-only snapshots panic on writes.
336
+ func () {
337
+ defer func () {
338
+ assert .NotNil (recover ())
339
+ }()
340
+ snapshot2 .Remove ([]byte ("blah" ))
341
+ }()
295
342
}
296
343
297
344
func TestIterator (t * testing.T ) {
0 commit comments