From 6312af78d4eee2a413be2c13d7f84fbc1f9be303 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 30 Apr 2017 03:38:58 +0200 Subject: readded basic append/fetch test and benchmark --- src/hub/src/spreadspace.org/sfive/s5store_test.go | 243 +++++++++++----------- 1 file changed, 121 insertions(+), 122 deletions(-) (limited to 'src/hub') diff --git a/src/hub/src/spreadspace.org/sfive/s5store_test.go b/src/hub/src/spreadspace.org/sfive/s5store_test.go index f0b9d1c..67557d4 100644 --- a/src/hub/src/spreadspace.org/sfive/s5store_test.go +++ b/src/hub/src/spreadspace.org/sfive/s5store_test.go @@ -37,6 +37,7 @@ import ( "io" "os" "os/user" + "reflect" "testing" "time" @@ -186,7 +187,7 @@ func TestOpen(t *testing.T) { store.Close() } -func TestAppend(t *testing.T) { +func TestAppendAndFetch(t *testing.T) { os.Remove(__boltPath) store, err := NewStore(__boltPath, false) if err != nil { @@ -194,40 +195,38 @@ func TestAppend(t *testing.T) { } defer store.Close() - startTime := time.Date(2014, time.August, 24, 14, 35, 33, 847282000, time.UTC) - update := DataUpdate{Data: SourceData{ClientCount: 3, BytesReceived: 42, BytesSent: 3 * 42}, StartTime: startTime, Duration: 5000} + startTime := time.Date(2014, time.August, 24, 14, 35, 33, 847000000, time.UTC) streamId := StreamId{ContentId: "talkingheads", Format: "7bitascii", Quality: "high"} source := SourceId{Hostname: "streamer", Tags: []string{"tag1", "master"}, StreamId: streamId} - dat := DataUpdateFull{ProtocolVersion, "", -1, source, update} + clients := []ClientData{ClientData{Ip: "1.2.3.4", UserAgent: "Mozilla Firefox", BytesSent: 48}, + ClientData{Ip: "5.6.7.8", UserAgent: "Google Chrome", BytesSent: 52}, + ClientData{Ip: "4.3.2.1", UserAgent: "Apple Safari", BytesSent: 36}} + update := DataUpdate{Data: SourceData{ClientCount: 3, BytesReceived: 42, BytesSent: 136, Clients: clients}, StartTime: startTime, Duration: 5000} + in := DataUpdateFull{0, "", -1, source, update} + + if err = store.Append(in); err != nil { + t.Fatalf("Failed to append update: %v", err) + } - err = store.Append(dat) + out, err := store.GetUpdate(1) if err != nil { - t.Fatalf("Failed to append: %v", err) + t.Fatalf("Failed to fetch update: %v", err) + + } + out.StartTime = out.StartTime.UTC() // this should be handled by the protocol encoder + + expected := in + expected.SourceHubUuid = store.GetStoreId() + expected.SourceHubDataUpdateId = 1 + + if !reflect.DeepEqual(expected, out) { + t.Fatalf("should have been equal\nactual: %v\nexpected: %v\n", out, expected) } -} -// func TestGetUpdatesAfter(t *testing.T) { -// os.Remove(__boltPath) -// store, err := NewStore(__boltPath, false) -// 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) -// } + // + // TODO: more example data + // +} func TestReadOnly(t *testing.T) { // create read-only db from not-existing file must fail @@ -254,96 +253,96 @@ func TestReadOnly(t *testing.T) { // } -// 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, false) -// 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, false) -// 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) -// } -// } +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.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, false) + 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, false) + 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) + } +} -- cgit v1.2.3