From c9a0c83a311473938c69d0b4a3a2f7e7d16f49e1 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 29 Apr 2017 22:27:41 +0200 Subject: added test cases for open and creation --- src/hub/src/spreadspace.org/sfive/s5store.go | 6 +- src/hub/src/spreadspace.org/sfive/s5store_test.go | 357 +++++++++++++++------- src/hub/src/spreadspace.org/sfive/s5typesStore.go | 2 +- 3 files changed, 245 insertions(+), 120 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 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" ) -- cgit v1.2.3