Skip to content

Commit 946536d

Browse files
committed
Move all stuff in main_test.go into utitls_test.go
Signed-off-by: Benjamin Wang <benjamin.ahrtr@gmail.com>
1 parent 961e0ac commit 946536d

File tree

2 files changed

+131
-140
lines changed

2 files changed

+131
-140
lines changed

cmd/bbolt/command/main_test.go

Lines changed: 0 additions & 140 deletions
This file was deleted.

cmd/bbolt/command/utils_test.go

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
package command_test
22

33
import (
4+
"bytes"
5+
crypto "crypto/rand"
6+
"encoding/binary"
7+
"encoding/hex"
8+
"fmt"
9+
"io"
10+
"math/rand"
411
"os"
12+
"strings"
13+
"sync"
514
"testing"
615

716
"github.com/stretchr/testify/require"
817

18+
bolt "go.etcd.io/bbolt"
919
"go.etcd.io/bbolt/internal/common"
1020
"go.etcd.io/bbolt/internal/guts_cli"
1121
)
@@ -44,3 +54,124 @@ func readPage(t *testing.T, path string, pageId int, pageSize int) []byte {
4454
func pageDataWithoutPageId(buf []byte) []byte {
4555
return buf[8:]
4656
}
57+
58+
type ConcurrentBuffer struct {
59+
m sync.Mutex
60+
buf bytes.Buffer
61+
}
62+
63+
func (b *ConcurrentBuffer) Read(p []byte) (n int, err error) {
64+
b.m.Lock()
65+
defer b.m.Unlock()
66+
67+
return b.buf.Read(p)
68+
}
69+
70+
func (b *ConcurrentBuffer) Write(p []byte) (n int, err error) {
71+
b.m.Lock()
72+
defer b.m.Unlock()
73+
74+
return b.buf.Write(p)
75+
}
76+
77+
func (b *ConcurrentBuffer) String() string {
78+
b.m.Lock()
79+
defer b.m.Unlock()
80+
81+
return b.buf.String()
82+
}
83+
84+
func fillBucket(b *bolt.Bucket, prefix []byte) error {
85+
n := 10 + rand.Intn(50)
86+
for i := 0; i < n; i++ {
87+
v := make([]byte, 10*(1+rand.Intn(4)))
88+
_, err := crypto.Read(v)
89+
if err != nil {
90+
return err
91+
}
92+
k := append(prefix, []byte(fmt.Sprintf("k%d", i))...)
93+
if err := b.Put(k, v); err != nil {
94+
return err
95+
}
96+
}
97+
// limit depth of subbuckets
98+
s := 2 + rand.Intn(4)
99+
if len(prefix) > (2*s + 1) {
100+
return nil
101+
}
102+
n = 1 + rand.Intn(3)
103+
for i := 0; i < n; i++ {
104+
k := append(prefix, []byte(fmt.Sprintf("b%d", i))...)
105+
sb, err := b.CreateBucket(k)
106+
if err != nil {
107+
return err
108+
}
109+
if err := fillBucket(sb, append(k, '.')); err != nil {
110+
return err
111+
}
112+
}
113+
return nil
114+
}
115+
116+
func chkdb(path string) ([]byte, error) {
117+
db, err := bolt.Open(path, 0600, &bolt.Options{ReadOnly: true})
118+
if err != nil {
119+
return nil, err
120+
}
121+
defer db.Close()
122+
var buf bytes.Buffer
123+
err = db.View(func(tx *bolt.Tx) error {
124+
return tx.ForEach(func(name []byte, b *bolt.Bucket) error {
125+
return walkBucket(b, name, nil, &buf)
126+
})
127+
})
128+
if err != nil {
129+
return nil, err
130+
}
131+
return buf.Bytes(), nil
132+
}
133+
134+
func walkBucket(parent *bolt.Bucket, k []byte, v []byte, w io.Writer) error {
135+
if _, err := fmt.Fprintf(w, "%d:%x=%x\n", parent.Sequence(), k, v); err != nil {
136+
return err
137+
}
138+
139+
// not a bucket, exit.
140+
if v != nil {
141+
return nil
142+
}
143+
return parent.ForEach(func(k, v []byte) error {
144+
if v == nil {
145+
return walkBucket(parent.Bucket(k), k, nil, w)
146+
}
147+
return walkBucket(parent, k, v, w)
148+
})
149+
}
150+
151+
func dbData(t *testing.T, filePath string) []byte {
152+
data, err := os.ReadFile(filePath)
153+
require.NoError(t, err)
154+
return data
155+
}
156+
157+
func requireDBNoChange(t *testing.T, oldData []byte, filePath string) {
158+
newData, err := os.ReadFile(filePath)
159+
require.NoError(t, err)
160+
161+
noChange := bytes.Equal(oldData, newData)
162+
require.True(t, noChange)
163+
}
164+
165+
func convertInt64IntoBytes(num int64) []byte {
166+
buf := make([]byte, binary.MaxVarintLen64)
167+
n := binary.PutVarint(buf, num)
168+
return buf[:n]
169+
}
170+
171+
func convertInt64KeysIntoHexString(nums ...int64) string {
172+
var res []string
173+
for _, num := range nums {
174+
res = append(res, hex.EncodeToString(convertInt64IntoBytes(num)))
175+
}
176+
return strings.Join(res, "\n") + "\n" // last newline char
177+
}

0 commit comments

Comments
 (0)