| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package memory | 5 package memory |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "bytes" | 8 "bytes" |
| 9 "testing" | 9 "testing" |
| 10 | 10 |
| 11 "github.com/luci/gae/service/datastore" |
| 11 "github.com/luci/gae/service/datastore/serialize" | 12 "github.com/luci/gae/service/datastore/serialize" |
| 12 "github.com/luci/gkvlite" | 13 "github.com/luci/gkvlite" |
| 13 "github.com/luci/luci-go/common/cmpbin" | 14 "github.com/luci/luci-go/common/cmpbin" |
| 14 . "github.com/smartystreets/goconvey/convey" | 15 . "github.com/smartystreets/goconvey/convey" |
| 15 ) | 16 ) |
| 16 | 17 |
| 17 func mkNum(n int64) []byte { | 18 func mkNum(n int64) []byte { |
| 18 buf := &bytes.Buffer{} | 19 buf := &bytes.Buffer{} |
| 19 _, err := cmpbin.WriteInt(buf, n) | 20 _, err := cmpbin.WriteInt(buf, n) |
| 20 memoryCorruption(err) | 21 memoryCorruption(err) |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 Convey("can join the same collection twice", func() { | 203 Convey("can join the same collection twice", func() { |
| 203 // get just the (1, *) | 204 // get just the (1, *) |
| 204 // starting at (1, 2) (i.e. >= 2) | 205 // starting at (1, 2) (i.e. >= 2) |
| 205 // ending at (1, 4) (i.e. < 7) | 206 // ending at (1, 4) (i.e. < 7) |
| 206 defs := []*iterDefinition{ | 207 defs := []*iterDefinition{ |
| 207 {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)
), start: mkNum(2), end: mkNum(7)}, | 208 {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)
), start: mkNum(2), end: mkNum(7)}, |
| 208 {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)
), start: mkNum(2), end: mkNum(7)}, | 209 {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)
), start: mkNum(2), end: mkNum(7)}, |
| 209 } | 210 } |
| 210 | 211 |
| 211 i := 1 | 212 i := 1 |
| 212 » » » multiIterate(defs, func(suffix []byte) bool { | 213 » » » So(multiIterate(defs, func(suffix []byte) error { |
| 213 So(readNum(suffix), ShouldEqual, vals[i][1]) | 214 So(readNum(suffix), ShouldEqual, vals[i][1]) |
| 214 i++ | 215 i++ |
| 215 » » » » return true | 216 » » » » return nil |
| 216 » » » }) | 217 » » » }), ShouldBeNil) |
| 217 | 218 |
| 218 So(i, ShouldEqual, 3) | 219 So(i, ShouldEqual, 3) |
| 219 }) | 220 }) |
| 220 | 221 |
| 221 Convey("can make empty iteration", func() { | 222 Convey("can make empty iteration", func() { |
| 222 // get just the (20, *) (doesn't exist) | 223 // get just the (20, *) (doesn't exist) |
| 223 defs := []*iterDefinition{ | 224 defs := []*iterDefinition{ |
| 224 {c: c, prefix: mkNum(20)}, | 225 {c: c, prefix: mkNum(20)}, |
| 225 {c: c, prefix: mkNum(20)}, | 226 {c: c, prefix: mkNum(20)}, |
| 226 } | 227 } |
| 227 | 228 |
| 228 i := 0 | 229 i := 0 |
| 229 » » » multiIterate(defs, func(suffix []byte) bool { | 230 » » » So(multiIterate(defs, func(suffix []byte) error { |
| 230 panic("never") | 231 panic("never") |
| 231 » » » }) | 232 » » » }), ShouldBeNil) |
| 232 | 233 |
| 233 So(i, ShouldEqual, 0) | 234 So(i, ShouldEqual, 0) |
| 234 }) | 235 }) |
| 235 | 236 |
| 236 Convey("can join (other, val, val)", func() { | 237 Convey("can join (other, val, val)", func() { |
| 237 // 'other' must start with 20, 'vals' must start with 1 | 238 // 'other' must start with 20, 'vals' must start with 1 |
| 238 // no range constraints | 239 // no range constraints |
| 239 defs := []*iterDefinition{ | 240 defs := []*iterDefinition{ |
| 240 {c: c2, prefix: mkNum(20)}, | 241 {c: c2, prefix: mkNum(20)}, |
| 241 {c: c, prefix: mkNum(1)}, | 242 {c: c, prefix: mkNum(1)}, |
| 242 {c: c, prefix: mkNum(1)}, | 243 {c: c, prefix: mkNum(1)}, |
| 243 } | 244 } |
| 244 | 245 |
| 245 expect := []int64{2, 4} | 246 expect := []int64{2, 4} |
| 246 i := 0 | 247 i := 0 |
| 247 » » » multiIterate(defs, func(suffix []byte) bool { | 248 » » » So(multiIterate(defs, func(suffix []byte) error { |
| 248 So(readNum(suffix), ShouldEqual, expect[i]) | 249 So(readNum(suffix), ShouldEqual, expect[i]) |
| 249 i++ | 250 i++ |
| 250 » » » » return true | 251 » » » » return nil |
| 251 » » » }) | 252 » » » }), ShouldBeNil) |
| 252 }) | 253 }) |
| 253 | 254 |
| 254 Convey("Can stop early", func() { | 255 Convey("Can stop early", func() { |
| 255 defs := []*iterDefinition{ | 256 defs := []*iterDefinition{ |
| 256 {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)
)}, | 257 {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)
)}, |
| 257 {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)
)}, | 258 {c: c, prefix: mkNum(1), prefixLen: len(mkNum(1)
)}, |
| 258 } | 259 } |
| 259 | 260 |
| 260 i := 0 | 261 i := 0 |
| 261 » » » multiIterate(defs, func(suffix []byte) bool { | 262 » » » So(multiIterate(defs, func(suffix []byte) error { |
| 262 So(readNum(suffix), ShouldEqual, vals[i][1]) | 263 So(readNum(suffix), ShouldEqual, vals[i][1]) |
| 263 i++ | 264 i++ |
| 264 » » » » return true | 265 » » » » return nil |
| 265 » » » }) | 266 » » » }), ShouldBeNil) |
| 266 So(i, ShouldEqual, 5) | 267 So(i, ShouldEqual, 5) |
| 267 | 268 |
| 268 i = 0 | 269 i = 0 |
| 269 » » » multiIterate(defs, func(suffix []byte) bool { | 270 » » » So(multiIterate(defs, func(suffix []byte) error { |
| 270 So(readNum(suffix), ShouldEqual, vals[i][1]) | 271 So(readNum(suffix), ShouldEqual, vals[i][1]) |
| 271 i++ | 272 i++ |
| 272 » » » » return false | 273 » » » » return datastore.Stop |
| 273 » » » }) | 274 » » » }), ShouldBeNil) |
| 274 So(i, ShouldEqual, 1) | 275 So(i, ShouldEqual, 1) |
| 275 }) | 276 }) |
| 276 | 277 |
| 277 }) | 278 }) |
| 278 | 279 |
| 279 } | 280 } |
| OLD | NEW |