@@ -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+
105201func 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