12684: Support num_retries in PySDK client constructors
[arvados.git] / services / fuse / tests / test_retry.py
index f6c0807678e9c7c06bdb7b2424eebefd40396758..44ab5cce91a4f9d3a746b7f2f2a21151d83871a4 100644 (file)
@@ -1,11 +1,24 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
+from __future__ import absolute_import
+from future import standard_library
+standard_library.install_aliases()
 import arvados
 import arvados_fuse.command
+import json
 import mock
 import os
-import run_test_server
+import pycurl
+import queue
+from . import run_test_server
 import tempfile
 import unittest
 
+from .integration_test import IntegrationTest
+
+
 class KeepClientRetry(unittest.TestCase):
     origKeepClient = arvados.keep.KeepClient
 
@@ -25,11 +38,30 @@ class KeepClientRetry(unittest.TestCase):
             pass
         self.assertEqual(num_retries, kc.call_args[1].get('num_retries'))
 
-    def test_default_retry_3(self):
-        self._test_retry(3, [])
+    def test_default_retry_10(self):
+        self._test_retry(10, [])
 
     def test_retry_2(self):
         self._test_retry(2, ['--retries=2'])
 
     def test_no_retry(self):
         self._test_retry(0, ['--retries=0'])
+
+class RetryPUT(IntegrationTest):
+    @mock.patch('time.sleep')
+    @IntegrationTest.mount(argv=['--read-write', '--mount-tmp=zzz'])
+    def test_retry_write(self, sleep):
+        mockedCurl = mock.Mock(spec=pycurl.Curl(), wraps=pycurl.Curl())
+        mockedCurl.perform.side_effect = Exception('mock error (ok)')
+        q = queue.Queue()
+        q.put(mockedCurl)
+        q.put(pycurl.Curl())
+        q.put(pycurl.Curl())
+        with mock.patch('arvados.keep.KeepClient.KeepService._get_user_agent', side_effect=q.get_nowait):
+            self.pool_test(os.path.join(self.mnt, 'zzz'))
+            self.assertTrue(mockedCurl.perform.called)
+    @staticmethod
+    def _test_retry_write(self, tmp):
+        with open(os.path.join(tmp, 'foo'), 'w') as f:
+            f.write('foo')
+        json.load(open(os.path.join(tmp, '.arvados#collection')))