|
@@ -5,6 +5,86 @@ import (
|
|
|
"testing"
|
|
"testing"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
+// TestCompactionSideEffects ensures that all the log related funcationality works correctly after
|
|
|
|
|
+// a compaction.
|
|
|
|
|
+func TestCompactionSideEffects(t *testing.T) {
|
|
|
|
|
+ lastIndex := 1000
|
|
|
|
|
+ log := newLog()
|
|
|
|
|
+
|
|
|
|
|
+ for i := 0; i < lastIndex; i++ {
|
|
|
|
|
+ log.append(i, Entry{Term: i + 1})
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.compact(500)
|
|
|
|
|
+
|
|
|
|
|
+ if log.lastIndex() != lastIndex {
|
|
|
|
|
+ t.Errorf("lastIndex = %d, want %d", log.lastIndex(), lastIndex)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for i := log.offset; i <= log.lastIndex(); i++ {
|
|
|
|
|
+ if log.term(i) != i {
|
|
|
|
|
+ t.Errorf("term(%d) = %d, want %d", i, log.term(i), i)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for i := log.offset; i <= log.lastIndex(); i++ {
|
|
|
|
|
+ if !log.matchTerm(i, i) {
|
|
|
|
|
+ t.Errorf("matchTerm(%d) = false, want true", i)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ prev := log.lastIndex()
|
|
|
|
|
+ log.append(log.lastIndex(), Entry{Term: log.lastIndex() + 1})
|
|
|
|
|
+ if log.lastIndex() != prev+1 {
|
|
|
|
|
+ t.Errorf("lastIndex = %d, want = %d", log.lastIndex(), prev+1)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ ents := log.entries(log.lastIndex())
|
|
|
|
|
+ if len(ents) != 1 {
|
|
|
|
|
+ t.Errorf("len(entries) = %d, want = %d", len(ents), 1)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+//TestCompaction ensures that the number of log entreis is correct after compactions.
|
|
|
|
|
+func TestCompaction(t *testing.T) {
|
|
|
|
|
+ tests := []struct {
|
|
|
|
|
+ app int
|
|
|
|
|
+ compact []int
|
|
|
|
|
+ wleft []int
|
|
|
|
|
+ wallow bool
|
|
|
|
|
+ }{
|
|
|
|
|
+ // out of upper bound
|
|
|
|
|
+ {1000, []int{1001}, []int{-1}, false},
|
|
|
|
|
+ {1000, []int{300, 500, 800, 900}, []int{701, 501, 201, 101}, true},
|
|
|
|
|
+ // out of lower bound
|
|
|
|
|
+ {1000, []int{300, 299}, []int{701, -1}, false},
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for i, tt := range tests {
|
|
|
|
|
+ func() {
|
|
|
|
|
+ defer func() {
|
|
|
|
|
+ if r := recover(); r != nil {
|
|
|
|
|
+ if tt.wallow == true {
|
|
|
|
|
+ t.Errorf("%d: allow = %v, want %v", i, false, true)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }()
|
|
|
|
|
+
|
|
|
|
|
+ log := newLog()
|
|
|
|
|
+ for i := 0; i < tt.app; i++ {
|
|
|
|
|
+ log.append(i, Entry{})
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for j := 0; j < len(tt.compact); j++ {
|
|
|
|
|
+ log.compact(tt.compact[j])
|
|
|
|
|
+ if len(log.ents) != tt.wleft[j] {
|
|
|
|
|
+ t.Errorf("#%d.%d len = %d, want %d", i, j, len(log.ents), tt.wleft[j])
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }()
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func TestIsOutOfBounds(t *testing.T) {
|
|
func TestIsOutOfBounds(t *testing.T) {
|
|
|
offset := 100
|
|
offset := 100
|
|
|
num := 100
|
|
num := 100
|