| 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))
 | 
| +			})
 | 
| +		}
 | 
| +	})
 | 
| +}
 | 
| 
 |