From 2d01eb4e11efa562f568247481605fc13af57b70 Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Mon, 24 Aug 2015 23:32:06 -0700 Subject: [PATCH] storage: add tests for kvstore_compaction --- storage/kvstore_compaction_test.go | 79 ++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 storage/kvstore_compaction_test.go diff --git a/storage/kvstore_compaction_test.go b/storage/kvstore_compaction_test.go new file mode 100644 index 000000000..4858636d4 --- /dev/null +++ b/storage/kvstore_compaction_test.go @@ -0,0 +1,79 @@ +package storage + +import ( + "reflect" + "testing" +) + +func TestScheduleCompaction(t *testing.T) { + revs := []revision{{1, 0}, {2, 0}, {3, 0}} + + tests := []struct { + rev int64 + keep map[revision]struct{} + wrevs []revision + }{ + // compact at 1 and discard all history + { + 1, + nil, + revs[1:], + }, + // compact at 3 and discard all history + { + 3, + nil, + nil, + }, + // compact at 1 and keeps history one step earlier + { + 1, + map[revision]struct{}{ + revision{main: 1}: {}, + }, + revs, + }, + // compact at 1 and keeps history two steps earlier + { + 3, + map[revision]struct{}{ + revision{main: 2}: {}, + revision{main: 3}: {}, + }, + revs[1:], + }, + } + for i, tt := range tests { + s := newStore("test") + tx := s.b.BatchTx() + + tx.Lock() + ibytes := newRevBytes() + for _, rev := range revs { + revToBytes(rev, ibytes) + tx.UnsafePut(keyBucketName, ibytes, []byte("bar")) + } + tx.Unlock() + // call `s.wg.Add(1)` to match the `s.wg.Done()` call in scheduleCompaction + // to avoid panic from wait group + s.wg.Add(1) + s.scheduleCompaction(tt.rev, tt.keep) + + tx.Lock() + for _, rev := range tt.wrevs { + revToBytes(rev, ibytes) + keys, _ := tx.UnsafeRange(keyBucketName, ibytes, nil, 0) + if len(keys) != 1 { + t.Errorf("#%d: range on %v = %d, want 1", i, rev, len(keys)) + } + } + _, vals := tx.UnsafeRange(metaBucketName, finishedCompactKeyName, nil, 0) + revToBytes(revision{main: tt.rev}, ibytes) + if w := [][]byte{ibytes}; !reflect.DeepEqual(vals, w) { + t.Errorf("#%d: vals on %v = %+v, want %+v", i, finishedCompactKeyName, vals, w) + } + tx.Unlock() + + cleanup(s, "test") + } +}