11308: Fix arvfile append mode: write() changes the file pointer.
authorTom Clegg <tom@curoverse.com>
Sat, 22 Apr 2017 06:29:00 +0000 (02:29 -0400)
committerTom Clegg <tom@curoverse.com>
Sat, 22 Apr 2017 06:29:00 +0000 (02:29 -0400)
sdk/python/arvados/arvfile.py
sdk/python/tests/test_arvfile.py

index b9faa11c20874eb47fea29c39c57e887c8120586..931a3a198db9407fd72b274225821cc3f12ca6d7 100644 (file)
@@ -1248,10 +1248,9 @@ class ArvadosFileWriter(ArvadosFileReader):
     @retry_method
     def write(self, data, num_retries=None):
         if self.mode[0] == "a":
-            self.arvadosfile.writeto(self.size(), data, num_retries)
-        else:
-            self.arvadosfile.writeto(self._filepos, data, num_retries)
-            self._filepos += len(data)
+            self._filepos = self.size()
+        self.arvadosfile.writeto(self._filepos, data, num_retries)
+        self._filepos += len(data)
         return len(data)
 
     @_FileLikeObjectBase._before_close
index 297fbfc92920647fb2d8270224c572c9f0321703..a8009130551fe3b0ecf0d74aa3ebfe834eb59ad6 100644 (file)
@@ -216,14 +216,21 @@ class ArvadosFileWriterTestCase(unittest.TestCase):
         c = Collection('. 781e5e245d69b566979b86e28d23f2c7+10 0:10:count.txt\n', keep_client=keep)
         writer = c.open("count.txt", "ab+")
         self.assertEqual(writer.read(20), b"0123456789")
-        writer.seek(0, os.SEEK_SET)
 
+        writer.seek(0, os.SEEK_SET)
         writer.write("hello")
-        self.assertEqual(writer.read(20), b"0123456789hello")
+        self.assertEqual(writer.read(), b"")
+        writer.seek(-5, os.SEEK_CUR)
+        self.assertEqual(writer.read(3), b"hel")
+        self.assertEqual(writer.read(), b"lo")
         writer.seek(0, os.SEEK_SET)
+        self.assertEqual(writer.read(), b"0123456789hello")
 
+        writer.seek(0)
         writer.write("world")
-        self.assertEqual(writer.read(20), b"0123456789helloworld")
+        self.assertEqual(writer.read(), b"")
+        writer.seek(0)
+        self.assertEqual(writer.read(), b"0123456789helloworld")
 
         self.assertEqual(". 781e5e245d69b566979b86e28d23f2c7+10 fc5e038d38a57032085441e7fe7010b0+10 0:20:count.txt\n", c.portable_manifest_text())