| package leveldb |
| |
| import ( |
| "encoding/binary" |
| "reflect" |
| "testing" |
| |
| "github.com/onsi/gomega" |
| |
| "github.com/syndtr/goleveldb/leveldb/testutil" |
| ) |
| |
| type testFileRec struct { |
| level int |
| num int64 |
| } |
| |
| func TestVersionStaging(t *testing.T) { |
| gomega.RegisterTestingT(t) |
| stor := testutil.NewStorage() |
| defer stor.Close() |
| s, err := newSession(stor, nil) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| v := newVersion(s) |
| v.newStaging() |
| |
| tmp := make([]byte, 4) |
| makeIKey := func(i uint64) []byte { |
| binary.BigEndian.PutUint32(tmp, uint32(i)) |
| return []byte(makeIkey(nil, tmp, 0, ktVal)) |
| } |
| |
| for i, x := range []struct { |
| add, del []testFileRec |
| levels [][]int64 |
| }{ |
| { |
| add: []testFileRec{ |
| {1, 1}, |
| }, |
| levels: [][]int64{ |
| {}, |
| {1}, |
| }, |
| }, |
| { |
| add: []testFileRec{ |
| {1, 1}, |
| }, |
| levels: [][]int64{ |
| {}, |
| {1}, |
| }, |
| }, |
| { |
| del: []testFileRec{ |
| {1, 1}, |
| }, |
| levels: [][]int64{}, |
| }, |
| { |
| add: []testFileRec{ |
| {0, 1}, |
| {0, 3}, |
| {0, 2}, |
| {2, 5}, |
| {1, 4}, |
| }, |
| levels: [][]int64{ |
| {3, 2, 1}, |
| {4}, |
| {5}, |
| }, |
| }, |
| { |
| add: []testFileRec{ |
| {1, 6}, |
| {2, 5}, |
| }, |
| del: []testFileRec{ |
| {0, 1}, |
| {0, 4}, |
| }, |
| levels: [][]int64{ |
| {3, 2}, |
| {4, 6}, |
| {5}, |
| }, |
| }, |
| { |
| del: []testFileRec{ |
| {0, 3}, |
| {0, 2}, |
| {1, 4}, |
| {1, 6}, |
| {2, 5}, |
| }, |
| levels: [][]int64{}, |
| }, |
| { |
| add: []testFileRec{ |
| {0, 1}, |
| }, |
| levels: [][]int64{ |
| {1}, |
| }, |
| }, |
| { |
| add: []testFileRec{ |
| {1, 2}, |
| }, |
| levels: [][]int64{ |
| {1}, |
| {2}, |
| }, |
| }, |
| { |
| add: []testFileRec{ |
| {0, 3}, |
| }, |
| levels: [][]int64{ |
| {3, 1}, |
| {2}, |
| }, |
| }, |
| { |
| add: []testFileRec{ |
| {6, 9}, |
| }, |
| levels: [][]int64{ |
| {3, 1}, |
| {2}, |
| {}, |
| {}, |
| {}, |
| {}, |
| {9}, |
| }, |
| }, |
| { |
| del: []testFileRec{ |
| {6, 9}, |
| }, |
| levels: [][]int64{ |
| {3, 1}, |
| {2}, |
| }, |
| }, |
| } { |
| rec := &sessionRecord{} |
| for _, f := range x.add { |
| ik := makeIKey(uint64(f.num)) |
| rec.addTable(f.level, f.num, 1, ik, ik) |
| } |
| for _, f := range x.del { |
| rec.delTable(f.level, f.num) |
| } |
| vs := v.newStaging() |
| vs.commit(rec) |
| v = vs.finish() |
| if len(v.levels) != len(x.levels) { |
| t.Fatalf("#%d: invalid level count: want=%d got=%d", i, len(x.levels), len(v.levels)) |
| } |
| for j, want := range x.levels { |
| tables := v.levels[j] |
| if len(want) != len(tables) { |
| t.Fatalf("#%d.%d: invalid tables count: want=%d got=%d", i, j, len(want), len(tables)) |
| } |
| got := make([]int64, len(tables)) |
| for k, t := range tables { |
| got[k] = t.fd.Num |
| } |
| if !reflect.DeepEqual(want, got) { |
| t.Fatalf("#%d.%d: invalid tables: want=%v got=%v", i, j, want, got) |
| } |
| } |
| } |
| } |