Index: go/src/infra/gae/libs/wrapper/memory/gkvlite_utils_test.go |
diff --git a/go/src/infra/gae/libs/wrapper/memory/gkvlite_utils_test.go b/go/src/infra/gae/libs/wrapper/memory/gkvlite_utils_test.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..30b142f271ed52fd2b2de2618fb44f7e133c2c7a |
--- /dev/null |
+++ b/go/src/infra/gae/libs/wrapper/memory/gkvlite_utils_test.go |
@@ -0,0 +1,128 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package memory |
+ |
+import ( |
+ "testing" |
+ |
+ . "github.com/smartystreets/goconvey/convey" |
+) |
+ |
+type keyLeftRight struct{ key, left, right []byte } |
+ |
+var testCollisionCases = []struct { |
+ name string |
+ left, right []kv // inserts into left and right collections |
+ expect []keyLeftRight |
+}{ |
+ { |
+ name: "nil", |
+ }, |
+ { |
+ name: "empty", |
+ left: []kv{}, |
+ right: []kv{}, |
+ }, |
+ { |
+ name: "all old", |
+ left: []kv{ |
+ {cat(1), cat()}, |
+ {cat(0), cat()}, |
+ }, |
+ expect: []keyLeftRight{ |
+ {cat(0), cat(), nil}, |
+ {cat(1), cat(), nil}, |
+ }, |
+ }, |
+ { |
+ name: "all new", |
+ right: []kv{ |
+ {cat(1), cat()}, |
+ {cat(0), cat()}, |
+ }, |
+ expect: []keyLeftRight{ |
+ {cat(0), nil, cat()}, |
+ {cat(1), nil, cat()}, |
+ }, |
+ }, |
+ { |
+ name: "new vals", |
+ left: []kv{ |
+ {cat(1), cat("hi")}, |
+ {cat(0), cat("newb")}, |
+ }, |
+ right: []kv{ |
+ {cat(0), cat(2.5)}, |
+ {cat(1), cat(58)}, |
+ }, |
+ expect: []keyLeftRight{ |
+ {cat(0), cat("newb"), cat(2.5)}, |
+ {cat(1), cat("hi"), cat(58)}, |
+ }, |
+ }, |
+ { |
+ name: "mixed", |
+ left: []kv{ |
+ {cat(1), cat("one")}, |
+ {cat(0), cat("hi")}, |
+ {cat(6), cat()}, |
+ {cat(3), cat(1.3)}, |
+ {cat(2), []byte("zoop")}, |
+ {cat(-1), cat("bob")}, |
+ }, |
+ right: []kv{ |
+ {cat(3), cat(1)}, |
+ {cat(1), cat(58)}, |
+ {cat(0), cat(2.5)}, |
+ {cat(4), cat(1337)}, |
+ {cat(2), cat("ski", 7)}, |
+ {cat(20), cat("nerd")}, |
+ }, |
+ expect: []keyLeftRight{ |
+ {cat(-1), cat("bob"), nil}, |
+ {cat(0), cat("hi"), cat(2.5)}, |
+ {cat(1), cat("one"), cat(58)}, |
+ {cat(2), []byte("zoop"), cat("ski", 7)}, |
+ {cat(3), cat(1.3), cat(1)}, |
+ {cat(4), nil, cat(1337)}, |
+ {cat(6), cat(), nil}, |
+ {cat(20), nil, cat("nerd")}, |
+ }, |
+ }, |
+} |
+ |
+func getFilledColl(s *memStore, fill []kv) *memCollection { |
+ if fill == nil { |
+ return nil |
+ } |
+ ret := s.MakePrivateCollection(nil) |
+ for _, i := range fill { |
+ ret.Set(i.k, i.v) |
+ } |
+ return ret |
+} |
+ |
+func TestCollision(t *testing.T) { |
+ t.Parallel() |
+ |
+ Convey("Test gkvCollide", t, func() { |
+ s := newMemStore() |
+ for _, tc := range testCollisionCases { |
+ Convey(tc.name, func() { |
+ left := getFilledColl(s, tc.left) |
+ right := getFilledColl(s, tc.right) |
+ i := 0 |
+ gkvCollide(left, right, func(key, left, right []byte) { |
+ e := tc.expect[i] |
+ So(key, ShouldResemble, e.key) |
+ So(left, ShouldResemble, e.left) |
+ So(right, ShouldResemble, e.right) |
+ i++ |
+ }) |
+ So(i, ShouldEqual, len(tc.expect)) |
+ }) |
+ } |
+ }) |
+} |