Issues 96 - Configuration

- Raising exception for invalid configuration
- Adding more unit tests
pull/112/head
Jonathan D'Orleans 2016-06-07 16:41:39 -04:00
parent 2be81631b8
commit fa5893cddb
2 changed files with 92 additions and 23 deletions

View File

@ -39,22 +39,37 @@ class ConfigurationLoader(object):
A utility for loading Mycroft configuration files. A utility for loading Mycroft configuration files.
""" """
@staticmethod
def init_config(config=None):
if not config:
return {}
return config
@staticmethod
def init_locations(locations=None):
if not locations:
return [DEFAULT_CONFIG, SYSTEM_CONFIG, USER_CONFIG]
return locations
@staticmethod
def validate_data(config=None, locations=None):
if not (isinstance(config, dict) and isinstance(locations, list)):
logger.error("Invalid configuration data type.")
logger.error("Locations: %s" % locations)
logger.error("Configuration: %s" % config)
raise TypeError
@staticmethod @staticmethod
def load(config=None, locations=None): def load(config=None, locations=None):
""" """
Loads default or specified configuration files Loads default or specified configuration files
""" """
if not config: config = ConfigurationLoader.init_config(config)
config = {} locations = ConfigurationLoader.init_locations(locations)
ConfigurationLoader.validate_data(config, locations)
if not locations: for location in locations:
locations = [DEFAULT_CONFIG, SYSTEM_CONFIG, USER_CONFIG] config = ConfigurationLoader.__load(config, location)
if isinstance(config, dict) and isinstance(locations, list):
for location in locations:
config = ConfigurationLoader.__load(config, location)
else:
logger.debug("Invalid configurations: %s" % locations)
return config return config
@ -93,14 +108,18 @@ class RemoteConfiguration(object):
"timezone": "timezone" "timezone": "timezone"
} }
@staticmethod
def validate_config(config):
if not (config and isinstance(config, dict)):
logger.error("Invalid configuration: %s" % config)
raise TypeError
@staticmethod @staticmethod
def load(config=None): def load(config=None):
if not config or not isinstance(config, dict): RemoteConfiguration.validate_config(config)
logger.debug("No valid remote configuration found")
return
identity = IdentityManager().get() identity = IdentityManager().get()
config_remote = config.get("remote_configuration") config_remote = config.get("remote_configuration", {})
enabled = str2bool(config_remote.get("enabled", "False")) enabled = str2bool(config_remote.get("enabled", "False"))
if enabled and identity.token: if enabled and identity.token:

View File

