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