summaryrefslogtreecommitdiff
path: root/objectstore
diff options
context:
space:
mode:
Diffstat (limited to 'objectstore')
-rw-r--r--objectstore/memory_backend.go58
-rw-r--r--objectstore/memory_backend_test.go59
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")
+ }
+}