33package recordio
44
55import (
6+ "github.com/stretchr/testify/assert"
67 "github.com/stretchr/testify/require"
7- "github.com/thomasjungblut/go-sstables/recordio/iouring"
88 "io/ioutil"
9+ "os"
910 "testing"
1011)
1112
1213func TestAsyncWriter_HappyPath (t * testing.T ) {
13- ok , err := iouring . IsIOUringAvailable ()
14+ ok , err := IsIOUringAvailable ()
1415 require .NoError (t , err )
1516 if ! ok {
1617 t .Skip ("iouring not available here" )
@@ -21,13 +22,68 @@ func TestAsyncWriter_HappyPath(t *testing.T) {
2122 require .NoError (t , err )
2223 defer closeCleanFile (t , temp )
2324
24- writer , err := NewAsyncWriter (temp .Name (), 4 )
25+ writer , file , err := NewAsyncWriter (temp .Name (), 4 )
2526 require .NoError (t , err )
27+ require .NotNil (t , file )
2628
27- for i := 0 ; i < 10000 ; i ++ {
28- _ , err = writer .Write (randomRecordOfSize (1024 ))
29+ var expected []byte
30+ for i := 0 ; i < 100 ; i ++ {
31+ s := randomRecordOfSize (10 )
32+ _ , err = writer .Write (s )
2933 require .NoError (t , err )
34+ expected = append (expected , s ... )
3035 }
3136
3237 require .NoError (t , writer .Close ())
38+ fileContentEquals (t , file , expected )
39+ }
40+
41+ func TestAsyncWriter_GuardAgainstBufferReuse (t * testing.T ) {
42+ ok , err := IsIOUringAvailable ()
43+ require .NoError (t , err )
44+ if ! ok {
45+ t .Skip ("iouring not available here" )
46+ return
47+ }
48+
49+ temp , err := ioutil .TempFile ("" , "TestAsyncWriter_GuardAgainstBufferReuse" )
50+ require .NoError (t , err )
51+ defer closeCleanFile (t , temp )
52+
53+ writer , file , err := NewAsyncWriter (temp .Name (), 4 )
54+ require .NoError (t , err )
55+ require .NotNil (t , file )
56+
57+ reusedSlice := []byte {13 , 06 , 91 }
58+ // we are writing the same slice, three times before a forced flush due to capacity
59+ writeBuf (t , writer , reusedSlice )
60+ writeBuf (t , writer , reusedSlice )
61+ writeBuf (t , writer , reusedSlice )
62+ // fourth time we change the slice in-place
63+ reusedSlice [0 ] = 29
64+ writeBuf (t , writer , reusedSlice )
65+ writeBuf (t , writer , reusedSlice )
66+ require .NoError (t , writer .Close ())
67+
68+ fileContentEquals (t , file , []byte {
69+ 13 , 06 , 91 ,
70+ 13 , 06 , 91 ,
71+ 13 , 06 , 91 ,
72+ 29 , 06 , 91 ,
73+ 29 , 06 , 91 ,
74+ })
75+ }
76+
77+ func fileContentEquals (t * testing.T , file * os.File , expectedContent []byte ) {
78+ f , err := os .Open (file .Name ())
79+ require .NoError (t , err )
80+ all , err := ioutil .ReadAll (f )
81+ require .NoError (t , err )
82+ assert .Equal (t , expectedContent , all )
83+ }
84+
85+ func writeBuf (t * testing.T , writer WriteCloserFlusher , buf []byte ) {
86+ o , err := writer .Write (buf )
87+ require .NoError (t , err )
88+ assert .Equal (t , len (buf ), o )
3389}
0 commit comments