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) mik := func(i uint64) []byte { binary.BigEndian.PutUint32(tmp, uint32(i)) return []byte(makeInternalKey(nil, tmp, 0, keyTypeVal)) } 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 := mik(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) } } } }