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  }