-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathindex_block_writer_test.go
113 lines (82 loc) · 2.97 KB
/
index_block_writer_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package esdb
import (
"bytes"
"math/rand"
"reflect"
"testing"
"github.com/customerio/esdb/binary"
"github.com/customerio/esdb/blocks"
"github.com/golang/snappy"
)
func TestWriteIndexBlocksSmall(t *testing.T) {
w := new(bytes.Buffer)
e1 := &Event{Timestamp: 1, block: 0, offset: 2048}
e2 := &Event{Timestamp: 3, block: 512, offset: 128}
e3 := &Event{Timestamp: 2, block: 2048, offset: 512}
e4 := &Event{Timestamp: 4, block: 248, offset: 1024}
index := &index{evs: events{e1, e2, e3, e4}}
writeIndexBlocks(index, w)
if index.length != 36 {
t.Errorf("Wrong written length: wanted: 36, found: %d", index.length)
}
compressed := snappy.Encode(nil, []byte(
"\xF8\x00\x00\x00\x00\x00\x00\x00"+"\x00\x04"+
"\x00\x02\x00\x00\x00\x00\x00\x00"+"\x80\x00"+
"\x00\x08\x00\x00\x00\x00\x00\x00"+"\x00\x02"+
"\x00\x00\x00\x00\x00\x00\x00\x00"+"\x00\x08"+
"\x00"))
expected := append([]byte("\x21\x00\x01"), compressed...)
if !reflect.DeepEqual(w.Bytes(), expected) {
t.Errorf("Wrong event block bytecode:\n wanted: %x\n found: %x", expected, w.Bytes())
}
want := events{e4, e2, e3, e1}
if !reflect.DeepEqual(index.evs, want) {
t.Errorf("Wrongly sorted events: wanted: %v found: %v", want, index.evs)
}
reader := blocks.NewByteReader(w.Bytes(), 4096)
for i, event := range index.evs {
block := binary.ReadInt64(reader)
offset := binary.ReadInt16(reader)
if event.block != block || event.offset != int(offset) {
t.Errorf("Case %d: Wrong read event block/offset. wanted: %d,%d found: %d,%d", i, event.block, event.offset, block, offset)
}
}
}
func TestWriteIndexBlocksMedium(t *testing.T) {
w := new(bytes.Buffer)
index := &index{evs: make(events, 500)}
for i := 0; i < 500; i++ {
index.evs[i] = &Event{Timestamp: i, block: rand.Int63(), offset: rand.Intn(4096)}
}
writeIndexBlocks(index, w)
if index.length != 5007 {
t.Errorf("Wrong written length: wanted: 5007, found: %d", index.length)
}
reader := blocks.NewByteReader(w.Bytes(), 4096)
for i, event := range index.evs {
block := binary.ReadInt64(reader)
offset := binary.ReadInt16(reader)
if event.block != block || event.offset != int(offset) {
t.Errorf("Case %d: Wrong read event block/offset. wanted: %d,%d found: %d,%d", i, event.block, event.offset, block, offset)
}
}
}
func TestWriteIndexBlocksLarge(t *testing.T) {
w := new(bytes.Buffer)
index := &index{evs: make(events, 5000)}
for i := 0; i < 5000; i++ {
index.evs[i] = &Event{Timestamp: i, block: rand.Int63(), offset: rand.Intn(4096)}
}
writeIndexBlocks(index, w)
if index.length != 50040 {
t.Errorf("Wrong written length: wanted: 50040, found: %d", index.length)
}
reader := blocks.NewByteReader(w.Bytes(), 4096)
for i, event := range index.evs {
block := binary.ReadInt64(reader)
offset := binary.ReadInt16(reader)
if event.block != block || event.offset != int(offset) {
t.Errorf("Case %d: Wrong read event block/offset. wanted: %d,%d found: %d,%d", i, event.block, event.offset, block, offset)
}
}
}