github.com/hasnat/dolt/go@v0.0.0-20210628190320-9eb5d843fbb7/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 "io/ioutil" 20 "os" 21 "path/filepath" 22 "testing" 23 24 "github.com/google/uuid" 25 "github.com/stretchr/testify/assert" 26 "github.com/stretchr/testify/require" 27 "github.com/stretchr/testify/suite" 28 ) 29 30 func TestBlockBufferTableSink(t *testing.T) { 31 createSink := func() ByteSink { 32 return NewBlockBufferTableSink(128) 33 } 34 35 suite.Run(t, &TableSinkSuite{createSink, t}) 36 } 37 38 func TestFixedBufferTableSink(t *testing.T) { 39 createSink := func() ByteSink { 40 return NewFixedBufferTableSink(make([]byte, 32*1024)) 41 } 42 43 suite.Run(t, &TableSinkSuite{createSink, t}) 44 } 45 46 func TestBufferedFileByteSink(t *testing.T) { 47 createSink := func() ByteSink { 48 sink, err := NewBufferedFileByteSink("", 4*1024, 16) 49 require.NoError(t, err) 50 51 return sink 52 } 53 54 suite.Run(t, &TableSinkSuite{createSink, t}) 55 } 56 57 type TableSinkSuite struct { 58 sinkFactory func() ByteSink 59 t *testing.T 60 } 61 62 func (suite *TableSinkSuite) SetT(t *testing.T) { 63 suite.t = t 64 } 65 66 func (suite *TableSinkSuite) T() *testing.T { 67 return suite.t 68 } 69 70 func writeToSink(sink ByteSink) error { 71 data := make([]byte, 64) 72 for i := 0; i < 64; i++ { 73 data[i] = byte(i) 74 } 75 76 for i := 0; i < 32; i++ { 77 _, err := sink.Write(data) 78 79 if err != nil { 80 return err 81 } 82 } 83 84 return nil 85 } 86 87 func verifyContents(t *testing.T, bytes []byte) { 88 for i := 0; i < 64*32; i++ { 89 assert.Equal(t, byte(i%64), bytes[i]) 90 } 91 } 92 93 func (suite *TableSinkSuite) TestWriteAndFlush() { 94 sink := suite.sinkFactory() 95 err := writeToSink(sink) 96 require.NoError(suite.t, err) 97 98 bb := bytes.NewBuffer(nil) 99 err = sink.Flush(bb) 100 require.NoError(suite.t, err) 101 102 verifyContents(suite.t, bb.Bytes()) 103 } 104 105 func (suite *TableSinkSuite) TestWriteAndFlushToFile() { 106 sink := suite.sinkFactory() 107 err := writeToSink(sink) 108 require.NoError(suite.t, err) 109 110 path := filepath.Join(os.TempDir(), uuid.New().String()) 111 err = sink.FlushToFile(path) 112 require.NoError(suite.t, err) 113 114 data, err := ioutil.ReadFile(path) 115 require.NoError(suite.t, err) 116 117 verifyContents(suite.t, data) 118 }