| Index: impl/memory/gkvlite_iter_test.go
|
| diff --git a/impl/memory/gkvlite_iter_test.go b/impl/memory/gkvlite_iter_test.go
|
| index cb22c6d8c32bdb8950b37cdb6fdc663383cc603b..bab9a4718bd1a06e57cee9b6867f6125070125d6 100644
|
| --- a/impl/memory/gkvlite_iter_test.go
|
| +++ b/impl/memory/gkvlite_iter_test.go
|
| @@ -6,7 +6,6 @@ package memory
|
|
|
| import (
|
| "bytes"
|
| - "fmt"
|
| "testing"
|
|
|
| "github.com/luci/gkvlite"
|
| @@ -17,17 +16,15 @@ import (
|
| func mkNum(n int64) []byte {
|
| buf := &bytes.Buffer{}
|
| _, err := cmpbin.WriteInt(buf, n)
|
| - if err != nil {
|
| - panic(fmt.Errorf("your RAM is busted: %s", err))
|
| - }
|
| + memoryCorruption(err)
|
| +
|
| return buf.Bytes()
|
| }
|
|
|
| func readNum(data []byte) int64 {
|
| ret, _, err := cmpbin.ReadInt(bytes.NewBuffer(data))
|
| - if err != nil {
|
| - panic(fmt.Errorf("your RAM is (probably) busted: %s", err))
|
| - }
|
| + memoryCorruption(err)
|
| +
|
| return ret
|
| }
|
|
|
| @@ -43,47 +40,49 @@ func TestIterator(t *testing.T) {
|
| prev = data
|
| }
|
|
|
| - get := func(c C, t *iterator) int64 {
|
| - ret := int64(0)
|
| + get := func(c C, t *iterator) interface{} {
|
| + ret := interface{}(nil)
|
| t.next(nil, func(i *gkvlite.Item) {
|
| - c.So(i, ShouldNotBeNil)
|
| - ret = readNum(i.Key)
|
| + if i != nil {
|
| + ret = readNum(i.Key)
|
| + }
|
| })
|
| return ret
|
| }
|
|
|
| - skipGet := func(c C, t *iterator, skipTo int64) int64 {
|
| - ret := int64(0)
|
| + skipGet := func(c C, t *iterator, skipTo int64) interface{} {
|
| + ret := interface{}(nil)
|
| t.next(mkNum(skipTo), func(i *gkvlite.Item) {
|
| - c.So(i, ShouldNotBeNil)
|
| - ret = readNum(i.Key)
|
| + if i != nil {
|
| + ret = readNum(i.Key)
|
| + }
|
| })
|
| return ret
|
| }
|
|
|
| Convey("Test iterator", t, func() {
|
| Convey("start at nil", func(ctx C) {
|
| - t := newIterator(c, nil, nil)
|
| + t := newIterator(&iterDefinition{c: c})
|
| defer t.stop()
|
| So(get(ctx, t), ShouldEqual, 5)
|
| So(get(ctx, t), ShouldEqual, 6)
|
| So(get(ctx, t), ShouldEqual, 7)
|
|
|
| - Convey("And can skip", func() {
|
| + Convey("And can skip", func(ctx C) {
|
| So(skipGet(ctx, t, 10), ShouldEqual, 10)
|
| So(get(ctx, t), ShouldEqual, 11)
|
|
|
| - Convey("But not forever", func(c C) {
|
| + Convey("But not forever", func(ctx C) {
|
| t.next(mkNum(200), func(i *gkvlite.Item) {
|
| - c.So(i, ShouldBeNil)
|
| + ctx.So(i, ShouldBeNil)
|
| })
|
| t.next(nil, func(i *gkvlite.Item) {
|
| - c.So(i, ShouldBeNil)
|
| + ctx.So(i, ShouldBeNil)
|
| })
|
| })
|
| })
|
|
|
| - Convey("Can iterate explicitly", func() {
|
| + Convey("Can iterate explicitly", func(ctx C) {
|
| So(skipGet(ctx, t, 7), ShouldEqual, 8)
|
| So(skipGet(ctx, t, 8), ShouldEqual, 9)
|
|
|
| @@ -91,27 +90,37 @@ func TestIterator(t *testing.T) {
|
| So(skipGet(ctx, t, 10), ShouldEqual, 10)
|
| })
|
|
|
| - Convey("Can stop", func(c C) {
|
| + Convey("Can stop", func(ctx C) {
|
| t.stop()
|
| t.next(mkNum(200), func(i *gkvlite.Item) {
|
| - c.So(i, ShouldBeNil)
|
| + ctx.So(i, ShouldBeNil)
|
| })
|
| t.next(nil, func(i *gkvlite.Item) {
|
| - c.So(i, ShouldBeNil)
|
| + ctx.So(i, ShouldBeNil)
|
| })
|
| So(t.stop, ShouldNotPanic)
|
| })
|
|
|
| - Convey("Going backwards is ignored", func(c C) {
|
| + Convey("Going backwards is ignored", func(ctx C) {
|
| So(skipGet(ctx, t, 3), ShouldEqual, 8)
|
| So(get(ctx, t), ShouldEqual, 9)
|
| So(skipGet(ctx, t, 20), ShouldEqual, 20)
|
| So(get(ctx, t), ShouldEqual, 21)
|
| })
|
| +
|
| + Convey("will stop at the end of the list", func(ctx C) {
|
| + So(skipGet(ctx, t, 95), ShouldEqual, 95)
|
| + So(get(ctx, t), ShouldEqual, 96)
|
| + So(get(ctx, t), ShouldEqual, 97)
|
| + So(get(ctx, t), ShouldEqual, 98)
|
| + So(get(ctx, t), ShouldEqual, 99)
|
| + So(get(ctx, t), ShouldBeNil)
|
| + So(get(ctx, t), ShouldBeNil)
|
| + })
|
| })
|
|
|
| Convey("can have caps on both sides", func(ctx C) {
|
| - t := newIterator(c, mkNum(20), mkNum(25))
|
| + t := newIterator(&iterDefinition{c: c, start: mkNum(20), end: mkNum(25)})
|
| So(get(ctx, t), ShouldEqual, 20)
|
| So(get(ctx, t), ShouldEqual, 21)
|
| So(get(ctx, t), ShouldEqual, 22)
|
| @@ -123,7 +132,7 @@ func TestIterator(t *testing.T) {
|
| })
|
|
|
| Convey("can skip over starting cap", func(ctx C) {
|
| - t := newIterator(c, mkNum(20), mkNum(25))
|
| + t := newIterator(&iterDefinition{c: c, start: mkNum(20), end: mkNum(25)})
|
| So(skipGet(ctx, t, 22), ShouldEqual, 22)
|
| So(get(ctx, t), ShouldEqual, 23)
|
| So(get(ctx, t), ShouldEqual, 24)
|
| @@ -152,8 +161,8 @@ func TestMultiIteratorSimple(t *testing.T) {
|
| valBytes := make([][]byte, len(vals))
|
| for i, nms := range vals {
|
| numbs := make([][]byte, len(nms))
|
| - for i, n := range nms {
|
| - numbs[i] = mkNum(n)
|
| + for j, n := range nms {
|
| + numbs[j] = mkNum(n)
|
| }
|
| valBytes[i] = bjoin(numbs...)
|
| }
|
| @@ -194,8 +203,8 @@ func TestMultiIteratorSimple(t *testing.T) {
|
| // starting at (1, 2) (i.e. >= 2)
|
| // ending at (1, 4) (i.e. < 7)
|
| defs := []*iterDefinition{
|
| - {c, mkNum(1), mkNum(2), mkNum(7)},
|
| - {c, mkNum(1), mkNum(2), mkNum(7)},
|
| + {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)), start: mkNum(2), end: mkNum(7)},
|
| + {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)), start: mkNum(2), end: mkNum(7)},
|
| }
|
|
|
| i := 1
|
| @@ -211,8 +220,8 @@ func TestMultiIteratorSimple(t *testing.T) {
|
| Convey("can make empty iteration", func() {
|
| // get just the (20, *) (doesn't exist)
|
| defs := []*iterDefinition{
|
| - {c, mkNum(20), nil, nil},
|
| - {c, mkNum(20), nil, nil},
|
| + {c: c, prefix: mkNum(20)},
|
| + {c: c, prefix: mkNum(20)},
|
| }
|
|
|
| i := 0
|
| @@ -227,9 +236,9 @@ func TestMultiIteratorSimple(t *testing.T) {
|
| // 'other' must start with 20, 'vals' must start with 1
|
| // no range constraints
|
| defs := []*iterDefinition{
|
| - {c2, mkNum(20), nil, nil},
|
| - {c, mkNum(1), nil, nil},
|
| - {c, mkNum(1), nil, nil},
|
| + {c: c2, prefix: mkNum(20)},
|
| + {c: c, prefix: mkNum(1)},
|
| + {c: c, prefix: mkNum(1)},
|
| }
|
|
|
| expect := []int64{2, 4}
|
| @@ -243,8 +252,8 @@ func TestMultiIteratorSimple(t *testing.T) {
|
|
|
| Convey("Can stop early", func() {
|
| defs := []*iterDefinition{
|
| - {c, mkNum(1), nil, nil},
|
| - {c, mkNum(1), nil, nil},
|
| + {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1))},
|
| + {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1))},
|
| }
|
|
|
| i := 0
|
|
|