1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
package bbolt
import (
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.etcd.io/bbolt/errors"
)
func TestOpenWithPreLoadFreelist(t *testing.T) {
testCases := []struct {
name string
readonly bool
preLoadFreePage bool
expectedFreePagesLoaded bool
}{
{
name: "write mode always load free pages",
readonly: false,
preLoadFreePage: false,
expectedFreePagesLoaded: true,
},
{
name: "readonly mode load free pages when flag set",
readonly: true,
preLoadFreePage: true,
expectedFreePagesLoaded: true,
},
{
name: "readonly mode doesn't load free pages when flag not set",
readonly: true,
preLoadFreePage: false,
expectedFreePagesLoaded: false,
},
}
fileName, err := prepareData(t)
require.NoError(t, err)
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
db, err := Open(fileName, 0666, &Options{
ReadOnly: tc.readonly,
PreLoadFreelist: tc.preLoadFreePage,
})
require.NoError(t, err)
assert.Equal(t, tc.expectedFreePagesLoaded, db.freelist != nil)
assert.NoError(t, db.Close())
})
}
}
func TestMethodPage(t *testing.T) {
testCases := []struct {
name string
readonly bool
preLoadFreePage bool
expectedError error
}{
{
name: "write mode",
readonly: false,
preLoadFreePage: false,
expectedError: nil,
},
{
name: "readonly mode with preloading free pages",
readonly: true,
preLoadFreePage: true,
expectedError: nil,
},
{
name: "readonly mode without preloading free pages",
readonly: true,
preLoadFreePage: false,
expectedError: errors.ErrFreePagesNotLoaded,
},
}
fileName, err := prepareData(t)
require.NoError(t, err)
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
db, err := Open(fileName, 0666, &Options{
ReadOnly: tc.readonly,
PreLoadFreelist: tc.preLoadFreePage,
})
require.NoError(t, err)
defer db.Close()
tx, err := db.Begin(!tc.readonly)
require.NoError(t, err)
_, err = tx.Page(0)
require.Equal(t, tc.expectedError, err)
if tc.readonly {
require.NoError(t, tx.Rollback())
} else {
require.NoError(t, tx.Commit())
}
require.NoError(t, db.Close())
})
}
}
func prepareData(t *testing.T) (string, error) {
fileName := filepath.Join(t.TempDir(), "db")
db, err := Open(fileName, 0666, nil)
if err != nil {
return "", err
}
if err := db.Close(); err != nil {
return "", err
}
return fileName, nil
}
|