aboutsummaryrefslogtreecommitdiff
path: root/test/chainwriter_test.go
diff options
context:
space:
mode:
authorgithub-classroom[bot] <66690702+github-classroom[bot]@users.noreply.github.com>2022-02-28 19:36:23 +0000
committergithub-classroom[bot] <66690702+github-classroom[bot]@users.noreply.github.com>2022-02-28 19:36:23 +0000
commit1dd0508d5d3c737f1ee9c723f580baf73b1cfd70 (patch)
tree6adcc5ef85f9cf0bbb205c577da0bac9148114dd /test/chainwriter_test.go
Initial commit
Diffstat (limited to 'test/chainwriter_test.go')
-rw-r--r--test/chainwriter_test.go129
1 files changed, 129 insertions, 0 deletions
diff --git a/test/chainwriter_test.go b/test/chainwriter_test.go
new file mode 100644
index 0000000..4ea22ac
--- /dev/null
+++ b/test/chainwriter_test.go
@@ -0,0 +1,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)
+ }
+ }
+
+}