| Index: impl/memory/memcache_test.go | 
| diff --git a/impl/memory/memcache_test.go b/impl/memory/memcache_test.go | 
| index 9aaefa534f13bf4f73f06693b9a594ddcb6f3178..441abe58a6eb86cbfd2c6baaf22fa3c60b3d550b 100644 | 
| --- a/impl/memory/memcache_test.go | 
| +++ b/impl/memory/memcache_test.go | 
| @@ -25,16 +25,12 @@ func TestMemcache(t *testing.T) { | 
|  | 
| Convey("implements MCSingleReadWriter", func() { | 
| Convey("Add", func() { | 
| -				itm := &mcItem{ | 
| -					key:        "sup", | 
| -					value:      []byte("cool"), | 
| -					expiration: time.Second, | 
| -				} | 
| -				err := mc.Add(itm) | 
| -				So(err, ShouldBeNil) | 
| +				itm := (mc.NewItem("sup"). | 
| +					SetValue([]byte("cool")). | 
| +					SetExpiration(time.Second)) | 
| +				So(mc.Add(itm), ShouldBeNil) | 
| Convey("which rejects objects already there", func() { | 
| -					err := mc.Add(itm) | 
| -					So(err, ShouldEqual, mcS.ErrNotStored) | 
| +					So(mc.Add(itm), ShouldEqual, mcS.ErrNotStored) | 
| }) | 
| }) | 
|  | 
| @@ -44,23 +40,24 @@ func TestMemcache(t *testing.T) { | 
| value:      []byte("cool"), | 
| expiration: time.Second, | 
| } | 
| -				err := mc.Add(itm) | 
| -				So(err, ShouldBeNil) | 
| +				So(mc.Add(itm), ShouldBeNil) | 
|  | 
| testItem := &mcItem{ | 
| key:   "sup", | 
| value: []byte("cool"), | 
| CasID: 1, | 
| } | 
| -				i, err := mc.Get("sup") | 
| -				So(err, ShouldBeNil) | 
| -				So(i, ShouldResemble, testItem) | 
| +				getItm := &mcItem{ | 
| +					key: "sup", | 
| +				} | 
| +				So(mc.Get(getItm), ShouldBeNil) | 
| +				So(getItm, ShouldResemble, testItem) | 
|  | 
| Convey("which can expire", func() { | 
| tc.Add(time.Second * 4) | 
| -					i, err := mc.Get("sup") | 
| -					So(err, ShouldEqual, mcS.ErrCacheMiss) | 
| -					So(i, ShouldBeNil) | 
| +					getItm := &mcItem{key: "sup"} | 
| +					So(mc.Get(getItm), ShouldEqual, mcS.ErrCacheMiss) | 
| +					So(getItm, ShouldResemble, &mcItem{key: "sup"}) | 
| }) | 
| }) | 
|  | 
| @@ -71,20 +68,15 @@ func TestMemcache(t *testing.T) { | 
| value:      []byte("cool"), | 
| expiration: time.Second, | 
| } | 
| -					err := mc.Add(itm) | 
| -					So(err, ShouldBeNil) | 
| +					So(mc.Add(itm), ShouldBeNil) | 
|  | 
| -					err = mc.Delete("sup") | 
| -					So(err, ShouldBeNil) | 
| +					So(mc.Delete("sup"), ShouldBeNil) | 
|  | 
| -					i, err := mc.Get("sup") | 
| -					So(err, ShouldEqual, mcS.ErrCacheMiss) | 
| -					So(i, ShouldBeNil) | 
| +					So(mc.Get(mc.NewItem("sup")), ShouldEqual, mcS.ErrCacheMiss) | 
| }) | 
|  | 
| Convey("but not if it's not there", func() { | 
| -					err := mc.Delete("sup") | 
| -					So(err, ShouldEqual, mcS.ErrCacheMiss) | 
| +					So(mc.Delete("sup"), ShouldEqual, mcS.ErrCacheMiss) | 
| }) | 
| }) | 
|  | 
| @@ -94,21 +86,48 @@ func TestMemcache(t *testing.T) { | 
| value:      []byte("cool"), | 
| expiration: time.Second, | 
| } | 
| -				err := mc.Add(itm) | 
| -				So(err, ShouldBeNil) | 
| +				So(mc.Add(itm), ShouldBeNil) | 
|  | 
| itm.SetValue([]byte("newp")) | 
| -				err = mc.Set(itm) | 
| -				So(err, ShouldBeNil) | 
| +				So(mc.Set(itm), ShouldBeNil) | 
|  | 
| testItem := &mcItem{ | 
| key:   "sup", | 
| value: []byte("newp"), | 
| CasID: 2, | 
| } | 
| -				i, err := mc.Get("sup") | 
| +				getItm := mc.NewItem("sup") | 
| +				So(mc.Get(getItm), ShouldBeNil) | 
| +				So(getItm, ShouldResemble, testItem) | 
| + | 
| +				Convey("Flush works too", func() { | 
| +					mc.Flush() | 
| +					So(mc.Get(getItm), ShouldEqual, mcS.ErrCacheMiss) | 
| +				}) | 
| +			}) | 
| + | 
| +			Convey("Increment", func() { | 
| +				val, err := mc.Increment("num", 7, 2) | 
| So(err, ShouldBeNil) | 
| -				So(i, ShouldResemble, testItem) | 
| +				So(val, ShouldEqual, 9) | 
| + | 
| +				Convey("IncrementExisting", func() { | 
| +					val, err := mc.IncrementExisting("num", -2) | 
| +					So(err, ShouldBeNil) | 
| +					So(val, ShouldEqual, 7) | 
| + | 
| +					val, err = mc.IncrementExisting("num", -100) | 
| +					So(err, ShouldBeNil) | 
| +					So(val, ShouldEqual, 0) | 
| + | 
| +					_, err = mc.IncrementExisting("noexist", 2) | 
| +					So(err, ShouldEqual, mcS.ErrCacheMiss) | 
| + | 
| +					So(mc.Set(mc.NewItem("text").SetValue([]byte("hello world, hooman!"))), ShouldBeNil) | 
| + | 
| +					_, err = mc.IncrementExisting("text", 2) | 
| +					So(err.Error(), ShouldContainSubstring, "got invalid current value") | 
| +				}) | 
| }) | 
|  | 
| Convey("CompareAndSwap", func() { | 
| @@ -117,30 +136,26 @@ func TestMemcache(t *testing.T) { | 
| value:      []byte("cool"), | 
| expiration: time.Second * 2, | 
| }) | 
| -				err := mc.Add(itm) | 
| -				So(err, ShouldBeNil) | 
| +				So(mc.Add(itm), ShouldBeNil) | 
|  | 
| Convey("works after a Get", func() { | 
| -					itm, err = mc.Get("sup") | 
| -					So(err, ShouldBeNil) | 
| +					itm = mc.NewItem("sup") | 
| +					So(mc.Get(itm), ShouldBeNil) | 
| So(itm.(*mcItem).CasID, ShouldEqual, 1) | 
|  | 
| itm.SetValue([]byte("newp")) | 
| -					err = mc.CompareAndSwap(itm) | 
| -					So(err, ShouldBeNil) | 
| +					So(mc.CompareAndSwap(itm), ShouldBeNil) | 
| }) | 
|  | 
| Convey("but fails if you don't", func() { | 
| itm.SetValue([]byte("newp")) | 
| -					err = mc.CompareAndSwap(itm) | 
| -					So(err, ShouldEqual, mcS.ErrCASConflict) | 
| +					So(mc.CompareAndSwap(itm), ShouldEqual, mcS.ErrCASConflict) | 
| }) | 
|  | 
| Convey("and fails if the item is expired/gone", func() { | 
| tc.Add(3 * time.Second) | 
| itm.SetValue([]byte("newp")) | 
| -					err = mc.CompareAndSwap(itm) | 
| -					So(err, ShouldEqual, mcS.ErrNotStored) | 
| +					So(mc.CompareAndSwap(itm), ShouldEqual, mcS.ErrNotStored) | 
| }) | 
| }) | 
| }) | 
| @@ -153,10 +168,22 @@ func TestMemcache(t *testing.T) { | 
| expiration: time.Second * 2, | 
| }) | 
|  | 
| -			mci := mc.(*memcacheImpl) | 
| +			mc.Get(mc.NewItem("sup")) | 
| +			mc.Get(mc.NewItem("sup")) | 
| +			mc.Get(mc.NewItem("sup")) | 
| +			mc.Get(mc.NewItem("sup")) | 
| +			mc.Get(mc.NewItem("wot")) | 
| + | 
| +			mci := mc.Raw().(*memcacheImpl) | 
|  | 
| So(err, ShouldBeNil) | 
| -			So(len(mci.data.items), ShouldEqual, 1) | 
| +			stats, err := mc.Stats() | 
| +			So(err, ShouldBeNil) | 
| +			So(stats.Items, ShouldEqual, 1) | 
| +			So(stats.Bytes, ShouldEqual, 4) | 
| +			So(stats.Hits, ShouldEqual, 4) | 
| +			So(stats.Misses, ShouldEqual, 1) | 
| +			So(stats.ByteHits, ShouldEqual, 4*4) | 
| So(mci.data.casID, ShouldEqual, 1) | 
| So(mci.data.items["sup"], ShouldResemble, &mcItem{ | 
| key:        "sup", | 
| @@ -165,8 +192,8 @@ func TestMemcache(t *testing.T) { | 
| CasID:      1, | 
| }) | 
|  | 
| -			el, err := mc.Get("sup") | 
| -			So(err, ShouldBeNil) | 
| +			getItm := mc.NewItem("sup") | 
| +			So(mc.Get(getItm), ShouldBeNil) | 
| So(len(mci.data.items), ShouldEqual, 1) | 
| So(mci.data.casID, ShouldEqual, 1) | 
|  | 
| @@ -175,7 +202,7 @@ func TestMemcache(t *testing.T) { | 
| value: []byte("cool"), | 
| CasID: 1, | 
| } | 
| -			So(el, ShouldResemble, testItem) | 
| +			So(getItm, ShouldResemble, testItem) | 
| }) | 
|  | 
| }) | 
|  |