inspectkv: add test

This commit is contained in:
xia
2015-12-17 12:15:00 +08:00
parent dd87a34610
commit fa5ca31faf

View File

@ -17,6 +17,7 @@ import (
"testing"
. "github.com/pingcap/check"
"github.com/pingcap/tidb/column"
"github.com/pingcap/tidb/kv"
"github.com/pingcap/tidb/meta"
"github.com/pingcap/tidb/meta/autoid"
@ -25,6 +26,7 @@ import (
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/store/localstore"
"github.com/pingcap/tidb/store/localstore/goleveldb"
"github.com/pingcap/tidb/table"
"github.com/pingcap/tidb/table/tables"
"github.com/pingcap/tidb/util/mock"
"github.com/pingcap/tidb/util/types"
@ -38,6 +40,7 @@ var _ = Suite(&testSuite{})
type testSuite struct {
store kv.Storage
ctx *mock.Context
dbInfo *model.DBInfo
tbInfo *model.TableInfo
}
@ -48,6 +51,10 @@ func (s *testSuite) SetUpSuite(c *C) {
s.store, err = driver.Open("memory:test_inspect")
c.Assert(err, IsNil)
s.ctx = mock.NewContext()
s.ctx.Store = s.store
variable.BindSessionVars(s.ctx)
txn, err := s.store.Begin()
c.Assert(err, IsNil)
t := meta.NewMeta(txn)
@ -101,7 +108,19 @@ func (s *testSuite) SetUpSuite(c *C) {
}
func (s *testSuite) TearDownSuite(c *C) {
s.store.Close()
txn, err := s.store.Begin()
c.Assert(err, IsNil)
t := meta.NewMeta(txn)
err = t.DropTable(s.dbInfo.ID, s.tbInfo.ID)
c.Assert(err, IsNil)
err = t.DropDatabase(s.dbInfo.ID)
c.Assert(err, IsNil)
err = txn.Commit()
c.Assert(err, IsNil)
err = s.store.Close()
c.Assert(err, IsNil)
}
func (s *testSuite) TestGetDDLInfo(c *C) {
@ -133,39 +152,34 @@ func (s *testSuite) TestGetDDLInfo(c *C) {
}
func (s *testSuite) TestScan(c *C) {
ctx := mock.NewContext()
ctx.Store = s.store
variable.BindSessionVars(ctx)
alloc := autoid.NewAllocator(s.store, s.dbInfo.ID)
tb, err := tables.TableFromMeta(alloc, s.tbInfo)
c.Assert(err, IsNil)
indices := tb.Indices()
_, err = tb.AddRecord(ctx, []interface{}{10, 11}, 0)
_, err = tb.AddRecord(s.ctx, []interface{}{10, 11}, 0)
c.Assert(err, IsNil)
ctx.FinishTxn(false)
s.ctx.FinishTxn(false)
record := &RecordData{Handle: int64(1), Values: []interface{}{int64(10), int64(11)}}
record1 := &RecordData{Handle: int64(1), Values: []interface{}{int64(10), int64(11)}}
record2 := &RecordData{Handle: int64(2), Values: []interface{}{int64(20), int64(21)}}
ver, err := s.store.CurrentVersion()
c.Assert(err, IsNil)
records, _, err := ScanSnapshotTableData(s.store, ver, tb, int64(1), 1)
c.Assert(err, IsNil)
c.Assert(records, DeepEquals, []*RecordData{record})
c.Assert(records, DeepEquals, []*RecordData{record1})
_, err = tb.AddRecord(ctx, []interface{}{20, 21}, 0)
_, err = tb.AddRecord(s.ctx, record2.Values, record2.Handle)
c.Assert(err, IsNil)
ctx.FinishTxn(false)
s.ctx.FinishTxn(false)
txn, err := s.store.Begin()
c.Assert(err, IsNil)
records, nextHandle, err := ScanTableData(txn, tb, int64(1), 1)
c.Assert(err, IsNil)
c.Assert(records, DeepEquals, []*RecordData{record})
c.Assert(records, DeepEquals, []*RecordData{record1})
records, nextHandle, err = ScanTableData(txn, tb, nextHandle, 1)
c.Assert(err, IsNil)
record.Handle = int64(2)
record.Values = []interface{}{int64(20), int64(21)}
c.Assert(records, DeepEquals, []*RecordData{record})
c.Assert(records, DeepEquals, []*RecordData{record2})
startHandle := nextHandle
records, nextHandle, err = ScanTableData(txn, tb, startHandle, 1)
c.Assert(records, IsNil)
@ -175,10 +189,10 @@ func (s *testSuite) TestScan(c *C) {
idxRow1 := &RecordData{Handle: int64(1), Values: []interface{}{int64(10)}}
idxRow2 := &RecordData{Handle: int64(2), Values: []interface{}{int64(20)}}
kvIndex := kv.NewKVIndex(tb.IndexPrefix(), indices[0].Name.L, indices[0].ID, indices[0].Unique)
idxRows, nextVals, err := ScanIndexData(txn, kvIndex, []interface{}{int64(10)}, 2)
idxRows, nextVals, err := ScanIndexData(txn, kvIndex, idxRow1.Values, 2)
c.Assert(err, IsNil)
c.Assert(idxRows, DeepEquals, []*RecordData{idxRow1, idxRow2})
idxRows, nextVals, err = ScanIndexData(txn, kvIndex, []interface{}{int64(10)}, 1)
idxRows, nextVals, err = ScanIndexData(txn, kvIndex, idxRow1.Values, 1)
c.Assert(err, IsNil)
c.Assert(idxRows, DeepEquals, []*RecordData{idxRow1})
idxRows, nextVals, err = ScanIndexData(txn, kvIndex, nextVals, 1)
@ -188,4 +202,157 @@ func (s *testSuite) TestScan(c *C) {
c.Assert(idxRows, IsNil)
c.Assert(nextVals, DeepEquals, []interface{}{nil})
c.Assert(err, IsNil)
s.testTableData(c, tb, []*RecordData{record1, record2})
s.testIndex(c, tb, tb.Indices()[0])
err = tb.RemoveRecord(s.ctx, 1, record1.Values)
c.Assert(err, IsNil)
err = tb.RemoveRecord(s.ctx, 2, record2.Values)
c.Assert(err, IsNil)
}
func (s *testSuite) testTableData(c *C, tb table.Table, rs []*RecordData) {
txn, err := s.store.Begin()
c.Assert(err, IsNil)
ret1, ret2, err := DiffTableData(txn, tb, rs, 3, -1)
c.Assert(err, IsNil)
c.Assert(ret1, DeepEquals, []*RecordData{nil, nil})
c.Assert(ret2, DeepEquals, rs)
ret1, ret2, err = DiffTableData(txn, tb, rs, 1, -1)
c.Assert(err, IsNil)
c.Assert(ret1, IsNil)
c.Assert(ret2, IsNil)
isEqual, err := EqualTableData(txn, tb, rs, 1, -1)
c.Assert(err, IsNil)
c.Assert(isEqual, IsTrue)
isEqual, err = EqualTableData(txn, tb, rs, 2, -1)
c.Assert(err, IsNil)
c.Assert(isEqual, IsFalse)
}
func (s *testSuite) testIndex(c *C, tb table.Table, idx *column.IndexedCol) {
txn, err := s.store.Begin()
c.Assert(err, IsNil)
isEqual, err := EqualIndexData(txn, tb, idx)
c.Assert(err, IsNil)
c.Assert(isEqual, IsTrue)
ret1, ret2, err := DiffIndexData(txn, tb, idx)
c.Assert(err, IsNil)
c.Assert(ret1, IsNil)
c.Assert(ret2, IsNil)
// current index data:
// index data (handle, data): (1, 10), (2, 20), (3, 30)
// index col data (handle, data): (1, 10), (2, 20), (4, 40)
err = idx.X.Create(txn, []interface{}{int64(30)}, 3)
c.Assert(err, IsNil)
col := tb.Cols()[idx.Columns[0].Offset]
key := tb.RecordKey(4, col)
err = tb.SetColValue(txn, key, int64(40))
c.Assert(err, IsNil)
err = txn.Commit()
c.Assert(err, IsNil)
txn, err = s.store.Begin()
c.Assert(err, IsNil)
isEqual, err = EqualIndexData(txn, tb, idx)
c.Assert(err, IsNil)
c.Assert(isEqual, IsFalse)
ret1, ret2, err = DiffIndexData(txn, tb, idx)
c.Assert(err, IsNil)
c.Assert(ret1, DeepEquals, []*RecordData{
{Handle: int64(3), Values: []interface{}{int64(30)}},
nil,
})
c.Assert(ret2, DeepEquals, []*RecordData{
nil,
{Handle: int64(4), Values: []interface{}{int64(40)}},
})
// current index data:
// index data (handle, data): (1, 10), (2, 20), (3, 30), (5, 50), (7, 70), (8, 80)
// index col data (handle, data): (1, 10), (2, 20), (4, 40), (5, 51), (6, 60), (7, 70)
err = idx.X.Create(txn, []interface{}{int64(50)}, 5)
c.Assert(err, IsNil)
err = idx.X.Create(txn, []interface{}{int64(70)}, 7)
c.Assert(err, IsNil)
err = idx.X.Create(txn, []interface{}{int64(80)}, 8)
c.Assert(err, IsNil)
col = tb.Cols()[idx.Columns[0].Offset]
key = tb.RecordKey(5, col)
err = tb.SetColValue(txn, key, int64(51))
c.Assert(err, IsNil)
col = tb.Cols()[idx.Columns[0].Offset]
key = tb.RecordKey(6, col)
err = tb.SetColValue(txn, key, int64(60))
c.Assert(err, IsNil)
col = tb.Cols()[idx.Columns[0].Offset]
key = tb.RecordKey(7, col)
err = tb.SetColValue(txn, key, int64(70))
c.Assert(err, IsNil)
err = txn.Commit()
c.Assert(err, IsNil)
txn, err = s.store.Begin()
c.Assert(err, IsNil)
isEqual, err = EqualIndexData(txn, tb, idx)
c.Assert(err, IsNil)
c.Assert(isEqual, IsFalse)
ret1, ret2, err = DiffIndexData(txn, tb, idx)
c.Assert(err, IsNil)
c.Assert(ret1, DeepEquals, []*RecordData{
{Handle: int64(3), Values: []interface{}{int64(30)}},
nil,
{Handle: int64(5), Values: []interface{}{int64(50)}},
nil,
{Handle: int64(8), Values: []interface{}{int64(80)}},
})
c.Assert(ret2, DeepEquals, []*RecordData{
nil,
{Handle: int64(4), Values: []interface{}{int64(40)}},
{Handle: int64(5), Values: []interface{}{int64(51)}},
{Handle: int64(6), Values: []interface{}{int64(60)}},
nil,
})
// current index data:
// index data (handle, data): (1, 10), (2, 20), (3, 30), (5, 50), (7, 70), (8, 80)
// index col data (handle, data): (1, 10), (2, 20), (4, 40), (5, 51), (6, 60), (7, 70), (9, 90)
col = tb.Cols()[idx.Columns[0].Offset]
key = tb.RecordKey(9, col)
err = tb.SetColValue(txn, key, int64(90))
c.Assert(err, IsNil)
err = txn.Commit()
c.Assert(err, IsNil)
txn, err = s.store.Begin()
c.Assert(err, IsNil)
isEqual, err = EqualIndexData(txn, tb, idx)
c.Assert(err, IsNil)
c.Assert(isEqual, IsFalse)
ret1, ret2, err = DiffIndexData(txn, tb, idx)
c.Assert(err, IsNil)
c.Assert(ret1, DeepEquals, []*RecordData{
{Handle: int64(3), Values: []interface{}{int64(30)}},
nil,
{Handle: int64(5), Values: []interface{}{int64(50)}},
nil,
{Handle: int64(8), Values: []interface{}{int64(80)}},
nil,
})
c.Assert(ret2, DeepEquals, []*RecordData{
nil,
{Handle: int64(4), Values: []interface{}{int64(40)}},
{Handle: int64(5), Values: []interface{}{int64(51)}},
{Handle: int64(6), Values: []interface{}{int64(60)}},
nil,
{Handle: int64(9), Values: []interface{}{int64(90)}},
})
}