From 4284124c00e3b6ad2c4fee99761d931f9ab0701b Mon Sep 17 00:00:00 2001 From: Dmytro Manchynskyi Date: Sat, 28 May 2022 17:21:57 +0300 Subject: [PATCH] mca: Add write test --- save/region/mca_test.go | 76 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/save/region/mca_test.go b/save/region/mca_test.go index b7a78fb..33642bd 100644 --- a/save/region/mca_test.go +++ b/save/region/mca_test.go @@ -3,8 +3,12 @@ package region import ( "bytes" "compress/zlib" - "github.com/Tnze/go-mc/nbt" + "io" + "math/rand" + "os" "testing" + + "github.com/Tnze/go-mc/nbt" ) func TestIn(t *testing.T) { @@ -95,3 +99,73 @@ func TestCountChunks(t *testing.T) { } t.Logf("chunk count: %d", count) } + +func TestWriteSectors(t *testing.T) { + temp, err := os.CreateTemp("", "region*.mca") + if err != nil { + t.Fatal(err) + } + defer func() { + if err := temp.Close(); err != nil { + t.Error(err) + } + if err := os.Remove(temp.Name()); err != nil { + t.Error(err) + } + }() + region, err := CreateWriter(temp) + if err != nil { + t.Fatal(err) + } + + expectedSectorsNum := 2 + for idx, test := range []struct{ size, sectors int }{ + {0, 1}, + {1000, 1}, + {4091, 1}, + {4092, 1}, + {4093, 2}, + {5000, 2}, + } { + expectedSectorsNum += test.sectors + + data := make([]byte, test.size) + rand.Read(data) + if err = region.WriteSector(idx, 0, data); err != nil { + t.Fatal("write sector", err) + } + if len(region.sectors) != expectedSectorsNum { + t.Errorf("wrong region sector count. Got: %d, Want: %d", len(region.sectors), expectedSectorsNum) + } + + if read, err := region.ReadSector(idx, 0); err != nil { + t.Fatal("read sector", err) + } else if !bytes.Equal(data, read) { + t.Fatal("read corrupted sector data") + } + } + + // reset file + if _, err = temp.Seek(0, io.SeekStart); err != nil { + t.Fatal(err) + } + + // Test load + region, err = Load(temp) + if err != nil { + t.Fatalf("load region: %v", err) + } + if len(region.sectors) != expectedSectorsNum { + t.Fatalf("read sector count missmatch. Got: %d, Want: %d", len(region.sectors), expectedSectorsNum) + } + + // Test padding + if err = region.PadToFullSector(); err != nil { + t.Fatal(err) + } + if stat, err := temp.Stat(); err != nil { + t.Fatal(err) + } else if stat.Size()%4096 != 0 { + t.Fatalf("wrong file size. Got %d, Want: %d", stat.Size(), stat.Size()+(4096-stat.Size()%4096)) + } +}