test/rbd: Add tests for Image.Seek()

Signed-off-by: Niels de Vos <ndevos@redhat.com>
This commit is contained in:
Niels de Vos 2019-12-10 12:10:45 +01:00 committed by John Mulligan
parent 2faaf93287
commit 9381485fac
2 changed files with 81 additions and 6 deletions

View File

@ -47,6 +47,11 @@ const (
// Features that only work when used with a single client using the image for writes. // Features that only work when used with a single client using the image for writes.
RbdFeaturesSingleClient = uint64(C.RBD_FEATURES_SINGLE_CLIENT) RbdFeaturesSingleClient = uint64(C.RBD_FEATURES_SINGLE_CLIENT)
// Image.Seek() constants
SeekSet = int(C.SEEK_SET)
SeekCur = int(C.SEEK_CUR)
SeekEnd = int(C.SEEK_END)
) )
// bits for Image.validate() and Snapshot.validate() // bits for Image.validate() and Snapshot.validate()
@ -863,11 +868,11 @@ func (image *Image) Write(data []byte) (n int, err error) {
func (image *Image) Seek(offset int64, whence int) (int64, error) { func (image *Image) Seek(offset int64, whence int) (int64, error) {
switch whence { switch whence {
case 0: case SeekSet:
image.offset = offset image.offset = offset
case 1: case SeekCur:
image.offset += offset image.offset += offset
case 2: case SeekEnd:
stats, err := image.Stat() stats, err := image.Stat()
if err != nil { if err != nil {
return 0, err return 0, err

View File

@ -392,6 +392,76 @@ func TestImageRename(t *testing.T) {
conn.Shutdown() conn.Shutdown()
} }
func TestImageSeek(t *testing.T) {
conn, _ := rados.NewConn()
conn.ReadDefaultConfigFile()
conn.Connect()
poolname := GetUUID()
err := conn.MakePool(poolname)
assert.NoError(t, err)
ioctx, err := conn.OpenIOContext(poolname)
require.NoError(t, err)
name := GetUUID()
img, err := Create(ioctx, name, 1<<22, 22)
assert.NoError(t, err)
err = img.Open()
assert.NoError(t, err)
_, err = img.Seek(0, SeekSet)
assert.NoError(t, err)
bytes_in := []byte("input data")
n_in, err := img.Write(bytes_in)
assert.NoError(t, err)
assert.Equal(t, n_in, len(bytes_in))
pos, err := img.Seek(0, SeekCur)
assert.NoError(t, err)
assert.Equal(t, pos, int64(n_in))
pos, err = img.Seek(0, SeekSet)
assert.NoError(t, err)
assert.Equal(t, pos, int64(0))
bytes_out := make([]byte, len(bytes_in))
n_out, err := img.Read(bytes_out)
assert.NoError(t, err)
assert.Equal(t, n_out, len(bytes_out))
assert.Equal(t, bytes_in, bytes_out)
pos, err = img.Seek(0, SeekCur)
assert.NoError(t, err)
assert.Equal(t, pos, int64(n_out))
pos, err = img.Seek(0, SeekSet)
assert.NoError(t, err)
assert.Equal(t, pos, int64(0))
pos, err = img.Seek(0, SeekEnd)
assert.NoError(t, err)
assert.Equal(t, pos, int64(1<<22))
_, err = img.Seek(0, -1)
assert.Error(t, err)
err = img.Close()
assert.NoError(t, err)
_, err = img.Seek(0, SeekEnd)
assert.Equal(t, err, ErrImageNotOpen)
err = img.Remove()
assert.NoError(t, err)
ioctx.Destroy()
conn.DeletePool(poolname)
conn.Shutdown()
}
func TestIOReaderWriter(t *testing.T) { func TestIOReaderWriter(t *testing.T) {
conn, _ := rados.NewConn() conn, _ := rados.NewConn()
conn.ReadDefaultConfigFile() conn.ReadDefaultConfigFile()
@ -420,7 +490,7 @@ func TestIOReaderWriter(t *testing.T) {
err = img.Flush() err = img.Flush()
assert.NoError(t, err) assert.NoError(t, err)
_, err = img.Seek(0, 0) _, err = img.Seek(0, SeekSet)
assert.NoError(t, err) assert.NoError(t, err)
var stats2 *ImageInfo var stats2 *ImageInfo
@ -429,12 +499,12 @@ func TestIOReaderWriter(t *testing.T) {
assert.Equal(t, &stats, &stats2) assert.Equal(t, &stats, &stats2)
_, err = img.Seek(0, 0) _, err = img.Seek(0, SeekSet)
bytes_in := []byte("input data") bytes_in := []byte("input data")
_, err = img.Write(bytes_in) _, err = img.Write(bytes_in)
assert.NoError(t, err) assert.NoError(t, err)
_, err = img.Seek(0, 0) _, err = img.Seek(0, SeekSet)
assert.NoError(t, err) assert.NoError(t, err)
bytes_out := make([]byte, len(bytes_in)) bytes_out := make([]byte, len(bytes_in))