Chromium Code Reviews| 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..4618d49e041069c3967ba9e5bee3cd29a319509b | 
| --- /dev/null | 
| +++ b/go/src/infra/gae/libs/wrapper/memory/gkvlite_utils_test.go | 
| @@ -0,0 +1,129 @@ | 
| +// 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" | 
| +) | 
| + | 
| +// key, old, new | 
| 
 
M-A Ruel
2015/05/31 23:03:16
Then use these names. The goal is not to make the
 
iannucci
2015/05/31 23:31:33
Done.
 
 | 
| +type kon struct{ k, o, n []byte } | 
| + | 
| +var testCollisionCases = []struct { | 
| + name string | 
| + left, right []kv // inserts into left and right collections | 
| + expect []kon | 
| +}{ | 
| + { | 
| + name: "nil", | 
| + }, | 
| + { | 
| + name: "empty", | 
| + left: []kv{}, | 
| + right: []kv{}, | 
| + }, | 
| + { | 
| + name: "all old", | 
| + left: []kv{ | 
| + {cat(1), cat()}, | 
| + {cat(0), cat()}, | 
| + }, | 
| + expect: []kon{ | 
| + {cat(0), cat(), nil}, | 
| + {cat(1), cat(), nil}, | 
| + }, | 
| + }, | 
| + { | 
| + name: "all new", | 
| + right: []kv{ | 
| + {cat(1), cat()}, | 
| + {cat(0), cat()}, | 
| + }, | 
| + expect: []kon{ | 
| + {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: []kon{ | 
| + {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: []kon{ | 
| + {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(k, o, n []byte) { | 
| + e := tc.expect[i] | 
| + So(k, ShouldResemble, e.k) | 
| + So(o, ShouldResemble, e.o) | 
| + So(n, ShouldResemble, e.n) | 
| + i++ | 
| + }) | 
| + So(i, ShouldEqual, len(tc.expect)) | 
| + }) | 
| + } | 
| + }) | 
| +} |