summaryrefslogtreecommitdiff
path: root/src/hub
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2017-04-29 22:27:41 +0200
committerChristian Pointner <equinox@spreadspace.org>2017-04-29 22:27:41 +0200
commitc9a0c83a311473938c69d0b4a3a2f7e7d16f49e1 (patch)
treec023cc3c03025a42890e316d2787e34cf3893f1a /src/hub
parentadded version field to store (diff)
added test cases for open and creation
Diffstat (limited to 'src/hub')
-rw-r--r--src/hub/src/spreadspace.org/sfive/s5store.go6
-rw-r--r--src/hub/src/spreadspace.org/sfive/s5store_test.go357
-rw-r--r--src/hub/src/spreadspace.org/sfive/s5typesStore.go2
3 files changed, 245 insertions, 120 deletions
diff --git a/src/hub/src/spreadspace.org/sfive/s5store.go b/src/hub/src/spreadspace.org/sfive/s5store.go
index 611e720..ea114c7 100644
--- a/src/hub/src/spreadspace.org/sfive/s5store.go
+++ b/src/hub/src/spreadspace.org/sfive/s5store.go
@@ -83,10 +83,10 @@ func checkDb(dbPath string) (db *bolt.DB, version int, hubUuid string, err error
}
version = btoi(bVersion)
if version != StoreVersion {
- return fmt.Errorf("store: failed to open, wrong hub version: %s (expected: %d)", version, StoreVersion)
+ return fmt.Errorf("store: failed to open, wrong hub version: %d (expected: %d)", version, StoreVersion)
}
- bHubId := b.Get([]byte(hubUUIDKey))
+ bHubId := b.Get([]byte(hubUuidKey))
if bHubId != nil {
hubUuid = string(bHubId)
}
@@ -127,7 +127,7 @@ func initDb(dbPath string) (db *bolt.DB, version int, hubUuid string, err error)
return err
}
hubUuid = uuid.New()
- if err := b.Put([]byte(hubUUIDKey), []byte(hubUuid)); err != nil {
+ if err := b.Put([]byte(hubUuidKey), []byte(hubUuid)); err != nil {
return err
}
return nil
diff --git a/src/hub/src/spreadspace.org/sfive/s5store_test.go b/src/hub/src/spreadspace.org/sfive/s5store_test.go
index 481b189..02ab727 100644
--- a/src/hub/src/spreadspace.org/sfive/s5store_test.go
+++ b/src/hub/src/spreadspace.org/sfive/s5store_test.go
@@ -34,10 +34,13 @@ package sfive
import (
"fmt"
+ "io"
"os"
"os/user"
"testing"
"time"
+
+ "github.com/boltdb/bolt"
)
const (
@@ -59,143 +62,265 @@ func TestMain(m *testing.M) {
os.Exit(m.Run())
}
-func TestAppend(t *testing.T) {
- os.Remove(__boltPath)
- store, err := NewStore(__boltPath)
- if err != nil {
- t.Errorf("Failed to initialize: %v", err)
- return
+func TestOpen(t *testing.T) {
+ // non-existing directory
+ if _, err := NewStore("/nonexistend/db.bolt"); err == nil {
+ t.Fatalf("opening store in nonexisting directory should throw an error")
}
- defer store.Close()
-
- startTime := time.Date(2014, time.August, 24, 14, 35, 33, 847282000, time.UTC)
- update := DataUpdate{Data: SourceData{BytesSent: 1, ClientCount: 3, BytesReceived: 1}, StartTime: startTime, Duration: 5000}
- streamId := StreamId{ContentId: "content", Format: "7bitascii", Quality: QualityHigh}
- source := SourceId{Hostname: "localhost", Tags: []string{"tag1", "master"}, StreamId: streamId, Version: 1}
- dat := DataUpdateFull{"", -1, source, update}
- err = store.Append(dat)
- if err != nil {
- t.Errorf("Failed to append: %v", err)
- return
+ // store path is a directory
+ os.Remove(__boltPath)
+ if err := os.MkdirAll(__boltPath, 0700); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if _, err := NewStore(__boltPath); err == nil {
+ t.Fatalf("opening store using a directory should throw an error: %v", err)
}
-}
-func TestGetUpdatesAfter(t *testing.T) {
+ // exisitng but non-database file
os.Remove(__boltPath)
- store, err := NewStore(__boltPath)
- if err != nil {
- t.Errorf("Failed to initialize: %v", err)
- return
+ if f, err := os.Create(__boltPath); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ } else {
+ io.WriteString(f, "this is not a bolt db.")
+ f.Close()
}
- defer store.Close()
-
- startTime := time.Date(2014, time.August, 24, 14, 35, 33, 847282000, time.UTC)
- update := DataUpdate{Data: SourceData{BytesSent: 1, ClientCount: 3, BytesReceived: 1}, StartTime: startTime, Duration: 5000}
- streamId := StreamId{ContentId: "content", Format: "7bitascii", Quality: QualityHigh}
- source := SourceId{Hostname: "localhost", Tags: []string{"tag1", "master"}, StreamId: streamId, Version: 1}
- dat := DataUpdateFull{"", -1, source, update}
-
- err = store.Append(dat)
- if err != nil {
- t.Errorf("Failed to append: %v", err)
- return
+ if _, err := NewStore(__boltPath); err == nil {
+ t.Fatalf("opening store using a invalid database should throw an error: %v", err)
}
- res, err := store.GetUpdatesAfter(2, -1)
- t.Logf("got updates (err %v):\n%#v", err, res)
-}
-
-func generateDataUpdateFull(n int) (data []DataUpdateFull) {
- hostnames := []string{"streamer1", "streamer2"}
- contents := []string{"av", "audio"}
- formats := []string{"webm", "flash", "hls"}
- qualities := []string{"high", "medium", "low"}
-
- numcombis := len(hostnames) * len(contents) * len(formats) * len(qualities)
-
- clients := []ClientData{
- ClientData{"127.0.0.1", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0", 6400},
- ClientData{"10.12.0.1", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/57.0.2987.98 Chrome/57.0.2987.98 Safari/537.36", 6400},
- ClientData{"127.0.0.1", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0", 6400},
- ClientData{"192.168.0.1", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/57.0.2987.98 Chrome/57.0.2987.98 Safari/537.36", 6400},
- ClientData{"172.16.0.2", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/57.0.2987.98 Chrome/57.0.2987.98 Safari/537.36", 6400}}
- starttime := time.Now()
- duration := int64(15000)
- tags := []string{"2017", "elevate", "discourse"}
-
- for i := 0; i < n; i += numcombis {
- for _, hostname := range hostnames {
- for _, content := range contents {
- for _, format := range formats {
- for _, quality := range qualities {
- d := DataUpdateFull{}
- d.SourceId.Version = 1
- d.SourceId.Hostname = hostname
- d.SourceId.Tags = tags
-
- d.SourceId.StreamId.ContentId = content
- d.SourceId.StreamId.Format = format
- d.SourceId.StreamId.Quality = quality
-
- d.DataUpdate.StartTime = starttime
- d.DataUpdate.Duration = duration
- d.DataUpdate.Data.ClientCount = uint(len(clients))
- d.DataUpdate.Data.BytesSent = 6400 * uint(len(clients))
-
- for _, client := range clients {
- c := ClientData{client.Ip, client.UserAgent, client.BytesSent}
- d.DataUpdate.Data.Clients = append(d.DataUpdate.Data.Clients, c)
- }
- data = append(data, d)
- }
- }
+ // bolt db with wrong layout
+ os.Remove(__boltPath)
+ if db, err := bolt.Open(__boltPath, 0600, &bolt.Options{Timeout: 1 * time.Second}); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ } else {
+ err = db.Update(func(tx *bolt.Tx) error {
+ if _, err := tx.CreateBucket([]byte("invalid-key")); err != nil {
+ t.Fatalf("unexpected error: %v", err)
}
+ return nil
+ })
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if err = db.Close(); err != nil {
+ t.Fatalf("unexpected error: %v", err)
}
- starttime = starttime.Add(time.Duration(duration) * time.Millisecond)
}
- return
-}
+ if _, err := NewStore(__boltPath); err == nil {
+ t.Fatalf("opening store using a invalid database should throw an error: %v", err)
+ }
-func BenchmarkAppendMany(b *testing.B) {
+ // bolt db with wrong version
os.Remove(__boltPath)
- store, err := NewStore(__boltPath)
- if err != nil {
- b.Errorf("Failed to initialize: %v", err)
+ if db, err := bolt.Open(__boltPath, 0600, &bolt.Options{Timeout: 1 * time.Second}); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ } else {
+ err = db.Update(func(tx *bolt.Tx) error {
+ b, err := tx.CreateBucket([]byte(hubInfoBn))
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ err = b.Put([]byte(storeVersionKey), itob(0))
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ return nil
+ })
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if err = db.Close(); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ }
+ if _, err := NewStore(__boltPath); err == nil {
+ t.Fatalf("opening store with the wrong database version should throw an error: %v", err)
}
- defer store.Close()
- data := generateDataUpdateFull(b.N)
-
- b.ResetTimer()
- if err := store.AppendMany(data); err != nil {
- b.Errorf("Failed to append: %v", err)
+ // bolt db empty UUID
+ os.Remove(__boltPath)
+ if db, err := bolt.Open(__boltPath, 0600, &bolt.Options{Timeout: 1 * time.Second}); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ } else {
+ err = db.Update(func(tx *bolt.Tx) error {
+ b, err := tx.CreateBucket([]byte(hubInfoBn))
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ err = b.Put([]byte(storeVersionKey), itob(StoreVersion))
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ err = b.Put([]byte(hubUuidKey), []byte(""))
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ return nil
+ })
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if err = db.Close(); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ }
+ if _, err := NewStore(__boltPath); err == nil {
+ t.Fatalf("opening store with empty UUID should throw an error: %v", err)
}
-}
-func BenchmarkGetUpdatesAfter(b *testing.B) {
+ // create new bolt-db and reopen it
os.Remove(__boltPath)
store, err := NewStore(__boltPath)
if err != nil {
- b.Errorf("Failed to initialize: %v", err)
- }
- defer store.Close()
- data := generateDataUpdateFull(b.N)
- if err := store.AppendMany(data); err != nil {
- b.Errorf("Failed to append: %v", err)
+ t.Fatalf("creating new store failed: %v", err)
}
+ createdUuid := store.hubUuid
+ store.Close()
- b.ResetTimer()
-
- latestId := -1
- for {
- updates, err := store.GetUpdatesAfter(latestId, -1)
- if err != nil {
- b.Errorf("Failed to retrieve: %v", err)
- }
- if len(updates) == 0 {
- break
- }
- latestId = findMaxId(updates)
+ store, err = NewStore(__boltPath)
+ if err != nil {
+ t.Fatalf("re-opening existing store failed: %v", err)
+ }
+ if createdUuid != store.hubUuid {
+ t.Fatalf("UUID of opened store differs from the one previously generated: '%s' != '%s'", createdUuid, store.hubUuid)
}
+ store.Close()
}
+
+// func TestAppend(t *testing.T) {
+// os.Remove(__boltPath)
+// store, err := NewStore(__boltPath)
+// if err != nil {
+// t.Fatalf("Failed to initialize: %v", err)
+// }
+// defer store.Close()
+
+// startTime := time.Date(2014, time.August, 24, 14, 35, 33, 847282000, time.UTC)
+// update := DataUpdate{Data: SourceData{BytesSent: 1, ClientCount: 3, BytesReceived: 1}, StartTime: startTime, Duration: 5000}
+// streamId := StreamId{ContentId: "content", Format: "7bitascii", Quality: QualityHigh}
+// source := SourceId{Hostname: "localhost", Tags: []string{"tag1", "master"}, StreamId: streamId, Version: 1}
+// dat := DataUpdateFull{"", -1, source, update}
+
+// err = store.Append(dat)
+// if err != nil {
+// t.Fatalf("Failed to append: %v", err)
+// }
+// }
+
+// func TestGetUpdatesAfter(t *testing.T) {
+// os.Remove(__boltPath)
+// store, err := NewStore(__boltPath)
+// if err != nil {
+// t.Fatalf("Failed to initialize: %v", err)
+// }
+// defer store.Close()
+
+// startTime := time.Date(2014, time.August, 24, 14, 35, 33, 847282000, time.UTC)
+// update := DataUpdate{Data: SourceData{BytesSent: 1, ClientCount: 3, BytesReceived: 1}, StartTime: startTime, Duration: 5000}
+// streamId := StreamId{ContentId: "content", Format: "7bitascii", Quality: QualityHigh}
+// source := SourceId{Hostname: "localhost", Tags: []string{"tag1", "master"}, StreamId: streamId, Version: 1}
+// dat := DataUpdateFull{"", -1, source, update}
+
+// err = store.Append(dat)
+// if err != nil {
+// t.Fatalf("Failed to append: %v", err)
+// }
+
+// res, err := store.GetUpdatesAfter(2, -1)
+// t.Logf("got updates (err %v):\n%#v", err, res)
+// }
+
+// func generateDataUpdateFull(n int) (data []DataUpdateFull) {
+// hostnames := []string{"streamer1", "streamer2"}
+// contents := []string{"av", "audio"}
+// formats := []string{"webm", "flash", "hls"}
+// qualities := []string{"high", "medium", "low"}
+
+// numcombis := len(hostnames) * len(contents) * len(formats) * len(qualities)
+
+// clients := []ClientData{
+// ClientData{"127.0.0.1", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0", 6400},
+// ClientData{"10.12.0.1", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/57.0.2987.98 Chrome/57.0.2987.98 Safari/537.36", 6400},
+// ClientData{"127.0.0.1", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0", 6400},
+// ClientData{"192.168.0.1", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/57.0.2987.98 Chrome/57.0.2987.98 Safari/537.36", 6400},
+// ClientData{"172.16.0.2", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/57.0.2987.98 Chrome/57.0.2987.98 Safari/537.36", 6400}}
+// starttime := time.Now()
+// duration := int64(15000)
+// tags := []string{"2017", "elevate", "discourse"}
+
+// for i := 0; i < n; i += numcombis {
+// for _, hostname := range hostnames {
+// for _, content := range contents {
+// for _, format := range formats {
+// for _, quality := range qualities {
+// d := DataUpdateFull{}
+// d.SourceId.Version = 1
+// d.SourceId.Hostname = hostname
+// d.SourceId.Tags = tags
+
+// d.SourceId.StreamId.ContentId = content
+// d.SourceId.StreamId.Format = format
+// d.SourceId.StreamId.Quality = quality
+
+// d.DataUpdate.StartTime = starttime
+// d.DataUpdate.Duration = duration
+// d.DataUpdate.Data.ClientCount = uint(len(clients))
+// d.DataUpdate.Data.BytesSent = 6400 * uint(len(clients))
+
+// for _, client := range clients {
+// c := ClientData{client.Ip, client.UserAgent, client.BytesSent}
+// d.DataUpdate.Data.Clients = append(d.DataUpdate.Data.Clients, c)
+// }
+// data = append(data, d)
+// }
+// }
+// }
+// }
+// starttime = starttime.Add(time.Duration(duration) * time.Millisecond)
+// }
+// return
+// }
+
+// func BenchmarkAppendMany(b *testing.B) {
+// os.Remove(__boltPath)
+// store, err := NewStore(__boltPath)
+// if err != nil {
+// b.Fatalf("Failed to initialize: %v", err)
+// }
+// defer store.Close()
+// data := generateDataUpdateFull(b.N)
+
+// b.ResetTimer()
+
+// if err := store.AppendMany(data); err != nil {
+// b.Fatalf("Failed to append: %v", err)
+// }
+// }
+
+// func BenchmarkGetUpdatesAfter(b *testing.B) {
+// os.Remove(__boltPath)
+// store, err := NewStore(__boltPath)
+// if err != nil {
+// b.Fatalf("Failed to initialize: %v", err)
+// }
+// defer store.Close()
+// data := generateDataUpdateFull(b.N)
+// if err := store.AppendMany(data); err != nil {
+// b.Fatalf("Failed to append: %v", err)
+// }
+
+// b.ResetTimer()
+
+// latestId := -1
+// for {
+// updates, err := store.GetUpdatesAfter(latestId, -1)
+// if err != nil {
+// b.Fatalf("Failed to retrieve: %v", err)
+// }
+// if len(updates) == 0 {
+// break
+// }
+// latestId = findMaxId(updates)
+// }
+// }
diff --git a/src/hub/src/spreadspace.org/sfive/s5typesStore.go b/src/hub/src/spreadspace.org/sfive/s5typesStore.go
index 5676c1f..7154740 100644
--- a/src/hub/src/spreadspace.org/sfive/s5typesStore.go
+++ b/src/hub/src/spreadspace.org/sfive/s5typesStore.go
@@ -58,7 +58,7 @@ const (
userAgentsRevBn = "UserAgentsRev"
// well-known keys
- hubUUIDKey = "HubUUID"
+ hubUuidKey = "HubUUID"
storeVersionKey = "Version"
)