github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/syndtr/goleveldb/leveldb/table/block_test.go (about)

     1  // Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com>
     2  // All rights reserved.
     3  //
     4  // Use of this source code is governed by a BSD-style license that can be
     5  // found in the LICENSE file.
     6  
     7  package table
     8  
     9  import (
    10  	"encoding/binary"
    11  	"fmt"
    12  
    13  	. "github.com/insionng/yougam/libraries/onsi/ginkgo"
    14  	. "github.com/insionng/yougam/libraries/onsi/gomega"
    15  
    16  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/comparer"
    17  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/iterator"
    18  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/testutil"
    19  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/util"
    20  )
    21  
    22  type blockTesting struct {
    23  	tr *Reader
    24  	b  *block
    25  }
    26  
    27  func (t *blockTesting) TestNewIterator(slice *util.Range) iterator.Iterator {
    28  	return t.tr.newBlockIter(t.b, nil, slice, false)
    29  }
    30  
    31  var _ = testutil.Defer(func() {
    32  	Describe("Block", func() {
    33  		Build := func(kv *testutil.KeyValue, restartInterval int) *blockTesting {
    34  			// Building the block.
    35  			bw := &blockWriter{
    36  				restartInterval: restartInterval,
    37  				scratch:         make([]byte, 30),
    38  			}
    39  			kv.Iterate(func(i int, key, value []byte) {
    40  				bw.append(key, value)
    41  			})
    42  			bw.finish()
    43  
    44  			// Opening the block.
    45  			data := bw.buf.Bytes()
    46  			restartsLen := int(binary.LittleEndian.Uint32(data[len(data)-4:]))
    47  			return &blockTesting{
    48  				tr: &Reader{cmp: comparer.DefaultComparer},
    49  				b: &block{
    50  					data:           data,
    51  					restartsLen:    restartsLen,
    52  					restartsOffset: len(data) - (restartsLen+1)*4,
    53  				},
    54  			}
    55  		}
    56  
    57  		Describe("read test", func() {
    58  			for restartInterval := 1; restartInterval <= 5; restartInterval++ {
    59  				Describe(fmt.Sprintf("with restart interval of %d", restartInterval), func() {
    60  					kv := &testutil.KeyValue{}
    61  					Text := func() string {
    62  						return fmt.Sprintf("and %d keys", kv.Len())
    63  					}
    64  
    65  					Test := func() {
    66  						// Make block.
    67  						br := Build(kv, restartInterval)
    68  						// Do testing.
    69  						testutil.KeyValueTesting(nil, kv.Clone(), br, nil, nil)
    70  					}
    71  
    72  					Describe(Text(), Test)
    73  
    74  					kv.PutString("", "empty")
    75  					Describe(Text(), Test)
    76  
    77  					kv.PutString("a1", "foo")
    78  					Describe(Text(), Test)
    79  
    80  					kv.PutString("a2", "v")
    81  					Describe(Text(), Test)
    82  
    83  					kv.PutString("a3qqwrkks", "hello")
    84  					Describe(Text(), Test)
    85  
    86  					kv.PutString("a4", "bar")
    87  					Describe(Text(), Test)
    88  
    89  					kv.PutString("a5111111", "v5")
    90  					kv.PutString("a6", "")
    91  					kv.PutString("a7", "v7")
    92  					kv.PutString("a8", "vvvvvvvvvvvvvvvvvvvvvv8")
    93  					kv.PutString("b", "v9")
    94  					kv.PutString("c9", "v9")
    95  					kv.PutString("c91", "v9")
    96  					kv.PutString("d0", "v9")
    97  					Describe(Text(), Test)
    98  				})
    99  			}
   100  		})
   101  
   102  		Describe("out-of-bound slice test", func() {
   103  			kv := &testutil.KeyValue{}
   104  			kv.PutString("k1", "v1")
   105  			kv.PutString("k2", "v2")
   106  			kv.PutString("k3abcdefgg", "v3")
   107  			kv.PutString("k4", "v4")
   108  			kv.PutString("k5", "v5")
   109  			for restartInterval := 1; restartInterval <= 5; restartInterval++ {
   110  				Describe(fmt.Sprintf("with restart interval of %d", restartInterval), func() {
   111  					// Make block.
   112  					bt := Build(kv, restartInterval)
   113  
   114  					Test := func(r *util.Range) func(done Done) {
   115  						return func(done Done) {
   116  							iter := bt.TestNewIterator(r)
   117  							Expect(iter.Error()).ShouldNot(HaveOccurred())
   118  
   119  							t := testutil.IteratorTesting{
   120  								KeyValue: kv.Clone(),
   121  								Iter:     iter,
   122  							}
   123  
   124  							testutil.DoIteratorTesting(&t)
   125  							iter.Release()
   126  							done <- true
   127  						}
   128  					}
   129  
   130  					It("Should do iterations and seeks correctly #0",
   131  						Test(&util.Range{Start: []byte("k0"), Limit: []byte("k6")}), 2.0)
   132  
   133  					It("Should do iterations and seeks correctly #1",
   134  						Test(&util.Range{Start: []byte(""), Limit: []byte("zzzzzzz")}), 2.0)
   135  				})
   136  			}
   137  		})
   138  	})
   139  })