|
|
@@ -262,73 +262,6 @@ func TestStoreDeleteRange(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func TestStoreRangeHistory(t *testing.T) {
|
|
|
- key := newTestKeyBytes(revision{2, 0}, false)
|
|
|
- kv := storagepb.KeyValue{
|
|
|
- Key: []byte("foo"),
|
|
|
- Value: []byte("bar"),
|
|
|
- CreateRevision: 1,
|
|
|
- ModRevision: 2,
|
|
|
- Version: 1,
|
|
|
- }
|
|
|
- kvb, err := kv.Marshal()
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- currev := revision{2, 0}
|
|
|
-
|
|
|
- tests := []struct {
|
|
|
- idxr indexRangeEventsResp
|
|
|
- r rangeResp
|
|
|
- }{
|
|
|
- {
|
|
|
- indexRangeEventsResp{[]revision{{2, 0}}},
|
|
|
- rangeResp{[][]byte{key}, [][]byte{kvb}},
|
|
|
- },
|
|
|
- {
|
|
|
- indexRangeEventsResp{[]revision{{2, 0}, {3, 0}}},
|
|
|
- rangeResp{[][]byte{key}, [][]byte{kvb}},
|
|
|
- },
|
|
|
- }
|
|
|
- for i, tt := range tests {
|
|
|
- s := newFakeStore()
|
|
|
- b := s.b.(*fakeBackend)
|
|
|
- fi := s.kvindex.(*fakeIndex)
|
|
|
-
|
|
|
- s.currentRev = currev
|
|
|
- fi.indexRangeEventsRespc <- tt.idxr
|
|
|
- b.tx.rangeRespc <- tt.r
|
|
|
-
|
|
|
- keys, kvs, _, err := s.RangeHistory([]byte("foo"), []byte("goo"), 1, 1)
|
|
|
- if err != nil {
|
|
|
- t.Errorf("#%d: err = %v, want nil", i, err)
|
|
|
- }
|
|
|
- if w := [][]byte{key}; !reflect.DeepEqual(keys, w) {
|
|
|
- t.Errorf("#%d: keys = %+v, want %+v", i, keys, w)
|
|
|
- }
|
|
|
- if w := []storagepb.KeyValue{kv}; !reflect.DeepEqual(kvs, w) {
|
|
|
- t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, w)
|
|
|
- }
|
|
|
-
|
|
|
- wact := []testutil.Action{
|
|
|
- {"rangeEvents", []interface{}{[]byte("foo"), []byte("goo"), int64(1)}},
|
|
|
- }
|
|
|
- if g := fi.Action(); !reflect.DeepEqual(g, wact) {
|
|
|
- t.Errorf("#%d: index action = %+v, want %+v", i, g, wact)
|
|
|
- }
|
|
|
- wstart, wend := revBytesRange(tt.idxr.revs[0])
|
|
|
- wact = []testutil.Action{
|
|
|
- {"range", []interface{}{keyBucketName, wstart, wend, int64(0)}},
|
|
|
- }
|
|
|
- if g := b.tx.Action(); !reflect.DeepEqual(g, wact) {
|
|
|
- t.Errorf("#%d: tx action = %+v, want %+v", i, g, wact)
|
|
|
- }
|
|
|
- if s.currentRev != currev {
|
|
|
- t.Errorf("#%d: current rev = %+v, want %+v", i, s.currentRev, currev)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
func TestStoreCompact(t *testing.T) {
|
|
|
s := newFakeStore()
|
|
|
b := s.b.(*fakeBackend)
|
|
|
@@ -420,202 +353,6 @@ func TestStoreRestore(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// tests end parameter works well
|
|
|
-func TestStoreRangeHistoryEnd(t *testing.T) {
|
|
|
- s := newStore(tmpPath)
|
|
|
- defer cleanup(s, tmpPath)
|
|
|
-
|
|
|
- s.Put([]byte("foo"), []byte("bar"))
|
|
|
- s.Put([]byte("foo1"), []byte("bar1"))
|
|
|
- s.Put([]byte("foo2"), []byte("bar2"))
|
|
|
- keys := [][]byte{
|
|
|
- newTestKeyBytes(revision{1, 0}, false),
|
|
|
- newTestKeyBytes(revision{2, 0}, false),
|
|
|
- newTestKeyBytes(revision{3, 0}, false),
|
|
|
- }
|
|
|
- kvs := []storagepb.KeyValue{
|
|
|
- {Key: []byte("foo"), Value: []byte("bar"), CreateRevision: 1, ModRevision: 1, Version: 1},
|
|
|
- {Key: []byte("foo1"), Value: []byte("bar1"), CreateRevision: 2, ModRevision: 2, Version: 1},
|
|
|
- {Key: []byte("foo2"), Value: []byte("bar2"), CreateRevision: 3, ModRevision: 3, Version: 1},
|
|
|
- }
|
|
|
-
|
|
|
- tests := []struct {
|
|
|
- key, end []byte
|
|
|
- wkeys [][]byte
|
|
|
- wkvs []storagepb.KeyValue
|
|
|
- }{
|
|
|
- // get no keys
|
|
|
- {
|
|
|
- []byte("doo"), []byte("foo"),
|
|
|
- nil, nil,
|
|
|
- },
|
|
|
- // get no keys when key == end
|
|
|
- {
|
|
|
- []byte("foo"), []byte("foo"),
|
|
|
- nil, nil,
|
|
|
- },
|
|
|
- // get no keys when ranging single key
|
|
|
- {
|
|
|
- []byte("doo"), nil,
|
|
|
- nil, nil,
|
|
|
- },
|
|
|
- // get all keys
|
|
|
- {
|
|
|
- []byte("foo"), []byte("foo3"),
|
|
|
- keys, kvs,
|
|
|
- },
|
|
|
- // get partial keys
|
|
|
- {
|
|
|
- []byte("foo"), []byte("foo1"),
|
|
|
- keys[:1], kvs[:1],
|
|
|
- },
|
|
|
- // get single key
|
|
|
- {
|
|
|
- []byte("foo"), nil,
|
|
|
- keys[:1], kvs[:1],
|
|
|
- },
|
|
|
- }
|
|
|
-
|
|
|
- for i, tt := range tests {
|
|
|
- keys, kvs, rev, err := s.RangeHistory(tt.key, tt.end, 0, 1)
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- if rev != 4 {
|
|
|
- t.Errorf("#%d: rev = %d, want %d", i, rev, 4)
|
|
|
- }
|
|
|
- if !reflect.DeepEqual(keys, tt.wkeys) {
|
|
|
- t.Errorf("#%d: actions = %+v, want %+v", i, keys, tt.wkeys)
|
|
|
- }
|
|
|
- if !reflect.DeepEqual(kvs, tt.wkvs) {
|
|
|
- t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-func TestStoreRangeHistoryRev(t *testing.T) {
|
|
|
- s := newStore(tmpPath)
|
|
|
- defer cleanup(s, tmpPath)
|
|
|
-
|
|
|
- s.Put([]byte("foo"), []byte("bar"))
|
|
|
- s.DeleteRange([]byte("foo"), nil)
|
|
|
- s.Put([]byte("foo"), []byte("bar"))
|
|
|
- s.Put([]byte("unrelated"), []byte("unrelated"))
|
|
|
- keys := [][]byte{
|
|
|
- newTestKeyBytes(revision{1, 0}, false),
|
|
|
- newTestKeyBytes(revision{2, 0}, true),
|
|
|
- newTestKeyBytes(revision{3, 0}, false),
|
|
|
- }
|
|
|
- kvs := []storagepb.KeyValue{
|
|
|
- {Key: []byte("foo"), Value: []byte("bar"), CreateRevision: 1, ModRevision: 1, Version: 1},
|
|
|
- {Key: []byte("foo")},
|
|
|
- {Key: []byte("foo"), Value: []byte("bar"), CreateRevision: 3, ModRevision: 3, Version: 1},
|
|
|
- }
|
|
|
-
|
|
|
- tests := []struct {
|
|
|
- start int64
|
|
|
-
|
|
|
- wkeys [][]byte
|
|
|
- wkvs []storagepb.KeyValue
|
|
|
- wnext int64
|
|
|
- }{
|
|
|
- {0, keys, kvs, 5},
|
|
|
- {1, keys, kvs, 5},
|
|
|
- {3, keys[2:], kvs[2:], 5},
|
|
|
- }
|
|
|
-
|
|
|
- for i, tt := range tests {
|
|
|
- keys, kvs, next, err := s.RangeHistory([]byte("foo"), nil, 0, tt.start)
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- if !reflect.DeepEqual(keys, tt.wkeys) {
|
|
|
- t.Errorf("#%d: acts = %+v, want %+v", i, keys, tt.wkeys)
|
|
|
- }
|
|
|
- if !reflect.DeepEqual(kvs, tt.wkvs) {
|
|
|
- t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
|
|
|
- }
|
|
|
- if next != tt.wnext {
|
|
|
- t.Errorf("#%d: next = %d, want %d", i, next, tt.wnext)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-func TestStoreRangeHistoryBad(t *testing.T) {
|
|
|
- s := newStore(tmpPath)
|
|
|
- defer cleanup(s, tmpPath)
|
|
|
-
|
|
|
- s.Put([]byte("foo"), []byte("bar"))
|
|
|
- s.Put([]byte("foo"), []byte("bar1"))
|
|
|
- s.Put([]byte("foo"), []byte("bar2"))
|
|
|
- if err := s.Compact(3); err != nil {
|
|
|
- t.Fatalf("compact error (%v)", err)
|
|
|
- }
|
|
|
-
|
|
|
- tests := []struct {
|
|
|
- rev int64
|
|
|
- werr error
|
|
|
- }{
|
|
|
- {1, ErrCompacted},
|
|
|
- {2, ErrCompacted},
|
|
|
- {3, ErrCompacted},
|
|
|
- {4, ErrFutureRev},
|
|
|
- {10, ErrFutureRev},
|
|
|
- }
|
|
|
- for i, tt := range tests {
|
|
|
- _, _, _, err := s.RangeHistory([]byte("foo"), nil, 0, tt.rev)
|
|
|
- if err != tt.werr {
|
|
|
- t.Errorf("#%d: error = %v, want %v", i, err, tt.werr)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-func TestStoreRangeHistoryLimit(t *testing.T) {
|
|
|
- s := newStore(tmpPath)
|
|
|
- defer cleanup(s, tmpPath)
|
|
|
-
|
|
|
- s.Put([]byte("foo"), []byte("bar"))
|
|
|
- s.DeleteRange([]byte("foo"), nil)
|
|
|
- s.Put([]byte("foo"), []byte("bar"))
|
|
|
- keys := [][]byte{
|
|
|
- newTestKeyBytes(revision{1, 0}, false),
|
|
|
- newTestKeyBytes(revision{2, 0}, true),
|
|
|
- newTestKeyBytes(revision{3, 0}, false),
|
|
|
- }
|
|
|
- kvs := []storagepb.KeyValue{
|
|
|
- {Key: []byte("foo"), Value: []byte("bar"), CreateRevision: 1, ModRevision: 1, Version: 1},
|
|
|
- {Key: []byte("foo")},
|
|
|
- {Key: []byte("foo"), Value: []byte("bar"), CreateRevision: 3, ModRevision: 3, Version: 1},
|
|
|
- }
|
|
|
-
|
|
|
- tests := []struct {
|
|
|
- limit int64
|
|
|
- wkeys [][]byte
|
|
|
- wkvs []storagepb.KeyValue
|
|
|
- }{
|
|
|
- // no limit
|
|
|
- {-1, keys, kvs},
|
|
|
- // no limit
|
|
|
- {0, keys, kvs},
|
|
|
- {1, keys[:1], kvs[:1]},
|
|
|
- {2, keys[:2], kvs[:2]},
|
|
|
- {3, keys, kvs},
|
|
|
- {100, keys, kvs},
|
|
|
- }
|
|
|
- for i, tt := range tests {
|
|
|
- keys, kvs, _, err := s.RangeHistory([]byte("foo"), nil, tt.limit, 1)
|
|
|
- if err != nil {
|
|
|
- t.Fatalf("#%d: range error (%v)", i, err)
|
|
|
- }
|
|
|
- if !reflect.DeepEqual(keys, tt.wkeys) {
|
|
|
- t.Errorf("#%d: acts = %+v, want %+v", i, keys, tt.wkeys)
|
|
|
- }
|
|
|
- if !reflect.DeepEqual(kvs, tt.wkvs) {
|
|
|
- t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
func TestRestoreContinueUnfinishedCompaction(t *testing.T) {
|
|
|
s0 := newStore(tmpPath)
|
|
|
defer os.Remove(tmpPath)
|