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.
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()
@ -863,11 +868,11 @@ func (image *Image) Write(data []byte) (n int, err error) {
func (image *Image) Seek(offset int64, whence int) (int64, error) {
switch whence {
case 0:
case SeekSet:
image.offset = offset
case 1:
case SeekCur:
image.offset += offset
case 2:
case SeekEnd:
stats, err := image.Stat()
if err != nil {
return 0, err

View File

@ -392,6 +392,76 @@ func TestImageRename(t *testing.T) {
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) {
conn, _ := rados.NewConn()
conn.ReadDefaultConfigFile()
@ -420,7 +490,7 @@ func TestIOReaderWriter(t *testing.T) {
err = img.Flush()
assert.NoError(t, err)
_, err = img.Seek(0, 0)
_, err = img.Seek(0, SeekSet)
assert.NoError(t, err)
var stats2 *ImageInfo
@ -429,12 +499,12 @@ func TestIOReaderWriter(t *testing.T) {
assert.Equal(t, &stats, &stats2)
_, err = img.Seek(0, 0)
_, err = img.Seek(0, SeekSet)
bytes_in := []byte("input data")
_, err = img.Write(bytes_in)
assert.NoError(t, err)
_, err = img.Seek(0, 0)
_, err = img.Seek(0, SeekSet)
assert.NoError(t, err)
bytes_out := make([]byte, len(bytes_in))