diff --git a/optimizely/config_manager.py b/optimizely/config_manager.py index 35bdfa8e6..0c05d534a 100644 --- a/optimizely/config_manager.py +++ b/optimizely/config_manager.py @@ -212,15 +212,24 @@ def set_update_interval(self, update_interval): Args: update_interval: Time in seconds after which to update datafile. """ - self.update_interval = update_interval or enums.ConfigManager.DEFAULT_UPDATE_INTERVAL + if not update_interval: + update_interval = enums.ConfigManager.DEFAULT_UPDATE_INTERVAL + self.logger.debug('Set config update interval to default value {}.'.format(update_interval)) + + if not isinstance(update_interval, (int, float)): + raise optimizely_exceptions.InvalidInputException( + 'Invalid update_interval "{}" provided.'.format(update_interval) + ) # If polling interval is less than minimum allowed interval then set it to default update interval. - if self.update_interval < enums.ConfigManager.MIN_UPDATE_INTERVAL: - self.logger.debug('Invalid update_interval {} provided. Defaulting to {}'.format( + if update_interval < enums.ConfigManager.MIN_UPDATE_INTERVAL: + self.logger.debug('update_interval value {} too small. Defaulting to {}'.format( update_interval, enums.ConfigManager.DEFAULT_UPDATE_INTERVAL) ) - self.update_interval = enums.ConfigManager.DEFAULT_UPDATE_INTERVAL + update_interval = enums.ConfigManager.DEFAULT_UPDATE_INTERVAL + + self.update_interval = update_interval def set_last_modified(self, response_headers): """ Looks up and sets last modified time based on Last-Modified header in the response. @@ -269,9 +278,14 @@ def is_running(self): def _run(self): """ Triggered as part of the thread which fetches the datafile and sleeps until next update interval. """ - while self.is_running: - self.fetch_datafile() - time.sleep(self.update_interval) + try: + while self.is_running: + self.fetch_datafile() + time.sleep(self.update_interval) + except (OSError, OverflowError) as err: + self.logger.error('Error in time.sleep. ' + 'Provided update_interval value may be too big. Error: {}'.format(str(err))) + raise def start(self): """ Start the config manager and the thread to periodically fetch datafile. """ diff --git a/optimizely/helpers/validator.py b/optimizely/helpers/validator.py index e08e1fd7e..c9ad2a219 100644 --- a/optimizely/helpers/validator.py +++ b/optimizely/helpers/validator.py @@ -221,7 +221,7 @@ def is_finite_number(value): greater than absolute limit of 2^53 else False. """ if not isinstance(value, (numbers.Integral, float)): - # numbers.Integral instead of int to accomodate long integer in python 2 + # numbers.Integral instead of int to accommodate long integer in python 2 return False if isinstance(value, bool): @@ -244,7 +244,7 @@ def are_values_same_type(first_val, second_val): Args: first_val: Value to validate. - second_Val: Value to validate. + second_val: Value to validate. Returns: Boolean: True if both values belong to same type. Otherwise False. diff --git a/tests/test_config_manager.py b/tests/test_config_manager.py index 5aafa3618..5ea73c263 100644 --- a/tests/test_config_manager.py +++ b/tests/test_config_manager.py @@ -188,6 +188,11 @@ def test_set_update_interval(self, _): """ Test set_update_interval with different inputs. """ project_config_manager = config_manager.PollingConfigManager(sdk_key='some_key') + # Assert that if invalid update_interval is set, then exception is raised. + with self.assertRaisesRegexp(optimizely_exceptions.InvalidInputException, + 'Invalid update_interval "invalid interval" provided.'): + project_config_manager.set_update_interval('invalid interval') + # Assert that update_interval cannot be set to less than allowed minimum and instead is set to default value. project_config_manager.set_update_interval(0.42) self.assertEqual(enums.ConfigManager.DEFAULT_UPDATE_INTERVAL, project_config_manager.update_interval)