From 2d20d809f66be6139853fce52a711a0e67be43bd Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 1 May 2017 12:59:52 +0200 Subject: some more open tests --- src/hub/src/spreadspace.org/sfive/s5store.go | 7 +- src/hub/src/spreadspace.org/sfive/s5store_test.go | 181 ++++++++++++++-------- 2 files changed, 120 insertions(+), 68 deletions(-) (limited to 'src') diff --git a/src/hub/src/spreadspace.org/sfive/s5store.go b/src/hub/src/spreadspace.org/sfive/s5store.go index 426b46d..2266895 100644 --- a/src/hub/src/spreadspace.org/sfive/s5store.go +++ b/src/hub/src/spreadspace.org/sfive/s5store.go @@ -105,7 +105,9 @@ func openDb(dbPath string, readOnly bool) (db *bolt.DB, version int, hubUuid str } return nil }) - + if err != nil { + db.Close() + } return } @@ -136,6 +138,9 @@ func createDb(dbPath string) (db *bolt.DB, version int, hubUuid string, err erro } return nil }) + if err != nil { + db.Close() + } return } diff --git a/src/hub/src/spreadspace.org/sfive/s5store_test.go b/src/hub/src/spreadspace.org/sfive/s5store_test.go index 96f1847..180019c 100644 --- a/src/hub/src/spreadspace.org/sfive/s5store_test.go +++ b/src/hub/src/spreadspace.org/sfive/s5store_test.go @@ -58,6 +58,48 @@ var ( 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}} ) +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) + + 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.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(clientsData)) + d.DataUpdate.Data.BytesSent = 6400 * uint(len(clientsData)) + + d.DataUpdate.Data.Clients = clientsData + data = append(data, d) + } + } + } + } + starttime = starttime.Add(time.Duration(duration) * time.Millisecond) + } + return +} + func TestMain(m *testing.M) { u, err := user.Current() if err != nil { @@ -67,6 +109,10 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } +// +// Testing +// + func TestOpen(t *testing.T) { // non-existing directory if _, err := NewStore("/nonexistend/db.bolt", false); err == nil { @@ -94,14 +140,27 @@ func TestOpen(t *testing.T) { t.Fatalf("opening store using a invalid database should throw an error") } - // bolt db with wrong layout + // bolt db without HubInfo Bucket os.Remove(testBoltPath) + db, err := bolt.Open(testBoltPath, 0600, &bolt.Options{Timeout: 100 * time.Millisecond}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } else { + if err = db.Close(); err != nil { + t.Fatalf("unexpected error: %v", err) + } + } + if _, err := NewStore(testBoltPath, false); err == nil { + t.Fatalf("opening store without HubInfo Bucket should throw an error") + } + + // bolt db no version key if db, err := bolt.Open(testBoltPath, 0600, &bolt.Options{Timeout: 100 * time.Millisecond}); 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) + if _, err := tx.CreateBucket([]byte(hubInfoBn)); err != nil { + return err } return nil }) @@ -113,22 +172,39 @@ func TestOpen(t *testing.T) { } } if _, err := NewStore(testBoltPath, false); err == nil { - t.Fatalf("opening store using a invalid database should throw an error") + t.Fatalf("opening store without a database version should throw an error") } - // bolt db with wrong version - os.Remove(testBoltPath) + // bolt db wrong version if db, err := bolt.Open(testBoltPath, 0600, &bolt.Options{Timeout: 100 * time.Millisecond}); 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) + b := tx.Bucket([]byte(hubInfoBn)) + if err := b.Put([]byte(storeVersionKey), itob(0)); err != nil { + return 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(testBoltPath, false); err == nil { + t.Fatalf("opening store with wrong database version should throw an error") + } + + // bolt db no UUID key + if db, err := bolt.Open(testBoltPath, 0600, &bolt.Options{Timeout: 100 * time.Millisecond}); err != nil { + t.Fatalf("unexpected error: %v", err) + } else { + err = db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(hubInfoBn)) + if err := b.Put([]byte(storeVersionKey), itob(StoreVersion)); err != nil { + return err } return nil }) @@ -140,26 +216,17 @@ func TestOpen(t *testing.T) { } } if _, err := NewStore(testBoltPath, false); err == nil { - t.Fatalf("opening store with the wrong database version should throw an error") + t.Fatalf("opening store without a database UUID should throw an error") } // bolt db empty UUID - os.Remove(testBoltPath) if db, err := bolt.Open(testBoltPath, 0600, &bolt.Options{Timeout: 100 * time.Millisecond}); 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) + b := tx.Bucket([]byte(hubInfoBn)) + if err := b.Put([]byte(hubUuidKey), []byte("")); err != nil { + return err } return nil }) @@ -174,6 +241,28 @@ func TestOpen(t *testing.T) { t.Fatalf("opening store with empty UUID should throw an error") } + // bolt db with missing buckets + if db, err := bolt.Open(testBoltPath, 0600, &bolt.Options{Timeout: 100 * time.Millisecond}); err != nil { + t.Fatalf("unexpected error: %v", err) + } else { + err = db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(hubInfoBn)) + if err := b.Put([]byte(hubUuidKey), []byte("6d1a2192-7cb6-404d-80fb-add9b40a8f33")); err != nil { + return 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(testBoltPath, false); err == nil { + t.Fatalf("opening store with (some) buckets missing should throw an error") + } + // create new bolt-db and reopen it os.Remove(testBoltPath) store, err := NewStore(testBoltPath, false) @@ -461,48 +550,6 @@ func TestForwardedDataUpdates(t *testing.T) { // Benchmarking // -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) - - 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.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(clientsData)) - d.DataUpdate.Data.BytesSent = 6400 * uint(len(clientsData)) - - d.DataUpdate.Data.Clients = clientsData - data = append(data, d) - } - } - } - } - starttime = starttime.Add(time.Duration(duration) * time.Millisecond) - } - return -} - func BenchmarkAppendMany(b *testing.B) { os.Remove(testBoltPath) store, err := NewStore(testBoltPath, false) -- cgit v1.2.3