From 5576ab79b3a6a305f1f0611ee2c93a2c5c1fe5b0 Mon Sep 17 00:00:00 2001 From: Uri Simchoni Date: Sun, 15 Sep 2019 13:50:16 +0300 Subject: [PATCH] local: unit-test the atomicity --- local/container_test.go | 80 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/local/container_test.go b/local/container_test.go index 6af32a09..f24a5a39 100644 --- a/local/container_test.go +++ b/local/container_test.go @@ -2,6 +2,7 @@ package local_test import ( "fmt" + "io" "strings" "testing" @@ -60,3 +61,82 @@ func TestItemsPaging(t *testing.T) { is.Equal(err, stow.ErrBadCursor) } + +type chunkOfZero int + +func (c *chunkOfZero) Read(b []byte) (n int, err error) { + if *c <= 0 { + return 0, io.EOF + } + toFill := len(b) + if toFill > int(*c) { + toFill = int(*c) + } + leftBytes := int(*c) - toFill + *c = chunkOfZero(leftBytes) + for i := 0; i < toFill; i++ { + b[i] = 0 + } + return toFill, nil +} + +func TestAtomicWrites(t *testing.T) { + is := is.New(t) + testDir, teardown, err := setup() + is.NoErr(err) + defer teardown() + cfg := stow.ConfigMap{"path": testDir} + l, err := stow.Dial(local.Kind, cfg) + is.NoErr(err) + is.OK(l) + + container, err := l.Container("one") + is.NoErr(err) + is.OK(container) + + initialVer := chunkOfZero(1000000) + initialItem, err := container.Put("test-file", &initialVer, 1000000, nil) + is.NoErr(err) + sz, err := initialItem.Size() + is.NoErr(err) + is.True(sz == 1000000) + + end := make(chan error) + go func() { + for i := 0; i < 10; i++ { + c := chunkOfZero(1000000) + _, err := container.Put("test-file", &c, 1000000, nil) + if err != nil { + end <- err + } + } + + end <- nil + }() + +loop: + for { + items, _, err := container.Items("", "", 10) + is.NoErr(err) + is.True(len(items) < 10) + found := false + for _, i := range items { + if i.Name() != "test-file" { + continue + } + + found = true + sz, err := i.Size() + is.NoErr(err) + is.True(sz == 1000000) + } + is.True(found) + + select { + case err := <-end: + is.NoErr(err) + break loop + default: + } + } +}