github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/tidb/store/localstore/boltdb/boltdb_test.go (about) 1 // Copyright 2015 PingCAP, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package boltdb 15 16 import ( 17 "os" 18 "testing" 19 20 "github.com/insionng/yougam/libraries/boltdb/bolt" 21 . "github.com/insionng/yougam/libraries/pingcap/check" 22 "github.com/insionng/yougam/libraries/pingcap/tidb/store/localstore/engine" 23 "github.com/insionng/yougam/libraries/pingcap/tidb/util/testleak" 24 ) 25 26 func TestT(t *testing.T) { 27 TestingT(t) 28 } 29 30 var _ = Suite(&testSuite{}) 31 32 type testSuite struct { 33 db engine.DB 34 } 35 36 const testPath = "/tmp/test-tidb-boltdb" 37 38 func (s *testSuite) SetUpTest(c *C) { 39 var ( 40 d Driver 41 err error 42 ) 43 s.db, err = d.Open(testPath) 44 c.Assert(err, IsNil) 45 } 46 47 func (s *testSuite) TearDownTest(c *C) { 48 s.db.Close() 49 os.Remove(testPath) 50 } 51 52 func (s *testSuite) TestPutNilAndDelete(c *C) { 53 defer testleak.AfterTest(c)() 54 d := s.db 55 rawDB := d.(*db).DB 56 // nil as value 57 b := d.NewBatch() 58 b.Put([]byte("aa"), nil) 59 err := d.Commit(b) 60 c.Assert(err, IsNil) 61 62 v, err := d.Get([]byte("aa")) 63 c.Assert(err, IsNil) 64 c.Assert(len(v), Equals, 0) 65 66 found := false 67 rawDB.View(func(tx *bolt.Tx) error { 68 b1 := tx.Bucket(bucketName) 69 c := b1.Cursor() 70 for k, _ := c.First(); k != nil; k, _ = c.Next() { 71 if string(k) == "aa" { 72 found = true 73 } 74 } 75 return nil 76 }) 77 c.Assert(found, Equals, true) 78 79 // real delete 80 b = d.NewBatch() 81 b.Delete([]byte("aa")) 82 err = d.Commit(b) 83 c.Assert(err, IsNil) 84 85 found = false 86 rawDB.View(func(tx *bolt.Tx) error { 87 b := tx.Bucket(bucketName) 88 c := b.Cursor() 89 for k, _ := c.First(); k != nil; k, _ = c.Next() { 90 if string(k) == "aa" { 91 found = true 92 } 93 94 } 95 return nil 96 }) 97 c.Assert(found, Equals, false) 98 } 99 100 func (s *testSuite) TestGetSet(c *C) { 101 defer testleak.AfterTest(c)() 102 db := s.db 103 104 b := db.NewBatch() 105 b.Put([]byte("a"), []byte("1")) 106 b.Put([]byte("b"), []byte("2")) 107 b.Delete([]byte("c")) 108 109 err := db.Commit(b) 110 c.Assert(err, IsNil) 111 112 v, err := db.Get([]byte("c")) 113 c.Assert(err, NotNil) 114 c.Assert(v, IsNil) 115 116 v, err = db.Get([]byte("a")) 117 c.Assert(err, IsNil) 118 c.Assert(v, DeepEquals, []byte("1")) 119 } 120 121 func (s *testSuite) TestSeek(c *C) { 122 defer testleak.AfterTest(c)() 123 b := s.db.NewBatch() 124 b.Put([]byte("a"), []byte("1")) 125 b.Put([]byte("b"), []byte("2")) 126 err := s.db.Commit(b) 127 c.Assert(err, IsNil) 128 129 k, v, err := s.db.Seek(nil) 130 c.Assert(err, IsNil) 131 c.Assert(k, BytesEquals, []byte("a")) 132 c.Assert(v, BytesEquals, []byte("1")) 133 134 k, v, err = s.db.Seek([]byte("a")) 135 c.Assert(err, IsNil) 136 c.Assert(k, BytesEquals, []byte("a")) 137 c.Assert(v, BytesEquals, []byte("1")) 138 139 k, v, err = s.db.Seek([]byte("b")) 140 c.Assert(err, IsNil) 141 c.Assert(k, BytesEquals, []byte("b")) 142 c.Assert(v, BytesEquals, []byte("2")) 143 144 k, v, err = s.db.Seek([]byte("a1")) 145 c.Assert(err, IsNil) 146 c.Assert(k, BytesEquals, []byte("b")) 147 c.Assert(v, BytesEquals, []byte("2")) 148 149 k, v, err = s.db.Seek([]byte("c1")) 150 c.Assert(err, NotNil) 151 c.Assert(k, IsNil) 152 c.Assert(v, IsNil) 153 } 154 155 func (s *testSuite) TestPrevSeek(c *C) { 156 defer testleak.AfterTest(c)() 157 b := s.db.NewBatch() 158 b.Put([]byte("b"), []byte("1")) 159 b.Put([]byte("c"), []byte("2")) 160 err := s.db.Commit(b) 161 c.Assert(err, IsNil) 162 163 k, v, err := s.db.SeekReverse(nil) 164 c.Assert(err, IsNil) 165 c.Assert(k, BytesEquals, []byte("c")) 166 c.Assert(v, BytesEquals, []byte("2")) 167 168 k, v, err = s.db.SeekReverse([]byte("d")) 169 c.Assert(err, IsNil) 170 c.Assert(k, BytesEquals, []byte("c")) 171 c.Assert(v, BytesEquals, []byte("2")) 172 173 k, v, err = s.db.SeekReverse([]byte("c")) 174 c.Assert(err, IsNil) 175 c.Assert(k, BytesEquals, []byte("b")) 176 c.Assert(v, BytesEquals, []byte("1")) 177 178 k, v, err = s.db.SeekReverse([]byte("bb")) 179 c.Assert(err, IsNil) 180 c.Assert(k, BytesEquals, []byte("b")) 181 c.Assert(v, BytesEquals, []byte("1")) 182 183 k, v, err = s.db.SeekReverse([]byte("b")) 184 c.Assert(err, NotNil) 185 c.Assert(k, IsNil) 186 c.Assert(v, IsNil) 187 188 k, v, err = s.db.SeekReverse([]byte("a")) 189 c.Assert(err, NotNil) 190 c.Assert(k, IsNil) 191 c.Assert(v, IsNil) 192 }