1 // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
2 // All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
15 "github.com/syndtr/goleveldb/leveldb/testutil"
18 func TestBatchHeader(t *testing.T) {
19 f := func(seq uint64, length uint32) bool {
20 encoded := encodeBatchHeader(nil, seq, int(length))
21 decSeq, decLength, err := decodeBatchHeader(encoded)
22 return err == nil && decSeq == seq && decLength == int(length)
24 config := &quick.Config{
25 Rand: testutil.NewRand(),
27 if err := quick.Check(f, config); err != nil {
37 func TestBatch(t *testing.T) {
45 testBatch := func(i int, kt keyType, k, v []byte) error {
48 return fmt.Errorf("invalid key type, index=%d: %d vs %d", i, kv.kt, kt)
50 if !bytes.Equal(kv.k, k) {
51 return fmt.Errorf("invalid key, index=%d", i)
53 if !bytes.Equal(kv.v, v) {
54 return fmt.Errorf("invalid value, index=%d", i)
58 f := func(ktr uint8, k, v []byte) bool {
59 kt := keyType(ktr % 2)
63 kvs = append(kvs, batchKV{kt: kt, k: k, v: v})
64 internalLen += len(k) + len(v) + 8
68 kvs = append(kvs, batchKV{kt: kt, k: k})
69 internalLen += len(k) + 8
71 if batch.Len() != len(kvs) {
72 t.Logf("batch.Len: %d vs %d", len(kvs), batch.Len())
75 if batch.internalLen != internalLen {
76 t.Logf("abatch.internalLen: %d vs %d", internalLen, batch.internalLen)
79 if len(kvs)%1000 == 0 {
80 if err := batch.replayInternal(testBatch); err != nil {
81 t.Logf("batch.replayInternal: %v", err)
87 if abatch.Len() != len(kvs) {
88 t.Logf("abatch.Len: %d vs %d", len(kvs), abatch.Len())
91 if abatch.internalLen != internalLen {
92 t.Logf("abatch.internalLen: %d vs %d", internalLen, abatch.internalLen)
95 if err := abatch.replayInternal(testBatch); err != nil {
96 t.Logf("abatch.replayInternal: %v", err)
101 if err := nbatch.Load(batch.Dump()); err != nil {
102 t.Logf("nbatch.Load: %v", err)
105 if nbatch.Len() != len(kvs) {
106 t.Logf("nbatch.Len: %d vs %d", len(kvs), nbatch.Len())
109 if nbatch.internalLen != internalLen {
110 t.Logf("nbatch.internalLen: %d vs %d", internalLen, nbatch.internalLen)
113 if err := nbatch.replayInternal(testBatch); err != nil {
114 t.Logf("nbatch.replayInternal: %v", err)
118 if len(kvs)%10000 == 0 {
120 if err := batch.Replay(nbatch); err != nil {
121 t.Logf("batch.Replay: %v", err)
124 if nbatch.Len() != len(kvs) {
125 t.Logf("nbatch.Len: %d vs %d", len(kvs), nbatch.Len())
128 if nbatch.internalLen != internalLen {
129 t.Logf("nbatch.internalLen: %d vs %d", internalLen, nbatch.internalLen)
132 if err := nbatch.replayInternal(testBatch); err != nil {
133 t.Logf("nbatch.replayInternal: %v", err)
139 config := &quick.Config{
141 Rand: testutil.NewRand(),
143 if err := quick.Check(f, config); err != nil {
146 t.Logf("length=%d internalLen=%d", len(kvs), internalLen)