From da3e84a0984d60a2f4bec00672eb766e2e978859 Mon Sep 17 00:00:00 2001 From: Tim Pierce Date: Wed, 23 Apr 2014 18:09:24 -0400 Subject: [PATCH] Added UnixVolume unit tests. (refs #2620) --- services/keep/src/keep/volume_test.go | 113 ++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 services/keep/src/keep/volume_test.go diff --git a/services/keep/src/keep/volume_test.go b/services/keep/src/keep/volume_test.go new file mode 100644 index 0000000000..7e3a42e130 --- /dev/null +++ b/services/keep/src/keep/volume_test.go @@ -0,0 +1,113 @@ +package main + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "testing" +) + +func TempUnixVolume(t *testing.T) UnixVolume { + d, err := ioutil.TempDir("", "volume_test") + if err != nil { + t.Fatal(err) + } + return UnixVolume{d} +} + +func _teardown(v UnixVolume) { + os.RemoveAll(v.root) +} + +// store writes a Keep block directly into a UnixVolume, for testing +// UnixVolume methods. +// +func _store(t *testing.T, vol UnixVolume, filename string, block []byte) { + blockdir := fmt.Sprintf("%s/%s", vol.root, filename[:3]) + if err := os.MkdirAll(blockdir, 0755); err != nil { + t.Fatal(err) + } + + blockpath := fmt.Sprintf("%s/%s", blockdir, filename) + if f, err := os.Create(blockpath); err == nil { + f.Write(block) + f.Close() + } else { + t.Fatal(err) + } +} + +func TestRead(t *testing.T) { + v := TempUnixVolume(t) + defer _teardown(v) + _store(t, v, TEST_HASH, TEST_BLOCK) + + buf, err := v.Read(TEST_HASH) + if err != nil { + t.Error(err) + } + if bytes.Compare(buf, TEST_BLOCK) != 0 { + t.Errorf("expected %s, got %s", string(TEST_BLOCK), string(buf)) + } +} + +func TestReadNotFound(t *testing.T) { + v := TempUnixVolume(t) + defer _teardown(v) + _store(t, v, TEST_HASH, TEST_BLOCK) + + buf, err := v.Read(TEST_HASH_2) + switch { + case os.IsNotExist(err): + break + case err == nil: + t.Errorf("Read should have failed, returned %s", string(buf)) + default: + t.Errorf("Read expected ErrNotExist, got: %s", err) + } +} + +func TestReadCorrupt(t *testing.T) { + v := TempUnixVolume(t) + defer _teardown(v) + _store(t, v, TEST_HASH, BAD_BLOCK) + + buf, err := v.Read(TEST_HASH) + switch err { + case CorruptError: + break + case nil: + t.Errorf("Read should have failed, returned %s", string(buf)) + default: + t.Error(err) + } +} + +func TestWrite(t *testing.T) { + v := TempUnixVolume(t) + defer _teardown(v) + + err := v.Write(TEST_HASH, TEST_BLOCK) + if err != nil { + t.Error(err) + } + p := fmt.Sprintf("%s/%s/%s", v.root, TEST_HASH[:3], TEST_HASH) + if buf, err := ioutil.ReadFile(p); err != nil { + t.Error(err) + } else if bytes.Compare(buf, TEST_BLOCK) != 0 { + t.Errorf("Write should have stored %s, did store %s", + string(TEST_BLOCK), string(buf)) + } +} + +func TestWriteBadVolume(t *testing.T) { + v := TempUnixVolume(t) + defer _teardown(v) + + os.Chmod(v.root, 000) + err := v.Write(TEST_HASH, TEST_BLOCK) + if err == nil { + t.Error("Write should have failed") + } +} -- 2.30.2