github.com/dolthub/dolt/go@v0.40.5-0.20240520175717-68db7794bea6/store/nbs/byte_sink_test.go (about) 1 // Copyright 2019 Dolthub, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package nbs 16 17 import ( 18 "bytes" 19 "os" 20 "path/filepath" 21 "testing" 22 23 "github.com/google/uuid" 24 "github.com/stretchr/testify/assert" 25 "github.com/stretchr/testify/require" 26 "github.com/stretchr/testify/suite" 27 ) 28 29 func TestBlockBufferTableSink(t *testing.T) { 30 createSink := func() ByteSink { 31 return NewBlockBufferByteSink(128) 32 } 33 34 suite.Run(t, &TableSinkSuite{createSink, t}) 35 } 36 37 func TestFixedBufferTableSink(t *testing.T) { 38 createSink := func() ByteSink { 39 return NewFixedBufferByteSink(make([]byte, 32*1024)) 40 } 41 42 suite.Run(t, &TableSinkSuite{createSink, t}) 43 } 44 45 func TestBufferedFileByteSink(t *testing.T) { 46 createSink := func() ByteSink { 47 sink, err := NewBufferedFileByteSink("", 4*1024, 16) 48 require.NoError(t, err) 49 50 return sink 51 } 52 53 suite.Run(t, &TableSinkSuite{createSink, t}) 54 55 t.Run("ReaderTwice", func(t *testing.T) { 56 sink, err := NewBufferedFileByteSink("", 4*1024, 16) 57 require.NoError(t, err) 58 _, err = sink.Write([]byte{1, 2, 3, 4}) 59 require.NoError(t, err) 60 r, err := sink.Reader() 61 require.NoError(t, err) 62 require.NotNil(t, r) 63 var readbytes [5]byte 64 n, err := r.Read(readbytes[:]) 65 require.Equal(t, 4, n) 66 require.True(t, bytes.Equal(readbytes[:4], []byte{1, 2, 3, 4})) 67 r.Close() 68 r, err = sink.Reader() 69 require.NoError(t, err) 70 require.NotNil(t, r) 71 n, err = r.Read(readbytes[:]) 72 require.Equal(t, 4, n) 73 require.True(t, bytes.Equal(readbytes[:4], []byte{1, 2, 3, 4})) 74 r.Close() 75 }) 76 } 77 78 type TableSinkSuite struct { 79 sinkFactory func() ByteSink 80 t *testing.T 81 } 82 83 func (suite2 *TableSinkSuite) SetS(suite suite.TestingSuite) {} 84 85 var _ suite.TestingSuite = (*TableSinkSuite)(nil) 86 87 func (suite *TableSinkSuite) SetT(t *testing.T) { 88 suite.t = t 89 } 90 91 func (suite *TableSinkSuite) T() *testing.T { 92 return suite.t 93 } 94 95 func writeToSink(sink ByteSink) error { 96 data := make([]byte, 64) 97 for i := 0; i < 64; i++ { 98 data[i] = byte(i) 99 } 100 101 for i := 0; i < 32; i++ { 102 _, err := sink.Write(data) 103 104 if err != nil { 105 return err 106 } 107 } 108 109 return nil 110 } 111 112 func verifyContents(t *testing.T, bytes []byte) { 113 for i := 0; i < 64*32; i++ { 114 assert.Equal(t, byte(i%64), bytes[i]) 115 } 116 } 117 118 func (suite *TableSinkSuite) TestWriteAndFlush() { 119 sink := suite.sinkFactory() 120 err := writeToSink(sink) 121 require.NoError(suite.t, err) 122 123 bb := bytes.NewBuffer(nil) 124 err = sink.Flush(bb) 125 require.NoError(suite.t, err) 126 127 verifyContents(suite.t, bb.Bytes()) 128 } 129 130 func (suite *TableSinkSuite) TestWriteAndFlushToFile() { 131 sink := suite.sinkFactory() 132 err := writeToSink(sink) 133 require.NoError(suite.t, err) 134 135 path := filepath.Join(os.TempDir(), uuid.New().String()) 136 err = sink.FlushToFile(path) 137 require.NoError(suite.t, err) 138 139 data, err := os.ReadFile(path) 140 require.NoError(suite.t, err) 141 142 verifyContents(suite.t, data) 143 }