def test_locator_init(self): client = self.api_client_mock(200) # Ensure Keep will not return anything if asked. with tutil.mock_responses(None, 404): reader = arvados.CollectionReader(self.DEFAULT_DATA_HASH, api_client=client) self.assertEqual(self.DEFAULT_MANIFEST, reader.manifest_text())
def test_init_num_retries_propagated(self): # More of an integration test... client = self.api_client_mock(200) reader = arvados.CollectionReader(self.DEFAULT_UUID, api_client=client, num_retries=3) with tutil.mock_responses('foo', 500, 500, 200): self.assertEqual('foo', ''.join(f.read(9) for f in reader.all_files()))
def test_locator_init_falls_back_to_keep(self): # Reading manifests from Keep is deprecated. Feel free to # remove this test when we remove the fallback. client = self.api_client_mock(200) self.mock_get_collection(client, 404, None) with tutil.mock_responses(self.DEFAULT_MANIFEST, 200): reader = arvados.CollectionReader(self.DEFAULT_DATA_HASH, api_client=client, num_retries=3) self.assertEqual(self.DEFAULT_MANIFEST, reader.manifest_text())
def test_general_exception_with_mixed_errors(self): # get should raise a NotFoundError if no server returns the block, # and a high threshold of servers report that it's not found. # This test rigs up 50/50 disagreement between two servers, and # checks that it does not become a NotFoundError. client = self.new_client() with tutil.mock_responses(self.DEFAULT_EXPECT, 404, 500): with self.assertRaises(arvados.errors.KeepReadError) as exc_check: client.get(self.HINTED_LOCATOR) self.assertNotIsInstance( exc_check.exception, arvados.errors.NotFoundError, "mixed errors raised NotFoundError")
def test_general_exception_with_mixed_errors(self): # get should raise a NotFoundError if no server returns the block, # and a high threshold of servers report that it's not found. # This test rigs up 50/50 disagreement between two servers, and # checks that it does not become a NotFoundError. client = self.new_client() with tutil.mock_responses(self.DEFAULT_EXPECT, 404, 500): with self.assertRaises(arvados.errors.KeepReadError) as exc_check: client.get(self.HINTED_LOCATOR) self.assertNotIsInstance(exc_check.exception, arvados.errors.NotFoundError, "mixed errors raised NotFoundError")
def test_immediate_success(self): with tutil.mock_responses(self.DEFAULT_EXPECT, 200): self.check_success()
def test_method_retries_take_precedence(self): reader = self.reader_for('user_agreement', num_retries=10) with tutil.mock_responses('', 500, 500, 500, 200): with self.assertRaises(arvados.errors.KeepReadError): self.read_for_test(reader, 10, num_retries=1)
def mock_keep(self, body, *codes, **headers): headers.setdefault('x-keep-replicas-stored', 2) return tutil.mock_responses(body, *codes, **headers)
def test_read_method_retries_exhausted(self): reader = self.reader_for('bar_file') with tutil.mock_responses('bar', 500, 500, 500, 500, 200): with self.assertRaises(arvados.errors.KeepReadError): self.read_for_test(reader, 3, num_retries=3)
def test_read_no_default_retry(self): reader = self.reader_for('user_agreement') with tutil.mock_responses('', 500): with self.assertRaises(arvados.errors.KeepReadError): self.read_for_test(reader, 10)
def test_do_not_send_multiple_copies_to_same_server(self): with tutil.mock_responses(self.DEFAULT_EXPECT, 200): self.check_exception(copies=2, num_retries=3)
def test_retry_then_success(self): with tutil.mock_responses(self.DEFAULT_EXPECT, 500, 200): self.check_success(num_retries=3)
def test_num_retries_instance_fallback(self): self.client_kwargs['num_retries'] = 3 with tutil.mock_responses(self.DEFAULT_EXPECT, 500, 200): self.check_success()
def test_no_retry_after_permanent_error(self): with tutil.mock_responses(self.DEFAULT_EXPECT, 403, 200): self.check_exception(num_retries=3)
def test_specific_exception_when_not_found(self): with tutil.mock_responses(self.DEFAULT_EXPECT, 404, 200): self.check_exception(arvados.errors.NotFoundError, num_retries=3)
def test_error_after_retries_exhausted(self): with tutil.mock_responses(self.DEFAULT_EXPECT, 500, 500, 200): self.check_exception(num_retries=1)
def test_no_default_retry(self): with tutil.mock_responses(self.DEFAULT_EXPECT, 500, 200): self.check_exception()
def test_hint_server_can_succeed_without_retries(self): with tutil.mock_responses(self.DEFAULT_EXPECT, 404, 200, 500): self.check_success(locator=self.HINTED_LOCATOR)
def test_success_without_retries(self): reader = self.reader_for('bar_file') with tutil.mock_responses('bar', 200): self.assertEqual('bar', self.read_for_test(reader, 3))
def test_read_with_method_retries(self): reader = self.reader_for('foo_file') with tutil.mock_responses('foo', 500, 200): self.assertEqual('foo', self.read_for_test(reader, 3, num_retries=3))