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  }