Skip to content

Commit c4e14ff

Browse files
committed
test(embedded/appendable): unit test read/write using file and inmem buffering
Signed-off-by: Jeronimo Irazabal <[email protected]> test(embedded/appendable): reuse unit test logic Signed-off-by: Jeronimo Irazabal <[email protected]>
1 parent 4c0abce commit c4e14ff

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

embedded/appendable/singleapp/single_app_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"encoding/binary"
2121
"io"
2222
"io/ioutil"
23+
"math/rand"
2324
"os"
2425
"path/filepath"
2526
"testing"
@@ -102,6 +103,101 @@ func TestSingleApp(t *testing.T) {
102103
require.NoError(t, err)
103104
}
104105

106+
func TestSingleAppSetOffsetWithRetryableSyncOn(t *testing.T) {
107+
opts := DefaultOptions().
108+
WithWriteBuffer(make([]byte, 64))
109+
110+
testSingleAppSetOffsetWith(opts, t)
111+
}
112+
113+
func TestSingleAppSetOffsetWithRetryableSyncOff(t *testing.T) {
114+
opts := DefaultOptions().
115+
WithRetryableSync(false).
116+
WithWriteBuffer(make([]byte, 64))
117+
118+
testSingleAppSetOffsetWith(opts, t)
119+
}
120+
121+
func testSingleAppSetOffsetWith(opts *Options, t *testing.T) {
122+
a, err := Open("testdata.aof", opts)
123+
defer os.Remove("testdata.aof")
124+
require.NoError(t, err)
125+
126+
err = a.SetOffset(-1)
127+
require.ErrorIs(t, err, ErrNegativeOffset)
128+
129+
// prealloc buffer used when writing data
130+
writeBuf := make([]byte, len(opts.writeBuffer)*3)
131+
132+
// prealloc buffer used when reading data
133+
readBuf := make([]byte, len(writeBuf))
134+
135+
for i := 1; i <= len(writeBuf); i++ {
136+
// gen some random data
137+
rand.Read(writeBuf[:i])
138+
139+
off, n, err := a.Append(writeBuf[:i])
140+
require.NoError(t, err)
141+
require.Equal(t, int64(0), off)
142+
require.Equal(t, i, n)
143+
144+
err = a.SetOffset(int64(n + 1))
145+
require.ErrorIs(t, err, ErrIllegalArguments)
146+
147+
// incremental left truncation
148+
for j := 0; j <= n; j++ {
149+
err = a.SetOffset(int64(n - j))
150+
require.NoError(t, err)
151+
require.Equal(t, int64(n-j), a.Offset())
152+
153+
sz, err := a.Size()
154+
require.NoError(t, err)
155+
require.Equal(t, int64(n-j), sz)
156+
157+
// read entire content should match what was appended
158+
rn, err := a.ReadAt(readBuf[:sz], 0)
159+
require.NoError(t, err)
160+
require.Equal(t, sz, int64(rn))
161+
require.Equal(t, writeBuf[:sz], readBuf[:sz])
162+
}
163+
}
164+
165+
require.Zero(t, a.Offset())
166+
167+
sz, err := a.Size()
168+
require.NoError(t, err)
169+
require.Zero(t, sz)
170+
171+
err = a.Close()
172+
require.NoError(t, err)
173+
}
174+
175+
func TestSingleAppSwitchToReadOnlyMode(t *testing.T) {
176+
a, err := Open("testdata.aof", DefaultOptions())
177+
defer os.Remove("testdata.aof")
178+
require.NoError(t, err)
179+
180+
off, n, err := a.Append([]byte{1, 2, 3})
181+
require.NoError(t, err)
182+
require.Equal(t, int64(0), off)
183+
require.Equal(t, 3, n)
184+
185+
err = a.SwitchToReadOnlyMode()
186+
require.NoError(t, err)
187+
188+
err = a.SwitchToReadOnlyMode()
189+
require.ErrorIs(t, err, ErrReadOnly)
190+
191+
bs := make([]byte, 3)
192+
n, err = a.ReadAt(bs, 0)
193+
require.NoError(t, err)
194+
require.Equal(t, 3, n)
195+
require.Equal(t, []byte{1, 2, 3}, bs)
196+
197+
err = a.Close()
198+
require.NoError(t, err)
199+
}
200+
105201
func TestSingleAppReOpening(t *testing.T) {
106202
a, err := Open("testdata.aof", DefaultOptions())
107203
defer os.Remove("testdata.aof")
@@ -132,6 +228,12 @@ func TestSingleAppReOpening(t *testing.T) {
132228
require.Equal(t, 3, n)
133229
require.Equal(t, []byte{1, 2, 3}, bs)
134230

231+
err = a.SwitchToReadOnlyMode()
232+
require.ErrorIs(t, err, ErrReadOnly)
233+
234+
err = a.SetOffset(sz)
235+
require.ErrorIs(t, err, ErrReadOnly)
236+
135237
_, _, err = a.Append([]byte{})
136238
require.ErrorIs(t, err, ErrReadOnly)
137239

0 commit comments

Comments
 (0)