X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2c6557f613fcf6cdcebb08c321a5d061aeb780c6..022107bd52092c658208e74161581c6bedda4a5f:/services/keepstore/volume_test.go diff --git a/services/keepstore/volume_test.go b/services/keepstore/volume_test.go index 5a17b3a7dc..f64041b048 100644 --- a/services/keepstore/volume_test.go +++ b/services/keepstore/volume_test.go @@ -5,6 +5,7 @@ package keepstore import ( + "sync" "time" ) @@ -38,3 +39,52 @@ type TestableVolume interface { // Clean up, delete temporary files. Teardown() } + +// brbuffer is like bytes.Buffer, but it implements io.WriterAt. +// Convenient for testing (volume)BlockRead implementations. +type brbuffer struct { + mtx sync.Mutex + buf []byte +} + +func (b *brbuffer) WriteAt(p []byte, offset int64) (int, error) { + b.mtx.Lock() + defer b.mtx.Unlock() + if short := int(offset) + len(p) - len(b.buf); short > 0 { + b.buf = append(b.buf, make([]byte, short)...) + } + return copy(b.buf[offset:], p), nil +} + +func (b *brbuffer) Bytes() []byte { + b.mtx.Lock() + defer b.mtx.Unlock() + return b.buf +} + +func (b *brbuffer) String() string { + b.mtx.Lock() + defer b.mtx.Unlock() + return string(b.buf) +} + +func (b *brbuffer) Len() int { + b.mtx.Lock() + defer b.mtx.Unlock() + return len(b.buf) +} + +func (b *brbuffer) Reset() { + b.mtx.Lock() + defer b.mtx.Unlock() + b.buf = nil +} + +// a brdiscarder is like io.Discard, but it implements +// io.WriterAt. Convenient for testing (volume)BlockRead +// implementations when the output is not checked. +type brdiscarder struct{} + +func (brdiscarder) WriteAt(p []byte, offset int64) (int, error) { return len(p), nil } + +var brdiscard = brdiscarder{}