diff --git a/model_server/extensions/ilastik/tests/test_ilastik.py b/model_server/extensions/ilastik/tests/test_ilastik.py index 89fe2b98d1f8ea25702e8a221c6178e8fe3a645b..54a2505b5a4d17a8a74b150551a9800e4ad97a07 100644 --- a/model_server/extensions/ilastik/tests/test_ilastik.py +++ b/model_server/extensions/ilastik/tests/test_ilastik.py @@ -130,17 +130,17 @@ class TestIlastikPixelClassification(unittest.TestCase): class TestIlastikOverApi(TestServerBaseClass): def test_httpexception_if_incorrect_project_file_loaded(self): - resp_load = requests.put( - self.uri + 'ilastik/seg/load/', - params={'project_file': 'improper.ilp'}, + resp_load = self._put( + 'ilastik/seg/load/', + {'project_file': 'improper.ilp'}, ) self.assertEqual(resp_load.status_code, 404) def test_load_ilastik_pixel_model(self): - resp_load = requests.put( - self.uri + 'ilastik/seg/load/', - params={'project_file': str(ilastik_classifiers['px'])}, + resp_load = self._put( + 'ilastik/seg/load/', + {'project_file': str(ilastik_classifiers['px'])}, ) self.assertEqual(resp_load.status_code, 200, resp_load.json()) model_id = resp_load.json()['model_id'] @@ -154,21 +154,15 @@ class TestIlastikOverApi(TestServerBaseClass): model_id = self.test_load_ilastik_pixel_model() resp_list_1st = requests.get(self.uri + 'models').json() self.assertEqual(len(resp_list_1st), 1, resp_list_1st) - resp_load_2nd = requests.put( - self.uri + 'ilastik/seg/load/', - params={ - 'project_file': str(ilastik_classifiers['px']), - 'duplicate': True, - }, + resp_load_2nd = self._put( + 'ilastik/seg/load/', + {'project_file': str(ilastik_classifiers['px']), 'duplicate': True, }, ) resp_list_2nd = requests.get(self.uri + 'models').json() self.assertEqual(len(resp_list_2nd), 2, resp_list_2nd) - resp_load_3rd = requests.put( - self.uri + 'ilastik/seg/load/', - params={ - 'project_file': str(ilastik_classifiers['px']), - 'duplicate': False, - }, + resp_load_3rd = self._put( + 'ilastik/seg/load/', + {'project_file': str(ilastik_classifiers['px']), 'duplicate': False}, ) resp_list_3rd = requests.get(self.uri + 'models').json() self.assertEqual(len(resp_list_3rd), 2, resp_list_3rd) @@ -189,19 +183,13 @@ class TestIlastikOverApi(TestServerBaseClass): self.assertEqual(pathlib.Path(ilp_win), pathlib.Path(ilp_posx)) # load models with these paths - resp1 = requests.put( - self.uri + 'ilastik/seg/load/', - params={ - 'project_file': ilp_win, - 'duplicate': False, - }, + resp1 = self._put( + 'ilastik/seg/load/', + {'project_file': ilp_win, 'duplicate': False }, ) - resp2 = requests.put( - self.uri + 'ilastik/seg/load/', - params={ - 'project_file': ilp_posx, - 'duplicate': False, - }, + resp2 = self._put( + 'ilastik/seg/load/', + {'project_file': ilp_posx, 'duplicate': False}, ) self.assertEqual(resp1.json(), resp2.json()) @@ -212,9 +200,9 @@ class TestIlastikOverApi(TestServerBaseClass): def test_load_ilastik_pxmap_to_obj_model(self): - resp_load = requests.put( - self.uri + 'ilastik/pxmap_to_obj/load/', - params={'project_file': str(ilastik_classifiers['pxmap_to_obj'])}, + resp_load = self._put( + 'ilastik/pxmap_to_obj/load/', + {'project_file': str(ilastik_classifiers['pxmap_to_obj'])}, ) model_id = resp_load.json()['model_id'] @@ -226,9 +214,9 @@ class TestIlastikOverApi(TestServerBaseClass): return model_id def test_load_ilastik_seg_to_obj_model(self): - resp_load = requests.put( - self.uri + 'ilastik/seg_to_obj/load/', - params={'project_file': str(ilastik_classifiers['seg_to_obj'])}, + resp_load = self._put( + 'ilastik/seg_to_obj/load/', + {'project_file': str(ilastik_classifiers['seg_to_obj'])}, ) model_id = resp_load.json()['model_id'] @@ -243,13 +231,9 @@ class TestIlastikOverApi(TestServerBaseClass): self.copy_input_file_to_server() model_id = self.test_load_ilastik_pixel_model() - resp_infer = requests.put( - self.uri + f'workflows/segment', - params={ - 'model_id': model_id, - 'input_filename': czifile['filename'], - 'channel': 0, - }, + resp_infer = self._put( + f'workflows/segment', + {'model_id': model_id, 'input_filename': czifile['filename'], 'channel': 0}, ) self.assertEqual(resp_infer.status_code, 200, resp_infer.content.decode()) @@ -258,9 +242,9 @@ class TestIlastikOverApi(TestServerBaseClass): px_model_id = self.test_load_ilastik_pixel_model() ob_model_id = self.test_load_ilastik_pxmap_to_obj_model() - resp_infer = requests.put( - self.uri + f'ilastik/pixel_then_object_classification/infer/', - params={ + resp_infer = self._put( + 'ilastik/pixel_then_object_classification/infer/', + { 'px_model_id': px_model_id, 'ob_model_id': ob_model_id, 'input_filename': czifile['filename'], diff --git a/tests/test_api.py b/tests/test_api.py index 2b67a67d84e4df26c7f6432070845104f81ca9f1..bffc9d4989347e9291b59a30243d018ddbce34fe 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -2,6 +2,7 @@ from multiprocessing import Process from pathlib import Path import requests import unittest +from urllib3 import Retry from model_server.conf.testing import czifile @@ -24,6 +25,15 @@ class TestServerBaseClass(unittest.TestCase): self.server_process.start() requests.get(self.uri + 'restart') + def _put(self, endpoint, params=None): + sesh = requests.Session() + retries = Retry( + total=5, + backoff_factor=0.1, + ) + sesh.mount('http://', requests.adapters.HTTPAdapter(max_retries=retries)) + return sesh.put(self.uri + endpoint, params=params) + def copy_input_file_to_server(self): from shutil import copyfile @@ -44,7 +54,7 @@ class TestApiFromAutomatedClient(TestServerBaseClass): self.assertEqual(resp.status_code, 200) def test_bounceback_parameters(self): - resp = requests.put(self.uri + 'bounce_back', params={'par1': 'hello'}) + resp = self._put('bounce_back', {'par1': 'hello'}) self.assertEqual(resp.status_code, 200, resp.json()) self.assertEqual(resp.json()['params']['par1'], 'hello', resp.json()) self.assertEqual(resp.json()['params']['par2'], None, resp.json()) @@ -64,9 +74,7 @@ class TestApiFromAutomatedClient(TestServerBaseClass): self.assertEqual(resp.content, b'{}') def test_load_dummy_model(self): - resp_load = requests.put( - self.uri + f'models/dummy/load', - ) + resp_load = self._put(f'models/dummy/load') model_id = resp_load.json()['model_id'] self.assertEqual(resp_load.status_code, 200, resp_load.json()) resp_list = requests.get(self.uri + 'models') @@ -78,33 +86,27 @@ class TestApiFromAutomatedClient(TestServerBaseClass): def test_respond_with_error_when_invalid_filepath_requested(self): model_id = self.test_load_dummy_model() - resp = requests.put( - self.uri + f'infer/from_image_file', - params={ - 'model_id': model_id, - 'input_filename': 'not_a_real_file.name' - } + resp = self._put( + f'infer/from_image_file', + {'model_id': model_id, 'input_filename': 'not_a_real_file.name'} ) self.assertEqual(resp.status_code, 404, resp.content.decode()) def test_i2i_inference_errors_when_model_not_found(self): model_id = 'not_a_real_model' - resp = requests.put( - self.uri + f'workflows/segment', - params={ - 'model_id': model_id, - 'input_filename': 'not_a_real_file.name' - } + resp = self._put( + f'workflows/segment', + {'model_id': model_id, 'input_filename': 'not_a_real_file.name'} ) self.assertEqual(resp.status_code, 409, resp.content.decode()) def test_i2i_dummy_inference_by_api(self): model_id = self.test_load_dummy_model() self.copy_input_file_to_server() - resp_infer = requests.put( - self.uri + f'workflows/segment', - params={ + resp_infer = self._put( + f'workflows/segment', + { 'model_id': model_id, 'input_filename': czifile['filename'], 'channel': 2, @@ -113,9 +115,7 @@ class TestApiFromAutomatedClient(TestServerBaseClass): self.assertEqual(resp_infer.status_code, 200, resp_infer.content.decode()) def test_restarting_session_clears_loaded_models(self): - resp_load = requests.put( - self.uri + f'models/dummy/load', - ) + resp_load = self._put(f'models/dummy/load',) self.assertEqual(resp_load.status_code, 200, resp_load.json()) resp_list_0 = requests.get(self.uri + 'models') self.assertEqual(resp_list_0.status_code, 200) @@ -130,11 +130,9 @@ class TestApiFromAutomatedClient(TestServerBaseClass): resp_inpath = requests.get( self.uri + 'paths' ) - resp_change = requests.put( - self.uri + f'paths/watch_output', - params={ - 'path': resp_inpath.json()['inbound_images'] - } + resp_change = self._put( + f'paths/watch_output', + {'path': resp_inpath.json()['inbound_images']} ) self.assertEqual(resp_change.status_code, 200) resp_check = requests.get( @@ -147,11 +145,9 @@ class TestApiFromAutomatedClient(TestServerBaseClass): self.uri + 'paths' ) fakepath = 'c:/fake/path/to/nowhere' - resp_change = requests.put( - self.uri + f'paths/watch_output', - params={ - 'path': fakepath, - } + resp_change = self._put( + f'paths/watch_output', + {'path': fakepath} ) self.assertEqual(resp_change.status_code, 404) self.assertIn(fakepath, resp_change.json()['detail']) @@ -164,11 +160,9 @@ class TestApiFromAutomatedClient(TestServerBaseClass): resp_inpath = requests.get( self.uri + 'paths' ) - resp_change = requests.put( - self.uri + f'paths/watch_output', - params={ - 'path': resp_inpath.json()['outbound_images'] - } + resp_change = self._put( + f'paths/watch_output', + {'path': resp_inpath.json()['outbound_images']} ) self.assertEqual(resp_change.status_code, 200) resp_check = requests.get(