github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/tidb/kv/index_iter_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 kv_test 15 16 import ( 17 "io" 18 "testing" 19 20 . "github.com/insionng/yougam/libraries/pingcap/check" 21 "github.com/insionng/yougam/libraries/pingcap/tidb/kv" 22 "github.com/insionng/yougam/libraries/pingcap/tidb/store/localstore" 23 "github.com/insionng/yougam/libraries/pingcap/tidb/store/localstore/goleveldb" 24 "github.com/insionng/yougam/libraries/pingcap/tidb/terror" 25 "github.com/insionng/yougam/libraries/pingcap/tidb/util/testleak" 26 "github.com/insionng/yougam/libraries/pingcap/tidb/util/types" 27 ) 28 29 func TestT(t *testing.T) { 30 TestingT(t) 31 } 32 33 var _ = Suite(&testIndexSuite{}) 34 35 type testIndexSuite struct { 36 s kv.Storage 37 } 38 39 func (s *testIndexSuite) SetUpSuite(c *C) { 40 path := "memory:" 41 d := localstore.Driver{Driver: goleveldb.MemoryDriver{}} 42 store, err := d.Open(path) 43 c.Assert(err, IsNil) 44 s.s = store 45 } 46 47 func (s *testIndexSuite) TearDownSuite(c *C) { 48 err := s.s.Close() 49 c.Assert(err, IsNil) 50 } 51 52 func (s *testIndexSuite) TestIndex(c *C) { 53 defer testleak.AfterTest(c)() 54 index := kv.NewKVIndex([]byte("i"), "test", 0, false) 55 56 // Test ununiq index. 57 txn, err := s.s.Begin() 58 c.Assert(err, IsNil) 59 60 values := types.MakeDatums(1, 2) 61 err = index.Create(txn, values, 1) 62 c.Assert(err, IsNil) 63 64 it, err := index.SeekFirst(txn) 65 c.Assert(err, IsNil) 66 67 getValues, h, err := it.Next() 68 c.Assert(err, IsNil) 69 c.Assert(getValues, HasLen, 2) 70 c.Assert(getValues[0].GetInt64(), Equals, int64(1)) 71 c.Assert(getValues[1].GetInt64(), Equals, int64(2)) 72 c.Assert(h, Equals, int64(1)) 73 it.Close() 74 75 exist, _, err := index.Exist(txn, values, 100) 76 c.Assert(err, IsNil) 77 c.Assert(exist, IsFalse) 78 79 exist, _, err = index.Exist(txn, values, 1) 80 c.Assert(err, IsNil) 81 c.Assert(exist, IsTrue) 82 83 err = index.Delete(txn, values, 1) 84 c.Assert(err, IsNil) 85 86 it, err = index.SeekFirst(txn) 87 c.Assert(err, IsNil) 88 89 _, _, err = it.Next() 90 c.Assert(terror.ErrorEqual(err, io.EOF), IsTrue) 91 it.Close() 92 93 err = index.Create(txn, values, 0) 94 c.Assert(err, IsNil) 95 96 _, err = index.SeekFirst(txn) 97 c.Assert(err, IsNil) 98 99 _, hit, err := index.Seek(txn, values) 100 c.Assert(err, IsNil) 101 c.Assert(hit, IsTrue) 102 103 err = index.Drop(txn) 104 c.Assert(err, IsNil) 105 106 it, hit, err = index.Seek(txn, values) 107 c.Assert(err, IsNil) 108 c.Assert(hit, IsFalse) 109 110 _, _, err = it.Next() 111 c.Assert(terror.ErrorEqual(err, io.EOF), IsTrue) 112 it.Close() 113 114 it, err = index.SeekFirst(txn) 115 c.Assert(err, IsNil) 116 117 _, _, err = it.Next() 118 c.Assert(terror.ErrorEqual(err, io.EOF), IsTrue) 119 it.Close() 120 121 err = txn.Commit() 122 c.Assert(err, IsNil) 123 124 index = kv.NewKVIndex([]byte("j"), "test", 1, true) 125 126 // Test uniq index. 127 txn, err = s.s.Begin() 128 c.Assert(err, IsNil) 129 130 err = index.Create(txn, values, 1) 131 c.Assert(err, IsNil) 132 133 err = index.Create(txn, values, 2) 134 c.Assert(err, NotNil) 135 136 exist, h, err = index.Exist(txn, values, 1) 137 c.Assert(err, IsNil) 138 c.Assert(h, Equals, int64(1)) 139 c.Assert(exist, IsTrue) 140 141 exist, h, err = index.Exist(txn, values, 2) 142 c.Assert(err, NotNil) 143 c.Assert(h, Equals, int64(1)) 144 c.Assert(exist, IsTrue) 145 146 err = txn.Commit() 147 c.Assert(err, IsNil) 148 } 149 150 func (s *testIndexSuite) TestCombineIndexSeek(c *C) { 151 defer testleak.AfterTest(c)() 152 index := kv.NewKVIndex([]byte("i"), "test", 1, false) 153 154 txn, err := s.s.Begin() 155 c.Assert(err, IsNil) 156 157 values := types.MakeDatums("abc", "def") 158 err = index.Create(txn, values, 1) 159 c.Assert(err, IsNil) 160 161 index2 := kv.NewKVIndex([]byte("i"), "test", 1, false) 162 iter, hit, err := index2.Seek(txn, types.MakeDatums("abc", nil)) 163 c.Assert(err, IsNil) 164 defer iter.Close() 165 c.Assert(hit, IsFalse) 166 _, h, err := iter.Next() 167 c.Assert(err, IsNil) 168 c.Assert(h, Equals, int64(1)) 169 }