@ -1,6 +1,7 @@
import unittest import unittest
from mycroft.configuration import ConfigurationLoader, ConfigurationManager from mycroft.configuration import ConfigurationLoader, ConfigurationManager, \
DEFAULT_CONFIG, SYSTEM_CONFIG, USER_CONFIG, RemoteConfiguration
__author__ = 'jdorleans' __author__ = 'jdorleans'
@ -28,20 +29,42 @@ class AbstractConfigurationTest(unittest.TestCase):
class ConfigurationLoaderTest(AbstractConfigurationTest): class ConfigurationLoaderTest(AbstractConfigurationTest):
def test_init_config(self):
config = {'a': 'b'}
self.assertEquals(ConfigurationLoader.init_config(), {})
self.assertEquals(ConfigurationLoader.init_config(config), config)
def test_init_locations(self):
locations = [DEFAULT_CONFIG, SYSTEM_CONFIG, USER_CONFIG]
self.assertEquals(ConfigurationLoader.init_locations(), locations)
locations = ['./mycroft.ini']
self.assertEquals(ConfigurationLoader.init_locations(locations),
locations)
def test_validate_data(self):
try:
ConfigurationLoader.validate_data({}, [])
except TypeError:
self.fail()
def test_validate_data_with_invalid_data(self):
self.assertRaises(TypeError, ConfigurationLoader.validate_data)
def test_load(self): def test_load(self):
self.assert_config(ConfigurationLoader.load()) self.assert_config(ConfigurationLoader.load())
def test_load_and_override_custom(self): def test_load_with_override_custom(self):
config = self.create_config('pt-br', 'espeak') config = self.create_config('pt-br', 'espeak')
config = ConfigurationLoader.load(config) config = ConfigurationLoader.load(config)
self.assert_config(config) self.assert_config(config)
def test_load_and_override_default(self): def test_load_with_override_default(self):
config = self.create_config() config = self.create_config()
config = ConfigurationLoader.load(config, ['./mycroft.ini']) config = ConfigurationLoader.load(config, ['./mycroft.ini'])
self.assert_config(config, 'pt-br', 'espeak') self.assert_config(config, 'pt-br', 'espeak')
def test_load_and_do_not_override_custom(self): def test_load_with_extra_custom(self):
my_config = {'key': 'value'} my_config = {'key': 'value'}
config = ConfigurationLoader.load(my_config) config = ConfigurationLoader.load(my_config)
self.assert_config(config) self.assert_config(config)
@ -51,13 +74,11 @@ class ConfigurationLoaderTest(AbstractConfigurationTest):
self.assertEquals(value, my_config.get('key')) self.assertEquals(value, my_config.get('key'))
def test_load_with_invalid_config_type(self): def test_load_with_invalid_config_type(self):
invalid_type = 'invalid_type' self.assertRaises(TypeError, ConfigurationLoader.load, 'invalid_type')
config = ConfigurationLoader.load(invalid_type)
self.assertEquals(config, invalid_type)
def test_load_with_invalid_locations_type(self): def test_load_with_invalid_locations_type(self):
config = ConfigurationLoader.load(None, './mycroft.ini') self.assertRaises(TypeError, ConfigurationLoader.load,
self.assertEquals(config, {}) None, './mycroft.ini')
def test_load_with_invalid_locations_path(self): def test_load_with_invalid_locations_path(self):
locations = ['./invalid/mycroft.ini', './invalid_mycroft.ini'] locations = ['./invalid/mycroft.ini', './invalid_mycroft.ini']
@ -65,15 +86,44 @@ class ConfigurationLoaderTest(AbstractConfigurationTest):
self.assertEquals(config, {}) self.assertEquals(config, {})
class RemoteConfigurationTest(AbstractConfigurationTest):
def test_validate_config(self):
try:
RemoteConfiguration.validate_config(self.create_config())
except TypeError:
self.fail()
def test_validate_config_with_invalid_config(self):
self.assertRaises(TypeError, RemoteConfiguration.validate_config)
def test_load_without_remote_config(self):
config = self.create_config()
self.assertEquals(RemoteConfiguration.load(config), config)
class ConfigurationManagerTest(AbstractConfigurationTest): class ConfigurationManagerTest(AbstractConfigurationTest):
def test_load_defaults(self): def test_load_defaults(self):
ConfigurationManager.load_defaults()
self.assert_config(ConfigurationManager.load_defaults()) self.assert_config(ConfigurationManager.load_defaults())
def test_load_local(self): def test_load_local(self):
ConfigurationManager.load_defaults()
self.assert_config(ConfigurationManager.load_local()) self.assert_config(ConfigurationManager.load_local())
def test_load_local_with_locations(self):
ConfigurationManager.load_defaults()
config = ConfigurationManager.load_local(['./mycroft.ini'])
self.assert_config(config, 'pt-br', 'espeak')
def test_load_remote(self): def test_load_remote(self):
ConfigurationManager.load_defaults()
self.assert_config(ConfigurationManager.load_remote()) self.assert_config(ConfigurationManager.load_remote())
def test_get(self): def test_get(self):
ConfigurationManager.load_defaults()
self.assert_config(ConfigurationManager.get()) self.assert_config(ConfigurationManager.get())
def test_load_get_with_locations(self):
ConfigurationManager.load_defaults()
config = ConfigurationManager.get(['./mycroft.ini'])
self.assert_config(config, 'pt-br', 'espeak')