aboutsummaryrefslogtreecommitdiff
path: root/test/chainwriter_test.go
blob: 4ea22ac47d359e5af1be608b8e3ac4ed773ba19b (plain)
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)
		}
	}

}