From 3fb91439752407f9f9dd8d3400fd35b828c64a3c Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 1 May 2017 00:09:12 +0200 Subject: added test case for getUpdatesAfter and fix a bug --- src/hub/Makefile | 2 +- src/hub/src/spreadspace.org/sfive/s5cvt_test.go | 2 +- src/hub/src/spreadspace.org/sfive/s5store.go | 8 ++- src/hub/src/spreadspace.org/sfive/s5store_test.go | 75 ++++++++++++++++++----- 4 files changed, 68 insertions(+), 19 deletions(-) diff --git a/src/hub/Makefile b/src/hub/Makefile index daf06ef..87890a4 100644 --- a/src/hub/Makefile +++ b/src/hub/Makefile @@ -81,7 +81,7 @@ bench: getlibs @$(GOCMD) test -bench=. spreadspace.org/sfive cover: getlibs - @echo "testing and benchmarking: sfive" + @echo "testing with coverage output" @$(GOCMD) test -coverprofile=coverage.out spreadspace.org/sfive @$(GOCMD) tool cover -html=coverage.out diff --git a/src/hub/src/spreadspace.org/sfive/s5cvt_test.go b/src/hub/src/spreadspace.org/sfive/s5cvt_test.go index 2d89485..5a79d85 100644 --- a/src/hub/src/spreadspace.org/sfive/s5cvt_test.go +++ b/src/hub/src/spreadspace.org/sfive/s5cvt_test.go @@ -145,6 +145,6 @@ func TestEncodeStateless(t *testing.T) { expected := td expected.Version = ProtocolVersion if !reflect.DeepEqual(decoded, expected) { - t.Fatalf("Encoding failed:\n actual: %v\n expected: %v\n", decoded, expected) + t.Fatalf("encoding failed:\n actual: %v\n expected: %v\n", decoded, expected) } } diff --git a/src/hub/src/spreadspace.org/sfive/s5store.go b/src/hub/src/spreadspace.org/sfive/s5store.go index f097e8e..426b46d 100644 --- a/src/hub/src/spreadspace.org/sfive/s5store.go +++ b/src/hub/src/spreadspace.org/sfive/s5store.go @@ -425,10 +425,14 @@ func (st Store) GetUpdatesAfter(id, limit int) (res []DataUpdateFull, err error) } err = st.db.View(func(tx *bolt.Tx) error { c := tx.Bucket([]byte(dataUpdatesBn)).Cursor() - if k, _ := c.Seek(itob(id)); k == nil { + k, v := c.Seek(itob(id)) + if k == nil { return nil } - for k, v := c.Next(); k != nil; k, v = c.Next() { + if btoi(k) == id { + k, v = c.Next() + } + for ; k != nil; k, v = c.Next() { var d dataUpdateDb if err := json.Unmarshal(v, &d); err != nil { return err diff --git a/src/hub/src/spreadspace.org/sfive/s5store_test.go b/src/hub/src/spreadspace.org/sfive/s5store_test.go index d4d2119..680f32b 100644 --- a/src/hub/src/spreadspace.org/sfive/s5store_test.go +++ b/src/hub/src/spreadspace.org/sfive/s5store_test.go @@ -211,39 +211,39 @@ func TestAppendAndFetch(t *testing.T) { in := DataUpdateFull{0, "", -1, sourceData, upd} if err = store.Append(in); err != nil { - t.Fatalf("Failed to append update: %v", err) + t.Fatalf("failed to append update: %v", err) } out, err := store.GetUpdate(1) if err != nil { - t.Fatalf("Failed to fetch update: %v", err) + t.Fatalf("failed to fetch update: %v", err) } - out.StartTime = out.StartTime.UTC() // this would be handled by the protocol encoder + out.StartTime = out.StartTime.UTC() // this would normally 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) + t.Fatalf("failed to fetch update\nactual: %v\nexpected: %v\n", out, expected) } // remote dataupdate in = DataUpdateFull{0, "7411836d-58f7-4a36-85d6-409b4e4ca30c", 3, sourceData, upd} if err = store.Append(in); err != nil { - t.Fatalf("Failed to append update: %v", err) + t.Fatalf("failed to append update: %v", err) } out, err = store.GetUpdate(2) if err != nil { - t.Fatalf("Failed to fetch update: %v", err) + t.Fatalf("failed to fetch update: %v", err) } - out.StartTime = out.StartTime.UTC() // this should be handled by the protocol encoder + out.StartTime = out.StartTime.UTC() // this would normally be handled by the protocol encoder expected = in if !reflect.DeepEqual(expected, out) { - t.Fatalf("should have been equal\nactual: %v\nexpected: %v\n", out, expected) + t.Fatalf("failed to fetch update\nactual: %v\nexpected: %v\n", out, expected) } // @@ -278,10 +278,11 @@ func TestReadOnly(t *testing.T) { if err != nil { t.Fatalf("opening existing store in read-only mode failed: %v", err) } + defer store.Close() // fetching the date-update from read-only store must succeed if _, err := store.GetUpdate(1); err != nil { - t.Fatalf("Failed to fetch update: %v", err) + t.Fatalf("failed to fetch update: %v", err) } // appending to read-only store must fail @@ -290,9 +291,53 @@ func TestReadOnly(t *testing.T) { } } +func TestGetUpdatesAfter(t *testing.T) { + // create read-only db from not-existing file must fail + os.Remove(testBoltPath) + if _, err := NewStore(testBoltPath, true); err == nil { + t.Fatalf("creating a read-only database should throw an error") + } + + // prepare a store with 3 data-update + store, err := NewStore(testBoltPath, false) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + defer store.Close() + + upd := updateData + upd.StartTime = time.Date(2014, time.August, 24, 14, 35, 33, 847000000, time.UTC) + upd.Data.Clients = clientsData + + expected := []DataUpdateFull{} + for i := 0; i < 3; i = i + 1 { + in := DataUpdateFull{0, "", -1, sourceData, upd} + if err = store.Append(in); err != nil { + t.Fatalf("unexpected error: %v", err) + } + e := in + e.SourceHubUuid = store.hubUuid + e.SourceHubDataUpdateId = i + 1 + expected = append(expected, e) + upd.StartTime = upd.StartTime.Add(time.Duration(upd.Duration) * time.Millisecond) + } + + updList, err := store.GetUpdatesAfter(0, -1) + if err != nil { + t.Fatalf("failed to fetch updates: %v", err) + } + + for i, _ := range updList { + updList[i].StartTime = updList[i].StartTime.UTC() // this would normally be handled by the protocol encoder + } + + if !reflect.DeepEqual(expected, updList) { + t.Fatalf("failed to fetch update\nactual: %v\nexpected: %v\n", updList, expected) + } +} + // // TODO: add tests for -// * store.GetUpdatesAfter // * store.GetHubs // * store.GetSource(s) // * GetLastUpdateId @@ -345,7 +390,7 @@ func BenchmarkAppendMany(b *testing.B) { os.Remove(testBoltPath) store, err := NewStore(testBoltPath, false) if err != nil { - b.Fatalf("Failed to initialize: %v", err) + b.Fatalf("failed to initialize: %v", err) } defer store.Close() data := generateDataUpdateFull(b.N) @@ -353,7 +398,7 @@ func BenchmarkAppendMany(b *testing.B) { b.ResetTimer() if err := store.AppendMany(data); err != nil { - b.Fatalf("Failed to append: %v", err) + b.Fatalf("failed to append: %v", err) } } @@ -361,12 +406,12 @@ func BenchmarkGetUpdatesAfter(b *testing.B) { os.Remove(testBoltPath) store, err := NewStore(testBoltPath, false) if err != nil { - b.Fatalf("Failed to initialize: %v", err) + 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.Fatalf("failed to append: %v", err) } b.ResetTimer() @@ -375,7 +420,7 @@ func BenchmarkGetUpdatesAfter(b *testing.B) { for { updates, err := store.GetUpdatesAfter(latestId, -1) if err != nil { - b.Fatalf("Failed to retrieve: %v", err) + b.Fatalf("failed to retrieve: %v", err) } if len(updates) == 0 { break -- cgit v1.2.3