diff options
-rwxr-xr-x | glusterfs/gfapi.py | 19 | ||||
-rw-r--r-- | test/unit/gluster/test_gfapi.py | 12 |
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 |