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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
package test
import (
"Chain/pkg/block"
"Chain/pkg/blockchain/chainwriter"
"google.golang.org/protobuf/proto"
"reflect"
"testing"
)
func TestStoreOrphanBlock(t *testing.T) {
defer cleanUp()
cw := chainwriter.New(chainwriter.DefaultConfig())
bl := MockedBlock()
ub := &chainwriter.UndoBlock{}
br := cw.StoreBlock(bl, ub, 0)
if br.BlockFile != "data/block_0.txt" {
t.Errorf("Expected file name: %v Actual file name: %v", "data/block_0.txt", br.BlockFile)
}
if br.UndoFile != "" {
t.Errorf("Expected file name: %v Actual file name: %v", "", br.UndoFile)
}
}
func TestStoreBlock(t *testing.T) {
defer cleanUp()
cw := chainwriter.New(chainwriter.DefaultConfig())
bl := MockedBlock()
ub := MockedUndoBlock()
br := cw.StoreBlock(bl, ub, 0)
if br.BlockFile != "data/block_0.txt" {
t.Errorf("Expected file name: %v Actual file name: %v", "data/block_0", br.BlockFile)
}
if br.UndoFile != "data/undo_0.txt" {
t.Errorf("Expected file name: %v Actual file name: %v", "", br.UndoFile)
}
}
func TestWriteBlock(t *testing.T) {
defer cleanUp()
cw := chainwriter.New(chainwriter.DefaultConfig())
b := MockedBlock()
pb := block.EncodeBlock(b)
serializedBlock, _ := proto.Marshal(pb)
fi := cw.WriteBlock(serializedBlock)
if fi.StartOffset != 0 {
t.Errorf("Expected start offset: %v\nActual start offset: %v", 0, fi.StartOffset)
}
if int(fi.EndOffset) != len(serializedBlock) {
t.Errorf("Expected end offset: %v\nActual end offset: %v", 0, fi.EndOffset)
}
if fi.FileName != "data/block_0.txt" {
t.Errorf("Expected file name: %v Actual file name: %v", "data/block_0", fi.FileName)
}
}
func TestWriteUndoBlock(t *testing.T) {
defer cleanUp()
cw := chainwriter.New(chainwriter.DefaultConfig())
ub := MockedUndoBlock()
pub := chainwriter.EncodeUndoBlock(ub)
serializedUndoBlock, _ := proto.Marshal(pub)
ufi := cw.WriteUndoBlock(serializedUndoBlock)
if ufi.StartOffset != 0 {
t.Errorf("Expected start offset: %v\nActual start offset: %v", 0, ufi.StartOffset)
}
if int(ufi.EndOffset) != len(serializedUndoBlock) {
t.Errorf("Expected end offset: %v\nActual end offset: %v", 0, ufi.EndOffset)
}
if ufi.FileName != "data/undo_0.txt" {
t.Errorf("Expected file name: %v Actual file name: %v", "data/block_0", ufi.FileName)
}
}
func TestReadBlock(t *testing.T) {
defer cleanUp()
cw := chainwriter.New(chainwriter.DefaultConfig())
b := MockedBlock()
pb := block.EncodeBlock(b)
serializedBlock, _ := proto.Marshal(pb)
fi := cw.WriteBlock(serializedBlock)
b2 := cw.ReadBlock(fi)
if !reflect.DeepEqual(b, b2) {
t.Errorf("Expected block: %v\nActual block: %v", b, b2)
}
}
func TestReadUndoBlock(t *testing.T) {
defer cleanUp()
cw := chainwriter.New(chainwriter.DefaultConfig())
ub := MockedUndoBlock()
pub := chainwriter.EncodeUndoBlock(ub)
serializedUndoBlock, _ := proto.Marshal(pub)
ufi := cw.WriteUndoBlock(serializedUndoBlock)
ub2 := cw.ReadUndoBlock(ufi)
if !reflect.DeepEqual(ub, ub2) {
t.Errorf("Expected block: %v\nActual block: %v", ub, ub2)
}
}
func TestRead100Blocks(t *testing.T) {
defer cleanUp()
config := chainwriter.DefaultConfig()
config.MaxBlockFileSize = 100
cw := chainwriter.New(config)
var blocks []*block.Block
var fileInfos []*chainwriter.FileInfo
// write blocks
for i := 0; i < 100; i++ {
b := MockedBlock()
b.Header.Nonce = uint32(i)
blocks = append(blocks, b)
pb := block.EncodeBlock(b)
serializedBlock, _ := proto.Marshal(pb)
fi := cw.WriteBlock(serializedBlock)
fileInfos = append(fileInfos, fi)
}
// read blocks
for i := 0; i < 100; i++ {
b := cw.ReadBlock(fileInfos[i])
if !reflect.DeepEqual(blocks[i], b) {
t.Errorf("Block: %v/99\nExpected block: %v\nActual block: %v", i, blocks[i], b)
}
}
}
|