Skip to content

Commit

Permalink
Merge pull request #122 from lovoo/bugfix/multi-iterator-tests
Browse files Browse the repository at this point in the history
fixing multi-iterator test cases
  • Loading branch information
db7 committed Apr 9, 2018
2 parents ee629ef + 413c398 commit d58a314
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 26 deletions.
3 changes: 2 additions & 1 deletion storage/memory.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package storage
import (
"bytes"
"fmt"
"strings"

"github.com/syndtr/goleveldb/leveldb/util"
)
Expand Down Expand Up @@ -50,7 +51,7 @@ func (i *memiter) Seek(key []byte) bool {
seek := make(map[string][]byte)
keys := []string{}
for k, v := range i.storage {
if bytes.ContainsAny(key, k) {
if strings.Contains(k, string(key)) {
keys = append(keys, k)
seek[k] = v
}
Expand Down
9 changes: 4 additions & 5 deletions storage/multi_iterator.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,13 @@ func NewMultiIterator(iters []Iterator) Iterator {
return &multiIterator{current: 0, iters: iters}
}

func (m *multiIterator) Next() (next bool) {
func (m *multiIterator) Next() bool {
for ; m.current < len(m.iters); m.current++ {
next = m.iters[m.current].Next()
if next {
break
if m.iters[m.current].Next() {
return true
}
}
return next
return false
}

func (m *multiIterator) Key() []byte {
Expand Down
50 changes: 30 additions & 20 deletions storage/multi_iterator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,17 @@ import (
)

func TestMultiIterator(t *testing.T) {
numStorages := 3
numValues := 3

storages := make([]Storage, numStorages)
expected := map[string]string{}
var (
numStorages = 3
numValues = 3
storages = make([]Storage, numStorages)
expected = make(map[string]string)
)

for i := 0; i < numStorages; i++ {
storages[i] = NewMemory()
for j := 0; j < numValues; j++ {
key := fmt.Sprintf("storage-%d", i)
key := fmt.Sprintf("key-%d-%d", i, j)
val := fmt.Sprintf("value-%d", j)
expected[key] = val
storages[i].Set(key, []byte(val))
Expand All @@ -41,13 +42,11 @@ func TestMultiIterator(t *testing.T) {
}
ensure.DeepEqual(t, count, len(expected))

k := []byte("storage-0")
k := []byte("key-2")
iter = NewMultiIterator(iters)
ensure.True(t, iter.Seek(k), "seek return false should return true")
ensure.True(t, iter.Next(), "Iterator should have a value")
ensure.DeepEqual(t, iter.Key(), k, "key mismatch")

total := 1
total := 0
for iter.Next() {
_, err := iter.Value()
ensure.Nil(t, err)
Expand Down Expand Up @@ -85,18 +84,21 @@ func TestMultiIteratorOneValue(t *testing.T) {
}

func TestMultiIteratorMixedValues(t *testing.T) {
storages := make([]Storage, 3)
var expected []string
n := 0
var (
n = 0
storages = make([]Storage, 3)
expected = make(map[string]string)
counts = make(map[string]int)
)

// first storage has two values
storages[0] = NewMemory()
for i := 0; i < 2; i++ {
key := fmt.Sprintf("key-%d", n)
val := fmt.Sprintf("value-%d", n)
n++
expected = append(expected, val)
expected[key] = val
storages[0].Set(key, []byte(val))
n++
}

// second storage has 0 values
Expand All @@ -107,9 +109,9 @@ func TestMultiIteratorMixedValues(t *testing.T) {
for i := 0; i < 3; i++ {
key := fmt.Sprintf("key-%d", n)
val := fmt.Sprintf("value-%d", n)
n++
expected = append(expected, val)
expected[key] = val
storages[2].Set(key, []byte(val))
n++
}

iters := make([]Iterator, len(storages))
Expand All @@ -120,12 +122,20 @@ func TestMultiIteratorMixedValues(t *testing.T) {
}

iter := NewMultiIterator(iters)
count := 0
for iter.Next() {
val, err := iter.Value()
ensure.Nil(t, err)
ensure.DeepEqual(t, expected[count], string(val))
count++
ensure.DeepEqual(t, expected[string(iter.Key())], string(val))
counts[string(iter.Key())]++
}

// uniques and totals should match
unique := 0
count := 0
for _, c := range counts {
unique++
count += c
}
ensure.DeepEqual(t, count, len(expected))
ensure.DeepEqual(t, unique, len(expected))
}

0 comments on commit d58a314

Please sign in to comment.