summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xglusterfs/gfapi.py19
-rw-r--r--test/unit/gluster/test_gfapi.py12
2 files changed, 29 insertions, 2 deletions
diff --git a/glusterfs/gfapi.py b/glusterfs/gfapi.py
index 2d51a96..af25d18 100755
--- a/glusterfs/gfapi.py
+++ b/glusterfs/gfapi.py
@@ -104,6 +104,12 @@ class File(object):
raise OSError(err, os.strerror(err))
return ret
+ def fgetsize(self):
+ """
+ Return the size of a file, reported by fstat()
+ """
+ return self.fstat().st_size
+
def fstat(self):
"""
Returns Stat object for this file.
@@ -137,9 +143,18 @@ class File(object):
"""
return api.glfs_lseek(self.fd, pos, how)
- def read(self, buflen, flags=0):
+ def read(self, buflen=-1):
+ """
+ read file
+
+ :param buflen: length of read buffer. If less than 0, then whole
+ file is read. Default is -1.
+ :returns: buffer of size buflen
+ """
+ if buflen < 0:
+ buflen = self.fgetsize()
rbuf = ctypes.create_string_buffer(buflen)
- ret = api.glfs_read(self.fd, rbuf, buflen, flags)
+ ret = api.glfs_read(self.fd, rbuf, buflen, 0)
if ret > 0:
return rbuf
elif ret < 0:
diff --git a/test/unit/gluster/test_gfapi.py b/test/unit/gluster/test_gfapi.py
index 1608332..0d73a32 100644
--- a/test/unit/gluster/test_gfapi.py
+++ b/test/unit/gluster/test_gfapi.py
@@ -180,6 +180,18 @@ class TestFile(unittest.TestCase):
b = self.fd.read(5)
self.assertEqual(b, 0)
+ def test_read_buflen_negative(self):
+ _mock_fgetsize = Mock(return_value=12345)
+
+ def _mock_glfs_read(fd, rbuf, buflen, flags):
+ self.assertEqual(buflen, 12345)
+ return buflen
+
+ for buflen in (-1,-2,-999):
+ with patch("glusterfs.gfapi.api.glfs_read", _mock_glfs_read):
+ with patch("glusterfs.gfapi.File.fgetsize", _mock_fgetsize):
+ b = self.fd.read(buflen)
+
def test_write_success(self):
mock_glfs_write = Mock()
mock_glfs_write.return_value = 5