From 9652971df4fedf0463300cddcdfc20b25171edfd Mon Sep 17 00:00:00 2001 From: Matjaz Pirnovar Date: Fri, 8 Mar 2024 12:40:24 -0800 Subject: [PATCH 1/3] updare error log message --- optimizely/config_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optimizely/config_manager.py b/optimizely/config_manager.py index 032189e9..a4ca91f2 100644 --- a/optimizely/config_manager.py +++ b/optimizely/config_manager.py @@ -422,7 +422,7 @@ def _run(self) -> None: break except (OSError, OverflowError) as err: self.logger.error( - f'Provided update_interval value may be too big. Error: {err}' + f'Thread for background datafile polling failed. Error: {err}' ) raise From f6f1676b0dbe4ae8029aa59f0a08b45432d9636a Mon Sep 17 00:00:00 2001 From: Matjaz Pirnovar Date: Mon, 11 Mar 2024 11:21:48 -0700 Subject: [PATCH 2/3] test for the log message --- tests/test_config_manager.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/test_config_manager.py b/tests/test_config_manager.py index 6f4038cb..929609c2 100644 --- a/tests/test_config_manager.py +++ b/tests/test_config_manager.py @@ -494,6 +494,33 @@ def test_fetch_datafile__request_exception_raised(self, _): self.assertEqual(test_headers['Last-Modified'], project_config_manager.last_modified) self.assertIsInstance(project_config_manager.get_config(), project_config.ProjectConfig) + def test_fetch_datafile__exception_polling_thread_failed(self, _): + """ Test that exception is raised when polling thread stops. """ + sdk_key = 'some_key' + mock_logger = mock.Mock() + + test_headers = {'Last-Modified': 'New Time'} + test_datafile = json.dumps(self.config_dict_with_features) + test_response = requests.Response() + test_response.status_code = 200 + test_response.headers = test_headers + test_response._content = test_datafile + + with mock.patch('requests.get', return_value=test_response): + with self.assertRaises(OverflowError): + project_config_manager = config_manager.PollingConfigManager(sdk_key=sdk_key, + logger=mock_logger, + update_interval=12345678912345) + + project_config_manager.stop() + + # verify the error log message + log_messages = [args[0] for args, _ in mock_logger.error.call_args_list] + for message in log_messages: + if "Thread for background datafile polling failed. " \ + "Error: timestamp too large to convert to C _PyTime_t" not in message: + assert False + def test_is_running(self, _): """ Test that polling thread is running after instance of PollingConfigManager is created. """ with mock.patch('optimizely.config_manager.PollingConfigManager.fetch_datafile'): From 19f30771952323cd7e73bf8a3a456642dc6b5be0 Mon Sep 17 00:00:00 2001 From: Matjaz Pirnovar Date: Mon, 11 Mar 2024 12:52:34 -0700 Subject: [PATCH 3/3] upate to generic exception --- optimizely/config_manager.py | 2 +- tests/test_config_manager.py | 25 ++++++++++++------------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/optimizely/config_manager.py b/optimizely/config_manager.py index a4ca91f2..755c6b9c 100644 --- a/optimizely/config_manager.py +++ b/optimizely/config_manager.py @@ -420,7 +420,7 @@ def _run(self) -> None: if self.stopped.wait(self.update_interval): self.stopped.clear() break - except (OSError, OverflowError) as err: + except Exception as err: self.logger.error( f'Thread for background datafile polling failed. Error: {err}' ) diff --git a/tests/test_config_manager.py b/tests/test_config_manager.py index 929609c2..1c3fbe89 100644 --- a/tests/test_config_manager.py +++ b/tests/test_config_manager.py @@ -507,19 +507,18 @@ def test_fetch_datafile__exception_polling_thread_failed(self, _): test_response._content = test_datafile with mock.patch('requests.get', return_value=test_response): - with self.assertRaises(OverflowError): - project_config_manager = config_manager.PollingConfigManager(sdk_key=sdk_key, - logger=mock_logger, - update_interval=12345678912345) - - project_config_manager.stop() - - # verify the error log message - log_messages = [args[0] for args, _ in mock_logger.error.call_args_list] - for message in log_messages: - if "Thread for background datafile polling failed. " \ - "Error: timestamp too large to convert to C _PyTime_t" not in message: - assert False + project_config_manager = config_manager.PollingConfigManager(sdk_key=sdk_key, + logger=mock_logger, + update_interval=12345678912345) + + project_config_manager.stop() + + # verify the error log message + log_messages = [args[0] for args, _ in mock_logger.error.call_args_list] + for message in log_messages: + if "Thread for background datafile polling failed. " \ + "Error: timestamp too large to convert to C _PyTime_t" not in message: + assert False def test_is_running(self, _): """ Test that polling thread is running after instance of PollingConfigManager is created. """