summaryrefslogtreecommitdiff
path: root/src/hub
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2017-05-01 00:09:12 +0200
committerChristian Pointner <equinox@spreadspace.org>2017-05-01 00:09:17 +0200
commit3fb91439752407f9f9dd8d3400fd35b828c64a3c (patch)
tree536c00149c6302eccfa6444e1df59767e6e8b1f5 /src/hub
parentadded append/fetch tests for read only store (diff)
added test case for getUpdatesAfter and fix a bug
Diffstat (limited to 'src/hub')
-rw-r--r--src/hub/Makefile2
-rw-r--r--src/hub/src/spreadspace.org/sfive/s5cvt_test.go2
-rw-r--r--src/hub/src/spreadspace.org/sfive/s5store.go8
-rw-r--r--src/hub/src/spreadspace.org/sfive/s5store_test.go75
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