github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/forensics/storage/multi_iterator_test.go (about) 1 package storage 2 3 import ( 4 "sort" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 func TestMultiIterator(t *testing.T) { 11 t.Log("Testing forward iterator...") 12 ci1 := iteratorOver(kvPairs("a", "dogs")) 13 ci2 := iteratorOver(kvPairs("b", "frogs", "x", "mogs")) 14 ci3 := iteratorOver(kvPairs("d", "bar", "h", "flobs")) 15 ci4 := iteratorOver(kvPairs("c", "zfoo", "A", "nibble", "\xFF", "HIGH")) 16 mi := NewMultiIterator(false, ci4, ci2, ci3, ci1) 17 start, end := mi.Domain() 18 assert.Equal(t, []byte{'A'}, start) 19 assert.Equal(t, []byte{0xff}, end) 20 assertIteratorSorted(t, mi, false) 21 22 t.Log("Testing reverse iterator...") 23 ci1 = iteratorOver(kvPairs("a", "dogs"), true) 24 ci2 = iteratorOver(kvPairs("b", "frogs", "x", "mogs"), true) 25 ci3 = iteratorOver(kvPairs("d", "bar", "h", "flobs"), true) 26 ci4 = iteratorOver(kvPairs("c", "zfoo", "A", "nibble", "", ""), true) 27 mi = NewMultiIterator(true, ci4, ci2, ci3, ci1) 28 start, end = mi.Domain() 29 assert.Equal(t, []byte{'x'}, start) 30 assert.Equal(t, []byte{}, end) 31 assertIteratorSorted(t, mi, true) 32 } 33 34 func TestDuplicateKeys(t *testing.T) { 35 t.Log("Testing iterators with duplicate keys...") 36 ci1 := iteratorOver(kvPairs("a", "dogs")) 37 ci2 := iteratorOver(kvPairs("a", "frogs", "x", "mogs")) 38 ci3 := iteratorOver(kvPairs("a", "bar", "h", "flobs")) 39 ci4 := iteratorOver(kvPairs("a", "zfoo", "A", "nibble", "\xFF", "HIGH")) 40 mi := NewMultiIterator(false, ci1, ci2, ci3, ci4) 41 var as []string 42 for mi.Valid() { 43 if string(mi.Key()) == "a" { 44 as = append(as, string(mi.Value())) 45 } 46 mi.Next() 47 } 48 assert.Equal(t, []string{"dogs", "frogs", "bar", "zfoo"}, as, 49 "duplicate keys should appear in iterator order") 50 } 51 52 func iteratorOver(kvp []KVPair, reverse ...bool) *ChannelIterator { 53 var sortable sort.Interface = KVPairs(kvp) 54 if len(reverse) > 0 && reverse[0] { 55 sortable = sort.Reverse(sortable) 56 } 57 sort.Stable(sortable) 58 ch := make(chan KVPair) 59 var start, end []byte 60 if len(kvp) > 0 { 61 start, end = kvp[0].Key, kvp[len(kvp)-1].Key 62 } 63 go sendKVPair(ch, kvp) 64 ci := NewChannelIterator(ch, start, end) 65 return ci 66 }