diff options
Diffstat (limited to 'objectstore')
| -rw-r--r-- | objectstore/memory_backend.go | 58 | ||||
| -rw-r--r-- | objectstore/memory_backend_test.go | 59 |
2 files changed, 117 insertions, 0 deletions
diff --git a/objectstore/memory_backend.go b/objectstore/memory_backend.go new file mode 100644 index 0000000..a21abca --- /dev/null +++ b/objectstore/memory_backend.go @@ -0,0 +1,58 @@ +// Basic in-memory object store +// +// Licensed under CC0 1.0 Universal: +// https://creativecommons.org/publicdomain/zero/1.0/legalcode +package objectstore + +import "fmt" + +type memBucket struct { + objects map[string]string +} + +type MemObjectStore struct { + buckets map[string]memBucket +} + +func NewMemBackend() *MemObjectStore { + os := &MemObjectStore{} + os.buckets = make(map[string]memBucket) + return os +} + +func (os *MemObjectStore) CreateObject(bucketId string, objectId string, object string) { + if bucket, ok := os.buckets[bucketId]; ok { + bucket.objects[objectId] = object + } else { + bucket := memBucket{} + bucket.objects = make(map[string]string) + + bucket.objects[objectId] = object + os.buckets[bucketId] = bucket + } +} + +func (os *MemObjectStore) GetObject(bucketId string, objectId string) (string, error) { + if bucket, ok := os.buckets[bucketId]; ok { + if object, ok := bucket.objects[objectId]; ok { + return object, nil + } else { + return "", fmt.Errorf("Object not found") + } + } else { + return "", fmt.Errorf("Bucket not found") + } +} + +func (os *MemObjectStore) DeleteObject(bucketId string, objectId string) error { + if bucket, ok := os.buckets[bucketId]; ok { + if _, ok := bucket.objects[objectId]; ok { + delete(bucket.objects, objectId) + return nil + } else { + return fmt.Errorf("Object not found") + } + } else { + return fmt.Errorf("Bucket not found") + } +} diff --git a/objectstore/memory_backend_test.go b/objectstore/memory_backend_test.go new file mode 100644 index 0000000..3fc2852 --- /dev/null +++ b/objectstore/memory_backend_test.go @@ -0,0 +1,59 @@ +// Memory backend tests +// +// Licensed under CC0 1.0 Universal: +// https://creativecommons.org/publicdomain/zero/1.0/legalcode +package objectstore + +import "testing" + +func TestCreateAndGet(t *testing.T) { + objects := NewMemBackend() + + // Create the object + bucketId := "foo" + objectId := "bar" + objectContent := "Lorem ipsum" + objects.CreateObject(bucketId, objectId, objectContent) + + // Retrieve the object + object, err := objects.GetObject(bucketId, objectId) + if err != nil { + t.Fatalf("Get test object: %v", err) + } + + // Check the object content + if object != objectContent { + t.Errorf("Check test object. Got (%v), want (%v)", object, objectContent) + } + + // Try to get a non-existent object + _, err = objects.GetObject(bucketId, "baz") + if err == nil { + t.Error("Get non-existent object. Got nil, want error") + } +} + +func TestCreateAndDelete(t *testing.T) { + objects := NewMemBackend() + + // Create the object + bucketId := "foo" + objectId := "bar" + objectContent := "Lorem ipsum" + objects.CreateObject(bucketId, objectId, objectContent) + + // Try to delete a non-existent object + if err := objects.DeleteObject(bucketId, "baz"); err == nil { + t.Error("Delete non-existent object. Got nil, want error") + } + + // Delete the object + if err := objects.DeleteObject(bucketId, objectId); err != nil { + t.Fatalf("Delete test object: %v", err) + } + + // Try to re-delete the object + if err := objects.DeleteObject(bucketId, objectId); err == nil { + t.Error("Delete already deleted object. Got nil, want error") + } +} |
