From 83f05197fbb9a898c3532306dc347110604fcfcd Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Fri, 21 Jun 2019 23:04:04 +0200 Subject: [PATCH] update todict support and tests --- tests/test_choice_option.py | 36 +- tests/test_config.py | 44 +- tests/test_config_api.py | 37 +- tests/test_config_domain.py | 81 +- tests/test_config_ip.py | 83 +- tests/test_leadership.py | 811 +++++++------- tests/test_mandatory.py | 549 +++++----- tests/test_option_callback.py | 1129 +++++++++++--------- tests/test_option_consistency.py | 850 ++++++++------- tests/test_option_default.py | 227 ++-- tests/test_option_owner.py | 208 ++-- tests/test_option_setting.py | 428 ++++---- tiramisu/api.py | 16 +- tiramisu/error.py | 5 +- tiramisu/locale/fr/LC_MESSAGES/tiramisu.po | 2 +- tiramisu/option/choiceoption.py | 15 +- tiramisu/option/option.py | 13 +- tiramisu/setting.py | 11 +- tiramisu/storage/dictionary/value.py | 8 + tiramisu/todict.py | 561 +++++----- tiramisu/value.py | 2 +- 21 files changed, 2820 insertions(+), 2296 deletions(-) diff --git a/tests/test_choice_option.py b/tests/test_choice_option.py index b521eb6..3069aa2 100644 --- a/tests/test_choice_option.py +++ b/tests/test_choice_option.py @@ -3,12 +3,12 @@ from py.test import raises from .autopath import do_autopath do_autopath() +from .config import config_type, get_config, value_list, global_owner from tiramisu.setting import owners from tiramisu import ChoiceOption, StrOption, OptionDescription, Config from tiramisu.error import ConfigError from tiramisu import undefined, Params, ParamValue, ParamOption -from tiramisu.api import TIRAMISU_VERSION from tiramisu.storage import list_sessions @@ -32,12 +32,13 @@ def return_error(*args, **kwargs): raise Exception('test') -def test_choiceoption(): +def test_choiceoption(config_type): choice = ChoiceOption('choice', '', values=('val1', 'val2')) odesc = OptionDescription('od', '', [choice]) cfg = Config(odesc) cfg.property.read_write() - owner = cfg.owner.get() + cfg = get_config(cfg, config_type) + owner = global_owner(cfg, config_type) assert cfg.option('choice').owner.get() == owners.default assert cfg.option('choice').owner.isdefault() # @@ -53,15 +54,16 @@ def test_choiceoption(): assert cfg.option('choice').owner.get() == owners.default assert cfg.option('choice').owner.isdefault() # - assert cfg.option('choice').value.list() == ('val1', 'val2') + assert value_list(cfg.option('choice').value.list()) == ('val1', 'val2') -def test_choiceoption_function(): +def test_choiceoption_function(config_type): choice = ChoiceOption('choice', '', values=return_list) odesc = OptionDescription('od', '', [choice]) cfg = Config(odesc) cfg.property.read_write() - owner = cfg.owner.get() + cfg = get_config(cfg, config_type) + owner = global_owner(cfg, config_type) assert cfg.option('choice').owner.isdefault() # cfg.option('choice').value.set('val1') @@ -73,7 +75,7 @@ def test_choiceoption_function(): raises(ValueError, "cfg.option('choice').value.set('no')") assert cfg.option('choice').owner.isdefault() # - assert cfg.option('choice').value.list() == ['val1', 'val2'] + assert value_list(cfg.option('choice').value.list()) == ('val1', 'val2') def test_choiceoption_function_error(): @@ -100,12 +102,13 @@ def test_choiceoption_function_error_kwargs(): raises(ConfigError, "cfg.option('choice').value.set('val1')") -def test_choiceoption_calc_function(): +def test_choiceoption_calc_function(config_type): choice = ChoiceOption('choice', "", values=return_calc_list, values_params=Params((ParamValue('val1'),))) odesc = OptionDescription('od', '', [choice]) cfg = Config(odesc) cfg.property.read_write() - owner = cfg.owner.get() + cfg = get_config(cfg, config_type) + owner = global_owner(cfg, config_type) assert cfg.option('choice').owner.isdefault() # cfg.option('choice').value.set('val1') @@ -118,7 +121,7 @@ def test_choiceoption_calc_function(): assert cfg.option('choice').owner.isdefault() -def test_choiceoption_calc_opt_function(): +def test_choiceoption_calc_opt_function(config_type): str_ = StrOption('str', '', 'val1') choice = ChoiceOption('choice', "", @@ -128,6 +131,7 @@ def test_choiceoption_calc_opt_function(): cfg = Config(odesc) cfg.property.read_write() owner = cfg.owner.get() + cfg = get_config(cfg, config_type) assert cfg.option('choice').owner.isdefault() # cfg.option('choice').value.set('val1') @@ -149,13 +153,13 @@ def test_choiceoption_calc_opt_function_propertyerror(): odesc = OptionDescription('od', '', [str_, choice]) cfg = Config(odesc) cfg.property.read_write() - if TIRAMISU_VERSION == 2: - raises(ValueError, "cfg.option('choice').value.set('no')") - else: - raises(ConfigError, "cfg.option('choice').value.set('no')") + raises(ConfigError, "cfg.option('choice').value.set('no')") +#def test_choiceoption_calc_opt_multi_function(config_type): def test_choiceoption_calc_opt_multi_function(): + # FIXME + config_type = 'tiramisu' str_ = StrOption('str', '', ['val1'], multi=True) choice = ChoiceOption('choice', "", @@ -173,6 +177,7 @@ def test_choiceoption_calc_opt_multi_function(): cfg = Config(odesc) cfg.property.read_write() owner = cfg.owner.get() + cfg = get_config(cfg, config_type, True) assert cfg.option('choice').owner.isdefault() assert cfg.option('choice').value.get() == [] # @@ -193,7 +198,7 @@ def test_choiceoption_calc_opt_multi_function(): raises(ValueError, "cfg.option('ch2').value.get()") -def test_choiceoption_calc_opt_multi_function_kwargs(): +def test_choiceoption_calc_opt_multi_function_kwargs(config_type): str_ = StrOption('str', '', ['val1'], multi=True) choice = ChoiceOption('choice', "", @@ -211,6 +216,7 @@ def test_choiceoption_calc_opt_multi_function_kwargs(): cfg = Config(odesc) cfg.property.read_write() owner = cfg.owner.get() + # FIXME cfg = get_config(cfg, config_type) assert cfg.option('choice').owner.isdefault() assert cfg.option('choice').value.get() == [] # diff --git a/tests/test_config.py b/tests/test_config.py index 76658a2..e495667 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -7,6 +7,7 @@ import weakref from .autopath import do_autopath do_autopath() +from .config import config_type, get_config, value_list, global_owner from tiramisu import Config from tiramisu.config import SubConfig @@ -44,13 +45,14 @@ def make_description(): return descr -def test_base_config(): +def test_base_config(config_type): """making a :class:`tiramisu.config.Config()` object and a :class:`tiramisu.option.OptionDescription()` object """ gcdummy = BoolOption('dummy', 'dummy', default=False) descr = OptionDescription('tiramisu', '', [gcdummy]) cfg = Config(descr) + cfg = get_config(cfg, config_type) assert cfg.option('dummy').value.get() is False #dmo = cfg.unwrap_from_path('dummy') #assert dmo.impl_getname() == 'dummy' @@ -87,9 +89,12 @@ def test_base_config_force_permissive(): def test_base_config_in_a_tree(): + # FIXME + config_type = 'tiramisu' "how options are organized into a tree, see :ref:`tree`" descr = make_description() config = Config(descr) + config = get_config(config, config_type) # config.option('bool').value.set(False) # @@ -216,11 +221,12 @@ def test_get_modified_values(): assert to_tuple(config.value.exportation()) == (('od.g5', 'od.g6'), (None, None), ('yes', tuple()), ('user', 'user')) -def test_get_modified_values_not_modif(): +def test_get_modified_values_not_modif(config_type): g1 = StrOption('g1', '', multi=True) d1 = OptionDescription('od', '', [g1]) root = OptionDescription('root', '', [d1]) config = Config(root) + config = get_config(config, config_type) assert config.option('od.g1').value.get() == [] value = config.option('od.g1').value.get() value.append('val') @@ -249,12 +255,13 @@ def test_cannot_assign_value_to_option_description(): raises(APIError, "cfg.option('gc').value.set(3)") -def test_config_multi(): +def test_config_multi(config_type): i1 = IntOption('test1', '', multi=True) i2 = IntOption('test2', '', multi=True, default_multi=1) i3 = IntOption('test3', '', default=[2], multi=True, default_multi=1) od = OptionDescription('test', '', [i1, i2, i3]) config = Config(od) + config = get_config(config, config_type) assert config.option('test1').value.get() == [] assert config.option('test2').value.get() == [] config.option('test2').value.set([undefined]) @@ -282,20 +289,24 @@ def test_prefix_error(): def test_no_validation(): + # FIXME + config_type = 'tiramisu' i1 = IntOption('test1', '') od = OptionDescription('test', '', [i1]) config = Config(od) config.property.read_write() - config.option('test1').value.set(1) - raises(ValueError, "config.option('test1').value.set('yes')") - assert config.option('test1').value.get() == 1 + cfg = get_config(config, config_type) + cfg.option('test1').value.set(1) + raises(ValueError, "cfg.option('test1').value.set('yes')") + assert cfg.option('test1').value.get() == 1 config.property.pop('validator') - config.option('test1').value.set('yes') - assert config.option('test1').value.get() == 'yes' - config.property.add('validator') - raises(ValueError, "config.option('test1').value.get()") - config.option('test1').value.reset() - assert config.option('test1').value.get() is None + cfg = get_config(config, config_type) + cfg.option('test1').value.set('yes') + assert cfg.option('test1').value.get() == 'yes' + cfg.property.add('validator') + raises(ValueError, "cfg.option('test1').value.get()") + cfg.option('test1').value.reset() + assert cfg.option('test1').value.get() is None def test_subconfig(): @@ -325,30 +336,33 @@ def test_config_invalidsession(): raises(ValueError, 'Config(o2, session_id=2)') -def test_config_od_name(): +def test_config_od_name(config_type): i = IntOption('i', '') s = SymLinkOption('s', i) o = OptionDescription('val', '', [i, s]) o2 = OptionDescription('val', '', [o]) c = Config(o2) + c = get_config(c, config_type) assert c.option('val.i').option.name() == 'i' assert c.option('val.s').option.name() == 's' assert c.option('val.s').option.name(follow_symlink=True) == 'i' -def test_config_od_type(): +def test_config_od_type(config_type): i = IntOption('i', '') o = OptionDescription('val', '', [i]) o2 = OptionDescription('val', '', [o]) c = Config(o2) + c = get_config(c, config_type) assert c.option('val.i').option.type() == 'integer' -def test_config_default(): +def test_config_default(config_type): i = IntOption('i', '', 8) o = OptionDescription('val', '', [i]) o2 = OptionDescription('val', '', [o]) c = Config(o2) + c = get_config(c, config_type) assert c.option('val.i').value.default() == 8 c.option('val.i').value.set(9) assert c.option('val.i').value.get() == 9 diff --git a/tests/test_config_api.py b/tests/test_config_api.py index 7d096d1..3b54734 100644 --- a/tests/test_config_api.py +++ b/tests/test_config_api.py @@ -3,6 +3,7 @@ from py.test import raises from .autopath import do_autopath do_autopath() +from .config import config_type, get_config, value_list, global_owner from tiramisu import Config, IntOption, FloatOption, StrOption, ChoiceOption, \ BoolOption, FilenameOption, UnicodeOption, SymLinkOption, IPOption, \ @@ -59,7 +60,7 @@ def test_str(): c # does not crash -def test_make_dict(): +def test_make_dict(config_type): "serialization of the whole config to a dict" descr = OptionDescription("opt", "", [ OptionDescription("s1", "", [ @@ -69,6 +70,7 @@ def test_make_dict(): config = Config(descr) config.property.read_write() config.permissive.set(frozenset(['hidden'])) + config = get_config(config, config_type) d = config.value.dict() assert d == {"s1.a": False, "int": 42} config.option('int').value.set(43) @@ -77,12 +79,14 @@ def test_make_dict(): assert d == {"s1.a": True, "int": 43} d2 = config.value.dict(flatten=True) assert d2 == {'a': True, 'int': 43} - raises(ValueError, 'd2 = config.value.dict(withvalue="3")') - d = config.forcepermissive.value.dict() - assert d == {"s1.a": True, "s1.b": False, "int": 43} + if config_type == 'tiramisu': + # FIXME + raises(ValueError, 'd2 = config.value.dict(withvalue="3")') + d = config.forcepermissive.value.dict() + assert d == {"s1.a": True, "s1.b": False, "int": 43} -def test_make_dict_with_disabled(): +def test_make_dict_with_disabled(config_type): descr = OptionDescription("opt", "", [ OptionDescription("s1", "", [ BoolOption("a", "", default=False), @@ -93,9 +97,11 @@ def test_make_dict_with_disabled(): IntOption("int", "", default=42)]) config = Config(descr) config.property.read_only() + config = get_config(config, config_type) assert config.value.dict() == {"s1.a": False, "int": 42} - assert config.forcepermissive.value.dict() == {"s1.a": False, "int": 42} - assert config.unrestraint.value.dict() == {"int": 42, "s1.a": False, "s1.b": False, "s2.a": False, "s2.b": False} + if config_type == 'tiramisu': + assert config.forcepermissive.value.dict() == {"s1.a": False, "int": 42} + assert config.unrestraint.value.dict() == {"int": 42, "s1.a": False, "s1.b": False, "s2.a": False, "s2.b": False} def test_make_dict_with_disabled_withoption(): @@ -114,7 +120,7 @@ def test_make_dict_with_disabled_withoption(): assert config.unrestraint.value.dict(withoption="a") == {"s1.a": False, "s1.b": False, "s2.a": False, "s2.b": False} -def test_make_dict_with_disabled_in_callback(): +def test_make_dict_with_disabled_in_callback(config_type): descr = OptionDescription("opt", "", [ OptionDescription("s1", "", [ BoolOption("a", "", default=False), @@ -125,11 +131,12 @@ def test_make_dict_with_disabled_in_callback(): IntOption("int", "", default=42)]) config = Config(descr) config.property.read_only() + config = get_config(config, config_type) d = config.value.dict() assert d == {"s1.a": False, "int": 42} -def test_make_dict_fullpath(): +def test_make_dict_fullpath(config_type): descr = OptionDescription("root", "", [ OptionDescription("opt", "", [ OptionDescription("s1", "", [ @@ -142,10 +149,15 @@ def test_make_dict_fullpath(): IntOption("introot", "", default=42)]) config = Config(descr) config.property.read_only() + config = get_config(config, config_type) assert config.value.dict() == {"opt.s1.a": False, "opt.int": 42, "introot": 42} - assert config.option('opt').value.dict() == {"s1.a": False, "int": 42} + if config_type == 'tiramisu': + # FIXME + assert config.option('opt').value.dict() == {"s1.a": False, "int": 42} assert config.value.dict(fullpath=True) == {"opt.s1.a": False, "opt.int": 42, "introot": 42} - assert config.option('opt').value.dict(fullpath=True) == {"opt.s1.a": False, "opt.int": 42} + if config_type == 'tiramisu': + # FIXME + assert config.option('opt').value.dict(fullpath=True) == {"opt.s1.a": False, "opt.int": 42} def test_find_in_config(): @@ -273,10 +285,11 @@ def test_does_not_find_in_config(): raises(AttributeError, "list(conf.option.find('IDontExist'))") -def test_filename(): +def test_filename(config_type): a = FilenameOption('a', '') o = OptionDescription('o', '', [a]) cfg = Config(o) + # FIXME cfg = get_config(cfg, config_type) cfg.option('a').value.set('/') cfg.option('a').value.set('/tmp') cfg.option('a').value.set('/tmp/') diff --git a/tests/test_config_domain.py b/tests/test_config_domain.py index d2e5d15..65a057d 100644 --- a/tests/test_config_domain.py +++ b/tests/test_config_domain.py @@ -1,5 +1,6 @@ from .autopath import do_autopath do_autopath() +from .config import config_type, get_config, value_list, global_owner import warnings, sys from py.test import raises @@ -14,7 +15,7 @@ def teardown_function(function): assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) -def test_domainname(): +def test_domainname(config_type): d = DomainnameOption('d', '') f = DomainnameOption('f', '', allow_without_dot=True) g = DomainnameOption('g', '', allow_ip=True) @@ -22,6 +23,7 @@ def test_domainname(): od = OptionDescription('a', '', [d, f, g, h]) cfg = Config(od) cfg.property.read_write() + cfg = get_config(cfg, config_type) # cfg.option('d').value.set('toto.com') raises(ValueError, "cfg.option('d').value.set('toto')") @@ -40,7 +42,9 @@ def test_domainname(): cfg.option('f').value.set('d') cfg.option('f').value.set('d.t') # - raises(ValueError, "cfg.option('f').value.set('192.168.1.1')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('f').value.set('192.168.1.1')") raises(ValueError, "cfg.option('f').value.set('192.168.1.0/24')") # cfg.option('g').value.set('toto.com') @@ -49,35 +53,42 @@ def test_domainname(): raises(ValueError, "cfg.option('g').value.set('192.168.1.0/24')") # cfg.option('h').value.set('toto.com') - raises(ValueError, "cfg.option('h').value.set('192.168.1.0')") - raises(ValueError, "cfg.option('h').value.set('192.168.1.29')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('h').value.set('192.168.1.0')") + raises(ValueError, "cfg.option('h').value.set('192.168.1.29')") cfg.option('h').value.set('192.168.1.0/24') -def test_domainname_upper(): +def test_domainname_upper(config_type): d = DomainnameOption('d', '') od = OptionDescription('a', '', [d]) cfg = Config(od) cfg.property.read_write() + cfg = get_config(cfg, config_type) cfg.option('d').value.set('toto.com') msg = _('some characters are uppercase') has_error = False try: cfg.option('d').value.set('TOTO.COM') except ValueError as err: - assert msg in str(err) + if config_type != 'tiramisu-api': + # FIXME + assert msg in str(err) has_error = True assert has_error is True has_error = False try: cfg.option('d').value.set('toTo.com') except ValueError as err: - assert msg in str(err) + if config_type != 'tiramisu-api': + # FIXME + assert msg in str(err) has_error = True assert has_error is True -def test_domainname_warning(): +def test_domainname_warning(config_type): d = DomainnameOption('d', '', warnings_only=True) f = DomainnameOption('f', '', allow_without_dot=True, warnings_only=True) g = DomainnameOption('g', '', allow_ip=True, warnings_only=True) @@ -85,12 +96,15 @@ def test_domainname_warning(): warnings.simplefilter("always", ValueWarning) cfg = Config(od) cfg.property.read_write() + cfg = get_config(cfg, config_type) cfg.option('d').value.set('toto.com') raises(ValueError, "cfg.option('d').value.set('toto')") cfg.option('d').value.set('toto3.com') - with warnings.catch_warnings(record=True) as w: - cfg.option('d').value.set('toto_super.com') - assert len(w) == 1 + if config_type != 'tiramisu-api': + # FIXME + with warnings.catch_warnings(record=True) as w: + cfg.option('d').value.set('toto_super.com') + assert len(w) == 1 with warnings.catch_warnings(record=True) as w: cfg.option('d').value.set('toto-.com') assert len(w) == 0 @@ -102,17 +116,21 @@ def test_domainname_warning(): raises(ValueError, "cfg.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamean')") cfg.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nd') cfg.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainnamea.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnameto.olongthathavemorethanmaximumsizeforatruedomainnameanditsnoteas.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowie') - raises(ValueError, "cfg.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainname.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnamet.olongthathavemorethanmaximumsizeforatruedomainnameanditsnotea.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowie.xxxx')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('f').value.set('domainnametoolongthathavemorethanmaximumsizeforatruedomainname.nditsnoteasytogeneratesolongdomainnamewithoutrepeatdomainnamet.olongthathavemorethanmaximumsizeforatruedomainnameanditsnotea.ytogeneratesolongdomainnamewithoutrepeatbutimnotabletodoitnowie.xxxx')") cfg.option('f').value.set('d') cfg.option('f').value.set('d.t') # - raises(ValueError, "cfg.option('f').value.set('192.168.1.1')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('f').value.set('192.168.1.1')") cfg.option('g').value.set('toto.com') cfg.option('g').value.set('192.168.1.0') cfg.option('g').value.set('192.168.1.29') -def test_special_domain_name(): +def test_special_domain_name(config_type): """domain name option that starts with a number or not """ d = DomainnameOption('d', '') @@ -120,39 +138,43 @@ def test_special_domain_name(): od = OptionDescription('a', '', [d, e]) cfg = Config(od) cfg.property.read_write() + cfg = get_config(cfg, config_type) cfg.option('d').value.set('1toto.com') cfg.option('d').value.set('123toto.com') cfg.option('e').value.set('toto') cfg.option('e').value.set('1toto') -def test_domainname_netbios(): +def test_domainname_netbios(config_type): d = DomainnameOption('d', '', type_='netbios') e = DomainnameOption('e', '', "toto", type_='netbios') od = OptionDescription('a', '', [d, e]) cfg = Config(od) cfg.property.read_write() + cfg = get_config(cfg, config_type) raises(ValueError, "cfg.option('d').value.set('toto.com')") cfg.option('d').value.set('toto') raises(ValueError, "cfg.option('d').value.set('domainnametoolong')") -def test_domainname_hostname(): +def test_domainname_hostname(config_type): d = DomainnameOption('d', '', type_='hostname') e = DomainnameOption('e', '', "toto", type_='hostname') od = OptionDescription('a', '', [d, e]) cfg = Config(od) cfg.property.read_write() + cfg = get_config(cfg, config_type) raises(ValueError, "cfg.option('d').value.set('toto.com')") cfg.option('d').value.set('toto') cfg.option('d').value.set('domainnametoolong') -def test_email(): +def test_email(config_type): e = EmailOption('e', '') od = OptionDescription('a', '', [e]) cfg = Config(od) cfg.property.read_write() + cfg = get_config(cfg, config_type) cfg.option('e').value.set('foo-bar.baz@example.com') cfg.option('e').value.set('root@foo.com') cfg.option('e').value.set('root@domain') @@ -161,25 +183,34 @@ def test_email(): raises(ValueError, "cfg.option('e').value.set('root[]@domain')") -def test_url(): +def test_url(config_type): u = URLOption('u', '') od = OptionDescription('a', '', [u]) cfg = Config(od) cfg.property.read_write() + cfg = get_config(cfg, config_type) cfg.option('u').value.set('http://foo.com') cfg.option('u').value.set('https://foo.com') cfg.option('u').value.set('https://foo.com/') raises(ValueError, "cfg.option('u').value.set(1)") - raises(ValueError, "cfg.option('u').value.set('ftp://foo.com')") - raises(ValueError, "cfg.option('u').value.set('foo.com')") - raises(ValueError, "cfg.option('u').value.set(':/foo.com')") - raises(ValueError, "cfg.option('u').value.set('foo.com/http://')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('u').value.set('ftp://foo.com')") + raises(ValueError, "cfg.option('u').value.set('foo.com')") + raises(ValueError, "cfg.option('u').value.set(':/foo.com')") + raises(ValueError, "cfg.option('u').value.set('foo.com/http://')") cfg.option('u').value.set('https://foo.com/index.html') cfg.option('u').value.set('https://foo.com/index.html?var=value&var2=val2') - raises(ValueError, "cfg.option('u').value.set('https://foo.com/index\\n.html')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('u').value.set('https://foo.com/index\\n.html')") cfg.option('u').value.set('https://foo.com:8443') cfg.option('u').value.set('https://foo.com:8443/') cfg.option('u').value.set('https://foo.com:8443/index.html') - raises(ValueError, "cfg.option('u').value.set('https://foo.com:84438989')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('u').value.set('https://foo.com:84438989')") cfg.option('u').value.set('https://foo.com:8443/INDEX') - raises(ValueError, "cfg.option('u').value.set('https://FOO.COM:8443')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('u').value.set('https://FOO.COM:8443')") diff --git a/tests/test_config_ip.py b/tests/test_config_ip.py index 368d2eb..c88dbb6 100644 --- a/tests/test_config_ip.py +++ b/tests/test_config_ip.py @@ -1,5 +1,6 @@ from .autopath import do_autopath do_autopath() +from .config import config_type, get_config, value_list, global_owner import warnings from py.test import raises @@ -13,29 +14,38 @@ def teardown_function(function): assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) -def test_ip(): +def test_ip(config_type): a = IPOption('a', '') b = IPOption('b', '', private_only=True) d = IPOption('d', '', warnings_only=True, private_only=True) warnings.simplefilter("always", ValueWarning) od = OptionDescription('od', '', [a, b, d]) config = Config(od) + config = get_config(config, config_type) config.option('a').value.set('192.168.1.1') config.option('a').value.set('192.168.1.0') config.option('a').value.set('88.88.88.88') config.option('a').value.set('0.0.0.0') - raises(ValueError, "config.option('a').value.set('255.255.255.0')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "config.option('a').value.set('255.255.255.0')") config.option('b').value.set('192.168.1.1') config.option('b').value.set('192.168.1.0') - raises(ValueError, "config.option('b').value.set('88.88.88.88')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "config.option('b').value.set('88.88.88.88')") config.option('b').value.set('0.0.0.0') - raises(ValueError, "config.option('b').value.set('255.255.255.0')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "config.option('b').value.set('255.255.255.0')") raises(ValueError, "config.option('a').value.set('333.0.1.20')") - raises(ValueError, "IPOption('a', 'ip', default='192.000.023.01')") - with warnings.catch_warnings(record=True) as w: - config.option('d').value.set('88.88.88.88') - assert len(w) == 1 + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "IPOption('a', 'ip', default='192.000.023.01')") + with warnings.catch_warnings(record=True) as w: + config.option('d').value.set('88.88.88.88') + assert len(w) == 1 def test_ip_cidr(): @@ -60,44 +70,55 @@ def test_ip_default(): c.option('a').value.get() == '88.88.88.88' -def test_ip_reserved(): +def test_ip_reserved(config_type): a = IPOption('a', '') b = IPOption('b', '', allow_reserved=True) c = IPOption('c', '', warnings_only=True) od = OptionDescription('od', '', [a, b, c]) warnings.simplefilter("always", ValueWarning) cfg = Config(od) - raises(ValueError, "cfg.option('a').value.set('240.94.1.1')") + cfg = get_config(cfg, config_type) + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('a').value.set('240.94.1.1')") cfg.option('b').value.set('240.94.1.1') - with warnings.catch_warnings(record=True) as w: - cfg.option('c').value.set('240.94.1.1') - assert len(w) == 1 + if config_type != 'tiramisu-api': + # FIXME + with warnings.catch_warnings(record=True) as w: + cfg.option('c').value.set('240.94.1.1') + assert len(w) == 1 -def test_network(): +def test_network(config_type): a = NetworkOption('a', '') b = NetworkOption('b', '', warnings_only=True) od = OptionDescription('od', '', [a, b]) warnings.simplefilter("always", ValueWarning) cfg = Config(od) + cfg = get_config(cfg, config_type) cfg.option('a').value.set('192.168.1.1') cfg.option('a').value.set('192.168.1.0') cfg.option('a').value.set('88.88.88.88') cfg.option('a').value.set('0.0.0.0') raises(ValueError, "cfg.option('a').value.set(1)") raises(ValueError, "cfg.option('a').value.set('1.1.1.1.1')") - raises(ValueError, "cfg.option('a').value.set('255.255.255.0')") - raises(ValueError, "cfg.option('a').value.set('192.168.001.0')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('a').value.set('255.255.255.0')") + raises(ValueError, "cfg.option('a').value.set('192.168.001.0')") raises(ValueError, "cfg.option('a').value.set('333.168.1.1')") - with warnings.catch_warnings(record=True) as w: - cfg.option('b').value.set('255.255.255.0') - assert len(w) == 1 + if config_type != 'tiramisu-api': + # FIXME + with warnings.catch_warnings(record=True) as w: + cfg.option('b').value.set('255.255.255.0') + assert len(w) == 1 -def test_network_cidr(): +def test_network_cidr(config_type): a = NetworkOption('a', '', cidr=True) od = OptionDescription('od', '', [a]) cfg = Config(od) + # FIXME cfg = get_config(cfg, config_type) cfg.option('a').value.set('192.168.1.1/32') cfg.option('a').value.set('192.168.1.0/24') cfg.option('a').value.set('88.88.88.88/32') @@ -111,24 +132,28 @@ def test_network_invalid(): raises(ValueError, "NetworkOption('a', '', default='toto')") -def test_netmask(): +def test_netmask(config_type): a = NetmaskOption('a', '') od = OptionDescription('od', '', [a]) cfg = Config(od) + cfg = get_config(cfg, config_type) raises(ValueError, "cfg.option('a').value.set('192.168.1.1.1')") - raises(ValueError, "cfg.option('a').value.set('192.168.1.1')") - raises(ValueError, "cfg.option('a').value.set('192.168.1.0')") - raises(ValueError, "cfg.option('a').value.set('88.88.88.88')") - raises(ValueError, "cfg.option('a').value.set('255.255.255.000')") + if config_type != 'tiramisu-api': + # FIXME + raises(ValueError, "cfg.option('a').value.set('192.168.1.1')") + raises(ValueError, "cfg.option('a').value.set('192.168.1.0')") + raises(ValueError, "cfg.option('a').value.set('88.88.88.88')") + raises(ValueError, "cfg.option('a').value.set('255.255.255.000')") raises(ValueError, "cfg.option('a').value.set(2)") cfg.option('a').value.set('0.0.0.0') cfg.option('a').value.set('255.255.255.0') -def test_broadcast(): +def test_broadcast(config_type): a = BroadcastOption('a', '') od = OptionDescription('od', '', [a]) cfg = Config(od) + # FIXME cfg = get_config(cfg, config_type) raises(ValueError, "cfg.option('a').value.set('192.168.1.255.1')") raises(ValueError, "cfg.option('a').value.set('192.168.001.255')") raises(ValueError, "cfg.option('a').value.set('192.168.0.300')") @@ -139,7 +164,7 @@ def test_broadcast(): cfg.option('a').value.set('255.255.255.0') -def test_port(): +def test_port(config_type): a = PortOption('a', '') b = PortOption('b', '', allow_zero=True) c = PortOption('c', '', allow_zero=True, allow_registred=False) @@ -148,6 +173,7 @@ def test_port(): f = PortOption('f', '', allow_private=True) od = OptionDescription('od', '', [a, b, c, d, e, f]) cfg = Config(od) + # FIXME cfg = get_config(cfg, config_type) raises(ValueError, "cfg.option('a').value.set('0')") cfg.option('a').value.set('1') cfg.option('a').value.set('1023') @@ -202,7 +228,7 @@ def test_port(): raises(ValueError, "cfg.option('f').value.set('65536')") -def test_port_range(): +def test_port_range(config_type): a = PortOption('a', '', allow_range=True) b = PortOption('b', '', allow_range=True, allow_zero=True) c = PortOption('c', '', allow_range=True, allow_zero=True, allow_registred=False) @@ -211,6 +237,7 @@ def test_port_range(): f = PortOption('f', '', allow_range=True, allow_private=True) od = OptionDescription('od', '', [a, b, c, d, e, f]) cfg = Config(od) + # FIXME cfg = get_config(cfg, config_type) raises(ValueError, "cfg.option('a').value.set('0')") cfg.option('a').value.set('1') cfg.option('a').value.set('1023') diff --git a/tests/test_leadership.py b/tests/test_leadership.py index 2ca7776..accc836 100644 --- a/tests/test_leadership.py +++ b/tests/test_leadership.py @@ -1,6 +1,7 @@ # coding: utf-8 from .autopath import do_autopath do_autopath() +from .config import config_type, get_config, value_list, global_owner from py.test import raises from tiramisu.setting import groups, owners @@ -61,30 +62,34 @@ def make_description(): return descr -def test_base_config(): +def test_base_config(config_type): descr = make_description() - api = Config(descr) - api.property.read_write() - assert api.option('creole.general.activer_proxy_client').value.get() is False - assert api.option('creole.general.nom_machine').value.get() == "eoleng" - assert api.option.find('nom_machine', first=True).value.get() == "eoleng" + cfg = Config(descr) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('creole.general.activer_proxy_client').value.get() is False + assert cfg.option('creole.general.nom_machine').value.get() == "eoleng" + if config_type != 'tiramisu-api': + assert cfg.option.find('nom_machine', first=True).value.get() == "eoleng" result = {'general.numero_etab': None, 'general.nombre_interfaces': 1, 'general.serveur_ntp': [], 'interface1.ip_admin_eth0.ip_admin_eth0': None, 'general.mode_conteneur_actif': False, 'general.time_zone': 'Paris', 'interface1.ip_admin_eth0.netmask_admin_eth0': None, 'general.nom_machine': 'eoleng', 'general.activer_proxy_client': False} - assert api.option('creole').value.dict() == result + assert cfg.option('creole').value.dict() == result result = {'serveur_ntp': [], 'mode_conteneur_actif': False, 'ip_admin_eth0': None, 'time_zone': 'Paris', 'numero_etab': None, 'netmask_admin_eth0': None, 'nom_machine': 'eoleng', 'activer_proxy_client': False, 'nombre_interfaces': 1} - assert api.option('creole').value.dict(flatten=True) == result + assert cfg.option('creole').value.dict(flatten=True) == result + if config_type == 'tiramisu-api': + cfg.send() def test_make_dict_filter(): descr = make_description() - api = Config(descr) - api.property.read_write() + cfg = Config(descr) + cfg.property.read_write() subresult = {'numero_etab': None, 'nombre_interfaces': 1, 'serveur_ntp': [], 'mode_conteneur_actif': False, 'time_zone': 'Paris', 'nom_machine': 'eoleng', @@ -92,17 +97,17 @@ def test_make_dict_filter(): result = {} for key, value in subresult.items(): result['general.' + key] = value - assert api.option('creole').value.dict(withoption='numero_etab') == result - raises(AttributeError, "api.option('creole').value.dict(withoption='numero_etab', withvalue='toto')") - assert api.option('creole').value.dict(withoption='numero_etab', withvalue=None) == result - assert api.option('creole.general').value.dict(withoption='numero_etab') == subresult + assert cfg.option('creole').value.dict(withoption='numero_etab') == result + raises(AttributeError, "cfg.option('creole').value.dict(withoption='numero_etab', withvalue='toto')") + assert cfg.option('creole').value.dict(withoption='numero_etab', withvalue=None) == result + assert cfg.option('creole.general').value.dict(withoption='numero_etab') == subresult def test_get_group_type(): descr = make_description() - api = Config(descr) - api.property.read_write() - grp = api.option('creole.general') + cfg = Config(descr) + cfg.property.read_write() + grp = cfg.option('creole.general') assert grp.group_type() == groups.family assert grp.group_type() == 'family' assert isinstance(grp.group_type(), groups.GroupType) @@ -110,55 +115,55 @@ def test_get_group_type(): def test_iter_on_groups(): descr = make_description() - api = Config(descr) - api.property.read_write() - result = api.option('creole').list('optiondescription', + cfg = Config(descr) + cfg.property.read_write() + result = cfg.option('creole').list('optiondescription', group_type=groups.family) group_names = [res.option.name() for res in result] assert group_names == ['general', 'interface1'] - for i in api.option('creole').list('optiondescription', + for i in cfg.option('creole').list('optiondescription', group_type=groups.family): #test StopIteration break - result = api.option('creole').list('option', + result = cfg.option('creole').list('option', group_type=groups.family) assert list(result) == [] - result = api.option('creole.general').list('optiondescription', + result = cfg.option('creole.general').list('optiondescription', group_type=groups.family) assert list(result) == [] def test_list_recursive(): descr = make_description() - api = Config(descr) - api.property.read_write() - result = api.option('creole').list('all') + cfg = Config(descr) + cfg.property.read_write() + result = cfg.option('creole').list('all') group_names = [res.option.name() for res in result] assert group_names == ['general', 'interface1'] # - result = api.option.list(recursive=True) + result = cfg.option.list(recursive=True) group_names = [res.option.name() for res in result] assert group_names == ['numero_etab', 'nom_machine', 'nombre_interfaces', 'activer_proxy_client', 'mode_conteneur_actif', 'serveur_ntp', 'time_zone', 'ip_admin_eth0', 'netmask_admin_eth0'] - result = list(api.option.list(recursive=True, type='optiondescription')) + result = list(cfg.option.list(recursive=True, type='optiondescription')) group_names = [res.option.name() for res in result] assert group_names == ['general', 'ip_admin_eth0', 'interface1', 'creole'] def test_iter_on_groups_force_permissive(): descr = make_description() - api = Config(descr) - api.property.read_write() - api.permissive.set(frozenset(['hidden'])) - result = api.forcepermissive.option('creole.general').list() + cfg = Config(descr) + cfg.property.read_write() + cfg.permissive.set(frozenset(['hidden'])) + result = cfg.forcepermissive.option('creole.general').list() group_names = [res.option.name() for res in result] ass = ['numero_etab', 'nom_machine', 'nombre_interfaces', 'activer_proxy_client', 'mode_conteneur_actif', 'mode_conteneur_actif2', 'serveur_ntp', 'time_zone'] assert group_names == ass # mode_conteneur_actif2 is not visible is not forcepermissive - result = api.option('creole.general').list() + result = cfg.option('creole.general').list() group_names = [res.option.name() for res in result] ass.remove('mode_conteneur_actif2') assert group_names == ass @@ -166,10 +171,10 @@ def test_iter_on_groups_force_permissive(): def test_iter_group_on_groups_force_permissive(): descr = make_description() - api = Config(descr) - api.property.read_write() - api.permissive.set(frozenset(['hidden'])) - result = api.forcepermissive.option('creole').list(type='optiondescription', + cfg = Config(descr) + cfg.property.read_write() + cfg.permissive.set(frozenset(['hidden'])) + result = cfg.forcepermissive.option('creole').list(type='optiondescription', group_type=groups.family) group_names = [res.option.name() for res in result] assert group_names == ['general', 'interface1', 'new'] @@ -177,27 +182,27 @@ def test_iter_group_on_groups_force_permissive(): def test_iter_on_groups_props(): descr = make_description() - api = Config(descr) - api.property.read_write() - api.option('creole.interface1').property.add('disabled') - result = api.option('creole').list(type='optiondescription', + cfg = Config(descr) + cfg.property.read_write() + cfg.option('creole.interface1').property.add('disabled') + result = cfg.option('creole').list(type='optiondescription', group_type=groups.family) group_names = [res.option.name() for res in result] assert group_names == ['general'] def test_iter_on_empty_group(): - api = Config(OptionDescription("name", "descr", [])) - api.property.read_write() - result = list(api.option.list(type='optiondescription')) + cfg = Config(OptionDescription("name", "descr", [])) + cfg.property.read_write() + result = list(cfg.option.list(type='optiondescription')) assert result == [] def test_iter_not_group(): - api = Config(OptionDescription("name", "descr", [])) - api.property.read_write() + cfg = Config(OptionDescription("name", "descr", [])) + cfg.property.read_write() try: - list(api.option.list(type='optiondescription', group_type='family')) + list(cfg.option.list(type='optiondescription', group_type='family')) except AssertionError: pass else: @@ -211,28 +216,31 @@ def test_groups_with_leader(): assert interface1.impl_get_group_type() == groups.leadership -def test_groups_is_leader(): +def test_groups_is_leader(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, default_multi='value') interface1 = Leadership('leadership', '', [ip_admin_eth0, netmask_admin_eth0]) var = StrOption('var', "ip réseau autorisé", multi=True) od2 = OptionDescription('od2', '', [var]) od1 = OptionDescription('od', '', [interface1, od2]) - api = Config(od1) - assert not api.option('od2').option.isleadership() - assert api.option('leadership').option.isleadership() - assert not api.option('od2.var').option.isleader() - assert not api.option('od2.var').option.isfollower() - assert api.option('leadership.ip_admin_eth0').option.ismulti() - assert api.option('leadership.netmask_admin_eth0').option.ismulti() - assert not api.option('leadership.ip_admin_eth0').option.issubmulti() - assert not api.option('leadership.netmask_admin_eth0').option.issubmulti() - assert api.option('leadership.ip_admin_eth0').option.isleader() - assert not api.option('leadership.ip_admin_eth0').option.isfollower() - assert not api.option('leadership.netmask_admin_eth0').option.isleader() - assert api.option('leadership.netmask_admin_eth0').option.isfollower() - assert api.option('leadership.netmask_admin_eth0').option.path() == 'leadership.netmask_admin_eth0' - assert api.option('leadership.netmask_admin_eth0').option.defaultmulti() == 'value' + cfg = Config(od1) + cfg = get_config(cfg, config_type) + assert not cfg.option('od2').option.isleadership() + assert cfg.option('leadership').option.isleadership() + assert not cfg.option('od2.var').option.isleader() + assert not cfg.option('od2.var').option.isfollower() + assert cfg.option('leadership.ip_admin_eth0').option.ismulti() + assert cfg.option('leadership.netmask_admin_eth0').option.ismulti() + assert not cfg.option('leadership.ip_admin_eth0').option.issubmulti() + assert not cfg.option('leadership.netmask_admin_eth0').option.issubmulti() + assert cfg.option('leadership.ip_admin_eth0').option.isleader() + assert not cfg.option('leadership.ip_admin_eth0').option.isfollower() + assert not cfg.option('leadership.netmask_admin_eth0').option.isleader() + assert cfg.option('leadership.netmask_admin_eth0').option.isfollower() + assert cfg.option('leadership.netmask_admin_eth0').option.path() == 'leadership.netmask_admin_eth0' + assert cfg.option('leadership.netmask_admin_eth0').option.defaultmulti() == 'value' + if config_type == 'tiramisu-api': + cfg.send() def test_groups_with_leader_in_root(): @@ -252,57 +260,70 @@ def test_groups_with_leader_in_config(): assert interface1.impl_get_group_type() == groups.leadership -def test_groups_with_leader_make_dict(): +def test_groups_with_leader_make_dict(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) od = OptionDescription('root', '', [interface1]) - api = Config(od) - assert api.value.dict() == {'ip_admin_eth0.ip_admin_eth0': [], 'ip_admin_eth0.netmask_admin_eth0': []} - assert api.option('ip_admin_eth0.ip_admin_eth0').value.len() == 0 - assert api.option('ip_admin_eth0.netmask_admin_eth0').value.len() == 0 - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip1', 'ip2']) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.len() == 2 - assert api.option('ip_admin_eth0.netmask_admin_eth0').value.len() == 2 - assert api.value.dict() == {'ip_admin_eth0.ip_admin_eth0': ['ip1', 'ip2'], 'ip_admin_eth0.netmask_admin_eth0': [None, None]} + cfg = Config(od) + cfg = get_config(cfg, config_type) + assert cfg.value.dict() == {'ip_admin_eth0.ip_admin_eth0': [], 'ip_admin_eth0.netmask_admin_eth0': []} + if config_type != 'tiramisu-api': + # FIXME useful? already in leadership + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.len() == 0 + assert cfg.option('ip_admin_eth0.netmask_admin_eth0').value.len() == 0 + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip1', 'ip2']) + if config_type != 'tiramisu-api': + # FIXME + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.len() == 2 + assert cfg.option('ip_admin_eth0.netmask_admin_eth0').value.len() == 2 + assert cfg.value.dict() == {'ip_admin_eth0.ip_admin_eth0': ['ip1', 'ip2'], 'ip_admin_eth0.netmask_admin_eth0': [None, None]} + if config_type == 'tiramisu-api': + cfg.send() -def test_groups_with_leader_default_value(): +def test_groups_with_leader_default_value(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) od = OptionDescription('root', '', [interface1]) - api = Config(od) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] - assert api.option('ip_admin_eth0.ip_admin_eth0').value.default() == [] - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip1', 'ip2']) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip1', 'ip2'] - assert api.option('ip_admin_eth0.ip_admin_eth0').value.default() == [] + cfg = Config(od) + cfg = get_config(cfg, config_type) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.default() == [] + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip1', 'ip2']) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip1', 'ip2'] + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.default() == [] + if config_type == 'tiramisu-api': + cfg.send() -def test_groups_with_leader_default_value_2(): +def test_groups_with_leader_default_value_2(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", ['ip1', 'ip2'], multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", default_multi='netmask1', multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) od = OptionDescription('root', '', [interface1]) - api = Config(od) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip1', 'ip2'] - assert api.option('ip_admin_eth0.ip_admin_eth0').value.default() == ['ip1', 'ip2'] - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip3', 'ip4']) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip3', 'ip4'] - assert api.option('ip_admin_eth0.ip_admin_eth0').value.default() == ['ip1', 'ip2'] + cfg = Config(od) + cfg = get_config(cfg, config_type) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip1', 'ip2'] + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.default() == ['ip1', 'ip2'] + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip3', 'ip4']) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip3', 'ip4'] + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.default() == ['ip1', 'ip2'] # - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == 'netmask1' - assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == 'netmask1' - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.default() == 'netmask1' - assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.default() == 'netmask1' - assert api.option('ip_admin_eth0.netmask_admin_eth0').value.default() == ['netmask1', 'netmask1'] - api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('netmask2') - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == 'netmask1' - assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == 'netmask2' - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.default() == 'netmask1' - assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.default() == 'netmask1' - assert api.option('ip_admin_eth0.netmask_admin_eth0').value.default() == ['netmask1', 'netmask1'] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == 'netmask1' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == 'netmask1' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.default() == 'netmask1' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.default() == 'netmask1' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0').value.default() == ['netmask1', 'netmask1'] + cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('netmask2') + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == 'netmask1' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == 'netmask2' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.default() == 'netmask1' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.default() == 'netmask1' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0').value.default() == ['netmask1', 'netmask1'] + if config_type == 'tiramisu-api': + cfg.send() def test_groups_with_leader_hidden_in_config(): @@ -310,14 +331,14 @@ def test_groups_with_leader_hidden_in_config(): netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',)) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) od = OptionDescription('root', '', [interface1]) - api = Config(od) - api.property.read_write() - api.permissive.set(frozenset(['hidden'])) - assert api.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] - api.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) - assert api.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None - raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.get()") - raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") + cfg = Config(od) + cfg.property.read_write() + cfg.permissive.set(frozenset(['hidden'])) + assert cfg.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert cfg.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.ip_admin_eth0').value.get()") + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") def test_groups_with_leader_hidden_in_config2(): @@ -325,53 +346,67 @@ def test_groups_with_leader_hidden_in_config2(): netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True, properties=('hidden',)) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) od = OptionDescription('root', '', [interface1]) - api = Config(od) - api.property.read_write() - api.permissive.set(frozenset(['hidden'])) - assert api.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] - api.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) - raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - assert api.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg = Config(od) + cfg.property.read_write() + cfg.permissive.set(frozenset(['hidden'])) + assert cfg.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert cfg.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] #del - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) - api.property.pop('hidden') - assert api.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None - api.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') - assert api.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' - api.property.add('hidden') - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) - api.property.pop('hidden') - assert api.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + cfg.property.pop('hidden') + assert cfg.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None + cfg.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + assert cfg.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' + cfg.property.add('hidden') + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + cfg.property.pop('hidden') + assert cfg.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None -def test_groups_with_leader_reset_empty(): +def test_groups_with_leader_reset_empty(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) od_ = OptionDescription('root', '', [interface1]) - api = Config(od_) - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - raises(LeadershipError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset()") - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset() + cfg = Config(od_) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + if config_type != 'tiramisu-api': + raises(LeadershipError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset()") + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset() + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + if config_type == 'tiramisu-api': + cfg.send() -def test_groups_with_leader_reset_out_of_range(): +def test_groups_with_leader_reset_out_of_range(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) od_ = OptionDescription('root', '', [interface1]) - api = Config(od_) - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) - api.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset() - raises(LeadershipError, "api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.reset()") - raises(IndexError, "api.option('ip_admin_eth0.ip_admin_eth0').value.pop(1)") + cfg_ori = Config(od_) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + cfg = get_config(cfg_ori, config_type) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset() + if config_type != 'tiramisu-api': + # FIXME + raises(LeadershipError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.reset()") + raises(IndexError, "cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(1)") + if config_type == 'tiramisu-api': + cfg.send() def test_groups_with_leader_hidden_in_config3(): @@ -380,14 +415,14 @@ def test_groups_with_leader_hidden_in_config3(): netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) od = OptionDescription('root', '', [interface1]) - api = Config(od) - api.property.read_write() - api.permissive.set(frozenset(['hidden'])) - assert api.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] - api.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) - assert api.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None - raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.get()") - raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") + cfg = Config(od) + cfg.property.read_write() + cfg.permissive.set(frozenset(['hidden'])) + assert cfg.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg.forcepermissive.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert cfg.forcepermissive.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.ip_admin_eth0').value.get()") + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") def test_allowed_groups(): @@ -398,20 +433,26 @@ def test_allowed_groups(): raises(ValueError, "interface1.impl_set_group_type('toto')") -def test_values_with_leader_disabled_leader(): +def test_values_with_leader_disabled_leader(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145']) - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145']) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set("192.168.230.145") - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset() - api.option('ip_admin_eth0.ip_admin_eth0').property.add('disabled') - raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('192.168.230.145')") + cfg_ori = Config(maconfig) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145']) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145']) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set("192.168.230.145") + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset() + cfg_ori.option('ip_admin_eth0.ip_admin_eth0').property.add('disabled') + cfg = get_config(cfg_ori, config_type) + if config_type != 'tiramisu-api': + # FIXME + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('192.168.230.145')") + if config_type == 'tiramisu-api': + cfg.send() def test_sub_group_in_leader_group(): @@ -428,48 +469,54 @@ def test_group_always_has_multis(): #____________________________________________________________ -def test_values_with_leader_and_followers(): +def test_values_with_leader_and_followers(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - owner = api.owner.get() + cfg = Config(maconfig) + cfg.property.read_write() + owner = global_owner(cfg, config_type) + cfg = get_config(cfg, config_type) assert interface1.impl_get_group_type() == groups.leadership - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() # - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ["192.168.230.145"] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145", "192.168.230.147"]) - raises(APIError, "api.option('ip_admin_eth0.netmask_admin_eth0').value.set([None])") - raises(APIError, "api.option('ip_admin_eth0.netmask_admin_eth0').value.pop(0)") + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ["192.168.230.145"] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() is None + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145", "192.168.230.147"]) + if config_type != 'tiramisu-api': + # FIXME + raises(APIError, "cfg.option('ip_admin_eth0.netmask_admin_eth0').value.set([None])") + raises(APIError, "cfg.option('ip_admin_eth0.netmask_admin_eth0').value.pop(0)") + if config_type == 'tiramisu-api': + cfg.send() -def test_reset_values_with_leader_and_followers(): +def test_reset_values_with_leader_and_followers(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - owner = api.owner.get() + cfg = Config(maconfig) + cfg.property.read_write() + owner = global_owner(cfg, config_type) + cfg = Config(maconfig) assert interface1.impl_get_group_type() == groups.leadership - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] #reset - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] def test_reset_values_with_leader_and_followers_default_value(): @@ -478,113 +525,129 @@ def test_reset_values_with_leader_and_followers_default_value(): raises(ValueError, "Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])") -def test_reset_values_with_leader_and_followers_default(): +def test_reset_values_with_leader_and_followers_default(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True, default=['192.168.230.145']) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - owner = api.owner.get() - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + cfg = Config(maconfig) + cfg.property.read_write() + owner = global_owner(cfg, config_type) + cfg = get_config(cfg, config_type) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.146']) - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.145'] - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set(None) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.146']) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.145'] + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set(None) - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.146']) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owner - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.default - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.145'] - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set(None) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.146']) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owner + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owners.default + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.145'] + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set(None) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owner - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.145'] - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set(None) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == owner + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.145'] + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set(None) + if config_type == 'tiramisu-api': + cfg.send() -def test_values_with_leader_and_followers_follower(): +def test_values_with_leader_and_followers_follower(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - raises(LeadershipError, - "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0')") - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145']) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset() - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + if config_type != 'tiramisu-api': + raises(LeadershipError, + "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0')") + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145']) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.reset() + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') # - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145', '192.168.230.145']) - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' - assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() is None - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') - api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.255.0') - raises(APIError, "api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.pop(1)") + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145', '192.168.230.145']) + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() is None + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.255.0') + if config_type != 'tiramisu-api': + # FIXME + raises(APIError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.pop(1)") #reset - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145', + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145', '192.168.230.145', '192.168.230.145']) - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + if config_type == 'tiramisu-api': + cfg.send() -def test_values_with_leader_and_followers_pop(): +def test_values_with_leader_and_followers_pop(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145']) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145', '192.168.230.146']) - api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.0.0') - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.145', '192.168.230.146'] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' - assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == '255.255.0.0' - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.146'] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145']) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145', '192.168.230.146']) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.0.0') + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.145', '192.168.230.146'] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == '255.255.0.0' + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.230.146'] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + if config_type == 'tiramisu-api': + cfg.send() -def test_values_with_leader_and_followers_leader(): +def test_values_with_leader_and_followers_leader(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145", "192.168.230.145"]) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') - api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.255.0') - raises(LeadershipError, "api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145'])") - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' - assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == '255.255.255.0' - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(1) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ["192.168.230.145"] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145", "192.168.230.145"]) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.0') + cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.255.0') + if config_type != 'tiramisu-api': + raises(LeadershipError, "cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.145'])") + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == '255.255.255.0' + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(1) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ["192.168.230.145"] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.0' + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + if config_type == 'tiramisu-api': + cfg.send() def test_values_with_leader_and_followers_leader_pop(): @@ -592,97 +655,122 @@ def test_values_with_leader_and_followers_leader_pop(): netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145", "192.168.230.146"]) - api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.0.0') - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ["192.168.230.145", "192.168.230.146"] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None - assert api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == '255.255.0.0' - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (1,)), (('192.168.230.145', '192.168.230.146'), ('255.255.0.0',)), ('user', ('user',)))) - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0,)), (('192.168.230.146',), ('255.255.0.0',)), ('user', ('user',)))) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ["192.168.230.146"] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.146', "192.168.230.145", "192.168.230.146", "192.168.230.147", "192.168.230.148", "192.168.230.149"]) - api.option('ip_admin_eth0.netmask_admin_eth0', 3).value.set('255.255.0.0') - api.option('ip_admin_eth0.netmask_admin_eth0', 4).value.set('255.255.0.0') - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0, 3, 4)), (('192.168.230.146', "192.168.230.145", "192.168.230.146", "192.168.230.147", "192.168.230.148", "192.168.230.149"), ('255.255.0.0', '255.255.0.0', '255.255.0.0')), ('user', ('user', 'user', 'user')))) - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(5) - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0, 3, 4)), (('192.168.230.146', "192.168.230.145", "192.168.230.146", "192.168.230.147", "192.168.230.148"), ('255.255.0.0', '255.255.0.0', '255.255.0.0')), ('user', ('user', 'user', 'user')))) - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(2) - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0, 2, 3)), (('192.168.230.146', "192.168.230.145", "192.168.230.147", "192.168.230.148"), ('255.255.0.0', '255.255.0.0', '255.255.0.0')), ('user', ('user', 'user', 'user')))) - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(2) - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0, 2)), (('192.168.230.146', "192.168.230.145", "192.168.230.148"), ('255.255.0.0', '255.255.0.0')), ('user', ('user', 'user')))) - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(2) - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0,)), (('192.168.230.146', "192.168.230.145"), ('255.255.0.0',)), ('user', ('user',)))) + cfg = Config(maconfig) + cfg.property.read_write() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145", "192.168.230.146"]) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.0.0') + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ["192.168.230.145", "192.168.230.146"] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == '255.255.0.0' + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (1,)), (('192.168.230.145', '192.168.230.146'), ('255.255.0.0',)), ('user', ('user',)))) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0,)), (('192.168.230.146',), ('255.255.0.0',)), ('user', ('user',)))) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ["192.168.230.146"] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.0.0' + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.230.146', "192.168.230.145", "192.168.230.146", "192.168.230.147", "192.168.230.148", "192.168.230.149"]) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 3).value.set('255.255.0.0') + cfg.option('ip_admin_eth0.netmask_admin_eth0', 4).value.set('255.255.0.0') + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0, 3, 4)), (('192.168.230.146', "192.168.230.145", "192.168.230.146", "192.168.230.147", "192.168.230.148", "192.168.230.149"), ('255.255.0.0', '255.255.0.0', '255.255.0.0')), ('user', ('user', 'user', 'user')))) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(5) + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0, 3, 4)), (('192.168.230.146', "192.168.230.145", "192.168.230.146", "192.168.230.147", "192.168.230.148"), ('255.255.0.0', '255.255.0.0', '255.255.0.0')), ('user', ('user', 'user', 'user')))) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(2) + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0, 2, 3)), (('192.168.230.146', "192.168.230.145", "192.168.230.147", "192.168.230.148"), ('255.255.0.0', '255.255.0.0', '255.255.0.0')), ('user', ('user', 'user', 'user')))) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(2) + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0, 2)), (('192.168.230.146', "192.168.230.145", "192.168.230.148"), ('255.255.0.0', '255.255.0.0')), ('user', ('user', 'user')))) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(2) + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'), (None, (0,)), (('192.168.230.146', "192.168.230.145"), ('255.255.0.0',)), ('user', ('user',)))) -def test_values_with_leader_owner(): +def test_values_with_leader_owner(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - owner = api.owner.get() - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) - assert api.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner + cfg = Config(maconfig) + cfg.property.read_write() + owner = cfg.owner.get() + cfg = get_config(cfg, config_type) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.isdefault() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.isdefault() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').owner.get() == owner -def test_values_with_leader_disabled(): +def test_values_with_leader_disabled(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set("192.168.230.145") - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) - api.option('ip_admin_eth0.netmask_admin_eth0').property.add('disabled') - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) + cfg_ori = Config(maconfig) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set("192.168.230.145") + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.option('ip_admin_eth0.netmask_admin_eth0').property.add('disabled') + cfg = get_config(cfg_ori, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) + if config_type == 'tiramisu-api': + cfg.send() #delete with value in disabled var - api.unrestraint.option('ip_admin_eth0.netmask_admin_eth0').property.pop('disabled') - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set("192.168.230.145") - api.unrestraint.option('ip_admin_eth0.netmask_admin_eth0').property.add('disabled') - api.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) + cfg_ori.unrestraint.option('ip_admin_eth0.netmask_admin_eth0').property.pop('disabled') + cfg = get_config(cfg_ori, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set("192.168.230.145") + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.unrestraint.option('ip_admin_eth0.netmask_admin_eth0').property.add('disabled') + cfg = get_config(cfg_ori, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.pop(0) - #append with value in disabled var - api.unrestraint.option('ip_admin_eth0.netmask_admin_eth0').property.pop('disabled') - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set("192.168.230.145") - api.unrestraint.option('ip_admin_eth0.netmask_admin_eth0').property.add('disabled') - api.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145", '192.168.230.43']) + ##append with value in disabled var + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.unrestraint.option('ip_admin_eth0.netmask_admin_eth0').property.pop('disabled') + cfg = get_config(cfg_ori, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145"]) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set("192.168.230.145") + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.unrestraint.option('ip_admin_eth0.netmask_admin_eth0').property.add('disabled') + cfg = get_config(cfg_ori, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(["192.168.230.145", '192.168.230.43']) + if config_type == 'tiramisu-api': + cfg.send() -def test_multi_non_valid_value(): +def test_multi_non_valid_value(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) maconfig = OptionDescription('toto', '', [ip_admin_eth0]) - api = Config(maconfig) - api.property.read_write() - api.option('ip_admin_eth0').value.set(['a']) - raises(ValueError, "api.option('ip_admin_eth0').value.set([1])") + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + cfg.option('ip_admin_eth0').value.set(['a']) + raises(ValueError, "cfg.option('ip_admin_eth0').value.set([1])") + if config_type == 'tiramisu-api': + cfg.send() -def test_multi_leader_default_follower(): +def test_multi_leader_default_follower(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", default_multi="255.255.255.0", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1'] + if config_type == 'tiramisu-api': + cfg.send() def test_groups_with_leader_get_modified_value(): @@ -690,32 +778,35 @@ def test_groups_with_leader_get_modified_value(): netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - compare(api.value.exportation(), ((), (), (), ())) - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0',), (None,), (('192.168.1.1',),), ('user',))) - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.255') - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0',), (None, (0,)), (('192.168.1.1',), ('255.255.255.255',)), ('user', ('user',)))) - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1', '192.168.1.1']) - api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.255.255') - compare(api.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0',), (None, (0, 1)), (('192.168.1.1', '192.168.1.1'), ('255.255.255.255', '255.255.255.255')), ('user', ('user', 'user')))) + cfg = Config(maconfig) + cfg.property.read_write() + compare(cfg.value.exportation(), ((), (), (), ())) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1']) + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0',), (None,), (('192.168.1.1',),), ('user',))) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('255.255.255.255') + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0',), (None, (0,)), (('192.168.1.1',), ('255.255.255.255',)), ('user', ('user',)))) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['192.168.1.1', '192.168.1.1']) + cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('255.255.255.255') + compare(cfg.value.exportation(), (('ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0',), (None, (0, 1)), (('192.168.1.1', '192.168.1.1'), ('255.255.255.255', '255.255.255.255')), ('user', ('user', 'user')))) -def test_groups_with_leader_importation(): +def test_groups_with_leader_importation(config_type): ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) maconfig = OptionDescription('toto', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.value.importation([['ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'], [None, [0, 1]], [['192.168.1.1', '192.168.1.0'], ['255.255.255.255', '255.255.255.0']], ['user', ['user', 'user']]]) - api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1', '192.168.1.0'] - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.255' - api.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == '255.255.255.0' - api.option('ip_admin_eth0.ip_admin_eth0').owner.get() == 'user' - api.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == 'user' - api.option('ip_admin_eth0.netmask_admin_eth0', 1).owner.get() == 'user' + cfg = Config(maconfig) + cfg.property.read_write() + cfg.value.importation([['ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'], [None, [0, 1]], [['192.168.1.1', '192.168.1.0'], ['255.255.255.255', '255.255.255.0']], ['user', ['user', 'user']]]) + cfg = get_config(cfg, config_type) + cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['192.168.1.1', '192.168.1.0'] + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == '255.255.255.255' + cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.get() == '255.255.255.0' + cfg.option('ip_admin_eth0.ip_admin_eth0').owner.get() == 'user' + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).owner.get() == 'user' + cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).owner.get() == 'user' + if config_type == 'tiramisu-api': + cfg.send() def test_wrong_index(): @@ -724,15 +815,15 @@ def test_wrong_index(): interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) od1 = OptionDescription('od', '', [interface1]) maconfig = OptionDescription('toto', '', [od1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('od.ip_admin_eth0.ip_admin_eth0').option.get() - raises(APIError, "api.option('od.ip_admin_eth0.ip_admin_eth0', 0).option.get()") - assert api.option('od.ip_admin_eth0.netmask_admin_eth0', 0).option.get() - assert api.option('od.ip_admin_eth0').option.get() - raises(APIError, "api.option('od.ip_admin_eth0', 0).option.get()") - assert api.option('od').option.get() - raises(APIError, "api.option('od', 0).option.get()") + cfg = Config(maconfig) + cfg.property.read_write() + assert cfg.option('od.ip_admin_eth0.ip_admin_eth0').option.get() + raises(APIError, "cfg.option('od.ip_admin_eth0.ip_admin_eth0', 0).option.get()") + assert cfg.option('od.ip_admin_eth0.netmask_admin_eth0', 0).option.get() + assert cfg.option('od.ip_admin_eth0').option.get() + raises(APIError, "cfg.option('od.ip_admin_eth0', 0).option.get()") + assert cfg.option('od').option.get() + raises(APIError, "cfg.option('od', 0).option.get()") def test_without_leader_or_follower(): @@ -778,8 +869,8 @@ def test_follower_not_same_not_equal(): interface1 = Leadership('interface1', '', [ip_admin_eth1, netmask_admin_eth1]) od1 = OptionDescription('od', '', [interface0, interface1]) maconfig = OptionDescription('toto', '', [od1]) - api = Config(maconfig) - api.property.read_write() + cfg = Config(maconfig) + cfg.property.read_write() def test_follower_force_store_value(): diff --git a/tests/test_mandatory.py b/tests/test_mandatory.py index c3966c8..ae123b7 100644 --- a/tests/test_mandatory.py +++ b/tests/test_mandatory.py @@ -1,9 +1,9 @@ # coding: utf-8 from .autopath import do_autopath do_autopath() +# FIXME from .config import config_type, get_config from py.test import raises -from tiramisu.api import TIRAMISU_VERSION from tiramisu import Config from tiramisu import IntOption, StrOption, UnicodeOption, OptionDescription, \ SymLinkOption, Leadership, undefined, Params, ParamOption @@ -78,71 +78,71 @@ def make_description3(): def test_mandatory_ro(): descr = make_description() - api = Config(descr) - api.property.read_only() + cfg = Config(descr) + cfg.property.read_only() prop = [] try: - api.option('str1').value.get() + cfg.option('str1').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop - api.property.read_write() - api.option('str1').value.set('yes') - api.property.read_only() - assert api.option('str1').value.get() == 'yes' + cfg.property.read_write() + cfg.option('str1').value.set('yes') + cfg.property.read_only() + assert cfg.option('str1').value.get() == 'yes' def test_mandatory_ro_dict(): descr = make_description() - api = Config(descr) - api.property.read_only() + cfg = Config(descr) + cfg.property.read_only() prop = [] try: - api.value.dict() + cfg.value.dict() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop - api.property.read_write() - api.option('str1').value.set('yes') - api.option('unicode2').value.set('yes') - api.property.read_only() + cfg.property.read_write() + cfg.option('str1').value.set('yes') + cfg.option('unicode2').value.set('yes') + cfg.property.read_only() try: - api.value.dict() + cfg.value.dict() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop - api.property.read_write() - api.option('str3').value.set(['yes']) - api.property.read_only() - assert api.value.dict() == {'str': 'abc', 'str1': 'yes', 'str3': ['yes'], 'str4': [], 'unicode2': 'yes'} + cfg.property.read_write() + cfg.option('str3').value.set(['yes']) + cfg.property.read_only() + assert cfg.value.dict() == {'str': 'abc', 'str1': 'yes', 'str3': ['yes'], 'str4': [], 'unicode2': 'yes'} def test_mandatory_rw(): descr = make_description() - api = Config(descr) - api.property.read_write() + cfg = Config(descr) + cfg.property.read_write() # not mandatory in rw - api.option('str1').value.get() - api.option('str1').value.set('yes') - assert api.option('str1').value.get() == 'yes' + cfg.option('str1').value.get() + cfg.option('str1').value.set('yes') + assert cfg.option('str1').value.get() == 'yes' def test_mandatory_default(): descr = make_description() - api = Config(descr) - api.property.read_only() + cfg = Config(descr) + cfg.property.read_only() #not mandatory in rw - api.option('str').value.get() - api.property.read_write() - api.option('str').value.set('yes') - api.property.read_only() - api.option('str').value.get() - api.property.read_write() - api.option('str').value.set(None) - api.property.read_only() + cfg.option('str').value.get() + cfg.property.read_write() + cfg.option('str').value.set('yes') + cfg.property.read_only() + cfg.option('str').value.get() + cfg.property.read_write() + cfg.option('str').value.set(None) + cfg.property.read_only() prop = [] try: - api.option('str').value.get() + cfg.option('str').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop @@ -150,40 +150,40 @@ def test_mandatory_default(): def test_mandatory_delete(): descr = make_description() - api = Config(descr) - api.property.read_only() - api.option('str').value.get() + cfg = Config(descr) + cfg.property.read_only() + cfg.option('str').value.get() try: - api.option('str1').value.get() + cfg.option('str1').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop - api.property.read_write() - api.option('str1').value.set('yes') - api.property.read_only() - assert api.option('str1').value.get() == 'yes' - api.property.pop('everything_frozen') + cfg.property.read_write() + cfg.option('str1').value.set('yes') + cfg.property.read_only() + assert cfg.option('str1').value.get() == 'yes' + cfg.property.pop('everything_frozen') prop = [] try: - api.option('str1').value.reset() + cfg.option('str1').value.reset() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop - api.option('str').value.reset() + cfg.option('str').value.reset() - assert api.option('str1').value.get() == 'yes' + assert cfg.option('str1').value.get() == 'yes' #valeur vide : None, '', u'', ... def test_mandatory_none(): descr = make_description() - api = Config(descr) - api.option('str1').value.set(None) - assert api.option('str1').owner.get() == 'user' - api.property.read_only() + cfg = Config(descr) + cfg.option('str1').value.set(None) + assert cfg.option('str1').owner.get() == 'user' + cfg.property.read_only() prop = [] try: - api.option('str1').value.get() + cfg.option('str1').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop @@ -191,13 +191,13 @@ def test_mandatory_none(): def test_mandatory_empty(): descr = make_description() - api = Config(descr) - api.option('str1').value.set('') - assert api.option('str1').owner.get() == 'user' - api.property.read_only() + cfg = Config(descr) + cfg.option('str1').value.set('') + assert cfg.option('str1').owner.get() == 'user' + cfg.property.read_only() prop = [] try: - api.option('str1').value.get() + cfg.option('str1').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop @@ -205,23 +205,23 @@ def test_mandatory_empty(): def test_mandatory_multi_none(): descr = make_description() - api = Config(descr) - api.option('str3').value.set([None]) - assert api.option('str3').owner.get() == 'user' - api.property.read_only() + cfg = Config(descr) + cfg.option('str3').value.set([None]) + assert cfg.option('str3').owner.get() == 'user' + cfg.property.read_only() prop = [] try: - api.option('str3').value.get() + cfg.option('str3').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop - api.property.read_write() - api.option('str3').value.set(['yes', None]) - assert api.option('str3').owner.get() == 'user' - api.property.read_only() + cfg.property.read_write() + cfg.option('str3').value.set(['yes', None]) + assert cfg.option('str3').owner.get() == 'user' + cfg.property.read_only() prop = [] try: - api.option('str3').value.get() + cfg.option('str3').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop @@ -229,35 +229,35 @@ def test_mandatory_multi_none(): def test_mandatory_multi_empty(): descr = make_description() - api = Config(descr) - api.option('str3').value.set([]) - assert api.option('str3').owner.get() == 'user' - api.property.read_only() + cfg = Config(descr) + cfg.option('str3').value.set([]) + assert cfg.option('str3').owner.get() == 'user' + cfg.property.read_only() prop = [] try: - api.option('str3').value.get() + cfg.option('str3').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop # - api.property.read_write() - api.option('str3').value.set(['']) - assert api.option('str3').owner.get() == 'user' - api.property.read_only() + cfg.property.read_write() + cfg.option('str3').value.set(['']) + assert cfg.option('str3').owner.get() == 'user' + cfg.property.read_only() prop = [] try: - api.option('str3').value.get() + cfg.option('str3').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop # - api.property.read_write() - api.option('str3').value.set(['yes', '']) - assert api.option('str3').owner.get() == 'user' - api.property.read_only() + cfg.property.read_write() + cfg.option('str3').value.set(['yes', '']) + assert cfg.option('str3').owner.get() == 'user' + cfg.property.read_only() prop = [] try: - api.option('str3').value.get() + cfg.option('str3').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop @@ -265,31 +265,31 @@ def test_mandatory_multi_empty(): def test_mandatory_multi_empty_allow_empty_list(): descr = make_description() - api = Config(descr) - api.option('str4').value.set([]) - assert api.option('str4').owner.get() == 'user' - api.property.read_only() + cfg = Config(descr) + cfg.option('str4').value.set([]) + assert cfg.option('str4').owner.get() == 'user' + cfg.property.read_only() prop = [] - api.option('str4').value.get() + cfg.option('str4').value.get() # - api.property.read_write() - api.option('str4').value.set(['']) - assert api.option('str4').owner.get() == 'user' - api.property.read_only() + cfg.property.read_write() + cfg.option('str4').value.set(['']) + assert cfg.option('str4').owner.get() == 'user' + cfg.property.read_only() prop = [] try: - api.option('str4').value.get() + cfg.option('str4').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop # - api.property.read_write() - api.option('str4').value.set(['yes', '']) - assert api.option('str4').owner.get() == 'user' - api.property.read_only() + cfg.property.read_write() + cfg.option('str4').value.set(['yes', '']) + assert cfg.option('str4').owner.get() == 'user' + cfg.property.read_only() prop = [] try: - api.option('str4').value.get() + cfg.option('str4').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop @@ -297,47 +297,44 @@ def test_mandatory_multi_empty_allow_empty_list(): def test_mandatory_multi_append(): descr = make_description() - api = Config(descr) - api.option('str3').value.set(['yes']) - api.property.read_write() - api.option('str3').value.get().append(None) + cfg = Config(descr) + cfg.option('str3').value.set(['yes']) + cfg.property.read_write() + cfg.option('str3').value.get().append(None) def test_mandatory_disabled(): descr = make_description() - api = Config(descr) - api.option('str1').value.get() - api.option('str1').property.add('disabled') - api.property.read_only() + cfg = Config(descr) + cfg.option('str1').value.get() + cfg.option('str1').property.add('disabled') + cfg.property.read_only() pop = [] try: - api.option('str1').value.get() + cfg.option('str1').value.get() except PropertiesOptionError as err: prop = err.proptype - if TIRAMISU_VERSION == 2: - search_prop = {'disabled', 'mandatory'} - else: - search_prop = {'disabled'} + search_prop = {'disabled'} assert set(prop) == search_prop def test_mandatory_unicode(): descr = make_description() - api = Config(descr) - api.option('unicode2').value.get() - api.property.read_only() + cfg = Config(descr) + cfg.option('unicode2').value.get() + cfg.property.read_only() prop = [] try: - api.option('unicode2').value.get() + cfg.option('unicode2').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop - api.property.read_write() - api.option('unicode2').value.set(u'') - api.property.read_only() + cfg.property.read_write() + cfg.option('unicode2').value.set(u'') + cfg.property.read_only() prop = [] try: - api.option('unicode2').value.get() + cfg.option('unicode2').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop @@ -345,66 +342,66 @@ def test_mandatory_unicode(): def test_mandatory_warnings_ro(): descr = make_description() - api = Config(descr) - api.option('str').value.set('') - api.property.read_only() + cfg = Config(descr) + cfg.option('str').value.set('') + cfg.property.read_only() proc = [] try: - api.option('str').value.get() + cfg.option('str').value.get() except PropertiesOptionError as err: prop = err.proptype assert 'mandatory' in prop - assert list(api.value.mandatory()) == ['str', 'str1', 'unicode2', 'str3'] - api.property.read_write() - api.option('str').value.set('a') - api.property.read_only() - assert list(api.value.mandatory()) == ['str1', 'unicode2', 'str3'] + assert list(cfg.value.mandatory()) == ['str', 'str1', 'unicode2', 'str3'] + cfg.property.read_write() + cfg.option('str').value.set('a') + cfg.property.read_only() + assert list(cfg.value.mandatory()) == ['str1', 'unicode2', 'str3'] def test_mandatory_warnings_rw(): descr = make_description() - api = Config(descr) - api.option('str').value.set('') - api.property.read_write() - api.option('str').value.get() - assert list(api.value.mandatory()) == ['str', 'str1', 'unicode2', 'str3'] - api.option('str').value.set('a') - assert list(api.value.mandatory()) == ['str1', 'unicode2', 'str3'] + cfg = Config(descr) + cfg.option('str').value.set('') + cfg.property.read_write() + cfg.option('str').value.get() + assert list(cfg.value.mandatory()) == ['str', 'str1', 'unicode2', 'str3'] + cfg.option('str').value.set('a') + assert list(cfg.value.mandatory()) == ['str1', 'unicode2', 'str3'] def test_mandatory_warnings_disabled(): descr = make_description() - api = Config(descr) - api.option('str').value.set('') - api.property.read_write() - api.option('str').value.get() - assert set(api.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} - api.option('str').property.add('disabled') - assert set(api.value.mandatory()) == {'str1', 'unicode2', 'str3'} + cfg = Config(descr) + cfg.option('str').value.set('') + cfg.property.read_write() + cfg.option('str').value.get() + assert set(cfg.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} + cfg.option('str').property.add('disabled') + assert set(cfg.value.mandatory()) == {'str1', 'unicode2', 'str3'} def test_mandatory_warnings_hidden(): descr = make_description() - api = Config(descr) - api.option('str').value.set('') - api.property.read_write() - api.permissive.set(frozenset(['hidden'])) - api.option('str').value.get() - assert set(api.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} - api.option('str').property.add('hidden') - assert set(api.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} + cfg = Config(descr) + cfg.option('str').value.set('') + cfg.property.read_write() + cfg.permissive.set(frozenset(['hidden'])) + cfg.option('str').value.get() + assert set(cfg.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} + cfg.option('str').property.add('hidden') + assert set(cfg.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} def test_mandatory_warnings_frozen(): descr = make_description() - api = Config(descr) - api.option('str').value.set('') - api.property.read_write() - api.option('str').value.get() - assert set(api.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} - api.option('str').property.add('frozen') - api.property.read_only() - assert set(api.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} + cfg = Config(descr) + cfg.option('str').value.set('') + cfg.property.read_write() + cfg.option('str').value.get() + assert set(cfg.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} + cfg.option('str').property.add('frozen') + cfg.property.read_only() + assert set(cfg.value.mandatory()) == {'str', 'str1', 'unicode2', 'str3'} def test_mandatory_leader(): @@ -414,10 +411,10 @@ def test_mandatory_leader(): multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) descr = OptionDescription('o', '', [interface1]) - api = Config(descr) - api.property.read_only() - raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.get()") - raises(PropertiesOptionError, "api.value.dict()") + cfg = Config(descr) + cfg.property.read_only() + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.ip_admin_eth0').value.get()") + raises(PropertiesOptionError, "cfg.value.dict()") def test_mandatory_warnings_leader(): @@ -427,8 +424,8 @@ def test_mandatory_warnings_leader(): multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) descr = OptionDescription('o', '', [interface1]) - api = Config(descr) - assert list(api.value.mandatory()) == ['ip_admin_eth0.ip_admin_eth0'] + cfg = Config(descr) + assert list(cfg.value.mandatory()) == ['ip_admin_eth0.ip_admin_eth0'] def test_mandatory_leader_empty(): @@ -437,40 +434,40 @@ def test_mandatory_leader_empty(): multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) descr = OptionDescription('o', '', [interface1]) - api = Config(descr) - api.property.read_write() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg = Config(descr) + cfg.property.read_write() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] # - api.option('ip_admin_eth0.ip_admin_eth0').value.set([undefined]) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [None] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None - api.property.read_only() - raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.get()") - raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set([undefined]) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [None] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + cfg.property.read_only() + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.ip_admin_eth0').value.get()") + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") + cfg.property.read_write() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] # - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['']) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [''] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None - api.property.read_only() - raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.get()") - raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") - api.property.read_write() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['']) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [''] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + cfg.property.read_only() + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.ip_admin_eth0').value.get()") + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") + cfg.property.read_write() # - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip']) - api.property.read_only() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip'] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + cfg.property.read_write() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip']) + cfg.property.read_only() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip'] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None # - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip2']) - api.property.read_only() - raises(PropertiesOptionError, "api.option('ip_admin_eth0.ip_admin_eth0').value.reset()") - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() + cfg.property.read_write() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip2']) + cfg.property.read_only() + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset()") + cfg.property.read_write() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() def test_mandatory_warnings_leader_empty(): @@ -479,22 +476,22 @@ def test_mandatory_warnings_leader_empty(): multi=True) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) descr = OptionDescription('o', '', [interface1]) - api = Config(descr) - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set([undefined]) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [None] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None - assert list(api.value.mandatory()) == ['ip_admin_eth0.ip_admin_eth0'] - api.option('ip_admin_eth0.ip_admin_eth0').value.reset() + cfg = Config(descr) + cfg.property.read_write() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set([undefined]) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [None] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + assert list(cfg.value.mandatory()) == ['ip_admin_eth0.ip_admin_eth0'] + cfg.option('ip_admin_eth0.ip_admin_eth0').value.reset() # - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['']) - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [''] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None - assert list(api.value.mandatory()) == ['ip_admin_eth0.ip_admin_eth0'] + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['']) + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [''] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == None + assert list(cfg.value.mandatory()) == ['ip_admin_eth0.ip_admin_eth0'] # - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip']) - assert list(api.value.mandatory()) == [] + cfg.property.read_write() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip']) + assert list(cfg.value.mandatory()) == [] def test_mandatory_follower(): @@ -503,27 +500,27 @@ def test_mandatory_follower(): multi=True, properties=('mandatory', )) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) descr = OptionDescription('o', '', [interface1]) - api = Config(descr) - api.property.read_only() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg = Config(descr) + cfg.property.read_only() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] # - api.property.read_write() - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip']) - api.property.read_only() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip'] - raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") + cfg.property.read_write() + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip']) + cfg.property.read_only() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip'] + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") # - api.property.read_write() - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('') - api.property.read_only() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip'] - raises(PropertiesOptionError, "api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") + cfg.property.read_write() + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('') + cfg.property.read_only() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip'] + raises(PropertiesOptionError, "cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get()") # - api.property.read_write() - api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('ip') - api.property.read_only() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip'] - assert api.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == 'ip' + cfg.property.read_write() + cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.set('ip') + cfg.property.read_only() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == ['ip'] + assert cfg.option('ip_admin_eth0.netmask_admin_eth0', 0).value.get() == 'ip' def test_mandatory_warnings_follower(): @@ -532,43 +529,43 @@ def test_mandatory_warnings_follower(): multi=True, properties=('mandatory', )) interface1 = Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0]) descr = OptionDescription('o', '', [interface1]) - api = Config(descr) - api.property.read_only() - assert api.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] + cfg = Config(descr) + cfg.property.read_only() + assert cfg.option('ip_admin_eth0.ip_admin_eth0').value.get() == [] # - api.property.read_write() - assert list(api.value.mandatory()) == [] - api.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip']) - assert list(api.value.mandatory()) == ['ip_admin_eth0.netmask_admin_eth0'] + cfg.property.read_write() + assert list(cfg.value.mandatory()) == [] + cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['ip']) + assert list(cfg.value.mandatory()) == ['ip_admin_eth0.netmask_admin_eth0'] def test_mandatory_warnings_symlink(): descr = make_description_sym() - api = Config(descr) - api.option('str').value.set('') - api.property.read_write() - api.option('str').value.get() - assert list(api.value.mandatory()) == ['str', 'str1', 'str3'] - api.option('str').property.add('frozen') - api.property.read_only() - assert list(api.value.mandatory()) == ['str', 'str1', 'str3'] + cfg = Config(descr) + cfg.option('str').value.set('') + cfg.property.read_write() + cfg.option('str').value.get() + assert list(cfg.value.mandatory()) == ['str', 'str1', 'str3'] + cfg.option('str').property.add('frozen') + cfg.property.read_only() + assert list(cfg.value.mandatory()) == ['str', 'str1', 'str3'] #def test_mandatory_warnings_validate(): # descr = make_description3() -# api = Config(descr) -# api.option('str').value.set('') -# raises(ValueError, "list(api.value.mandatory())") -# api.option('str').value.set('test') -# raises(ValueError, "list(api.value.mandatory())") +# cfg = Config(descr) +# cfg.option('str').value.set('') +# raises(ValueError, "list(cfg.value.mandatory())") +# cfg.option('str').value.set('test') +# raises(ValueError, "list(cfg.value.mandatory())") def test_mandatory_warnings_validate_empty(): descr = make_description2() - api = Config(descr) - api.option('str').value.set('') - api.property.read_only() - assert list(api.value.mandatory()) == ['str', 'str1', 'str3', 'unicode1'] + cfg = Config(descr) + cfg.option('str').value.set('') + cfg.property.read_only() + assert list(cfg.value.mandatory()) == ['str', 'str1', 'str3', 'unicode1'] def test_mandatory_warnings_requires(): @@ -580,16 +577,16 @@ def test_mandatory_warnings_requires(): properties=('mandatory', )) stroption3 = StrOption('str3', 'Test string option', multi=True, requires=[{'option': stroption, 'expected': 'yes', 'action': 'mandatory', 'transitive': False}]) descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3]) - api = Config(descr) - api.option('str').value.set('') - api.property.read_write() - api.option('str').value.get() - assert list(api.value.mandatory()) == ['str', 'str1', 'unicode2'] - api.property.read_only() - assert list(api.value.mandatory()) == ['str', 'str1', 'unicode2'] - api.property.read_write() - api.option('str').value.set('yes') - assert list(api.value.mandatory()) == ['str1', 'unicode2', 'str3'] + cfg = Config(descr) + cfg.option('str').value.set('') + cfg.property.read_write() + cfg.option('str').value.get() + assert list(cfg.value.mandatory()) == ['str', 'str1', 'unicode2'] + cfg.property.read_only() + assert list(cfg.value.mandatory()) == ['str', 'str1', 'unicode2'] + cfg.property.read_write() + cfg.option('str').value.set('yes') + assert list(cfg.value.mandatory()) == ['str1', 'unicode2', 'str3'] def test_mandatory_warnings_requires_leadership(): @@ -599,12 +596,12 @@ def test_mandatory_warnings_requires_leadership(): stroption2 = StrOption('str2', 'Test string option', multi=True, requires=[{'option': stroption, 'expected': 'yes', 'action': 'mandatory', 'transitive': False}]) leadership = Leadership('leader', 'leadership', [stroption1, stroption2]) descr = OptionDescription('tiram', '', [stroption, leadership]) - api = Config(descr) - api.option('str').value.set('') - api.option('leader.str1').value.set(['str']) - assert list(api.value.mandatory()) == ['str'] - api.option('str').value.set('yes') - assert list(api.value.mandatory()) == ['leader.str2'] + cfg = Config(descr) + cfg.option('str').value.set('') + cfg.option('leader.str1').value.set(['str']) + assert list(cfg.value.mandatory()) == ['str'] + cfg.option('str').value.set('yes') + assert list(cfg.value.mandatory()) == ['leader.str2'] def test_mandatory_warnings_requires_leadership_follower(): @@ -613,18 +610,18 @@ def test_mandatory_warnings_requires_leadership_follower(): stroption2 = StrOption('str2', 'Test string option', multi=True, requires=[{'option': stroption1, 'expected': 'yes', 'action': 'mandatory', 'transitive': False}]) leadership = Leadership('leader', 'leadership', [stroption, stroption1, stroption2]) descr = OptionDescription('tiram', '', [leadership]) - api = Config(descr) - api.option('leader.str').value.set(['str']) - assert list(api.value.mandatory()) == [] - api.option('leader.str1', 0).value.set('yes') - assert list(api.value.mandatory()) == ['leader.str2'] + cfg = Config(descr) + cfg.option('leader.str').value.set(['str']) + assert list(cfg.value.mandatory()) == [] + cfg.option('leader.str1', 0).value.set('yes') + assert list(cfg.value.mandatory()) == ['leader.str2'] def test_mandatory_od_disabled(): descr = make_description() descr = OptionDescription('od', '', [descr]) - api = Config(descr) - api.property.read_only() - assert list(api.value.mandatory()) == ['tiram.str1', 'tiram.unicode2', 'tiram.str3'] - api.option('tiram').property.add('disabled') - assert list(api.value.mandatory()) == [] + cfg = Config(descr) + cfg.property.read_only() + assert list(cfg.value.mandatory()) == ['tiram.str1', 'tiram.unicode2', 'tiram.str3'] + cfg.option('tiram').property.add('disabled') + assert list(cfg.value.mandatory()) == [] diff --git a/tests/test_option_callback.py b/tests/test_option_callback.py index 7686c3d..724b1a0 100644 --- a/tests/test_option_callback.py +++ b/tests/test_option_callback.py @@ -1,5 +1,6 @@ from .autopath import do_autopath do_autopath() +from .config import config_type, get_config from py.test import raises @@ -9,7 +10,6 @@ from tiramisu.setting import groups, owners from tiramisu import ChoiceOption, BoolOption, IntOption, FloatOption, \ StrOption, OptionDescription, SymLinkOption, IPOption, NetmaskOption, Leadership, \ undefined, Params, ParamOption, ParamValue, ParamContext, calc_value -from tiramisu.api import TIRAMISU_VERSION from tiramisu.error import PropertiesOptionError, ConflictError, LeadershipError, ConfigError from tiramisu.i18n import _ from tiramisu.storage import list_sessions @@ -79,8 +79,8 @@ def is_config(config, **kwargs): def ret_from_config(config): - api = Config(config) - return api.option('val1').value.get() + cfg = Config(config) + return cfg.option('val1').value.get() def return_raise(*arg): @@ -126,21 +126,24 @@ def test_identical_paths(): raises(ConflictError, "make_description_duplicates()") -def test_hidden_if_in(): +def test_hidden_if_in2(config_type): intoption = IntOption('int', 'Test int option', default=0) stroption = StrOption('str', 'Test string option', default="abc", requires=({'option': intoption, 'expected': 1, 'action': 'hidden'},)) descr = OptionDescription('constraints', '', [stroption, intoption]) - api = Config(descr) - api.property.read_write() - assert not 'hidden' in api.option('str').property.get() - api.option('int').value.set(1) - raises(PropertiesOptionError, "api.option('str').value.get()") - raises(PropertiesOptionError, "api.option('str').value.set('uvw')") - assert 'hidden' in api.unrestraint.option('str').property.get() + cfg_ori = Config(descr) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + assert not 'hidden' in cfg.option('str').property.get() + cfg.option('int').value.set(1) + raises(PropertiesOptionError, "cfg.option('str').value.get()") + raises(PropertiesOptionError, "cfg.option('str').value.set('uvw')") + if config_type == 'tiramisu-api': + cfg.send() + assert 'hidden' in cfg_ori.unrestraint.option('str').property.get() -def test_hidden_if_in_with_group(): +def test_hidden_if_in_with_group(config_type): gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref') gcdummy = BoolOption('dummy', 'dummy', default=False) @@ -155,11 +158,14 @@ def test_hidden_if_in_with_group(): requires=({'option': intoption, 'expected': 1, 'action': 'hidden'},)) descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption, stroption, intoption]) - api = Config(descr) - api.property.read_write() - assert not 'hidden' in api.option('str').property.get() - api.option('int').value.set(1) - raises(PropertiesOptionError, "api.option('gc.name').value.get()") + cfg_ori = Config(descr) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + assert not 'hidden' in cfg_ori.option('str').property.get() + cfg.option('int').value.set(1) + if config_type == 'tiramisu-api': + cfg.send() + raises(PropertiesOptionError, "cfg_ori.option('gc.name').value.get()") def test_disabled_with_group(): @@ -177,11 +183,11 @@ def test_disabled_with_group(): requires=({'option': intoption, 'expected': 1, 'action': 'disabled'},)) descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption, stroption, intoption]) - api = Config(descr) - api.property.read_write() - assert api.option('gc.name').value.get() - api.option('int').value.set(1) - raises(PropertiesOptionError, "api.option('gc.name').value.get()") + cfg = Config(descr) + cfg.property.read_write() + assert cfg.option('gc.name').value.get() + cfg.option('int').value.set(1) + raises(PropertiesOptionError, "cfg.option('gc.name').value.get()") #____________________________________________________________ @@ -211,38 +217,40 @@ def make_description_callback(): def test_has_callback(): descr = make_description_callback() # here the owner is 'default' - api = Config(descr) - api.property.read_write() - api.option('bool').value.set(False) + cfg = Config(descr) + cfg.property.read_write() + cfg.option('bool').value.set(False) # because dummy has a callback - api.property.add('freeze') - api.option('gc.dummy').property.add('frozen') - raises(PropertiesOptionError, "api.option('gc.dummy').value.set(True)") + cfg.property.add('freeze') + cfg.option('gc.dummy').property.add('frozen') + raises(PropertiesOptionError, "cfg.option('gc.dummy').value.set(True)") def test_freeze_and_has_callback(): descr = make_description_callback() - api = Config(descr) - api.property.read_write() - api.option('bool').value.set(False) - api.property.add('freeze') - api.option('gc.dummy').property.add('frozen') - raises(PropertiesOptionError, "api.option('gc.dummy').value.set(True)") + cfg = Config(descr) + cfg.property.read_write() + cfg.option('bool').value.set(False) + cfg.property.add('freeze') + cfg.option('gc.dummy').property.add('frozen') + raises(PropertiesOptionError, "cfg.option('gc.dummy').value.set(True)") -def test_callback(): +def test_callback(config_type): val1 = StrOption('val1', "", callback=return_val) val2 = StrOption('val2', "") maconfig = OptionDescription('rootconfig', '', [val1, val2]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1').option.callbacks() != (None, None) - assert api.option('val2').option.callbacks() == (None, None) - assert api.option('val1').value.get() == 'val' - api.option('val1').value.set('new-val') - assert api.option('val1').value.get() == 'new-val' - api.option('val1').value.reset() - assert api.option('val1').value.get() == 'val' + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + if config_type != 'tiramisu-api': + assert cfg.option('val1').option.callbacks() != (None, None) + assert cfg.option('val2').option.callbacks() == (None, None) + assert cfg.option('val1').value.get() == 'val' + cfg.option('val1').value.set('new-val') + assert cfg.option('val1').value.get() == 'new-val' + cfg.option('val1').value.reset() + assert cfg.option('val1').value.get() == 'val' def test_callback_params_without_callback(): @@ -281,8 +289,8 @@ def test_callback_with_context(): params = Params((context,), {'value': value}) val1 = StrOption("val1", "", callback=is_config, callback_params=params) maconfig = OptionDescription('rootconfig', '', [val1]) - api = Config(maconfig) - assert api.option('val1').value.get() == 'yes' + cfg = Config(maconfig) + assert cfg.option('val1').value.get() == 'yes' def test_callback_with_context_named(): @@ -290,15 +298,16 @@ def test_callback_with_context_named(): params = Params(kwargs={'config': context}) val1 = StrOption("val1", "", callback=is_config, callback_params=params) maconfig = OptionDescription('rootconfig', '', [val1]) - api = Config(maconfig) - assert api.option('val1').value.get() == 'yes' + cfg = Config(maconfig) + assert cfg.option('val1').value.get() == 'yes' -def test_callback_with_error(): +def test_callback_with_error(config_type): val1 = StrOption("val1", "", callback=is_config, callback_params=Params(ParamValue('string'), kwargs={'value': ParamValue('string')})) maconfig = OptionDescription('rootconfig', '', [val1]) - api = Config(maconfig) - assert api.option('val1').value.get() == 'no' + cfg = Config(maconfig) + cfg = get_config(cfg, config_type) + assert cfg.option('val1').value.get() == 'no' def test_callback_with_context_value(): @@ -307,66 +316,72 @@ def test_callback_with_context_value(): val1 = StrOption("val1", "") val2 = StrOption("val2", "", callback=ret_from_config, callback_params=params) maconfig = OptionDescription('rootconfig', '', [val1, val2]) - api = Config(maconfig) - api.option('val1').value.set('yes') - assert api.option('val1').value.get() == 'yes' - assert api.option('val2').value.get() == 'yes' - api.option('val1').value.set('no') - assert api.option('val1').value.get() == 'no' - assert api.option('val2').value.get() == 'no' + cfg = Config(maconfig) + cfg.option('val1').value.set('yes') + assert cfg.option('val1').value.get() == 'yes' + assert cfg.option('val2').value.get() == 'yes' + cfg.option('val1').value.set('no') + assert cfg.option('val1').value.get() == 'no' + assert cfg.option('val2').value.get() == 'no' -def test_callback_value(): +def test_callback_value(config_type): val1 = StrOption('val1', "", 'val') val2 = StrOption('val2', "", callback=return_value, callback_params=Params(ParamOption(val1))) val3 = StrOption('val3', "", callback=return_value, callback_params=Params(ParamValue('yes'))) val4 = StrOption('val4', "", callback=return_value, callback_params=Params(kwargs={'value': ParamOption(val1)})) val5 = StrOption('val5', "", callback=return_value, callback_params=Params(ParamValue('yes'))) maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4, val5]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1').value.get() == 'val' - assert api.option('val2').value.get() == 'val' - assert api.option('val4').value.get() == 'val' - api.option('val1').value.set('new-val') - assert api.option('val1').value.get() == 'new-val' - assert api.option('val2').value.get() == 'new-val' - assert api.option('val4').value.get() == 'new-val' - api.option('val1').value.reset() - assert api.option('val1').value.get() == 'val' - assert api.option('val2').value.get() == 'val' - assert api.option('val3').value.get() == 'yes' - assert api.option('val4').value.get() == 'val' - assert api.option('val5').value.get() == 'yes' + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1').value.get() == 'val' + assert cfg.option('val2').value.get() == 'val' + assert cfg.option('val4').value.get() == 'val' + cfg.option('val1').value.set('new-val') + assert cfg.option('val1').value.get() == 'new-val' + assert cfg.option('val2').value.get() == 'new-val' + assert cfg.option('val4').value.get() == 'new-val' + cfg.option('val1').value.reset() + assert cfg.option('val1').value.get() == 'val' + assert cfg.option('val2').value.get() == 'val' + assert cfg.option('val3').value.get() == 'yes' + assert cfg.option('val4').value.get() == 'val' + assert cfg.option('val5').value.get() == 'yes' -def test_callback_value_tuple(): +def test_callback_value_tuple(config_type): val1 = StrOption('val1', "", 'val1') val2 = StrOption('val2', "", 'val2') val3 = StrOption('val3', "", callback=return_concat, callback_params=Params((ParamOption(val1), ParamOption(val2)))) val4 = StrOption('val4', "", callback=return_concat, callback_params=Params((ParamValue('yes'), ParamValue('no')))) maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1').value.get() == 'val1' - assert api.option('val2').value.get() == 'val2' - assert api.option('val3').value.get() == 'val1.val2' - assert api.option('val4').value.get() == 'yes.no' - api.option('val1').value.set('new-val') - assert api.option('val3').value.get() == 'new-val.val2' - api.option('val1').value.reset() - assert api.option('val3').value.get() == 'val1.val2' + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1').value.get() == 'val1' + assert cfg.option('val2').value.get() == 'val2' + assert cfg.option('val3').value.get() == 'val1.val2' + assert cfg.option('val4').value.get() == 'yes.no' + cfg.option('val1').value.set('new-val') + assert cfg.option('val3').value.get() == 'new-val.val2' + cfg.option('val1').value.reset() + assert cfg.option('val3').value.get() == 'val1.val2' -def test_callback_value_force_permissive(): +def test_callback_value_force_permissive2(config_type): + config_type = 'tiramisu-api' val1 = StrOption('val1', "", 'val', properties=('disabled',)) val2 = StrOption('val2', "", callback=return_value, callback_params=Params(ParamOption(val1))) val3 = StrOption('val3', "", callback=return_value, callback_params=Params(ParamOption(val1, True))) maconfig = OptionDescription('rootconfig', '', [val1, val2, val3]) - api = Config(maconfig) - api.property.read_only() - raises(ConfigError, "api.option('val2').value.get()") - api.option('val3').value.get() is None + cfg = Config(maconfig) + cfg.property.read_only() + if config_type != 'tiramisu-api': + raises(ConfigError, "cfg.option('val2').value.get()") + cfg.option('val3').value.get() is None + else: + raises(ConfigError, "get_config(cfg, config_type)") def test_callback_value_force_permissive_kwargs(): @@ -374,36 +389,37 @@ def test_callback_value_force_permissive_kwargs(): val2 = StrOption('val2', "", callback=return_value, callback_params=Params(value=ParamOption(val1))) val3 = StrOption('val3', "", callback=return_value, callback_params=Params(value=ParamOption(val1, True))) maconfig = OptionDescription('rootconfig', '', [val1, val2, val3]) - api = Config(maconfig) - api.property.read_only() - raises(ConfigError, "api.option('val2').value.get()") - api.option('val3').value.get() is None + cfg = Config(maconfig) + cfg.property.read_only() + raises(ConfigError, "cfg.option('val2').value.get()") + cfg.option('val3').value.get() is None -def test_callback_symlink(): +def test_callback_symlink(config_type): val1 = StrOption('val1', "", 'val') val2 = SymLinkOption('val2', val1) val3 = StrOption('val3', "", callback=return_value, callback_params=Params(ParamOption(val2))) maconfig = OptionDescription('rootconfig', '', [val1, val2, val3]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1').value.get() == 'val' - assert api.option('val2').value.get() == 'val' - assert api.option('val3').value.get() == 'val' - api.option('val1').value.set('new-val') - assert api.option('val1').value.get() == 'new-val' - assert api.option('val3').value.get() == 'new-val' - api.option('val1').value.reset() - assert api.option('val1').value.get() == 'val' - assert api.option('val3').value.get() == 'val' + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1').value.get() == 'val' + assert cfg.option('val2').value.get() == 'val' + assert cfg.option('val3').value.get() == 'val' + cfg.option('val1').value.set('new-val') + assert cfg.option('val1').value.get() == 'new-val' + assert cfg.option('val3').value.get() == 'new-val' + cfg.option('val1').value.reset() + assert cfg.option('val1').value.get() == 'val' + assert cfg.option('val3').value.get() == 'val' def test_callback_list(): val1 = StrOption('val1', "", callback=return_list) maconfig = OptionDescription('rootconfig', '', [val1]) - api = Config(maconfig) - api.property.read_write() - raises(ValueError, "api.option('val1').value.get()") + cfg = Config(maconfig) + cfg.property.read_write() + raises(ValueError, "cfg.option('val1').value.get()") def test_callback_list2(): @@ -411,28 +427,29 @@ def test_callback_list2(): #val2 = StrOption('val2', "", callback=return_value, callback_params=Params(ParamOption(val1))) val2 = StrOption('val2', "", callback=return_value, callback_params=Params(ParamOption(val1))) # , 'forcepermissive': False}]}) maconfig = OptionDescription('rootconfig', '', [val1, val2]) - api = Config(maconfig) - api.property.read_write() - raises(ValueError, "api.option('val1').value.get()") + cfg = Config(maconfig) + cfg.property.read_write() + raises(ValueError, "cfg.option('val1').value.get()") #cfg.val2 - raises(ValueError, "api.option('val2').value.get()") + raises(ValueError, "cfg.option('val2').value.get()") -def test_callback_multi(): +def test_callback_multi(config_type): val1 = StrOption('val1', "", callback=return_val, multi=True) maconfig = OptionDescription('rootconfig', '', [val1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1').value.get() == ['val'] - api.option('val1').value.set(['new-val']) - assert api.option('val1').value.get() == ['new-val'] - api.option('val1').value.set(['new-val', 'new-val2']) - assert api.option('val1').value.get() == ['new-val', 'new-val2'] - api.option('val1').value.reset() - assert api.option('val1').value.get() == ['val'] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1').value.get() == ['val'] + cfg.option('val1').value.set(['new-val']) + assert cfg.option('val1').value.get() == ['new-val'] + cfg.option('val1').value.set(['new-val', 'new-val2']) + assert cfg.option('val1').value.get() == ['new-val', 'new-val2'] + cfg.option('val1').value.reset() + assert cfg.option('val1').value.get() == ['val'] -def test_callback_multi_value(): +def test_callback_multi_value(config_type): val1 = StrOption('val1', "", ['val'], multi=True) #val2 = StrOption('val2', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val1))) #val3 = StrOption('val3', "", multi=True, callback=return_value, callback_params=Params(ParamValue('yes'))) @@ -446,136 +463,148 @@ def test_callback_multi_value(): val3 = StrOption('val3', "", multi=True, callback=return_value, callback_params=params2) val4 = StrOption('val4', "", multi=True, callback=return_list2, callback_params=params3) maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1').value.get() == ['val'] - assert api.option('val2').value.get() == ['val'] - assert api.option('val4').value.get() == ['val', 'yes'] - api.option('val1').value.set(['new-val']) - assert api.option('val1').value.get() == ['new-val'] - assert api.option('val2').value.get() == ['new-val'] - assert api.option('val4').value.get() == ['new-val', 'yes'] - api.option('val1').value.set(['new-val', 'new-val2']) - assert api.option('val1').value.get() == ['new-val', 'new-val2'] - assert api.option('val2').value.get() == ['new-val', 'new-val2'] - assert api.option('val4').value.get() == ['new-val', 'new-val2', 'yes'] - api.option('val1').value.reset() - assert api.option('val1').value.get() == ['val'] - assert api.option('val2').value.get() == ['val'] - assert api.option('val3').value.get() == ['yes'] - assert api.option('val4').value.get() == ['val', 'yes'] - api.option('val2').value.set(['val', 'new']) - assert api.option('val1').value.get() == ['val'] - assert api.option('val2').value.get() == ['val', 'new'] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1').value.get() == ['val'] + assert cfg.option('val2').value.get() == ['val'] + assert cfg.option('val4').value.get() == ['val', 'yes'] + cfg.option('val1').value.set(['new-val']) + assert cfg.option('val1').value.get() == ['new-val'] + assert cfg.option('val2').value.get() == ['new-val'] + assert cfg.option('val4').value.get() == ['new-val', 'yes'] + cfg.option('val1').value.set(['new-val', 'new-val2']) + assert cfg.option('val1').value.get() == ['new-val', 'new-val2'] + assert cfg.option('val2').value.get() == ['new-val', 'new-val2'] + assert cfg.option('val4').value.get() == ['new-val', 'new-val2', 'yes'] + cfg.option('val1').value.reset() + assert cfg.option('val1').value.get() == ['val'] + assert cfg.option('val2').value.get() == ['val'] + assert cfg.option('val3').value.get() == ['yes'] + assert cfg.option('val4').value.get() == ['val', 'yes'] + cfg.option('val2').value.set(['val', 'new']) + assert cfg.option('val1').value.get() == ['val'] + assert cfg.option('val2').value.get() == ['val', 'new'] -def test_callback_multi_list(): +def test_callback_multi_list(config_type): val1 = StrOption('val1', "", callback=return_list, multi=True) maconfig = OptionDescription('rootconfig', '', [val1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1').value.get() == ['val', 'val'] - api.option('val1').value.set(['new-val']) - assert api.option('val1').value.get() == ['new-val'] - api.option('val1').value.set(['new-val', 'new-val2']) - assert api.option('val1').value.get() == ['new-val', 'new-val2'] - api.option('val1').value.reset() - assert api.option('val1').value.get() == ['val', 'val'] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1').value.get() == ['val', 'val'] + cfg.option('val1').value.set(['new-val']) + assert cfg.option('val1').value.get() == ['new-val'] + cfg.option('val1').value.set(['new-val', 'new-val2']) + assert cfg.option('val1').value.get() == ['new-val', 'new-val2'] + cfg.option('val1').value.reset() + assert cfg.option('val1').value.get() == ['val', 'val'] -def test_callback_multi_list_extend(): +def test_callback_multi_list_extend(config_type): val1 = StrOption('val1', "", callback=return_list2, callback_params=Params((ParamValue(['1', '2', '3']), ParamValue(['4', '5']))), multi=True) maconfig = OptionDescription('rootconfig', '', [val1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1').value.get() == ['1', '2', '3', '4', '5'] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1').value.get() == ['1', '2', '3', '4', '5'] -def test_callback_multi_callback(): +def test_callback_multi_callback(config_type): val1 = StrOption('val1', "", multi=True, callback=return_val) interface1 = OptionDescription('val1', '', [val1]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1.val1').value.get() == ['val'] - api.option('val1.val1').value.set(['val1', undefined]) - assert api.option('val1.val1').value.get() == ['val1', 'val'] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1.val1').value.get() == ['val'] + cfg.option('val1.val1').value.set(['val1', undefined]) + assert cfg.option('val1.val1').value.get() == ['val1', 'val'] -def test_callback_leader_and_followers_leader(): +def test_callback_leader_and_followers_leader(config_type): val1 = StrOption('val1', "", multi=True, callback=return_val) val2 = StrOption('val2', "", multi=True) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1.val1').value.get() == ['val'] - api.option('val1.val1').value.set([undefined, undefined]) - assert api.option('val1.val1').value.get() == ['val', 'val'] - assert api.option('val1.val2', 0).value.get() == None - assert api.option('val1.val2', 1).value.get() == None + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1.val1').value.get() == ['val'] + cfg.option('val1.val1').value.set([undefined, undefined]) + assert cfg.option('val1.val1').value.get() == ['val', 'val'] + assert cfg.option('val1.val2', 0).value.get() == None + assert cfg.option('val1.val2', 1).value.get() == None -def test_callback_follower(): +def test_callback_follower(config_type): val1 = StrOption('val1', "", multi=True) val2 = StrOption('val2', "", multi=True, callback=return_value3, callback_params=Params(ParamValue(['string', 'new']))) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.option('val1.val1').value.set(['val']) - assert api.option('val1.val2', 0).value.get() == 'string' - api.option('val1.val1').value.set(['val', 'val1']) - assert api.option('val1.val2', 0).value.get() == 'string' - assert api.option('val1.val2', 1).value.get() == 'new' - api.option('val1.val1').value.set(['val', 'val1', 'val2']) - assert api.option('val1.val2', 0).value.get() == 'string' - assert api.option('val1.val2', 1).value.get() == 'new' - assert api.option('val1.val2', 2).value.get() == None - api.option('val1.val1').value.set(['val', 'val1', 'val2', 'val3']) - assert api.option('val1.val2', 0).value.get() == 'string' - assert api.option('val1.val2', 1).value.get() == 'new' - assert api.option('val1.val2', 2).value.get() == None - assert api.option('val1.val2', 3).value.get() == None + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + cfg.option('val1.val1').value.set(['val']) + assert cfg.option('val1.val2', 0).value.get() == 'string' + cfg.option('val1.val1').value.set(['val', 'val1']) + assert cfg.option('val1.val2', 0).value.get() == 'string' + assert cfg.option('val1.val2', 1).value.get() == 'new' + cfg.option('val1.val1').value.set(['val', 'val1', 'val2']) + assert cfg.option('val1.val2', 0).value.get() == 'string' + assert cfg.option('val1.val2', 1).value.get() == 'new' + assert cfg.option('val1.val2', 2).value.get() == None + cfg.option('val1.val1').value.set(['val', 'val1', 'val2', 'val3']) + assert cfg.option('val1.val2', 0).value.get() == 'string' + assert cfg.option('val1.val2', 1).value.get() == 'new' + assert cfg.option('val1.val2', 2).value.get() == None + assert cfg.option('val1.val2', 3).value.get() == None -def test_callback_leader_and_followers_leader2(): +def test_callback_leader_and_followers_leader2(config_type): val1 = StrOption('val1', "", multi=True) val2 = StrOption('val2', "", multi=True, default_multi='val2') val3 = StrOption('val3', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val2))) val4 = StrOption('val4', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val3))) interface1 = Leadership('val1', '', [val1, val2, val3, val4]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.option('val1.val1').value.set(['val']) - assert api.option('val1.val4', 0).value.get() == 'val2' - assert api.option('val1.val3', 0).value.get() == 'val2' - assert api.option('val1.val2', 0).value.get() == 'val2' + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + cfg.option('val1.val1').value.set(['val']) + assert cfg.option('val1.val4', 0).value.get() == 'val2' + assert cfg.option('val1.val3', 0).value.get() == 'val2' + assert cfg.option('val1.val2', 0).value.get() == 'val2' -def test_callback_leader_and_followers_leader_mandatory(): +def test_callback_leader_and_followers_leader_mandatory(config_type): val = StrOption('val', "", default='val') val1 = StrOption('val1', "", multi=True, callback=return_value2, callback_params=Params(ParamOption(val)), properties=('mandatory',)) val3 = StrOption('val3', "", multi=True, callback=return_index, callback_params=Params(ParamOption(val1)), properties=('mandatory',)) val4 = StrOption('val4', "", multi=True, callback=return_index, callback_params=Params(ParamOption(val1)), properties=('mandatory',)) interface1 = Leadership('val1', '', [val1, val3, val4]) maconfig = OptionDescription('rootconfig', '', [val, interface1]) - api = Config(maconfig) - api.property.read_only() - assert api.option('val1.val3', 0).value.get() == 'val' - assert api.option('val1.val4', 0).value.get() == 'val' - assert api.option('val1.val1').value.get() == ['val'] - api.property.read_write() - api.option('val1.val1').value.set([undefined, 'val3']) - api.property.read_only() - assert api.option('val1.val1').value.get() == ['val', 'val3'] - assert api.option('val1.val3', 0).value.get() == 'val' - raises(PropertiesOptionError, "api.option('val1.val3', 1).value.get()") - raises(PropertiesOptionError, "api.option('val1.val4', 1).value.get()") + cfg_ori = Config(maconfig) + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('val1.val3', 0).value.get() == 'val' + assert cfg.option('val1.val4', 0).value.get() == 'val' + assert cfg.option('val1.val1').value.get() == ['val'] + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('val1.val1').value.set([undefined, 'val3']) + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('val1.val1').value.get() == ['val', 'val3'] + assert cfg.option('val1.val3', 0).value.get() == 'val' + if config_type != 'tiramisu-api': + # FIXME + raises(PropertiesOptionError, "cfg.option('val1.val3', 1).value.get()") + raises(PropertiesOptionError, "cfg.option('val1.val4', 1).value.get()") -def test_callback_leader_and_followers_leader_mandatory2(): +def test_callback_leader_and_followers_leader_mandatory2(config_type): val = StrOption('val', "", default='val') val_ = StrOption('val_', "", default='val_') val1 = StrOption('val1', "", multi=True, callback=return_index, callback_params=Params(ParamOption(val), {'val2': ParamOption(val_)}), properties=('mandatory',)) @@ -583,27 +612,32 @@ def test_callback_leader_and_followers_leader_mandatory2(): val4 = StrOption('val4', "", multi=True, callback=return_index, callback_params=Params(ParamOption(val1), {'val2': ParamOption(val_)}), properties=('mandatory',)) interface1 = Leadership('val1', '', [val1, val3, val4]) maconfig = OptionDescription('rootconfig', '', [val, val_, interface1]) - api = Config(maconfig) - api.property.read_only() - assert api.option('val1.val3', 0).value.get() == 'val' - assert api.option('val1.val3', 1).value.get() == 'val_' - assert api.option('val1.val4', 0).value.get() == 'val' - assert api.option('val1.val4', 1).value.get() == 'val_' - assert api.option('val1.val1').value.get() == ['val', 'val_'] - api.property.read_write() - api.option('val1.val1').value.set(['val', 'val_', 'val3']) - assert api.option('val1.val1').value.get() == ['val', 'val_', 'val3'] - api.property.read_only() - assert api.option('val1.val3', 0).value.get() == 'val' - assert api.option('val1.val3', 1).value.get() == 'val_' - assert api.option('val1.val4', 0).value.get() == 'val' - assert api.option('val1.val4', 1).value.get() == 'val_' - raises(PropertiesOptionError, "api.option('val1.val3', 2).value.get()") - raises(PropertiesOptionError, "api.option('val1.val4', 2).value.get()") - assert api.option('val1.val1').value.get() == ['val', 'val_', 'val3'] + cfg_ori = Config(maconfig) + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('val1.val3', 0).value.get() == 'val' + assert cfg.option('val1.val3', 1).value.get() == 'val_' + assert cfg.option('val1.val4', 0).value.get() == 'val' + assert cfg.option('val1.val4', 1).value.get() == 'val_' + assert cfg.option('val1.val1').value.get() == ['val', 'val_'] + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('val1.val1').value.set(['val', 'val_', 'val3']) + assert cfg.option('val1.val1').value.get() == ['val', 'val_', 'val3'] + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('val1.val3', 0).value.get() == 'val' + assert cfg.option('val1.val3', 1).value.get() == 'val_' + assert cfg.option('val1.val4', 0).value.get() == 'val' + assert cfg.option('val1.val4', 1).value.get() == 'val_' + if config_type != 'tiramisu-api': + # FIXME + raises(PropertiesOptionError, "cfg.option('val1.val3', 2).value.get()") + raises(PropertiesOptionError, "cfg.option('val1.val4', 2).value.get()") + assert cfg.option('val1.val1').value.get() == ['val', 'val_', 'val3'] -def test_callback_leader_and_followers_leader_mandatory3(): +def test_callback_leader_and_followers_leader_mandatory3(config_type): val = StrOption('val', "", default='val') val_ = StrOption('val_', "", default='val_') val1 = StrOption('val1', "", multi=True, callback=return_value2, callback_params=Params(ParamOption(val), {'val': ParamOption(val_)}), properties=('mandatory',)) @@ -611,46 +645,52 @@ def test_callback_leader_and_followers_leader_mandatory3(): val4 = StrOption('val4', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val1)), properties=('mandatory',)) interface1 = Leadership('val1', '', [val1, val3, val4]) maconfig = OptionDescription('rootconfig', '', [val, val_, interface1]) - api = Config(maconfig) - api.property.read_only() - assert api.option('val1.val3', 0).value.get() == 'val' - assert api.option('val1.val3', 1).value.get() == 'val_' - assert api.option('val1.val4', 0).value.get() == 'val' - assert api.option('val1.val4', 1).value.get() == 'val_' - assert api.option('val1.val1').value.get() == ['val', 'val_'] - api.property.read_write() - api.option('val1.val1').value.set(['val', 'val_', 'val3']) - api.property.read_only() - assert api.option('val1.val3', 0).value.get() == 'val' - assert api.option('val1.val3', 1).value.get() == 'val_' - assert api.option('val1.val3', 2).value.get() == 'val3' - assert api.option('val1.val4', 0).value.get() == 'val' - assert api.option('val1.val4', 1).value.get() == 'val_' - assert api.option('val1.val4', 2).value.get() == 'val3' - assert api.option('val1.val1').value.get() == ['val', 'val_', 'val3'] + cfg_ori = Config(maconfig) + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('val1.val3', 0).value.get() == 'val' + assert cfg.option('val1.val3', 1).value.get() == 'val_' + assert cfg.option('val1.val4', 0).value.get() == 'val' + assert cfg.option('val1.val4', 1).value.get() == 'val_' + assert cfg.option('val1.val1').value.get() == ['val', 'val_'] + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('val1.val1').value.set(['val', 'val_', 'val3']) + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('val1.val3', 0).value.get() == 'val' + assert cfg.option('val1.val3', 1).value.get() == 'val_' + assert cfg.option('val1.val3', 2).value.get() == 'val3' + assert cfg.option('val1.val4', 0).value.get() == 'val' + assert cfg.option('val1.val4', 1).value.get() == 'val_' + assert cfg.option('val1.val4', 2).value.get() == 'val3' + assert cfg.option('val1.val1').value.get() == ['val', 'val_', 'val3'] -def test_callback_leader_and_followers_leader_mandatory4(): +def test_callback_leader_and_followers_leader_mandatory4(config_type): val = StrOption('val', "", default='val') val1 = StrOption('val1', "", multi=True, callback=return_value2, callback_params=Params(ParamOption(val)), properties=('mandatory',)) val3 = StrOption('val3', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val1)), properties=('mandatory',)) val4 = StrOption('val4', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val1)), properties=('mandatory',)) interface1 = Leadership('val1', '', [val1, val3, val4]) maconfig = OptionDescription('rootconfig', '', [val, interface1]) - api = Config(maconfig) - api.property.read_only() - #raises(IndexError, "api.option('val1.val3').value.get()") - assert api.option('val1.val3', 0).value.get() == 'val' - assert api.option('val1.val4', 0).value.get() == 'val' - assert api.option('val1.val1').value.get() == ['val'] - api.property.read_write() - api.option('val1.val1').value.set(['val', 'val3']) - api.property.read_only() - assert api.option('val1.val1').value.get() == ['val', 'val3'] - assert api.option('val1.val3', 0).value.get() == 'val' - assert api.option('val1.val3', 1).value.get() == 'val3' - assert api.option('val1.val4', 0).value.get() == 'val' - assert api.option('val1.val4', 1).value.get() == 'val3' + cfg_ori = Config(maconfig) + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + #raises(IndexError, "cfg.option('val1.val3').value.get()") + assert cfg.option('val1.val3', 0).value.get() == 'val' + assert cfg.option('val1.val4', 0).value.get() == 'val' + assert cfg.option('val1.val1').value.get() == ['val'] + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('val1.val1').value.set(['val', 'val3']) + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('val1.val1').value.get() == ['val', 'val3'] + assert cfg.option('val1.val3', 0).value.get() == 'val' + assert cfg.option('val1.val3', 1).value.get() == 'val3' + assert cfg.option('val1.val4', 0).value.get() == 'val' + assert cfg.option('val1.val4', 1).value.get() == 'val3' def test_callback_leader_and_followers_leader3(): @@ -660,9 +700,10 @@ def test_callback_leader_and_followers_leader3(): val4 = StrOption('val4', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val3))) interface1 = Leadership('val1', '', [val1, val2, val3, val4]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - assert list(api.value.mandatory()) == ['val1.val1'] + cfg = Config(maconfig) + cfg.property.read_write() + # FIXME cfg = get_config(cfg, config_type) + assert list(cfg.value.mandatory()) == ['val1.val1'] def test_callback_leader_and_followers_leader4(): @@ -672,11 +713,12 @@ def test_callback_leader_and_followers_leader4(): val4 = StrOption('val4', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val3))) interface1 = Leadership('val1', '', [val1, val2, val3, val4]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - api.property.add('expert') - api.permissive.set(frozenset(['expert'])) - assert list(api.value.mandatory()) == [] + cfg = Config(maconfig) + cfg.property.read_write() + # FIXME cfg = get_config(cfg, config_type) + cfg.property.add('expert') + cfg.permissive.set(frozenset(['expert'])) + assert list(cfg.value.mandatory()) == [] def test_consistency_leader_and_followers_leader_mandatory_transitive(): @@ -691,16 +733,17 @@ def test_consistency_leader_and_followers_leader_mandatory_transitive(): interface1 = Leadership('val1', '', [val1, val2]) interface2 = Leadership('val3', '', [val3, val4]) maconfig = OptionDescription('rootconfig', '', [interface1, interface2]) - api = Config(maconfig) - api.property.read_write() + cfg = Config(maconfig) + cfg.property.read_write() + # FIXME cfg = get_config(cfg, config_type) try: - api.option('val1.val1').value.get() + cfg.option('val1.val1').value.get() except PropertiesOptionError as error: assert str(error) == str(_('cannot access to {0} "{1}" because "{2}" has {3} {4}').format('option', 'val1', 'val2', _('property'), '"disabled"')) else: raise Exception('must raises') - raises(PropertiesOptionError, "api.option('val3.val3').value.get()") - assert list(api.value.mandatory()) == [] + raises(PropertiesOptionError, "cfg.option('val3.val3').value.get()") + assert list(cfg.value.mandatory()) == [] def test_consistency_leader_and_followers_leader_mandatory_non_transitive(): @@ -715,88 +758,93 @@ def test_consistency_leader_and_followers_leader_mandatory_non_transitive(): interface1 = Leadership('val1', '', [val1, val2]) interface2 = Leadership('val3', '', [val3, val4]) maconfig = OptionDescription('rootconfig', '', [interface1, interface2]) - api = Config(maconfig) - api.property.read_write() - if TIRAMISU_VERSION == 2: - assert list(api.value.mandatory()) == ["val1.val1", "val1.val2"] - else: - assert list(api.value.mandatory()) == ["val1.val1"] + cfg = Config(maconfig) + cfg.property.read_write() + # FIXME cfg = get_config(cfg, config_type) + assert list(cfg.value.mandatory()) == ["val1.val1"] -def test_callback_leader_and_followers_leader_list(): +def test_callback_leader_and_followers_leader_list(config_type): val1 = StrOption('val1', "", multi=True, callback=return_list) val2 = StrOption('val2', "", multi=True) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1.val1').value.get() == ['val', 'val'] - assert api.option('val1.val2', 0).value.get() == None - assert api.option('val1.val2', 1).value.get() == None - api.option('val1.val1').value.set(['val', 'val', undefined]) - assert api.option('val1.val1').value.get() == ['val', 'val', None] - assert api.option('val1.val2', 0).value.get() == None - assert api.option('val1.val2', 1).value.get() == None - assert api.option('val1.val2', 1).value.get() == None - api.option('val1.val1').value.reset() - assert api.option('val1.val1').value.get() == ['val', 'val'] - assert api.option('val1.val2', 0).value.get() == None - assert api.option('val1.val2', 1).value.get() == None - api.option('val1.val1').value.pop(1) - assert api.option('val1.val1').value.get() == ['val'] - assert api.option('val1.val2', 0).value.get() == None + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1.val1').value.get() == ['val', 'val'] + assert cfg.option('val1.val2', 0).value.get() == None + assert cfg.option('val1.val2', 1).value.get() == None + cfg.option('val1.val1').value.set(['val', 'val', undefined]) + assert cfg.option('val1.val1').value.get() == ['val', 'val', None] + assert cfg.option('val1.val2', 0).value.get() == None + assert cfg.option('val1.val2', 1).value.get() == None + assert cfg.option('val1.val2', 2).value.get() == None + cfg.option('val1.val1').value.reset() + assert cfg.option('val1.val1').value.get() == ['val', 'val'] + assert cfg.option('val1.val2', 0).value.get() == None + assert cfg.option('val1.val2', 1).value.get() == None + cfg.option('val1.val1').value.pop(1) + assert cfg.option('val1.val1').value.get() == ['val'] + assert cfg.option('val1.val2', 0).value.get() == None -def test_callback_leader_and_followers_leader_follower_list(): +def test_callback_leader_and_followers_leader_follower_list(config_type): val1 = StrOption('val1', "", multi=True) val2 = StrOption('val2', "", multi=True, callback=return_list) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1.val1').value.get() == [] - api.option('val1.val1').value.set(['val1']) - raises(LeadershipError, "api.option('val1.val2', 0).value.get()") + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1.val1').value.get() == [] + if config_type == 'tiramisu-api': + # when "tiramisu-api", raise when set and not in get function + raises(ConfigError, "cfg.option('val1.val1').value.set(['val1'])") + else: + cfg.option('val1.val1').value.set(['val1']) + raises(LeadershipError, "cfg.option('val1.val2', 0).value.get()") -def test_callback_leader_and_followers_follower(): +def test_callback_leader_and_followers_follower(config_type): val1 = StrOption('val1', "", multi=True) val2 = StrOption('val2', "", multi=True, callback=return_val) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1.val1').value.get() == [] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1.val1').value.get() == [] # - api.option('val1.val1').value.set(['val1']) - assert api.option('val1.val1').value.get() == ['val1'] - assert api.option('val1.val2', 0).value.get() == 'val' + cfg.option('val1.val1').value.set(['val1']) + assert cfg.option('val1.val1').value.get() == ['val1'] + assert cfg.option('val1.val2', 0).value.get() == 'val' # - api.option('val1.val1').value.set(['val1', 'val2']) - assert api.option('val1.val1').value.get() == ['val1', 'val2'] - assert api.option('val1.val2', 0).value.get() == 'val' - assert api.option('val1.val2', 1).value.get() == 'val' + cfg.option('val1.val1').value.set(['val1', 'val2']) + assert cfg.option('val1.val1').value.get() == ['val1', 'val2'] + assert cfg.option('val1.val2', 0).value.get() == 'val' + assert cfg.option('val1.val2', 1).value.get() == 'val' # - api.option('val1.val1').value.set(['val1', 'val2', 'val3']) - assert api.option('val1.val1').value.get() == ['val1', 'val2', 'val3'] - assert api.option('val1.val2', 0).value.get() == 'val' - assert api.option('val1.val2', 1).value.get() == 'val' - assert api.option('val1.val2', 2).value.get() == 'val' + cfg.option('val1.val1').value.set(['val1', 'val2', 'val3']) + assert cfg.option('val1.val1').value.get() == ['val1', 'val2', 'val3'] + assert cfg.option('val1.val2', 0).value.get() == 'val' + assert cfg.option('val1.val2', 1).value.get() == 'val' + assert cfg.option('val1.val2', 2).value.get() == 'val' # - api.option('val1.val1').value.pop(2) - assert api.option('val1.val1').value.get() == ['val1', 'val2'] - assert api.option('val1.val2', 0).value.get() == 'val' - assert api.option('val1.val2', 1).value.get() == 'val' + cfg.option('val1.val1').value.pop(2) + assert cfg.option('val1.val1').value.get() == ['val1', 'val2'] + assert cfg.option('val1.val2', 0).value.get() == 'val' + assert cfg.option('val1.val2', 1).value.get() == 'val' # - api.option('val1.val2', 0).value.set('val2') - api.option('val1.val2', 1).value.set('val2') - assert api.option('val1.val2', 0).value.get() == 'val2' - assert api.option('val1.val2', 1).value.get() == 'val2' + cfg.option('val1.val2', 0).value.set('val2') + cfg.option('val1.val2', 1).value.set('val2') + assert cfg.option('val1.val2', 0).value.get() == 'val2' + assert cfg.option('val1.val2', 1).value.get() == 'val2' # - api.option('val1.val1').value.set(['val1', 'val2', 'val3']) - assert api.option('val1.val2', 0).value.get() == 'val2' - assert api.option('val1.val2', 1).value.get() == 'val2' - assert api.option('val1.val2', 2).value.get() == 'val' + cfg.option('val1.val1').value.set(['val1', 'val2', 'val3']) + assert cfg.option('val1.val2', 0).value.get() == 'val2' + assert cfg.option('val1.val2', 1).value.get() == 'val2' + assert cfg.option('val1.val2', 2).value.get() == 'val' def test_callback_leader_and_followers(): @@ -804,45 +852,50 @@ def test_callback_leader_and_followers(): val2 = StrOption('val2', "", multi=True, callback=return_val) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() + cfg = Config(maconfig) + cfg.property.read_write() -def test_callback_leader_and_followers_follower_cal(): +def test_callback_leader_and_followers_follower_cal(config_type): val3 = StrOption('val3', "", multi=True) val1 = StrOption('val1', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val3))) val2 = StrOption('val2', "", multi=True, callback=return_val) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1, val3]) - api = Config(maconfig) - api.property.read_write() + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) # - assert api.option('val3').value.get() == [] - assert api.option('val1.val1').value.get() == [] + assert cfg.option('val3').value.get() == [] + assert cfg.option('val1.val1').value.get() == [] # - api.option('val1.val1').value.set(['val1']) - api.option('val3').value.set(['val1']) - assert api.option('val1.val1').value.get() == ['val1'] - assert api.option('val1.val2', 0).value.get() == 'val' + cfg.option('val1.val1').value.set(['val1']) + cfg.option('val3').value.set(['val1']) + assert cfg.option('val1.val1').value.get() == ['val1'] + assert cfg.option('val1.val2', 0).value.get() == 'val' # - api.option('val1.val1').value.reset() - api.option('val1.val2', 0).value.set('val') + cfg.option('val1.val1').value.reset() + cfg.option('val1.val2', 0).value.set('val') # - api.option('val3').value.set(['val1', 'val2']) - assert api.option('val1.val2', 0).value.get() == 'val' - assert api.option('val1.val2', 1).value.get() == 'val' - assert api.option('val1.val1').value.get() == ['val1', 'val2'] + cfg.option('val3').value.set(['val1', 'val2']) + assert cfg.option('val1.val2', 0).value.get() == 'val' + assert cfg.option('val1.val2', 1).value.get() == 'val' + assert cfg.option('val1.val1').value.get() == ['val1', 'val2'] # len of follower is higher than leader's one - api.option('val1.val2', 0).value.set('val1') - api.option('val1.val2', 1).value.set('val2') - api.option('val3').value.set(['val1']) - assert api.option('val1.val1').value.get() == ['val1'] - raises(LeadershipError, "api.option('val1.val2', 0).value.get()") + cfg.option('val1.val2', 0).value.set('val1') + cfg.option('val1.val2', 1).value.set('val2') + if config_type == 'tiramisu-api': + # when "tiramisu-api", raise when set and not in get function + raises(ConfigError, "cfg.option('val3').value.set(['val1'])") + else: + cfg.option('val3').value.set(['val1']) + assert cfg.option('val1.val1').value.get() == ['val1'] + raises(LeadershipError, "cfg.option('val1.val2', 0).value.get()") # - api.option('val3').value.set(['val1', 'val2', 'val3']) - assert api.option('val1.val2', 0).value.get() == 'val1' - assert api.option('val1.val2', 1).value.get() == 'val2' - assert api.option('val1.val2', 2).value.get() == 'val' + cfg.option('val3').value.set(['val1', 'val2', 'val3']) + assert cfg.option('val1.val2', 0).value.get() == 'val1' + assert cfg.option('val1.val2', 1).value.get() == 'val2' + assert cfg.option('val1.val2', 2).value.get() == 'val' def test_callback_leader_and_followers_leader_disabled(): @@ -851,11 +904,11 @@ def test_callback_leader_and_followers_leader_disabled(): val2 = StrOption('val2', "", multi=True) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - raises(PropertiesOptionError, "api.option('val1.val1').value.get()") - raises(PropertiesOptionError, "api.option('val1.val1').value.set(['yes'])") - raises(PropertiesOptionError, "api.option('val1.val2', 0).value.get()") + cfg = Config(maconfig) + cfg.property.read_write() + raises(PropertiesOptionError, "cfg.option('val1.val1').value.get()") + raises(PropertiesOptionError, "cfg.option('val1.val1').value.set(['yes'])") + raises(PropertiesOptionError, "cfg.option('val1.val2', 0).value.get()") def test_callback_leader_and_followers_leader_callback_disabled(): @@ -864,14 +917,14 @@ def test_callback_leader_and_followers_leader_callback_disabled(): val2 = StrOption('val2', "", multi=True) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1, val0]) - api = Config(maconfig) - api.property.read_write() - raises(ConfigError, "api.option('val1.val1').value.get()") - raises(ConfigError, "api.option('val1.val2').value.get()") - api.property.pop('disabled') - api.option('val1.val1').value.set([]) - api.property.add('disabled') - assert api.option('val1.val1').value.get() == [] + cfg = Config(maconfig) + cfg.property.read_write() + raises(ConfigError, "cfg.option('val1.val1').value.get()") + raises(ConfigError, "cfg.option('val1.val2').value.get()") + cfg.property.pop('disabled') + cfg.option('val1.val1').value.set([]) + cfg.property.add('disabled') + assert cfg.option('val1.val1').value.get() == [] def test_callback_leader_and_followers_follower_disabled(): @@ -879,26 +932,25 @@ def test_callback_leader_and_followers_follower_disabled(): val2 = StrOption('val2', "", multi=True, properties=('disabled',)) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1.val1').value.get() == [] - #raises(PropertiesOptionError, "api.option('val1.val2').value.get()") - api.option('val1.val1').value.set(['yes']) - assert api.option('val1.val1').value.get() == ['yes'] - api.property.pop('disabled') - assert api.option('val1.val2', 0).value.get() == None - api.option('val1.val2', 0).value.set('no') - api.option('val1.val1').value.set(['yes', 'yes2', 'yes3']) - api.option('val1.val2', 2).value.set('no1') - assert api.option('val1.val2', 0).value.get() == 'no' - assert api.option('val1.val2', 1).value.get() == None - assert api.option('val1.val2', 2).value.get() == 'no1' - api.property.add('disabled') - api.option('val1.val1').value.pop(0) - assert api.option('val1.val1').value.get() == ['yes2', 'yes3'] - api.property.pop('disabled') - assert api.option('val1.val2', 0).value.get() == None - assert api.option('val1.val2', 1).value.get() == 'no1' + cfg = Config(maconfig) + cfg.property.read_write() + assert cfg.option('val1.val1').value.get() == [] + cfg.option('val1.val1').value.set(['yes']) + assert cfg.option('val1.val1').value.get() == ['yes'] + cfg.property.pop('disabled') + assert cfg.option('val1.val2', 0).value.get() == None + cfg.option('val1.val2', 0).value.set('no') + cfg.option('val1.val1').value.set(['yes', 'yes2', 'yes3']) + cfg.option('val1.val2', 2).value.set('no1') + assert cfg.option('val1.val2', 0).value.get() == 'no' + assert cfg.option('val1.val2', 1).value.get() == None + assert cfg.option('val1.val2', 2).value.get() == 'no1' + cfg.property.add('disabled') + cfg.option('val1.val1').value.pop(0) + assert cfg.option('val1.val1').value.get() == ['yes2', 'yes3'] + cfg.property.pop('disabled') + assert cfg.option('val1.val2', 0).value.get() == None + assert cfg.option('val1.val2', 1).value.get() == 'no1' def test_callback_leader_and_followers_follower_callback_disabled(): @@ -907,17 +959,17 @@ def test_callback_leader_and_followers_follower_callback_disabled(): val2 = StrOption('val2', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val0))) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1, val0]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1.val1').value.get() == [] - api.option('val1.val1').value.set(['yes']) - assert api.option('val1.val1').value.get() == ['yes'] - api.property.pop('disabled') - api.option('val1.val2', 0).value.set('no') - api.option('val1.val1').value.set(['yes', 'yes1']) - assert api.option('val1.val2', 0).value.get() == 'no' - api.property.add('disabled') - api.option('val1.val1').value.pop(1) + cfg = Config(maconfig) + cfg.property.read_write() + assert cfg.option('val1.val1').value.get() == [] + cfg.option('val1.val1').value.set(['yes']) + assert cfg.option('val1.val1').value.get() == ['yes'] + cfg.property.pop('disabled') + cfg.option('val1.val2', 0).value.set('no') + cfg.option('val1.val1').value.set(['yes', 'yes1']) + assert cfg.option('val1.val2', 0).value.get() == 'no' + cfg.property.add('disabled') + cfg.option('val1.val1').value.pop(1) def test_callback_leader_and_followers_value(): @@ -929,10 +981,10 @@ def test_callback_leader_and_followers_value(): val6 = StrOption('val6', "", multi=True, callback=return_value, callback_params=Params(ParamOption(val5))) interface1 = Leadership('val1', '', [val1, val2, val3, val5, val6]) maconfig = OptionDescription('rootconfig', '', [interface1, val4]) - api = Config(maconfig) - api.property.read_write() - api.option('val4').value.get() == ['val10', 'val11'] - assert api.option('val1.val1').value.get() == [] + cfg = Config(maconfig) + cfg.property.read_write() + cfg.option('val4').value.get() == ['val10', 'val11'] + assert cfg.option('val1.val1').value.get() == [] #raises(LeadershipError, "cfg.val1.val1") #raises(LeadershipError, "cfg.val1.val2") #raises(LeadershipError, "cfg.val1.val3") @@ -940,55 +992,55 @@ def test_callback_leader_and_followers_value(): #raises(LeadershipError, "cfg.val1.val6") # #default calculation has greater length - #raises(LeadershipError, "api.option('val1.val1').value.set(['val1']") + #raises(LeadershipError, "cfg.option('val1.val1').value.set(['val1']") # - api.option('val1.val1').value.set(['val1', 'val2']) - assert api.option('val1.val1').value.get() == ['val1', 'val2'] - assert api.option('val1.val2', 0).value.get() == 'val1' - assert api.option('val1.val2', 1).value.get() == 'val2' - assert api.option('val1.val3', 0).value.get() == 'yes' - assert api.option('val1.val3', 1).value.get() == 'yes' - raises(LeadershipError, "api.option('val1.val5', 0).value.get()") - raises(LeadershipError, "api.option('val1.val5', 1).value.get()") - raises(LeadershipError, "api.option('val1.val6', 0).value.get()") - raises(LeadershipError, "api.option('val1.val6', 1).value.get()") + cfg.option('val1.val1').value.set(['val1', 'val2']) + assert cfg.option('val1.val1').value.get() == ['val1', 'val2'] + assert cfg.option('val1.val2', 0).value.get() == 'val1' + assert cfg.option('val1.val2', 1).value.get() == 'val2' + assert cfg.option('val1.val3', 0).value.get() == 'yes' + assert cfg.option('val1.val3', 1).value.get() == 'yes' + raises(LeadershipError, "cfg.option('val1.val5', 0).value.get()") + raises(LeadershipError, "cfg.option('val1.val5', 1).value.get()") + raises(LeadershipError, "cfg.option('val1.val6', 0).value.get()") + raises(LeadershipError, "cfg.option('val1.val6', 1).value.get()") # - api.option('val1.val1').value.set(['val1', 'val2', 'val3']) - assert api.option('val1.val1').value.get() == ['val1', 'val2', 'val3'] - assert api.option('val1.val2', 0).value.get() == 'val1' - assert api.option('val1.val2', 1).value.get() == 'val2' - assert api.option('val1.val2', 2).value.get() == 'val3' - assert api.option('val1.val3', 0).value.get() == 'yes' - assert api.option('val1.val3', 1).value.get() == 'yes' - assert api.option('val1.val3', 2).value.get() == 'yes' - raises(LeadershipError, "api.option('val1.val5', 2).value.get()") - raises(LeadershipError, "api.option('val1.val6', 2).value.get()") + cfg.option('val1.val1').value.set(['val1', 'val2', 'val3']) + assert cfg.option('val1.val1').value.get() == ['val1', 'val2', 'val3'] + assert cfg.option('val1.val2', 0).value.get() == 'val1' + assert cfg.option('val1.val2', 1).value.get() == 'val2' + assert cfg.option('val1.val2', 2).value.get() == 'val3' + assert cfg.option('val1.val3', 0).value.get() == 'yes' + assert cfg.option('val1.val3', 1).value.get() == 'yes' + assert cfg.option('val1.val3', 2).value.get() == 'yes' + raises(LeadershipError, "cfg.option('val1.val5', 2).value.get()") + raises(LeadershipError, "cfg.option('val1.val6', 2).value.get()") # - api.option('val1.val1').value.pop(2) - assert api.option('val1.val1').value.get() == ['val1', 'val2'] - assert api.option('val1.val2', 0).value.get() == 'val1' - assert api.option('val1.val2', 1).value.get() == 'val2' - assert api.option('val1.val3', 0).value.get() == 'yes' - assert api.option('val1.val3', 1).value.get() == 'yes' + cfg.option('val1.val1').value.pop(2) + assert cfg.option('val1.val1').value.get() == ['val1', 'val2'] + assert cfg.option('val1.val2', 0).value.get() == 'val1' + assert cfg.option('val1.val2', 1).value.get() == 'val2' + assert cfg.option('val1.val3', 0).value.get() == 'yes' + assert cfg.option('val1.val3', 1).value.get() == 'yes' # - api.option('val1.val2', 0).value.set('val2') - api.option('val1.val2', 1).value.set('val2') - api.option('val1.val3', 0).value.set('val2') - api.option('val1.val3', 1).value.set('val2') - api.option('val1.val5', 0).value.set('val2') - api.option('val1.val5', 1).value.set('val2') - assert api.option('val1.val2', 0).value.get() == 'val2' - assert api.option('val1.val2', 1).value.get() == 'val2' - assert api.option('val1.val3', 0).value.get() == 'val2' - assert api.option('val1.val3', 1).value.get() == 'val2' - assert api.option('val1.val5', 0).value.get() == 'val2' - assert api.option('val1.val5', 1).value.get() == 'val2' - assert api.option('val1.val6', 0).value.get() == 'val2' - assert api.option('val1.val6', 1).value.get() == 'val2' + cfg.option('val1.val2', 0).value.set('val2') + cfg.option('val1.val2', 1).value.set('val2') + cfg.option('val1.val3', 0).value.set('val2') + cfg.option('val1.val3', 1).value.set('val2') + cfg.option('val1.val5', 0).value.set('val2') + cfg.option('val1.val5', 1).value.set('val2') + assert cfg.option('val1.val2', 0).value.get() == 'val2' + assert cfg.option('val1.val2', 1).value.get() == 'val2' + assert cfg.option('val1.val3', 0).value.get() == 'val2' + assert cfg.option('val1.val3', 1).value.get() == 'val2' + assert cfg.option('val1.val5', 0).value.get() == 'val2' + assert cfg.option('val1.val5', 1).value.get() == 'val2' + assert cfg.option('val1.val6', 0).value.get() == 'val2' + assert cfg.option('val1.val6', 1).value.get() == 'val2' # - api.option('val1.val1').value.set(['val1', 'val2', 'val3']) - assert api.option('val1.val2', 2).value.get() == 'val3' - assert api.option('val1.val3', 2).value.get() == 'yes' + cfg.option('val1.val1').value.set(['val1', 'val2', 'val3']) + assert cfg.option('val1.val2', 2).value.get() == 'val3' + assert cfg.option('val1.val3', 2).value.get() == 'yes' def test_callback_leader(): @@ -997,28 +1049,29 @@ def test_callback_leader(): raises(ValueError, "Leadership('val1', '', [val1, val2])") -def test_callback_different_type(): +def test_callback_different_type(config_type): val = IntOption('val', "", default=2) val_ = IntOption('val_', "", default=3) val1 = IntOption('val1', "", multi=True) val2 = IntOption('val2', "", multi=True, callback=return_calc, callback_params=Params((ParamOption(val), ParamOption(val1)), {'k': ParamOption(val_)})) interface1 = Leadership('val1', '', [val1, val2]) maconfig = OptionDescription('rootconfig', '', [interface1, val, val_]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val1.val1').value.get() == [] - api.option('val1.val1').value.set([1]) - assert api.option('val1.val1').value.get() == [1] - assert api.option('val1.val2', 0).value.get() == 6 - api.option('val1.val1').value.set([1, 3]) - assert api.option('val1.val1').value.get() == [1, 3] - assert api.option('val1.val2', 0).value.get() == 6 - assert api.option('val1.val2', 1).value.get() == 8 - api.option('val1.val1').value.set([1, 3, 5]) - assert api.option('val1.val1').value.get() == [1, 3, 5] - assert api.option('val1.val2', 0).value.get() == 6 - assert api.option('val1.val2', 1).value.get() == 8 - assert api.option('val1.val2', 2).value.get() == 10 + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val1.val1').value.get() == [] + cfg.option('val1.val1').value.set([1]) + assert cfg.option('val1.val1').value.get() == [1] + assert cfg.option('val1.val2', 0).value.get() == 6 + cfg.option('val1.val1').value.set([1, 3]) + assert cfg.option('val1.val1').value.get() == [1, 3] + assert cfg.option('val1.val2', 0).value.get() == 6 + assert cfg.option('val1.val2', 1).value.get() == 8 + cfg.option('val1.val1').value.set([1, 3, 5]) + assert cfg.option('val1.val1').value.get() == [1, 3, 5] + assert cfg.option('val1.val2', 0).value.get() == 6 + assert cfg.option('val1.val2', 1).value.get() == 8 + assert cfg.option('val1.val2', 2).value.get() == 10 def test_callback_hidden(): @@ -1027,11 +1080,11 @@ def test_callback_hidden(): od1 = OptionDescription('od1', '', [opt1], properties=('hidden',)) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_write() - raises(PropertiesOptionError, "api.option('od1.opt1').value.get()") + cfg = Config(maconfig) + cfg.property.read_write() + raises(PropertiesOptionError, "cfg.option('od1.opt1').value.get()") # do not raise, forcepermissive - api.option('od2.opt2').value.get() + cfg.option('od2.opt2').value.get() def test_callback_hidden_permissive(): @@ -1040,11 +1093,11 @@ def test_callback_hidden_permissive(): od1 = OptionDescription('od1', '', [opt1], properties=('hidden',)) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.permissive.set(frozenset(['hidden'])) - api.property.read_write() - raises(PropertiesOptionError, "api.option('od1.opt1').value.get()") - api.option('od2.opt2').value.get() + cfg = Config(maconfig) + cfg.permissive.set(frozenset(['hidden'])) + cfg.property.read_write() + raises(PropertiesOptionError, "cfg.option('od1.opt1').value.get()") + cfg.option('od2.opt2').value.get() def test_callback_hidden_permissive_callback(): @@ -1053,10 +1106,10 @@ def test_callback_hidden_permissive_callback(): od1 = OptionDescription('od1', '', [opt1], properties=('hidden',)) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_write() - raises(PropertiesOptionError, "api.option('od1.opt1').value.get()") - api.option('od2.opt2').value.get() + cfg = Config(maconfig) + cfg.property.read_write() + raises(PropertiesOptionError, "cfg.option('od1.opt1').value.get()") + cfg.option('od2.opt2').value.get() def test_callback_two_disabled(): @@ -1065,9 +1118,9 @@ def test_callback_two_disabled(): od1 = OptionDescription('od1', '', [opt1]) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_write() - raises(PropertiesOptionError, "api.option('od2.opt2').value.get()") + cfg = Config(maconfig) + cfg.property.read_write() + raises(PropertiesOptionError, "cfg.option('od2.opt2').value.get()") def test_callback_two_disabled2(): @@ -1076,11 +1129,11 @@ def test_callback_two_disabled2(): od1 = OptionDescription('od1', '', [opt1]) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_write() - api.permissive.set(frozenset(['hidden'])) - raises(PropertiesOptionError, "api.option('od2.opt2').value.get()") - assert api.forcepermissive.option('od2.opt2').owner.isdefault() + cfg = Config(maconfig) + cfg.property.read_write() + cfg.permissive.set(frozenset(['hidden'])) + raises(PropertiesOptionError, "cfg.option('od2.opt2').value.get()") + assert cfg.forcepermissive.option('od2.opt2').owner.isdefault() def test_callback_calculating_invalid(): @@ -1089,11 +1142,11 @@ def test_callback_calculating_invalid(): od1 = OptionDescription('od1', '', [opt1]) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_write() - raises(ValueError, "api.option('od2.opt2').value.get()") - api.unrestraint.option('od2.opt2').property.add('disabled') - raises(PropertiesOptionError, "api.option('od2.opt2').value.get()") + cfg = Config(maconfig) + cfg.property.read_write() + raises(ValueError, "cfg.option('od2.opt2').value.get()") + cfg.unrestraint.option('od2.opt2').property.add('disabled') + raises(PropertiesOptionError, "cfg.option('od2.opt2').value.get()") def test_callback_calculating_disabled(): @@ -1102,9 +1155,9 @@ def test_callback_calculating_disabled(): od1 = OptionDescription('od1', '', [opt1]) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_write() - raises(ConfigError, "api.option('od2.opt2').value.get()") + cfg = Config(maconfig) + cfg.property.read_write() + raises(ConfigError, "cfg.option('od2.opt2').value.get()") def test_callback_calculating_mandatory(): @@ -1113,9 +1166,9 @@ def test_callback_calculating_mandatory(): od1 = OptionDescription('od1', '', [opt1]) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_only() - raises(ConfigError, "api.option('od2.opt2').value.get()") + cfg = Config(maconfig) + cfg.property.read_only() + raises(ConfigError, "cfg.option('od2.opt2').value.get()") def test_callback_calculating_mandatory_multi(): @@ -1124,9 +1177,9 @@ def test_callback_calculating_mandatory_multi(): od1 = OptionDescription('od1', '', [opt1]) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_only() - raises(ConfigError, "api.option('od2.opt2').value.get()") + cfg = Config(maconfig) + cfg.property.read_only() + raises(ConfigError, "cfg.option('od2.opt2').value.get()") def test_callback_two_disabled_multi(): @@ -1135,47 +1188,50 @@ def test_callback_two_disabled_multi(): od1 = OptionDescription('od1', '', [opt1]) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_write() - raises(PropertiesOptionError, "api.option('od2.opt2').value.get()") + cfg = Config(maconfig) + cfg.property.read_write() + raises(PropertiesOptionError, "cfg.option('od2.opt2').value.get()") -def test_callback_multi_list_params(): +def test_callback_multi_list_params(config_type): val1 = StrOption('val1', "", multi=True, default=['val1', 'val2']) val2 = StrOption('val2', "", multi=True, callback=return_list, callback_params=Params(ParamOption(val1))) oval2 = OptionDescription('val2', '', [val2]) maconfig = OptionDescription('rootconfig', '', [val1, oval2]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val2.val2').value.get() == ['val', 'val'] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val2.val2').value.get() == ['val', 'val'] -def test_callback_multi_list_params_key(): +def test_callback_multi_list_params_key(config_type): val1 = StrOption('val1', "", multi=True, default=['val1', 'val2']) val2 = StrOption('val2', "", multi=True, callback=return_list, callback_params=Params(kwargs={'value': ParamOption(val1)})) oval2 = OptionDescription('val2', '', [val2]) maconfig = OptionDescription('rootconfig', '', [val1, oval2]) - api = Config(maconfig) - api.property.read_write() - assert api.option('val2.val2').value.get() == ['val', 'val'] + cfg = Config(maconfig) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + assert cfg.option('val2.val2').value.get() == ['val', 'val'] -def test_leadership_callback_description(): +def test_leadership_callback_description(config_type): st1 = StrOption('st1', "", multi=True) st2 = StrOption('st2', "", multi=True, callback=return_value, callback_params=Params(ParamOption(st1))) stm = Leadership('st1', '', [st1, st2]) st = OptionDescription('st', '', [stm]) od = OptionDescription('od', '', [st]) od2 = OptionDescription('od', '', [od]) - api = Config(od2) - owner = api.owner.get() - assert api.option('od.st.st1.st1').value.get() == [] - assert api.option('od.st.st1.st1').owner.isdefault() + cfg = Config(od2) + cfg = get_config(cfg, config_type) + owner = cfg.owner.get() + assert cfg.option('od.st.st1.st1').value.get() == [] + assert cfg.option('od.st.st1.st1').owner.isdefault() ## - api.option('od.st.st1.st1').value.set(['yes']) - api.option('od.st.st1.st2', 0).value.set('yes') - assert api.option('od.st.st1.st1').owner.get() == owner - assert api.option('od.st.st1.st2', 0).owner.get() == owner + cfg.option('od.st.st1.st1').value.set(['yes']) + cfg.option('od.st.st1.st2', 0).value.set('yes') + assert cfg.option('od.st.st1.st1').owner.get() == owner + assert cfg.option('od.st.st1.st2', 0).owner.get() == owner def test_callback_raise(): @@ -1184,32 +1240,34 @@ def test_callback_raise(): od1 = OptionDescription('od1', '', [opt1]) od2 = OptionDescription('od2', '', [opt2]) maconfig = OptionDescription('rootconfig', '', [od1, od2]) - api = Config(maconfig) - api.property.read_write() + cfg = Config(maconfig) + cfg.property.read_write() try: - api.option('od1.opt1').value.get() + cfg.option('od1.opt1').value.get() except ConfigError as err: assert '"Option 1"' in str(err) try: - api.option('od2.opt2').value.get() + cfg.option('od2.opt2').value.get() except ConfigError as err: assert '"Option 2"' in str(err) -def test_calc_value_simple(): +def test_calc_value_simple(config_type): val1 = StrOption('val1', '', 'val1') val2 = StrOption('val2', '', callback=calc_value, callback_params=Params(ParamOption(val1))) od = OptionDescription('root', '', [val1, val2]) cfg = Config(od) + cfg = get_config(cfg, config_type) assert cfg.value.dict() == {'val1': 'val1', 'val2': 'val1'} -def test_calc_value_multi(): +def test_calc_value_multi(config_type): val1 = StrOption('val1', "", 'val1') val2 = StrOption('val2', "", 'val2') val3 = StrOption('val3', "", multi=True, callback=calc_value, callback_params=Params((ParamOption(val1), ParamOption(val2)), multi=ParamValue(True))) od = OptionDescription('root', '', [val1, val2, val3]) cfg = Config(od) + cfg = get_config(cfg, config_type) assert cfg.value.dict() == {'val1': 'val1', 'val2': 'val2', 'val3': ['val1', 'val2']} @@ -1224,7 +1282,7 @@ def test_calc_value_disabled(): assert cfg.value.dict() == {'val2': 'default_value'} -def test_calc_value_condition(): +def test_calc_value_condition(config_type): boolean = BoolOption('boolean', '', True) val1 = StrOption('val1', '', 'val1') val2 = StrOption('val2', '', callback=calc_value, callback_params=Params(ParamOption(val1, True), @@ -1234,35 +1292,39 @@ def test_calc_value_condition(): od = OptionDescription('root', '', [boolean, val1, val2]) cfg = Config(od) cfg.property.read_write() + cfg = get_config(cfg, config_type) assert cfg.value.dict() == {'boolean': True, 'val1': 'val1', 'val2': 'val1'} cfg.option('boolean').value.set(False) assert cfg.value.dict() == {'boolean': False, 'val1': 'val1', 'val2': 'default_value'} -def test_calc_value_allow_none(): +def test_calc_value_allow_none(config_type): val1 = StrOption('val1', "", 'val1') val2 = StrOption('val2', "") val3 = StrOption('val3', "", multi=True, callback=calc_value, callback_params=Params((ParamOption(val1), ParamOption(val2)), multi=ParamValue(True), allow_none=ParamValue(True))) od = OptionDescription('root', '', [val1, val2, val3]) cfg = Config(od) + cfg = get_config(cfg, config_type) assert cfg.value.dict() == {'val1': 'val1', 'val2': None, 'val3': ['val1', None]} -def test_calc_value_remove_duplicate(): +def test_calc_value_remove_duplicate(config_type): val1 = StrOption('val1', "", 'val1') val2 = StrOption('val2', "", 'val1') val3 = StrOption('val3', "", multi=True, callback=calc_value, callback_params=Params((ParamOption(val1), ParamOption(val2)), multi=ParamValue(True), remove_duplicate_value=ParamValue(True))) od = OptionDescription('root', '', [val1, val2, val3]) cfg = Config(od) + cfg = get_config(cfg, config_type) assert cfg.value.dict() == {'val1': 'val1', 'val2': 'val1', 'val3': ['val1']} -def test_calc_value_join(): +def test_calc_value_join(config_type): val1 = StrOption('val1', "", 'val1') val2 = StrOption('val2', "", 'val2') val3 = StrOption('val3', "", callback=calc_value, callback_params=Params((ParamOption(val1), ParamOption(val2)), join=ParamValue('.'))) od = OptionDescription('root', '', [val1, val2, val3]) cfg = Config(od) + cfg = get_config(cfg, config_type) assert cfg.value.dict() == {'val1': 'val1', 'val2': 'val2', 'val3': 'val1.val2'} @@ -1279,10 +1341,11 @@ def test_calc_value_min(): assert cfg.value.dict() == {'val1': 'val1', 'val2': 'val2', 'val4': ''} -def test_calc_value_add(): +def test_calc_value_add(config_type): val1 = IntOption('val1', "", 1) val2 = IntOption('val2', "", 2) val3 = IntOption('val3', "", callback=calc_value, callback_params=Params((ParamOption(val1), ParamOption(val2)), operator=ParamValue('add'))) od = OptionDescription('root', '', [val1, val2, val3]) cfg = Config(od) + cfg = get_config(cfg, config_type) assert cfg.value.dict() == {'val1': 1, 'val2': 2, 'val3': 3} diff --git a/tests/test_option_consistency.py b/tests/test_option_consistency.py index 8c4d66b..7cd4c06 100644 --- a/tests/test_option_consistency.py +++ b/tests/test_option_consistency.py @@ -1,5 +1,6 @@ from .autopath import do_autopath do_autopath() +from .config import config_type, get_config from py.test import raises @@ -49,42 +50,44 @@ def test_consistency_warnings_only_default(): assert w != [] -def test_consistency_warnings_only(): +def test_consistency_warnings_only(config_type): a = IntOption('a', '') b = IntOption('b', '') c = IntOption('c', '') od = OptionDescription('od', '', [a, b, c]) a.impl_add_consistency('not_equal', b, warnings_only=True) - api = Config(od) - assert api.option('a').option.consistencies() - assert not api.option('b').option.consistencies() - assert not api.option('c').option.consistencies() - api.option('a').value.set(1) + cfg = Config(od) + assert cfg.option('a').option.consistencies() + assert not cfg.option('b').option.consistencies() + assert not cfg.option('c').option.consistencies() + cfg = get_config(cfg, config_type) + cfg.option('a').value.set(1) warnings.simplefilter("always", ValueWarning) with warnings.catch_warnings(record=True) as w: - api.option('b').value.set(1) + cfg.option('b').value.set(1) assert w != [] -def test_consistency_warnings_only_more_option(): +def test_consistency_warnings_only_more_option(config_type): a = IntOption('a', '') b = IntOption('b', '') d = IntOption('d', '') od = OptionDescription('od', '', [a, b, d]) a.impl_add_consistency('not_equal', b, d, warnings_only=True) - api = Config(od) - api.option('a').value.set(1) + cfg = Config(od) + cfg = get_config(cfg, config_type) + cfg.option('a').value.set(1) warnings.simplefilter("always", ValueWarning) with warnings.catch_warnings(record=True) as w: - api.option('b').value.set(1) + cfg.option('b').value.set(1) assert w != [] assert len(w) == 1 with warnings.catch_warnings(record=True) as w: - api.option('d').value.get() + cfg.option('d').value.get() assert w != [] assert len(w) == 1 with warnings.catch_warnings(record=True) as w: - api.option('d').value.set(1) + cfg.option('d').value.set(1) assert w != [] assert len(w) == 1 @@ -94,63 +97,72 @@ def test_consistency_error_prefix(): b = IntOption('b', '') od = OptionDescription('od', '', [a, b]) a.impl_add_consistency('not_equal', b) - api = Config(od) - api.option('a').value.set(1) + cfg = Config(od) + cfg.option('a').value.set(1) try: - api.option('b').value.set(1) + cfg.option('b').value.set(1) except Exception as err: assert str(err) == _('"{0}" is an invalid {1} for "{2}"').format('1', _('integer'), 'b') + ', ' + _('must be different from the value of {}').format('"a"') try: - api.option('b').value.set(1) + cfg.option('b').value.set(1) except Exception as err: err.prefix = '' assert str(err) == _('must be different from the value of {}').format('"a"') -def test_consistency_warnings_only_option(): +def test_consistency_warnings_only_option(config_type): a = IntOption('a', '') b = IntOption('b', '', warnings_only=True) od = OptionDescription('od', '', [a, b]) a.impl_add_consistency('not_equal', b) - api = Config(od) - api.option('a').value.set(1) + cfg_ori = Config(od) + cfg = get_config(cfg_ori, config_type) + cfg.option('a').value.set(1) warnings.simplefilter("always", ValueWarning) with warnings.catch_warnings(record=True) as w: - api.option('b').value.set(1) + cfg.option('b').value.set(1) assert w != [] - api.option('a').value.reset() - api.option('b').value.set(1) - raises(ValueError, "api.option('a').value.set(1)") + cfg.option('a').value.reset() + cfg.option('b').value.set(1) + raises(ValueError, "cfg.option('a').value.set(1)") # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) warnings.simplefilter("always", ValueWarning) with warnings.catch_warnings(record=True) as w: - api.option('a').value.set(1) + cfg.option('a').value.set(1) assert len(w) == 1 -def test_consistency_not_equal(): +def test_consistency_not_equal(config_type): a = IntOption('a', '') b = IntOption('b', '') od = OptionDescription('od', '', [a, b]) a.impl_add_consistency('not_equal', b) - api = Config(od) - assert api.option('a').value.get() is None - assert api.option('b').value.get() is None - api.option('a').value.set(1) - api.option('a').value.reset() - api.option('a').value.set(1) - raises(ValueError, "api.option('b').value.set(1)") - api.option('b').value.set(2) + cfg_ori = Config(od) + cfg = get_config(cfg_ori, config_type) + assert cfg.option('a').value.get() is None + assert cfg.option('b').value.get() is None + cfg.option('a').value.set(1) + cfg.option('a').value.reset() + cfg.option('a').value.set(1) + raises(ValueError, "cfg.option('b').value.set(1)") + cfg.option('b').value.set(2) # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) warnings.simplefilter("always", ValueWarning) with warnings.catch_warnings(record=True) as w: - api.option('b').value.set(1) + cfg.option('b').value.set(1) assert len(w) == 1 -def test_consistency_not_equal_many_opts(): +def test_consistency_not_equal_many_opts(config_type): + config_type='tiramisu-api' a = IntOption('a', '') b = IntOption('b', '') c = IntOption('c', '') @@ -159,38 +171,42 @@ def test_consistency_not_equal_many_opts(): f = IntOption('f', '') od = OptionDescription('od', '', [a, b, c, d, e, f]) a.impl_add_consistency('not_equal', b, c, d, e, f) - api = Config(od) - assert api.option('a').value.get() is None - assert api.option('b').value.get() is None + cfg_ori = Config(od) + cfg = get_config(cfg_ori, config_type) + assert cfg.option('a').value.get() is None + assert cfg.option('b').value.get() is None # - api.option('a').value.set(1) - api.option('a').value.reset() + cfg.option('a').value.set(1) + cfg.option('a').value.reset() # - api.option('a').value.set(1) - raises(ValueError, "api.option('b').value.set(1)") + cfg.option('a').value.set(1) + raises(ValueError, "cfg.option('b').value.set(1)") # - api.option('b').value.set(2) - raises(ValueError, "api.option('f').value.set(2)") - raises(ValueError, "api.option('f').value.set(1)") + cfg.option('b').value.set(2) + raises(ValueError, "cfg.option('f').value.set(2)") + raises(ValueError, "cfg.option('f').value.set(1)") # - api.option('d').value.set(3) - raises(ValueError, "api.option('f').value.set(3)") - raises(ValueError, "api.option('a').value.set(3)") - api.option('d').value.set(3) - raises(ValueError, "api.option('c').value.set(3)") - raises(ValueError, "api.option('e').value.set(3)") + cfg.option('d').value.set(3) + raises(ValueError, "cfg.option('f').value.set(3)") + raises(ValueError, "cfg.option('a').value.set(3)") + cfg.option('d').value.set(3) + raises(ValueError, "cfg.option('c').value.set(3)") + raises(ValueError, "cfg.option('e').value.set(3)") # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) warnings.simplefilter("always", ValueWarning) with warnings.catch_warnings(record=True) as w: - api.option('c').value.set(3) + cfg.option('c').value.set(3) assert len(w) == 1 with warnings.catch_warnings(record=True) as w: - api.option('e').value.set(3) + cfg.option('e').value.set(3) assert len(w) == 1 -def test_consistency_not_equal_many_opts_one_disabled(): +def test_consistency_not_equal_many_opts_one_disabled(config_type): a = IntOption('a', '') b = IntOption('b', '') c = IntOption('c', '') @@ -200,30 +216,36 @@ def test_consistency_not_equal_many_opts_one_disabled(): g = IntOption('g', '', properties=('disabled',)) od = OptionDescription('od', '', [a, b, c, d, e, f, g]) a.impl_add_consistency('not_equal', b, c, d, e, f, g, transitive=False) - api = Config(od) - api.property.read_write() - assert api.option('a').value.get() is None - assert api.option('b').value.get() is None + cfg_ori = Config(od) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('a').value.get() is None + assert cfg.option('b').value.get() is None # - api.option('a').value.set(1) - api.option('a').value.reset() + cfg.option('a').value.set(1) + cfg.option('a').value.reset() # - api.option('a').value.set(1) - raises(ValueError, "api.option('b').value.set(1)") + cfg.option('a').value.set(1) + raises(ValueError, "cfg.option('b').value.set(1)") # - api.option('b').value.set(2) - raises(ValueError, "api.option('f').value.set(2)") - raises(ValueError, "api.option('f').value.set(1)") + cfg.option('b').value.set(2) + raises(ValueError, "cfg.option('f').value.set(2)") + raises(ValueError, "cfg.option('f').value.set(1)") # - api.option('d').value.set(3) - raises(ValueError, "api.option('f').value.set(3)") - raises(ValueError, "api.option('a').value.set(3)") - raises(ValueError, "api.option('c').value.set(3)") - raises(ValueError, "api.option('e').value.set(3)") + cfg.option('d').value.set(3) + raises(ValueError, "cfg.option('f').value.set(3)") + raises(ValueError, "cfg.option('a').value.set(3)") + raises(ValueError, "cfg.option('c').value.set(3)") + raises(ValueError, "cfg.option('e').value.set(3)") # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('c').value.set(3) + cfg.option('c').value.set(3) assert len(w) == 1 @@ -275,25 +297,29 @@ def test_consistency_not_equal_symlink(): c = SymLinkOption('c', a) od = OptionDescription('od', '', [a, b, c]) a.impl_add_consistency('not_equal', b) - api = Config(od) + cfg = Config(od) assert set(od._cache_consistencies.keys()) == set([a, b]) -def test_consistency_mix(): +def test_consistency_mix(config_type): b = IntOption('b', '', multi=True) c = IntOption('c', '', multi=True) d = IntOption('d', '', multi=True) od = Leadership('c', '', [c, d]) od2 = OptionDescription('a', '', [b, od]) c.impl_add_consistency('not_equal', b, d) - cfg = Config(od2) + cfg_ori = Config(od2) + cfg = get_config(cfg_ori, config_type) cfg.option('b').value.set([1, 2, 3]) cfg.option('c.c').value.set([4, 5]) raises(ValueError, "cfg.option('c.c').value.set([1, 2])") raises(ValueError, "cfg.option('c.d', 0).value.set(1)") raises(ValueError, "cfg.option('c.d', 1).value.set(4)") # - cfg.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: cfg.option('c.d', 1).value.set(4) assert len(w) == 1 @@ -314,22 +340,23 @@ def test_consistency_not_equal_default_submulti(): raises(ConfigError, "a.impl_add_consistency('not_equal', b)") -def test_consistency_not_equal_leadership(): +def test_consistency_not_equal_leadership(config_type): a = IntOption('a', '', multi=True) b = IntOption('b', '', multi=True) od = Leadership('a', '', [a, b]) od2 = OptionDescription('b', '', [od]) a.impl_add_consistency('not_equal', b) - api = Config(od2) - assert api.option('a.a').value.get() == [] - api.option('a.a').value.set([1]) - api.option('a.a').value.reset() - api.option('a.a').value.set([1]) - raises(ValueError, "api.option('a.b', 0).value.set(1)") - api.option('a.b', 0).value.set(2) - api.option('a.a').value.reset() - api.option('a.a').value.set([1]) - api.value.dict() + cfg = Config(od2) + cfg = get_config(cfg, config_type) + assert cfg.option('a.a').value.get() == [] + cfg.option('a.a').value.set([1]) + cfg.option('a.a').value.reset() + cfg.option('a.a').value.set([1]) + raises(ValueError, "cfg.option('a.b', 0).value.set(1)") + cfg.option('a.b', 0).value.set(2) + cfg.option('a.a').value.reset() + cfg.option('a.a').value.set([1]) + cfg.value.dict() def test_consistency_not_equal_leadership_error_multi1(): @@ -391,39 +418,44 @@ def test_consistency_not_equal_leadership_default(): od = Leadership('a', '', [a, b]) od2 = OptionDescription('a', '', [od]) a.impl_add_consistency('not_equal', b) - api = Config(od2) - assert api.option('a.a').value.get() == [] - raises(ValueError, "api.option('a.a').value.set([1])") - api.option('a.a').value.set([2]) - api.option('a.a').value.reset() + cfg = Config(od2) + # FIXME cfg = get_config(cfg, config_type) + assert cfg.option('a.a').value.get() == [] + raises(ValueError, "cfg.option('a.a').value.set([1])") + cfg.option('a.a').value.set([2]) + cfg.option('a.a').value.reset() # - api.property.add('demoting_error_warning') + cfg.property.add('demoting_error_warning') with warnings.catch_warnings(record=True) as w: - api.option('a.a').value.set([1]) + cfg.option('a.a').value.set([1]) assert len(w) == 1 -def test_consistency_not_equal_multi(): +def test_consistency_not_equal_multi(config_type): a = IntOption('a', '', multi=True) b = IntOption('b', '', multi=True) od = OptionDescription('a', '', [a, b]) a.impl_add_consistency('not_equal', b) - api = Config(od) - assert api.option('a').value.get() == [] - assert api.option('b').value.get() == [] - api.option('a').value.set([1]) - api.option('a').value.reset() - api.option('a').value.set([1]) - raises(ValueError, "api.option('b').value.set([1])") - api.option('a').value.set([2]) - raises(ValueError, "api.option('b').value.set([2, 1])") - api.option('a').value.set([2, 3]) - raises(ValueError, "api.option('a').value.set([2, 3, 3])") - raises(ValueError, "api.option('b').value.set([2, 3])") + cfg_ori = Config(od) + cfg = get_config(cfg_ori, config_type) + assert cfg.option('a').value.get() == [] + assert cfg.option('b').value.get() == [] + cfg.option('a').value.set([1]) + cfg.option('a').value.reset() + cfg.option('a').value.set([1]) + raises(ValueError, "cfg.option('b').value.set([1])") + cfg.option('a').value.set([2]) + raises(ValueError, "cfg.option('b').value.set([2, 1])") + cfg.option('a').value.set([2, 3]) + raises(ValueError, "cfg.option('a').value.set([2, 3, 3])") + raises(ValueError, "cfg.option('b').value.set([2, 3])") # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('b').value.set([2, 3]) + cfg.option('b').value.set([2, 3]) assert len(w) == 1 @@ -442,34 +474,39 @@ def test_consistency_not_equal_multi_default2(): a.impl_add_consistency('not_equal', b) -def test_consistency_not_equal_leader_default(): +def test_consistency_not_equal_leader_default(config_type): a = IntOption('a', '', multi=True, default=[2, 1]) b = IntOption('b', '', multi=True, default_multi=1) od = Leadership('a', '', [a, b]) a.impl_add_consistency('not_equal', b) od2 = OptionDescription('a', '', [od]) - api = Config(od2) + cfg = Config(od2) + cfg = get_config(cfg, config_type) # default_multi not tested - raises(ValueError, "api.option('a.b', 0).value.get()") - api.option('a.b', 0).value.set(3) - api.option('a.b', 1).value.set(3) - assert api.option('a.b', 1).value.get() == 3 + raises(ValueError, "cfg.option('a.b', 0).value.get()") + cfg.option('a.b', 0).value.set(3) + cfg.option('a.b', 1).value.set(3) + assert cfg.option('a.b', 1).value.get() == 3 -def test_consistency_not_equal_multi_default_modif(): +def test_consistency_not_equal_multi_default_modif(config_type): a = IntOption('a', '', multi=True) b = IntOption('b', '', multi=True, default=[1, 2]) od = OptionDescription('a', '', [a, b]) a.impl_add_consistency('not_equal', b) - api = Config(od) - assert api.option('a').value.get() == [] - assert api.option('b').value.get() == [1, 2] - raises(ValueError, "api.option('a').value.set([1])") - raises(ValueError, "api.option('b').value.set([1, 2, 1])") + cfg_ori = Config(od) + cfg = get_config(cfg_ori, config_type) + assert cfg.option('a').value.get() == [] + assert cfg.option('b').value.get() == [1, 2] + raises(ValueError, "cfg.option('a').value.set([1])") + raises(ValueError, "cfg.option('b').value.set([1, 2, 1])") # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('b').value.set([1, 2, 1]) + cfg.option('b').value.set([1, 2, 1]) assert len(w) == 1 @@ -495,42 +532,48 @@ def test_consistency_default_diff(): b = IntOption('b', '', 1) od = OptionDescription('od', '', [a, b]) a.impl_add_consistency('not_equal', b) - api = Config(od) - raises(ValueError, "api.option('a').value.set(1)") - api.option('a').value.set(2) - api.option('b').value.set(3) - owner = api.owner.get() - assert api.option('a').owner.get() == owner - raises(ValueError, "api.option('a').value.reset()") - assert api.option('a').owner.get() == owner + cfg = Config(od) + # FIXME cfg = get_config(cfg, config_type) + raises(ValueError, "cfg.option('a').value.set(1)") + cfg.option('a').value.set(2) + cfg.option('b').value.set(3) + owner = cfg.owner.get() + assert cfg.option('a').owner.get() == owner + raises(ValueError, "cfg.option('a').value.reset()") + assert cfg.option('a').owner.get() == owner # - api.property.add('demoting_error_warning') + cfg.property.add('demoting_error_warning') with warnings.catch_warnings(record=True) as w: - api.option('a').value.reset() + cfg.option('a').value.reset() assert len(w) == 1 -def test_consistency_ip_netmask(): +def test_consistency_ip_netmask(config_type): a = IPOption('a', '') b = NetmaskOption('b', '') od = OptionDescription('od', '', [a, b]) b.impl_add_consistency('ip_netmask', a) - api = Config(od) - api.option('a').value.set('192.168.1.1') - api.option('b').value.set('255.255.255.0') - api.option('a').value.set('192.168.1.2') - api.option('b').value.set('255.255.255.128') - api.option('b').value.set('255.255.255.0') - raises(ValueError, "api.option('a').value.set('192.168.1.0')") - raises(ValueError, "api.option('a').value.set('192.168.1.255')") - api.option('a').value.reset() - api.option('b').value.reset() - api.option('a').value.set('192.168.1.255') - raises(ValueError, "api.option('b').value.set('255.255.255.0')") + cfg_ori = Config(od) + cfg = cfg_ori + cfg = get_config(cfg_ori, config_type) + cfg.option('a').value.set('192.168.1.1') + cfg.option('b').value.set('255.255.255.0') + cfg.option('a').value.set('192.168.1.2') + cfg.option('b').value.set('255.255.255.128') + cfg.option('b').value.set('255.255.255.0') + raises(ValueError, "cfg.option('a').value.set('192.168.1.0')") + raises(ValueError, "cfg.option('a').value.set('192.168.1.255')") + cfg.option('a').value.reset() + cfg.option('b').value.reset() + cfg.option('a').value.set('192.168.1.255') + raises(ValueError, "cfg.option('b').value.set('255.255.255.0')") # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('b').value.set('255.255.255.0') + cfg.option('b').value.set('255.255.255.0') assert len(w) == 1 @@ -540,22 +583,27 @@ def test_consistency_ip_netmask_invalid(): raises(ConfigError, "b.impl_add_consistency('ip_netmask')") -def test_consistency_network_netmask(): +def test_consistency_network_netmask(config_type): + config_type = 'tiramisu-api' a = NetworkOption('a', '') b = NetmaskOption('b', '') od = OptionDescription('od', '', [a, b]) b.impl_add_consistency('network_netmask', a) - api = Config(od) - api.option('a').value.set('192.168.1.1') - api.option('b').value.set('255.255.255.255') - api.option('b').value.reset() - api.option('a').value.set('192.168.1.0') - api.option('b').value.set('255.255.255.0') - raises(ValueError, "api.option('a').value.set('192.168.1.1')") + cfg_ori = Config(od) + cfg = get_config(cfg_ori, config_type) + cfg.option('a').value.set('192.168.1.1') + cfg.option('b').value.set('255.255.255.255') + cfg.option('b').value.reset() + cfg.option('a').value.set('192.168.1.0') + cfg.option('b').value.set('255.255.255.0') + raises(ValueError, "cfg.option('a').value.set('192.168.1.1')") # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('a').value.set('192.168.1.1') + cfg.option('a').value.set('192.168.1.1') assert len(w) == 1 @@ -565,7 +613,7 @@ def test_consistency_network_netmask_invalid(): raises(ConfigError, "b.impl_add_consistency('network_netmask')") -def test_consistency_ip_in_network(): +def test_consistency_ip_in_network(config_type): a = NetworkOption('a', '') b = NetmaskOption('b', '') c = IPOption('c', '') @@ -574,19 +622,20 @@ def test_consistency_ip_in_network(): c.impl_add_consistency('in_network', a, b) d.impl_add_consistency('in_network', a, b, warnings_only=True) warnings.simplefilter("always", ValueWarning) - api = Config(od) - api.option('a').value.set('192.168.1.0') - api.option('b').value.set('255.255.255.0') - api.option('c').value.set('192.168.1.1') - raises(ValueError, "api.option('c').value.set('192.168.2.1')") - raises(ValueError, "api.option('c').value.set('192.168.1.0')") - raises(ValueError, "api.option('c').value.set('192.168.1.255')") + cfg = Config(od) + cfg = get_config(cfg, config_type) + cfg.option('a').value.set('192.168.1.0') + cfg.option('b').value.set('255.255.255.0') + cfg.option('c').value.set('192.168.1.1') + raises(ValueError, "cfg.option('c').value.set('192.168.2.1')") + raises(ValueError, "cfg.option('c').value.set('192.168.1.0')") + raises(ValueError, "cfg.option('c').value.set('192.168.1.255')") with warnings.catch_warnings(record=True) as w: - api.option('d').value.set('192.168.2.1') + cfg.option('d').value.set('192.168.2.1') assert len(w) == 1 -def test_consistency_ip_in_network_cidr(): +def test_consistency_ip_in_network_cidr(config_type): a = NetworkOption('a', '', cidr=True) c = IPOption('c', '') d = IPOption('d', '') @@ -594,14 +643,15 @@ def test_consistency_ip_in_network_cidr(): c.impl_add_consistency('in_network', a) d.impl_add_consistency('in_network', a, warnings_only=True) warnings.simplefilter("always", ValueWarning) - api = Config(od) - api.option('a').value.set('192.168.1.0/24') - api.option('c').value.set('192.168.1.1') - raises(ValueError, "api.option('c').value.set('192.168.2.1')") - raises(ValueError, "api.option('c').value.set('192.168.1.0')") - raises(ValueError, "api.option('c').value.set('192.168.1.255')") + cfg = Config(od) + cfg = get_config(cfg, config_type) + cfg.option('a').value.set('192.168.1.0/24') + cfg.option('c').value.set('192.168.1.1') + raises(ValueError, "cfg.option('c').value.set('192.168.2.1')") + raises(ValueError, "cfg.option('c').value.set('192.168.1.0')") + raises(ValueError, "cfg.option('c').value.set('192.168.1.255')") with warnings.catch_warnings(record=True) as w: - api.option('d').value.set('192.168.2.1') + cfg.option('d').value.set('192.168.2.1') assert len(w) == 1 @@ -621,74 +671,87 @@ def test_consistency_ip_netmask_error_multi(): raises(ConfigError, "b.impl_add_consistency('ip_netmask', a)") -def test_consistency_ip_netmask_multi(): +def test_consistency_ip_netmask_multi(config_type): a = IPOption('a', '', multi=True) b = NetmaskOption('b', '', multi=True) od = Leadership('a', '', [a, b]) b.impl_add_consistency('ip_netmask', a) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) - api.option('a.a').value.set(['192.168.1.1']) - api.option('a.b', 0).value.set('255.255.255.0') - api.option('a.a').value.set(['192.168.1.2']) - api.option('a.b', 0).value.set('255.255.255.128') - api.option('a.b', 0).value.set('255.255.255.0') - raises(ValueError, "api.option('a.a').value.set(['192.168.1.0'])") + cfg_ori = Config(od2) + cfg = get_config(cfg_ori, config_type) + cfg.option('a.a').value.set(['192.168.1.1']) + cfg.option('a.b', 0).value.set('255.255.255.0') + cfg.option('a.a').value.set(['192.168.1.2']) + cfg.option('a.b', 0).value.set('255.255.255.128') + cfg.option('a.b', 0).value.set('255.255.255.0') + raises(ValueError, "cfg.option('a.a').value.set(['192.168.1.0'])") # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('a.a').value.set(['192.168.1.0']) + cfg.option('a.a').value.set(['192.168.1.0']) assert len(w) == 1 -def test_consistency_network_netmask_multi(): +def test_consistency_network_netmask_multi(config_type): a = NetworkOption('a', '', multi=True) b = NetmaskOption('b', '', multi=True) od = Leadership('a', '', [a, b]) b.impl_add_consistency('network_netmask', a) od2 = OptionDescription('od', '', [od]) - api = Config(od2) - api.option('a.a').value.set(['192.168.1.1']) - api.option('a.b', 0).value.set('255.255.255.255') - api.option('a.b', 0).value.reset() - api.option('a.a').value.set(['192.168.1.0']) - api.option('a.b', 0).value.set('255.255.255.0') - raises(ValueError, "api.option('a.a').value.set(['192.168.1.1'])") + cfg = Config(od2) + cfg = get_config(cfg, config_type) + cfg.option('a.a').value.set(['192.168.1.1']) + cfg.option('a.b', 0).value.set('255.255.255.255') + cfg.option('a.b', 0).value.reset() + cfg.option('a.a').value.set(['192.168.1.0']) + cfg.option('a.b', 0).value.set('255.255.255.0') + raises(ValueError, "cfg.option('a.a').value.set(['192.168.1.1'])") -def test_consistency_network_netmask_multi_follower_default_multi(): +def test_consistency_network_netmask_multi_follower_default_multi(config_type): a = NetworkOption('a', '', default_multi=u'192.168.1.0', multi=True, properties=('mandatory',)) b = NetmaskOption('b', '', default_multi=u'255.255.255.0', multi=True, properties=('mandatory',)) od = Leadership('a', '', [a, b]) od2 = OptionDescription('od2', '', [od]) b.impl_add_consistency('network_netmask', a) - api = Config(od2) - api.property.read_write() - api.option('a.a').value.set([undefined]) - assert api.option('a.a').value.get() == ['192.168.1.0'] - assert api.option('a.b', 0).value.get() == '255.255.255.0' + cfg = Config(od2) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + cfg.option('a.a').value.set([undefined]) + assert cfg.option('a.a').value.get() == ['192.168.1.0'] + assert cfg.option('a.b', 0).value.get() == '255.255.255.0' -def test_consistency_network_netmask_multi_follower_default(): +def test_consistency_network_netmask_multi_follower_default(config_type): a = NetworkOption('a', '', multi=True, properties=('mandatory',)) b = NetmaskOption('b', '', default_multi=u'255.255.255.0', multi=True, properties=('mandatory',)) od = Leadership('a', '', [a, b]) b.impl_add_consistency('network_netmask', a) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) - api.property.read_write() - api.property.pop('cache') - assert api.option('a.a').value.get() == [] - api.option('a.a').value.set(['192.168.1.0']) - api.property.read_only() - assert api.option('a.a').value.get() == [u'192.168.1.0'] - assert api.option('a.b', 0).value.get() == u'255.255.255.0' - api.property.read_write() - raises(ValueError, "api.option('a.a').value.set([u'192.168.1.0', u'192.168.1.1'])") - api.option('a.a').value.set(['192.168.1.0', undefined]) - api.option('a.b', 0).value.set('255.255.255.0') - api.option('a.b', 1).value.set('255.255.255.255') - api.option('a.a').value.set([u'192.168.1.0', u'192.168.1.1']) + cfg_ori = Config(od2) + cfg_ori.property.read_write() + cfg_ori.property.pop('cache') + cfg = get_config(cfg_ori, config_type) + assert cfg.option('a.a').value.get() == [] + cfg.option('a.a').value.set(['192.168.1.0']) + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('a.a').value.get() == [u'192.168.1.0'] + assert cfg.option('a.b', 0).value.get() == u'255.255.255.0' + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + raises(ValueError, "cfg.option('a.a').value.set([u'192.168.1.0', u'192.168.1.1'])") + cfg.option('a.a').value.set(['192.168.1.0', undefined]) + cfg.option('a.b', 0).value.set('255.255.255.0') + cfg.option('a.b', 1).value.set('255.255.255.255') + cfg.option('a.a').value.set([u'192.168.1.0', u'192.168.1.1']) def return_netmask(*args, **kwargs): @@ -704,86 +767,96 @@ def return_netmask2(leader): return u'255.255.255.0' -def test_consistency_network_netmask_multi_follower_callback(): +def test_consistency_network_netmask_multi_follower_callback(config_type): a = NetworkOption('a', '', multi=True, properties=('mandatory',)) b = NetmaskOption('b', '', callback=return_netmask, multi=True, properties=('mandatory',)) od = Leadership('a', '', [a, b]) b.impl_add_consistency('network_netmask', a) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) - api.property.read_write() - api.property.pop('cache') - assert api.option('a.a').value.get() == [] - api.option('a.a').value.set(['192.168.1.0']) - api.property.read_only() - assert api.option('a.a').value.get() == [u'192.168.1.0'] - assert api.option('a.b', 0).value.get() == '255.255.255.0' - api.property.read_write() - raises(ValueError, "assert api.option('a.a').value.set([u'192.168.1.0', u'192.168.1.1'])") - api.option('a.a').value.set(['192.168.1.0', undefined]) - api.option('a.b', 0).value.set('255.255.255.0') - api.option('a.b', 1).value.set('255.255.255.255') - api.option('a.a').value.set(['192.168.1.0', '192.168.1.1']) + cfg_ori = Config(od2) + cfg_ori.property.read_write() + cfg_ori.property.pop('cache') + cfg = get_config(cfg_ori, config_type) + assert cfg.option('a.a').value.get() == [] + cfg.option('a.a').value.set(['192.168.1.0']) + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.read_only() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('a.a').value.get() == [u'192.168.1.0'] + assert cfg.option('a.b', 0).value.get() == '255.255.255.0' + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + raises(ValueError, "assert cfg.option('a.a').value.set([u'192.168.1.0', u'192.168.1.1'])") + cfg.option('a.a').value.set(['192.168.1.0', undefined]) + cfg.option('a.b', 0).value.set('255.255.255.0') + cfg.option('a.b', 1).value.set('255.255.255.255') + cfg.option('a.a').value.set(['192.168.1.0', '192.168.1.1']) -def test_consistency_network_netmask_multi_follower_callback_value(): +def test_consistency_network_netmask_multi_follower_callback_value(config_type): a = NetworkOption('a', '', multi=True, properties=('mandatory',)) b = NetmaskOption('b', '', callback=return_netmask2, callback_params=Params(ParamOption(a)), multi=True, properties=('mandatory',)) od = Leadership('a', '', [a, b]) b.impl_add_consistency('network_netmask', a) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) - api.property.read_write() - api.property.pop('cache') - assert api.option('a.a').value.get() == [] - api.option('a.a').value.set(['192.168.1.0']) - assert api.option('a.a').value.get() == ['192.168.1.0'] - assert api.option('a.b', 0).value.get() == '255.255.255.0' - raises(ValueError, "api.option('a.a').value.set(['192.168.1.0', '192.168.2.1'])") - assert api.option('a.a').value.get() == [u'192.168.1.0'] - assert api.option('a.b', 0).value.get() == '255.255.255.0' - raises(ValueError, "api.option('a.a').value.set(['192.168.2.1'])") - assert api.option('a.a').value.get() == [u'192.168.1.0'] - assert api.option('a.b', 0).value.get() == '255.255.255.0' - api.option('a.a').value.set(['192.168.1.0', '192.168.1.1']) - api.option('a.b', 0).value.set('255.255.255.0') - api.option('a.b', 1).value.set('255.255.255.255') + cfg = Config(od2) + cfg.property.read_write() + cfg.property.pop('cache') + cfg = get_config(cfg, config_type) + assert cfg.option('a.a').value.get() == [] + cfg.option('a.a').value.set(['192.168.1.0']) + assert cfg.option('a.a').value.get() == ['192.168.1.0'] + assert cfg.option('a.b', 0).value.get() == '255.255.255.0' + raises(ValueError, "cfg.option('a.a').value.set(['192.168.1.0', '192.168.2.1'])") + assert cfg.option('a.a').value.get() == [u'192.168.1.0'] + assert cfg.option('a.b', 0).value.get() == '255.255.255.0' + raises(ValueError, "cfg.option('a.a').value.set(['192.168.2.1'])") + assert cfg.option('a.a').value.get() == [u'192.168.1.0'] + assert cfg.option('a.b', 0).value.get() == '255.255.255.0' + cfg.option('a.a').value.set(['192.168.1.0', '192.168.1.1']) + cfg.option('a.b', 0).value.set('255.255.255.0') + cfg.option('a.b', 1).value.set('255.255.255.255') -def test_consistency_ip_netmask_multi_leader(): +def test_consistency_ip_netmask_multi_leader(config_type): a = IPOption('a', '', multi=True) b = NetmaskOption('b', '', multi=True) od = Leadership('a', '', [a, b]) b.impl_add_consistency('ip_netmask', a) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) - api.option('a.a').value.set(['192.168.1.1']) - api.option('a.b', 0).value.set('255.255.255.0') - api.option('a.a').value.set(['192.168.1.2']) - api.option('a.b', 0).value.set('255.255.255.128') - api.option('a.b', 0).value.set('255.255.255.0') - raises(ValueError, "api.option('a.a').value.set(['192.168.1.0'])") - api.option('a.a').value.set(['192.168.1.128']) - raises(ValueError, "api.option('a.b', 0).value.set('255.255.255.128')") - api.option('a.a').value.set(['192.168.1.2', '192.168.1.3']) + cfg = Config(od2) + cfg = get_config(cfg, config_type) + cfg.option('a.a').value.set(['192.168.1.1']) + cfg.option('a.b', 0).value.set('255.255.255.0') + cfg.option('a.a').value.set(['192.168.1.2']) + cfg.option('a.b', 0).value.set('255.255.255.128') + cfg.option('a.b', 0).value.set('255.255.255.0') + raises(ValueError, "cfg.option('a.a').value.set(['192.168.1.0'])") + cfg.option('a.a').value.set(['192.168.1.128']) + raises(ValueError, "cfg.option('a.b', 0).value.set('255.255.255.128')") + cfg.option('a.a').value.set(['192.168.1.2', '192.168.1.3']) -def test_consistency_network_netmask_multi_leader(): +def test_consistency_network_netmask_multi_leader(config_type): a = NetworkOption('a', '', multi=True) b = NetmaskOption('b', '', multi=True) od = Leadership('a', '', [a, b]) b.impl_add_consistency('network_netmask', a) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) - api.option('a.a').value.set(['192.168.1.1']) - api.option('a.b', 0).value.set('255.255.255.255') - api.option('a.b', 0).value.reset() - api.option('a.a').value.set(['192.168.1.0']) - api.option('a.b', 0).value.set('255.255.255.0') - raises(ValueError, "api.option('a.a').value.set(['192.168.1.1'])") + cfg = Config(od2) + cfg = get_config(cfg, config_type) + cfg.option('a.a').value.set(['192.168.1.1']) + cfg.option('a.b', 0).value.set('255.255.255.255') + cfg.option('a.b', 0).value.reset() + cfg.option('a.a').value.set(['192.168.1.0']) + cfg.option('a.b', 0).value.set('255.255.255.0') + raises(ValueError, "cfg.option('a.a').value.set(['192.168.1.1'])") -def test_consistency_broadcast(): +def test_consistency_broadcast(config_type): a = NetworkOption('a', '', multi=True) b = NetmaskOption('b', '', multi=True) c = BroadcastOption('c', '', multi=True) @@ -791,26 +864,27 @@ def test_consistency_broadcast(): b.impl_add_consistency('network_netmask', a) c.impl_add_consistency('broadcast', a, b) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) + cfg = Config(od2) + cfg = get_config(cfg, config_type) #first, test network_netmask - api.option('a.a').value.set(['192.168.1.128']) - raises(ValueError, "api.option('a.a').value.set(['255.255.255.0'])") + cfg.option('a.a').value.set(['192.168.1.128']) + raises(ValueError, "cfg.option('a.a').value.set(['255.255.255.0'])") # - api.option('a.a').value.set(['192.168.1.0']) - api.option('a.b', 0).value.set('255.255.255.0') - api.option('a.c', 0).value.set('192.168.1.255') - raises(ValueError, "api.option('a.a').value.set(['192.168.1.1'])") + cfg.option('a.a').value.set(['192.168.1.0']) + cfg.option('a.b', 0).value.set('255.255.255.0') + cfg.option('a.c', 0).value.set('192.168.1.255') + raises(ValueError, "cfg.option('a.a').value.set(['192.168.1.1'])") # - api.option('a.a').value.set(['192.168.1.0', '192.168.2.128']) - api.option('a.b', 0).value.set('255.255.255.0') - api.option('a.b', 1).value.set('255.255.255.128') - api.option('a.c', 0).value.set('192.168.1.255') - api.option('a.c', 1).value.set('192.168.2.255') - raises(ValueError, "api.option('a.c', 1).value.set('192.168.2.128')") - api.option('a.c', 1).value.set('192.168.2.255') + cfg.option('a.a').value.set(['192.168.1.0', '192.168.2.128']) + cfg.option('a.b', 0).value.set('255.255.255.0') + cfg.option('a.b', 1).value.set('255.255.255.128') + cfg.option('a.c', 0).value.set('192.168.1.255') + cfg.option('a.c', 1).value.set('192.168.2.255') + raises(ValueError, "cfg.option('a.c', 1).value.set('192.168.2.128')") + cfg.option('a.c', 1).value.set('192.168.2.255') -def test_consistency_broadcast_error(): +def test_consistency_broadcast_error(config_type): a = NetworkOption('a', '', multi=True) b = NetmaskOption('b', '', multi=True) c = BroadcastOption('c', '', multi=True) @@ -818,25 +892,30 @@ def test_consistency_broadcast_error(): od2 = OptionDescription('od2', '', [od]) b.impl_add_consistency('network_netmask', a) c.impl_add_consistency('broadcast', a) - api = Config(od2) - raises(ConfigError, "api.option('a.a').value.set(['192.168.1.0'])") + cfg = Config(od2) + cfg = get_config(cfg, config_type) + raises(ConfigError, "cfg.option('a.a').value.set(['192.168.1.0'])") -def test_consistency_broadcast_warnings(): +def test_consistency_broadcast_warnings(config_type): warnings.simplefilter("always", ValueWarning) a = NetworkOption('a', '', properties=('mandatory', 'disabled')) b = NetmaskOption('b', '', properties=('mandatory', 'disabled')) c = NetmaskOption('c', '', properties=('mandatory', 'disabled')) od = OptionDescription('a', '', [a, b, c]) b.impl_add_consistency('network_netmask', a, warnings_only=True) - api = Config(od) + cfg_ori = Config(od) + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('a').value.set('192.168.1.4') - api.option('b').value.set('255.255.255.0') + cfg.option('a').value.set('192.168.1.4') + cfg.option('b').value.set('255.255.255.0') assert len(w) == 1 - api.property.read_write() + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - list(api.value.mandatory()) + list(cfg.value.mandatory()) assert len(w) == 0 @@ -858,7 +937,7 @@ def test_consistency_broadcast_default_2(): d.impl_add_consistency('broadcast', a, b) -def test_consistency_not_all(): +def test_consistency_not_all(config_type): #_cache_consistencies is not None by not options has consistencies a = NetworkOption('a', '', multi=True) b = NetmaskOption('b', '', multi=True) @@ -866,44 +945,48 @@ def test_consistency_not_all(): od = Leadership('a', '', [a, b, c]) b.impl_add_consistency('network_netmask', a) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) - api.option('a.a').value.set(['192.168.1.0']) - api.option('a.b', 0).value.set('255.255.255.0') - api.option('a.c', 0).value.set('192.168.1.255') + cfg = Config(od2) + cfg = get_config(cfg, config_type) + cfg.option('a.a').value.set(['192.168.1.0']) + cfg.option('a.b', 0).value.set('255.255.255.0') + cfg.option('a.c', 0).value.set('192.168.1.255') -def test_consistency_permissive(): +def test_consistency_permissive(config_type): a = IntOption('a', '', 1) b = IntOption('b', '', 2, properties=('hidden',)) od = OptionDescription('od', '', [a, b]) a.impl_add_consistency('not_equal', b) - api = Config(od) - api.property.read_write() - api.permissive.set(frozenset(['hidden'])) - api.option('a').value.set(1) + cfg = Config(od) + cfg.property.read_write() + cfg.permissive.set(frozenset(['hidden'])) + cfg = get_config(cfg, config_type) + cfg.option('a').value.set(1) -def test_consistency_disabled(): +def test_consistency_disabled(config_type): a = IntOption('a', '') b = IntOption('b', '', properties=('disabled',)) od = OptionDescription('od', '', [a, b]) a.impl_add_consistency('not_equal', b) - api = Config(od) - api.property.read_write() - raises(PropertiesOptionError, "api.option('a').value.set(1)") + cfg = Config(od) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + raises(PropertiesOptionError, "cfg.option('a').value.set(1)") -def test_consistency_disabled_transitive(): +def test_consistency_disabled_transitive(config_type): a = IntOption('a', '') b = IntOption('b', '', properties=('disabled',)) od = OptionDescription('od', '', [a, b]) a.impl_add_consistency('not_equal', b, transitive=False) - api = Config(od) - api.property.read_write() - api.option('a').value.set(1) + cfg = Config(od) + cfg.property.read_write() + cfg = get_config(cfg, config_type) + cfg.option('a').value.set(1) -def test_consistency_disabled_transitive_2(): +def test_consistency_disabled_transitive_2(config_type): a = IPOption('a', '') b = IPOption('b', '') c = NetworkOption('c', '', default='192.168.1.0') @@ -911,19 +994,26 @@ def test_consistency_disabled_transitive_2(): od = OptionDescription('od', '', [a, b, c, d]) a.impl_add_consistency('not_equal', b) a.impl_add_consistency('in_network', c, d, transitive=False) - api = Config(od) - api.property.read_write() - api.option('a').value.set('192.168.1.1') - raises(ValueError, "api.option('b').value.set('192.168.1.1')") - api.option('a').value.set('192.168.2.1') + cfg_ori = Config(od) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('a').value.set('192.168.1.1') + raises(ValueError, "cfg.option('b').value.set('192.168.1.1')") + cfg.option('a').value.set('192.168.2.1') # - api.option('a').value.set('192.168.1.1') - api.property.pop('disabled') - raises(ValueError, "api.option('a').value.set('192.168.2.1')") + cfg.option('a').value.set('192.168.1.1') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.pop('disabled') + cfg = get_config(cfg_ori, config_type) + raises(ValueError, "cfg.option('a').value.set('192.168.2.1')") # - api.property.add('demoting_error_warning') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.add('demoting_error_warning') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('a').value.set('192.168.2.1') + cfg.option('a').value.set('192.168.2.1') assert len(w) == 1 @@ -931,17 +1021,18 @@ def return_val(*args, **kwargs): return '192.168.1.1' -def test_consistency_with_callback(): +def test_consistency_with_callback(config_type): a = NetworkOption('a', '', default='192.168.1.0') b = NetmaskOption('b', '', default='255.255.255.0') c = IPOption('c', '', callback=return_val, callback_params=Params(ParamOption(a))) od = OptionDescription('od', '', [a, b, c]) c.impl_add_consistency('in_network', a, b) - api = Config(od) - api.option('c').value.get() + cfg = Config(od) + cfg = get_config(cfg, config_type) + cfg.option('c').value.get() -def test_consistency_warnings_only_options(): +def test_consistency_warnings_only_options(config_type): a = IPOption('a', '', warnings_only=True) b = IPOption('b', '') c = NetworkOption('c', '', default='192.168.1.0') @@ -949,20 +1040,24 @@ def test_consistency_warnings_only_options(): od = OptionDescription('od', '', [a, b, c, d]) a.impl_add_consistency('not_equal', b) a.impl_add_consistency('in_network', c, d, transitive=False) - api = Config(od) - api.property.read_write() - api.option('a').value.set('192.168.1.1') - raises(ValueError, "api.option('b').value.set('192.168.1.1')") - api.option('a').value.set('192.168.2.1') + cfg_ori = Config(od) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('a').value.set('192.168.1.1') + raises(ValueError, "cfg.option('b').value.set('192.168.1.1')") + cfg.option('a').value.set('192.168.2.1') # - api.option('a').value.set('192.168.1.1') - api.property.pop('disabled') + cfg.option('a').value.set('192.168.1.1') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.pop('disabled') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('a').value.set('192.168.2.1') + cfg.option('a').value.set('192.168.2.1') assert len(w) == 1 -def test_consistency_warnings_only_options_callback(): +def test_consistency_warnings_only_options_callback(config_type): a = IPOption('a', '', warnings_only=True) b = IPOption('b', '') c = NetworkOption('c', '', default='192.168.1.0') @@ -970,22 +1065,26 @@ def test_consistency_warnings_only_options_callback(): od = OptionDescription('od', '', [a, b, c, d]) a.impl_add_consistency('not_equal', b) a.impl_add_consistency('in_network', c, d, transitive=False) - api = Config(od) - api.property.read_write() - api.option('a').value.set('192.168.1.1') - raises(ValueError, "api.option('b').value.set('192.168.1.1')") + cfg_ori = Config(od) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('a').value.set('192.168.1.1') + raises(ValueError, "cfg.option('b').value.set('192.168.1.1')") with warnings.catch_warnings(record=True) as w: - api.option('a').value.set('192.168.2.1') + cfg.option('a').value.set('192.168.2.1') assert len(w) == 1 # - api.option('a').value.set('192.168.1.1') - api.property.pop('disabled') + cfg.option('a').value.set('192.168.1.1') + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.pop('disabled') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('a').value.set('192.168.2.1') + cfg.option('a').value.set('192.168.2.1') assert len(w) == 1 -def test_consistency_double_warnings(): +def test_consistency_double_warnings(config_type): a = IntOption('a', '') b = IntOption('b', '', 1) c = IntOption('c', '', 1) @@ -994,25 +1093,34 @@ def test_consistency_double_warnings(): a.impl_add_consistency('not_equal', b, warnings_only=True) a.impl_add_consistency('not_equal', c, warnings_only=True) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) + cfg_ori = Config(od2) + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('od.a').value.set(1) + cfg.option('od.a').value.set(1) assert w != [] - assert len(w) == 2 + if config_type == 'tiramisu-api': + # in this case warnings is for '"a" and "b"' + assert len(w) == 1 + else: + # in this cas one warnings is for "a" and the second for "b" + assert len(w) == 2 with warnings.catch_warnings(record=True) as w: - api.option('od.c').value.set(2) + cfg.option('od.c').value.set(2) assert len(w) == 0 with warnings.catch_warnings(record=True) as w: - api.option('od.a').value.set(2) - assert w != [] + cfg.option('od.a').value.set(2) assert len(w) == 1 - api.property.pop('warnings') + # + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.pop('warnings') + cfg = get_config(cfg_ori, config_type) with warnings.catch_warnings(record=True) as w: - api.option('od.a').value.set(1) + cfg.option('od.a').value.set(1) assert w == [] -def test_consistency_warnings_error(): +def test_consistency_warnings_error(config_type): a = IntOption('a', '') b = IntOption('b', '', 1) c = IntOption('c', '', 1) @@ -1020,22 +1128,24 @@ def test_consistency_warnings_error(): warnings.simplefilter("always", ValueWarning) a.impl_add_consistency('not_equal', b, warnings_only=True) a.impl_add_consistency('not_equal', c) - api = Config(od) + cfg = Config(od) + cfg = get_config(cfg, config_type) with warnings.catch_warnings(record=True) as w: - raises(ValueError, "api.option('a').value.set(1)") + raises(ValueError, "cfg.option('a').value.set(1)") assert w == [] -def test_consistency_network_netmask_mandatory(): +def test_consistency_network_netmask_mandatory(config_type): a = NetworkOption('a', '', multi=True, properties=('mandatory',), default=[u'0.0.0.0']) b = NetmaskOption('b', '', multi=True, properties=('mandatory',), default_multi=u'0.0.0.0') od = Leadership('a', '', [a, b]) b.impl_add_consistency('network_netmask', a) od2 = OptionDescription('od2', '', [od]) - api = Config(od2) - api.property.read_only() - api.property.pop('mandatory') - api.value.dict() + cfg = Config(od2) + cfg.property.read_only() + cfg.property.pop('mandatory') + cfg = get_config(cfg, config_type) + cfg.value.dict() def test_consistency_has_dependency(): @@ -1043,11 +1153,11 @@ def test_consistency_has_dependency(): b = NetmaskOption('b', '') od = OptionDescription('od', '', [a, b]) b.impl_add_consistency('ip_netmask', a) - api = Config(od) - assert api.option('a').option.has_dependency() is True - assert api.option('b').option.has_dependency() is True - assert api.option('a').option.has_dependency(False) is True - assert api.option('b').option.has_dependency(False) is True + cfg = Config(od) + assert cfg.option('a').option.has_dependency() is True + assert cfg.option('b').option.has_dependency() is True + assert cfg.option('a').option.has_dependency(False) is True + assert cfg.option('b').option.has_dependency(False) is True def test_consistency_not_equal_has_dependency(): @@ -1055,8 +1165,8 @@ def test_consistency_not_equal_has_dependency(): b = IntOption('b', '') od = OptionDescription('od', '', [a, b]) a.impl_add_consistency('not_equal', b) - api = Config(od) - assert api.option('a').option.has_dependency() is False - assert api.option('b').option.has_dependency() is False - assert api.option('a').option.has_dependency(False) is True - assert api.option('b').option.has_dependency(False) is True + cfg = Config(od) + assert cfg.option('a').option.has_dependency() is False + assert cfg.option('b').option.has_dependency() is False + assert cfg.option('a').option.has_dependency(False) is True + assert cfg.option('b').option.has_dependency(False) is True diff --git a/tests/test_option_default.py b/tests/test_option_default.py index c6454b3..d071719 100644 --- a/tests/test_option_default.py +++ b/tests/test_option_default.py @@ -1,6 +1,7 @@ "test all types of option default values for options, add new option in a descr" from .autopath import do_autopath do_autopath() +from .config import config_type, get_config from py.test import raises @@ -11,6 +12,9 @@ from tiramisu import IntOption, FloatOption, StrOption, ChoiceOption, \ from tiramisu.storage import list_sessions +owners.addowner("frozenmultifollower") + + def teardown_function(function): assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) @@ -41,7 +45,7 @@ def make_description(): #____________________________________________________________ # default values -def test_default_is_none(): +def test_default_is_none(config_type): """ Most constructors take a ``default`` argument that specifies the default value of the option. If this argument is not supplied the default value is @@ -50,10 +54,11 @@ def test_default_is_none(): dummy1 = BoolOption('dummy1', 'doc dummy') dummy2 = BoolOption('dummy2', 'doc dummy') group = OptionDescription('group', '', [dummy1, dummy2]) - api = Config(group) + cfg = Config(group) + cfg = get_config(cfg, config_type) # so when the default value is not set, there is actually a default value - assert api.option('dummy1').value.get() is None - assert api.option('dummy2').value.get() is None + assert cfg.option('dummy1').value.get() is None + assert cfg.option('dummy2').value.get() is None def test_set_defaut_value_from_option_object(): @@ -67,49 +72,73 @@ def test_force_default_on_freeze(): dummy1 = BoolOption('dummy1', 'doc dummy', default=False, properties=('force_default_on_freeze',)) dummy2 = BoolOption('dummy2', 'doc dummy', default=True) group = OptionDescription('group', '', [dummy1, dummy2]) - api = Config(group) - api.property.read_write() - owner = api.owner.get() - api.option('dummy1').value.set(True) - api.option('dummy2').value.set(False) - assert api.option('dummy1').owner.get() == owner - assert api.option('dummy2').owner.get() == owner - api.option('dummy1').property.add('frozen') - api.option('dummy2').property.add('frozen') - assert api.option('dummy1').value.get() is False - assert api.option('dummy2').value.get() is False - assert api.option('dummy1').owner.isdefault() - assert api.option('dummy2').owner.get() == owner - raises(PropertiesOptionError, "api.option('dummy2').owner.set('frozen')") - raises(PropertiesOptionError, "api.option('dummy1').value.reset()") - api.option('dummy1').property.pop('frozen') - api.option('dummy1').value.reset() - api.option('dummy1').property.add('frozen') - raises(PropertiesOptionError, "api.option('dummy2').owner.set('frozen')") + cfg_ori = Config(group) + cfg_ori.property.read_write() + cfg = cfg_ori + # FIXME cfg = get_config(cfg_ori, config_type) + owner = cfg.owner.get() + cfg.option('dummy1').value.set(True) + cfg.option('dummy2').value.set(False) + assert cfg.option('dummy1').owner.get() == owner + assert cfg.option('dummy2').owner.get() == owner + # if config_type == 'tiramisu-api': + # cfg.send() + cfg_ori.option('dummy1').property.add('frozen') + cfg_ori.option('dummy2').property.add('frozen') + # cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy1').value.get() is False + assert cfg.option('dummy2').value.get() is False + assert cfg.option('dummy1').owner.isdefault() + assert cfg.option('dummy2').owner.get() == owner + # if config_type == 'tiramisu-api': + # cfg.send() + raises(PropertiesOptionError, "cfg_ori.option('dummy2').owner.set('frozen')") + # cfg = get_config(cfg_ori, config_type) + raises(PropertiesOptionError, "cfg.option('dummy1').value.reset()") + # if config_type == 'tiramisu-api': + # cfg.send() + cfg_ori.option('dummy1').property.pop('frozen') + # cfg = get_config(cfg_ori, config_type) + cfg.option('dummy1').value.reset() + # if config_type == 'tiramisu-api': + # cfg.send() + cfg.option('dummy1').property.add('frozen') + # cfg = get_config(cfg_ori, config_type) + raises(PropertiesOptionError, "cfg.option('dummy2').owner.set('frozen')") def test_force_default_on_freeze_multi(): dummy1 = BoolOption('dummy1', 'doc dummy', default=[False], properties=('force_default_on_freeze',), multi=True) dummy2 = BoolOption('dummy2', 'doc dummy', default=[True], multi=True) group = OptionDescription('group', '', [dummy1, dummy2]) - api = Config(group) - api.property.read_write() - api.option('dummy1').value.set([undefined, True]) - api.option('dummy2').value.set([undefined, False]) - owner = api.owner.get() - assert api.option('dummy1').owner.get() == owner - assert api.option('dummy2').owner.get() == owner - api.option('dummy1').property.add('frozen') - api.option('dummy2').property.add('frozen') - assert api.option('dummy1').value.get() == [False] - assert api.option('dummy2').value.get() == [True, False] - assert api.option('dummy1').owner.isdefault() - assert api.option('dummy2').owner.get() == owner - raises(PropertiesOptionError, "api.option('dummy2').owner.set('owner')") - raises(PropertiesOptionError, "api.option('dummy2').value.reset()") - api.option('dummy1').property.pop('frozen') - api.option('dummy1').value.reset() - api.option('dummy1').property.add('frozen') + cfg_ori = Config(group) + cfg_ori.property.read_write() + cfg = cfg_ori + # FIXME cfg = get_config(cfg_ori, config_type) + cfg.option('dummy1').value.set([undefined, True]) + cfg.option('dummy2').value.set([undefined, False]) + owner = cfg.owner.get() + assert cfg.option('dummy1').owner.get() == owner + assert cfg.option('dummy2').owner.get() == owner + # if config_type == 'tiramisu-api': + # cfg.send() + cfg_ori.option('dummy1').property.add('frozen') + cfg_ori.option('dummy2').property.add('frozen') + # cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy1').value.get() == [False] + assert cfg.option('dummy2').value.get() == [True, False] + assert cfg.option('dummy1').owner.isdefault() + assert cfg.option('dummy2').owner.get() == owner + # if config_type == 'tiramisu-api': + # cfg.send() + raises(PropertiesOptionError, "cfg_ori.option('dummy2').owner.set('owner')") + # cfg = get_config(cfg_ori, config_type) + raises(PropertiesOptionError, "cfg.option('dummy2').value.reset()") + # if config_type == 'tiramisu-api': + # cfg.send() + cfg_ori.option('dummy1').property.pop('frozen') + # cfg = get_config(cfg_ori, config_type) + cfg.option('dummy1').value.reset() def test_force_default_on_freeze_leader(): @@ -133,8 +162,8 @@ def test_force_default_on_freeze_leader_frozen(): dummy2 = BoolOption('dummy2', 'Test string option', multi=True) descr = Leadership("dummy1", "", [dummy1, dummy2]) descr = OptionDescription("root", "", [descr]) - api = Config(descr) - raises(ConfigError, "api.option('dummy1.dummy1').property.pop('frozen')") + cfg = Config(descr) + raises(ConfigError, "cfg.option('dummy1.dummy1').property.pop('frozen')") def test_force_metaconfig_on_freeze_leader_frozen(): @@ -142,75 +171,93 @@ def test_force_metaconfig_on_freeze_leader_frozen(): dummy2 = BoolOption('dummy2', 'Test string option', multi=True) descr = Leadership("dummy1", "", [dummy1, dummy2]) descr = OptionDescription("root", "", [descr]) - api = Config(descr) - raises(ConfigError, "api.option('dummy1.dummy1').property.pop('frozen')") + cfg = Config(descr) + raises(ConfigError, "cfg.option('dummy1.dummy1').property.pop('frozen')") -def test_force_default_on_freeze_follower(): +def test_force_default_on_freeze_follower(config_type): dummy1 = BoolOption('dummy1', 'Test int option', multi=True) dummy2 = BoolOption('dummy2', 'Test string option', multi=True, properties=('force_default_on_freeze',)) descr = Leadership("dummy1", "", [dummy1, dummy2]) descr = OptionDescription("root", "", [descr]) - api = Config(descr) - api.property.read_write() - owners.addowner("frozenmultifollower2") - api.option('dummy1.dummy1').value.set([True]) - api.option('dummy1.dummy2', 0).value.set(False) - assert api.option('dummy1.dummy1').value.get() == [True] - assert api.option('dummy1.dummy2', 0).value.get() == False - assert api.option('dummy1.dummy1').owner.get() == 'user' - assert api.option('dummy1.dummy2', 0).owner.get() == 'user' + cfg_ori = Config(descr) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + cfg.option('dummy1.dummy1').value.set([True]) + cfg.option('dummy1.dummy2', 0).value.set(False) + assert cfg.option('dummy1.dummy1').value.get() == [True] + assert cfg.option('dummy1.dummy2', 0).value.get() == False + assert cfg.option('dummy1.dummy1').owner.get() == 'user' + assert cfg.option('dummy1.dummy2', 0).owner.get() == 'user' # - api.option('dummy1.dummy2').property.add('frozen') - assert api.option('dummy1.dummy1').value.get() == [True] - assert api.option('dummy1.dummy2', 0).value.get() == None - assert api.option('dummy1.dummy1').owner.get() == 'user' - assert api.option('dummy1.dummy2', 0).owner.isdefault() - raises(PropertiesOptionError, "api.option('dummy1.dummy2', 0).owner.set('frozenmultifollower2')") + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.option('dummy1.dummy2').property.add('frozen') + cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy1.dummy1').value.get() == [True] + assert cfg.option('dummy1.dummy2', 0).value.get() == None + assert cfg.option('dummy1.dummy1').owner.get() == 'user' + assert cfg.option('dummy1.dummy2', 0).owner.isdefault() + if config_type == 'tiramisu-api': + cfg.send() + raises(PropertiesOptionError, "cfg_ori.option('dummy1.dummy2', 0).owner.set('frozenmultifollower')") + cfg = get_config(cfg_ori, config_type) # - api.option('dummy1.dummy2').property.pop('frozen') - api.option('dummy1.dummy1').value.set([True, True]) - api.option('dummy1.dummy2', 1).value.set(False) - assert api.option('dummy1.dummy1').value.get() == [True, True] - assert api.option('dummy1.dummy2', 0).value.get() == False - assert api.option('dummy1.dummy2', 1).value.get() == False + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.option('dummy1.dummy2').property.pop('frozen') + cfg = get_config(cfg_ori, config_type) + cfg.option('dummy1.dummy1').value.set([True, True]) + cfg.option('dummy1.dummy2', 1).value.set(False) + assert cfg.option('dummy1.dummy1').value.get() == [True, True] + assert cfg.option('dummy1.dummy2', 0).value.get() == False + assert cfg.option('dummy1.dummy2', 1).value.get() == False # - api.option('dummy1.dummy2').property.add('frozen') - assert api.option('dummy1.dummy1').value.get() == [True, True] - assert api.option('dummy1.dummy2', 0).value.get() == None - assert api.option('dummy1.dummy2', 1).value.get() == None + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.option('dummy1.dummy2').property.add('frozen') + cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy1.dummy1').value.get() == [True, True] + assert cfg.option('dummy1.dummy2', 0).value.get() == None + assert cfg.option('dummy1.dummy2', 1).value.get() == None # - api.option('dummy1.dummy1').value.pop(1) - assert api.option('dummy1.dummy1').value.get() == [True] - assert api.option('dummy1.dummy2', 0).value.get() == None + cfg.option('dummy1.dummy1').value.pop(1) + assert cfg.option('dummy1.dummy1').value.get() == [True] + assert cfg.option('dummy1.dummy2', 0).value.get() == None # - api.option('dummy1.dummy2').property.pop('frozen') - assert api.option('dummy1.dummy1').value.get() == [True] - assert api.option('dummy1.dummy2', 0).value.get() == False + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.option('dummy1.dummy2').property.pop('frozen') + cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy1.dummy1').value.get() == [True] + assert cfg.option('dummy1.dummy2', 0).value.get() == False # - api.option('dummy1.dummy1').value.set([True, True]) - assert api.option('dummy1.dummy2', 0).value.get() == False - assert api.option('dummy1.dummy2', 1).value.get() == None + cfg.option('dummy1.dummy1').value.set([True, True]) + assert cfg.option('dummy1.dummy2', 0).value.get() == False + assert cfg.option('dummy1.dummy2', 1).value.get() == None -def test_overrides_changes_option_value(): +def test_overrides_changes_option_value(config_type): "with config.override(), the default is changed and the value is changed" descr = OptionDescription("test", "", [ BoolOption("b", "", default=False)]) - api = Config(descr) - api.option('b').value.set(True) + cfg = Config(descr) + cfg = get_config(cfg, config_type) + cfg.option('b').value.set(True) -def test_choice_with_no_default(): +def test_choice_with_no_default(config_type): descr = OptionDescription("test", "", [ ChoiceOption("backend", "", ("c", "cli"))]) - api = Config(descr) - assert api.option('backend').value.get() is None - api.option('backend').value.set('c') + cfg = Config(descr) + cfg = get_config(cfg, config_type) + assert cfg.option('backend').value.get() is None + cfg.option('backend').value.set('c') -def test_choice_with_default(): +def test_choice_with_default(config_type): descr = OptionDescription("test", "", [ ChoiceOption("backend", "", ("c", "cli"), default="cli")]) - api = Config(descr) - assert api.option('backend').value.get() == 'cli' + cfg = Config(descr) + cfg = get_config(cfg, config_type) + assert cfg.option('backend').value.get() == 'cli' diff --git a/tests/test_option_owner.py b/tests/test_option_owner.py index 90f4dd6..1ecf214 100644 --- a/tests/test_option_owner.py +++ b/tests/test_option_owner.py @@ -1,5 +1,6 @@ from .autopath import do_autopath do_autopath() +from .config import config_type, get_config from py.test import raises @@ -10,6 +11,10 @@ from tiramisu.error import ConfigError, ConstError, PropertiesOptionError, APIEr from tiramisu.storage import list_sessions +owners.addowner("readonly2") +owners.addowner("new2") + + def teardown_function(function): assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) @@ -36,41 +41,46 @@ def make_description(): return descr -def test_default_owner(): +def test_default_owner(config_type): gcdummy = BoolOption('dummy', 'dummy', default=False) descr = OptionDescription('tiramisu', '', [gcdummy]) - api = Config(descr) - assert api.option('dummy').value.get() is False - assert api.option('dummy').owner.get() == 'default' - api.option('dummy').value.set(True) - owner = api.owner.get() - assert api.option('dummy').owner.get() == owner + cfg = Config(descr) + cfg = get_config(cfg, config_type) + assert cfg.option('dummy').value.get() is False + assert cfg.option('dummy').owner.get() == 'default' + cfg.option('dummy').value.set(True) + owner = cfg.owner.get() + assert cfg.option('dummy').owner.get() == owner def test_hidden_owner(): gcdummy = BoolOption('dummy', 'dummy', default=False, properties=('hidden',)) descr = OptionDescription('tiramisu', '', [gcdummy]) - api = Config(descr) - api.property.read_write() - #raises(PropertiesOptionError, "api.forcepermissive.option('dummy').owner.get()") - #raises(PropertiesOptionError, "api.option('dummy').owner.isdefault()") - #raises(PropertiesOptionError, "api.forcepermissive.option('dummy').owner.isdefault()") - api.permissive.set(frozenset(['hidden'])) - api.forcepermissive.option('dummy').value.get() - api.forcepermissive.option('dummy').owner.isdefault() + cfg = Config(descr) + cfg.property.read_write() + #raises(PropertiesOptionError, "cfg.forcepermissive.option('dummy').owner.get()") + #raises(PropertiesOptionError, "cfg.option('dummy').owner.isdefault()") + #raises(PropertiesOptionError, "cfg.forcepermissive.option('dummy').owner.isdefault()") + cfg.permissive.set(frozenset(['hidden'])) + cfg.forcepermissive.option('dummy').value.get() + cfg.forcepermissive.option('dummy').owner.isdefault() -def test_addowner(): +def test_addowner(config_type): gcdummy = BoolOption('dummy', 'dummy', default=False) descr = OptionDescription('tiramisu', '', [gcdummy]) - api = Config(descr) - assert api.option('dummy').value.get() is False - assert api.option('dummy').owner.get() == 'default' - assert api.option('dummy').owner.isdefault() - api.owner.set('gen_config') - api.option('dummy').value.set(True) - assert api.option('dummy').owner.get() == owners.gen_config - assert not api.option('dummy').owner.isdefault() + cfg_ori = Config(descr) + cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy').value.get() is False + assert cfg.option('dummy').owner.get() == 'default' + assert cfg.option('dummy').owner.isdefault() + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.owner.set('gen_config') + cfg = get_config(cfg_ori, config_type) + cfg.option('dummy').value.set(True) + assert cfg.option('dummy').owner.get() == owners.gen_config + assert not cfg.option('dummy').owner.isdefault() def test_addowner_multiple_time(): @@ -83,102 +93,128 @@ def test_delete_owner(): raises(ConstError, 'del(owners.deleted2)') -def test_owner_is_not_a_string(): +def test_owner_is_not_a_string(config_type): gcdummy = BoolOption('dummy', 'dummy', default=False) descr = OptionDescription('tiramisu', '', [gcdummy]) - api = Config(descr) - assert api.option('dummy').value.get() is False - assert api.option('dummy').owner.get() == owners.default - assert api.option('dummy').owner.get() == 'default' - assert isinstance(api.option('dummy').owner.get(), owners.Owner) - api.option('dummy').value.set(True) - assert api.option('dummy').owner.get() == 'user' + cfg = Config(descr) + cfg = get_config(cfg, config_type) + assert cfg.option('dummy').value.get() is False + assert cfg.option('dummy').owner.get() == owners.default + assert cfg.option('dummy').owner.get() == 'default' + assert isinstance(cfg.option('dummy').owner.get(), owners.Owner) + cfg.option('dummy').value.set(True) + assert cfg.option('dummy').owner.get() == 'user' -def test_setowner_without_valid_owner(): +def test_setowner_without_valid_owner(config_type): gcdummy = BoolOption('dummy', 'dummy', default=False) descr = OptionDescription('tiramisu', '', [gcdummy]) - api = Config(descr) - assert api.option('dummy').value.get() is False - assert api.option('dummy').owner.get() == 'default' + cfg = Config(descr) + cfg = get_config(cfg, config_type) + assert cfg.option('dummy').value.get() is False + assert cfg.option('dummy').owner.get() == 'default' -def test_setowner_for_value(): +def test_setowner_for_value(config_type): gcdummy = BoolOption('dummy', 'dummy', default=False) descr = OptionDescription('tiramisu', '', [gcdummy]) - api = Config(descr) - assert api.option('dummy').value.get() is False - assert api.option('dummy').owner.get() == 'default' - owners.addowner("new2") - raises(ConfigError, "api.option('dummy').owner.set('new2')") - api.option('dummy').value.set(False) - assert api.option('dummy').owner.get() == owners.user - api.option('dummy').owner.set('new2') - assert api.option('dummy').owner.get() == owners.new2 + cfg_ori = Config(descr) + cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy').value.get() is False + assert cfg.option('dummy').owner.get() == 'default' + if config_type == 'tiramisu-api': + cfg.send() + raises(ConfigError, "cfg_ori.option('dummy').owner.set('new2')") + cfg = get_config(cfg_ori, config_type) + cfg.option('dummy').value.set(False) + assert cfg.option('dummy').owner.get() == owners.user + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.option('dummy').owner.set('new2') + cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy').owner.get() == owners.new2 -def test_setowner_forbidden(): +def test_setowner_forbidden(config_type): gcdummy = BoolOption('dummy', 'dummy', default=False) descr = OptionDescription('tiramisu', '', [gcdummy]) - api = Config(descr) - assert api.option('dummy').value.get() is False - assert api.option('dummy').owner.get() == 'default' - raises(ValueError, "api.owner.set('default')") - api.option('dummy').value.set(False) - raises(ValueError, "api.option('dummy').owner.set('default')") + cfg_ori = Config(descr) + cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy').value.get() is False + assert cfg.option('dummy').owner.get() == 'default' + if config_type == 'tiramisu-api': + cfg.send() + raises(ValueError, "cfg_ori.owner.set('default')") + cfg = get_config(cfg_ori, config_type) + cfg.option('dummy').value.set(False) + if config_type == 'tiramisu-api': + cfg.send() + raises(ValueError, "cfg_ori.option('dummy').owner.set('default')") + cfg = get_config(cfg_ori, config_type) -def test_setowner_read_only(): +def test_setowner_read_only(config_type): gcdummy = BoolOption('dummy', 'dummy', default=False) descr = OptionDescription('tiramisu', '', [gcdummy]) - api = Config(descr) - api.property.read_write() - assert api.option('dummy').value.get() is False - assert api.option('dummy').owner.get() == 'default' - owners.addowner("readonly2") - api.option('dummy').value.set(False) - assert api.option('dummy').owner.get() == owners.user - api.property.read_only() + cfg_ori = Config(descr) + cfg_ori.property.read_write() + cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy').value.get() is False + assert cfg.option('dummy').owner.get() == 'default' + cfg.option('dummy').value.set(False) + assert cfg.option('dummy').owner.get() == owners.user + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.property.read_only() raises(PropertiesOptionError, - "api.option('dummy').owner.set('readonly2')") - assert api.option('dummy').owner.get() == owners.user + "cfg_ori.option('dummy').owner.set('readonly2')") + cfg = get_config(cfg_ori, config_type) + assert cfg.option('dummy').owner.get() == owners.user -def test_setowner_optiondescription(): +def test_setowner_optiondescription(config_type): gcdummy = BoolOption('dummy', 'dummy', default=False) descr1 = OptionDescription('tiramisu', '', [gcdummy]) descr = OptionDescription('tiramisu', '', [descr1]) - api = Config(descr) - raises(APIError, "api.option('tiramisu').owner.get()") - raises(APIError, "api.option('tiramisu').owner.set('user')") + cfg = Config(descr) + cfg = get_config(cfg, config_type) + raises(APIError, "cfg.option('tiramisu').owner.get()") + raises(APIError, "cfg.option('tiramisu').owner.set('user')") -def test_setowner_symlinkoption(): +def test_setowner_symlinkoption(config_type): gcdummy = BoolOption('dummy', 'dummy', default=False) s = SymLinkOption('symdummy', gcdummy) descr1 = OptionDescription('tiramisu', '', [gcdummy, s]) descr = OptionDescription('tiramisu', '', [descr1]) - api = Config(descr) - assert api.option('tiramisu.symdummy').owner.isdefault() - api.option('tiramisu.dummy').value.set(True) - assert not api.option('tiramisu.symdummy').owner.isdefault() - raises(ConfigError, "api.option('tiramisu.symdummy').owner.set('user')") + cfg_ori = Config(descr) + cfg = get_config(cfg_ori, config_type) + assert cfg.option('tiramisu.symdummy').owner.isdefault() + cfg.option('tiramisu.dummy').value.set(True) + assert not cfg.option('tiramisu.symdummy').owner.isdefault() + if config_type == 'tiramisu-api': + cfg.send() + raises(ConfigError, "cfg_ori.option('tiramisu.symdummy').owner.set('user')") -def test_owner_leadership(): +def test_owner_leadership(config_type): b = IntOption('int', 'Test int option', default=[0], multi=True) c = StrOption('str', 'Test string option', multi=True) descr = Leadership("int", "", [b, c]) od = OptionDescription('od', '', [descr]) - api = Config(od) - raises(ConfigError, "api.option('int.str', 0).owner.set('user')") + cfg_ori = Config(od) + raises(ConfigError, "cfg_ori.option('int.str', 0).owner.set('user')") + cfg = get_config(cfg_ori, config_type) - api.option('int.int').value.set([0, 1]) - api.option('int.str', 0).value.set('yes') - assert not api.option('int.str', 0).owner.isdefault() - assert api.option('int.str', 1).owner.isdefault() - api.option('int.str', 0).owner.set('user') - assert api.option('int.str', 0).owner.get() == owners.user - assert api.option('int.str', 1).owner.isdefault() - assert api.option('int.str', 0).value.get() == 'yes' - assert api.option('int.str', 1).value.get() == None + cfg.option('int.int').value.set([0, 1]) + cfg.option('int.str', 0).value.set('yes') + assert not cfg.option('int.str', 0).owner.isdefault() + assert cfg.option('int.str', 1).owner.isdefault() + if config_type == 'tiramisu-api': + cfg.send() + cfg_ori.option('int.str', 0).owner.set('user') + cfg = get_config(cfg_ori, config_type) + assert cfg.option('int.str', 0).owner.get() == owners.user + assert cfg.option('int.str', 1).owner.isdefault() + assert cfg.option('int.str', 0).value.get() == 'yes' + assert cfg.option('int.str', 1).value.get() == None diff --git a/tests/test_option_setting.py b/tests/test_option_setting.py index 9cc3323..46de3d1 100644 --- a/tests/test_option_setting.py +++ b/tests/test_option_setting.py @@ -1,6 +1,7 @@ "config.set() or config.setoption() or option.setoption()" from .autopath import do_autopath do_autopath() +from .config import config_type, get_config from py.test import raises @@ -40,14 +41,15 @@ def make_description(): #____________________________________________________________ # change with __setattr__ -def test_attribute_access(): +def test_attribute_access(config_type): "Once set, option values can't be changed again by attribute access" s = StrOption("string", "", default="string") descr = OptionDescription("options", "", [s]) - api = Config(descr) + cfg = Config(descr) + cfg = get_config(cfg, config_type) # let's try to change it again - api.option('string').value.set('foo') - assert api.option('string').value.get() == 'foo' + cfg.option('string').value.set('foo') + assert cfg.option('string').value.get() == 'foo' def test_mod_read_only_write(): @@ -122,42 +124,45 @@ def test_mod_read_only_write(): raises(ValueError, "config2.property.getdefault('read_write', 'unknown')") -def test_setitem(): +def test_setitem(config_type): s = StrOption("string", "", default=["string", "sdfsdf"], default_multi="prout", multi=True) descr = OptionDescription("options", "", [s]) - api = Config(descr) - api.option('string').value.set([undefined, 'foo']) - assert api.option('string').value.get() == ['string', 'foo'] + cfg = Config(descr) + cfg = get_config(cfg, config_type) + cfg.option('string').value.set([undefined, 'foo']) + assert cfg.option('string').value.get() == ['string', 'foo'] -def test_reset(): +def test_reset(config_type): "if value is None, resets to default owner" s = StrOption("string", "", default="string") descr = OptionDescription("options", "", [s]) - api = Config(descr) - api.option('string').value.set('foo') - assert api.option('string').value.get() == "foo" - assert api.option('string').owner.get() ==owners.user - api.option('string').value.reset() - assert api.option('string').value.get() == 'string' - assert api.option('string').owner.get() ==owners.default + cfg = Config(descr) + cfg = get_config(cfg, config_type) + cfg.option('string').value.set('foo') + assert cfg.option('string').value.get() == "foo" + assert cfg.option('string').owner.get() ==owners.user + cfg.option('string').value.reset() + assert cfg.option('string').value.get() == 'string' + assert cfg.option('string').owner.get() ==owners.default -def test_reset_with_multi(): +def test_reset_with_multi(config_type): s = StrOption("string", "", default=["string"], default_multi="string", multi=True) descr = OptionDescription("options", "", [s]) - api = Config(descr) -# api.option('string').value.set([]) - api.option('string').value.reset() - assert api.option('string').value.get() == ["string"] - assert api.option('string').owner.get() =='default' - api.option('string').value.set(["eggs", "spam", "foo"]) - assert api.option('string').owner.get() =='user' - api.option('string').value.set([]) - api.option('string').value.reset() -# assert api.option('string').value.get() == ["string"] - assert api.option('string').owner.get() =='default' - raises(ValueError, "api.option('string').value.set(None)") + cfg = Config(descr) + cfg = get_config(cfg, config_type) +# cfg.option('string').value.set([]) + cfg.option('string').value.reset() + assert cfg.option('string').value.get() == ["string"] + assert cfg.option('string').owner.get() =='default' + cfg.option('string').value.set(["eggs", "spam", "foo"]) + assert cfg.option('string').owner.get() =='user' + cfg.option('string').value.set([]) + cfg.option('string').value.reset() +# assert cfg.option('string').value.get() == ["string"] + assert cfg.option('string').owner.get() =='default' + raises(ValueError, "cfg.option('string').value.set(None)") def test_property_only_raises(): @@ -166,58 +171,61 @@ def test_property_only_raises(): stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc", requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True) descr = OptionDescription("options", "", [s, intoption, stroption]) - api = Config(descr) - api.property.read_write() - assert api.option('str').property.get() == {'empty'} - assert api.option('str').property.get(only_raises=True) == set() + cfg = Config(descr) + cfg.property.read_write() + assert cfg.option('str').property.get() == {'empty'} + assert cfg.option('str').property.get(only_raises=True) == set() def test_default_with_multi(): "default with multi is a list" s = StrOption("string", "", default=[], default_multi="string", multi=True) descr = OptionDescription("options", "", [s]) - api = Config(descr) - assert api.option('string').value.get() == [] + cfg = Config(descr) + assert cfg.option('string').value.get() == [] s = StrOption("string", "", default=None, default_multi="string", multi=True) descr = OptionDescription("options", "", [s]) - api = Config(descr) - assert api.option('string').value.get() == [] + cfg = Config(descr) + assert cfg.option('string').value.get() == [] def test_idontexist(): descr = make_description() - api = Config(descr) - api.value.dict() - raises(AttributeError, "api.option('idontexist').value.get()") + cfg = Config(descr) + cfg.value.dict() + raises(AttributeError, "cfg.option('idontexist').value.get()") # ____________________________________________________________ -def test_attribute_access_with_multi(): +def test_attribute_access_with_multi(config_type): s = StrOption("string", "", default=["string"], default_multi="string", multi=True) descr = OptionDescription("options", "", [s]) - api = Config(descr) - api.option('string').value.set(["foo", "bar"]) - assert api.option('string').value.get() == ["foo", "bar"] + cfg = Config(descr) + cfg = get_config(cfg, config_type) + cfg.option('string').value.set(["foo", "bar"]) + assert cfg.option('string').value.get() == ["foo", "bar"] -def test_item_access_with_multi(): +def test_item_access_with_multi(config_type): s = StrOption("string", "", default=["string"], multi=True) descr = OptionDescription("options", "", [s]) - api = Config(descr) - api.option('string').value.set(["foo", "bar"]) - assert api.option('string').value.get() == ["foo", "bar"] - api.option('string').value.set(["changetest", "bar"]) - assert api.option('string').value.get() == ["changetest", "bar"] + cfg = Config(descr) + cfg = get_config(cfg, config_type) + cfg.option('string').value.set(["foo", "bar"]) + assert cfg.option('string').value.get() == ["foo", "bar"] + cfg.option('string').value.set(["changetest", "bar"]) + assert cfg.option('string').value.get() == ["changetest", "bar"] -def test_access_with_multi_default(): +def test_access_with_multi_default(config_type): s = StrOption("string", "", default=["string"], multi=True) descr = OptionDescription("options", "", [s]) - api = Config(descr) - assert api.option('string').owner.get() =='default' - api.option('string').value.set(["foo", "bar"]) - assert api.option('string').value.get() == ["foo", "bar"] - assert api.option('string').owner.get() =='user' + cfg = Config(descr) + cfg = get_config(cfg, config_type) + assert cfg.option('string').owner.get() =='default' + cfg.option('string').value.set(["foo", "bar"]) + assert cfg.option('string').value.get() == ["foo", "bar"] + assert cfg.option('string').owner.get() =='user' def test_multi_with_requires(): @@ -226,12 +234,12 @@ def test_multi_with_requires(): stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc", requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True) descr = OptionDescription("options", "", [s, intoption, stroption]) - api = Config(descr) - api.property.read_write() - assert not 'hidden' in api.option('str').property.get() - api.option('int').value.set(1) - raises(PropertiesOptionError, "api.option('str').value.set(['a', 'b'])") - assert 'hidden' in api.forcepermissive.option('str').property.get() + cfg = Config(descr) + cfg.property.read_write() + assert not 'hidden' in cfg.option('str').property.get() + cfg.option('int').value.set(1) + raises(PropertiesOptionError, "cfg.option('str').value.set(['a', 'b'])") + assert 'hidden' in cfg.forcepermissive.option('str').property.get() def test__requires_with_inverted(): @@ -240,10 +248,10 @@ def test__requires_with_inverted(): stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc", requires=[{'option': intoption, 'expected': 1, 'action': 'hide', 'inverse': True}], multi=True) descr = OptionDescription("options", "", [s, intoption, stroption]) - api = Config(descr) - assert not 'hidden' in api.option('str').property.get() - api.option('int').value.set(1) - assert not 'hidden' in api.option('str').property.get() + cfg = Config(descr) + assert not 'hidden' in cfg.option('str').property.get() + cfg.option('int').value.set(1) + assert not 'hidden' in cfg.option('str').property.get() def test_multi_with_requires_in_another_group(): @@ -253,12 +261,12 @@ def test_multi_with_requires_in_another_group(): requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True) descr = OptionDescription("opt", "", [stroption]) descr2 = OptionDescription("opt2", "", [intoption, s, descr]) - api = Config(descr2) - api.property.read_write() - assert not 'hidden' in api.option('opt.str').property.get() - api.option('int').value.set(1) - raises(PropertiesOptionError, "api.option('opt.str').value.set(['a', 'b'])") - assert 'hidden' in api.forcepermissive.option('opt.str').property.get() + cfg = Config(descr2) + cfg.property.read_write() + assert not 'hidden' in cfg.option('opt.str').property.get() + cfg.option('int').value.set(1) + raises(PropertiesOptionError, "cfg.option('opt.str').value.set(['a', 'b'])") + assert 'hidden' in cfg.forcepermissive.option('opt.str').property.get() def test_multi_with_requires_in_another_group_inverse(): @@ -268,12 +276,12 @@ def test_multi_with_requires_in_another_group_inverse(): requires=[{'option': intoption, 'expected': 0, 'action': 'hidden', 'inverse': True}], multi=True) descr = OptionDescription("opt", "", [stroption]) descr2 = OptionDescription("opt2", "", [intoption, s, descr]) - api = Config(descr2) - api.property.read_write() - assert not 'hidden' in api.option('opt.str').property.get() - api.option('int').value.set(1) - raises(PropertiesOptionError, "api.option('opt.str').value.set(['a', 'b'])") - assert 'hidden' in api.forcepermissive.option('opt.str').property.get() + cfg = Config(descr2) + cfg.property.read_write() + assert not 'hidden' in cfg.option('opt.str').property.get() + cfg.option('int').value.set(1) + raises(PropertiesOptionError, "cfg.option('opt.str').value.set(['a', 'b'])") + assert 'hidden' in cfg.forcepermissive.option('opt.str').property.get() def test_apply_requires_from_config(): @@ -283,14 +291,14 @@ def test_apply_requires_from_config(): requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True) descr = OptionDescription("opt", "", [stroption]) descr2 = OptionDescription("opt2", "", [intoption, s, descr]) - api = Config(descr2) - api.property.read_write() - assert not 'hidden' in api.option('opt.str').property.get() - api.option('int').value.set(1) - raises(PropertiesOptionError, "api.option('opt.str').value.get()") - assert 'hidden' in api.forcepermissive.option('opt.str').property.get() - assert 'hidden' not in api.forcepermissive.option('opt.str').option.properties() - assert 'hidden' not in api.forcepermissive.option('opt.str').option.properties(only_raises=True) + cfg = Config(descr2) + cfg.property.read_write() + assert not 'hidden' in cfg.option('opt.str').property.get() + cfg.option('int').value.set(1) + raises(PropertiesOptionError, "cfg.option('opt.str').value.get()") + assert 'hidden' in cfg.forcepermissive.option('opt.str').property.get() + assert 'hidden' not in cfg.forcepermissive.option('opt.str').option.properties() + assert 'hidden' not in cfg.forcepermissive.option('opt.str').option.properties(only_raises=True) def test_apply_requires_with_disabled(): @@ -300,14 +308,14 @@ def test_apply_requires_with_disabled(): requires=[{'option': intoption, 'expected': 1, 'action': 'disabled'}], multi=True) descr = OptionDescription("opt", "", [stroption]) descr2 = OptionDescription("opt2", "", [intoption, s, descr]) - api = Config(descr2) - api.property.read_write() - assert not 'disabled' in api.option('opt.str').property.get() - api.option('int').value.set(1) - raises(PropertiesOptionError, "api.option('opt.str').value.get()") - assert 'disabled' not in api.unrestraint.option('opt.str').option.properties() - assert 'disabled' not in api.unrestraint.option('opt.str').option.properties(only_raises=True) - assert 'disabled' in api.unrestraint.option('opt.str').property.get() + cfg = Config(descr2) + cfg.property.read_write() + assert not 'disabled' in cfg.option('opt.str').property.get() + cfg.option('int').value.set(1) + raises(PropertiesOptionError, "cfg.option('opt.str').value.get()") + assert 'disabled' not in cfg.unrestraint.option('opt.str').option.properties() + assert 'disabled' not in cfg.unrestraint.option('opt.str').option.properties(only_raises=True) + assert 'disabled' in cfg.unrestraint.option('opt.str').property.get() def test_multi_with_requires_with_disabled_in_another_group(): @@ -317,12 +325,12 @@ def test_multi_with_requires_with_disabled_in_another_group(): requires=[{'option': intoption, 'expected': 1, 'action': 'disabled'}], multi=True) descr = OptionDescription("opt", "", [stroption]) descr2 = OptionDescription("opt2", "", [intoption, s, descr]) - api = Config(descr2) - api.property.read_write() - assert not 'disabled' in api.option('opt.str').property.get() - api.option('int').value.set(1) - raises(PropertiesOptionError, "api.option('opt.str').value.set(['a', 'b'])") - assert 'disabled' in api.unrestraint.option('opt.str').property.get() + cfg = Config(descr2) + cfg.property.read_write() + assert not 'disabled' in cfg.option('opt.str').property.get() + cfg.option('int').value.set(1) + raises(PropertiesOptionError, "cfg.option('opt.str').value.set(['a', 'b'])") + assert 'disabled' in cfg.unrestraint.option('opt.str').property.get() def test_multi_with_requires_that_is_multi(): @@ -361,24 +369,24 @@ def test_multi_with_requires_that_is_leadership_follower(): d = StrOption('str1', 'Test string option', requires=[{'option': c, 'expected': '1', 'action': 'hidden'}], multi=True) descr = Leadership("int", "", [b, c, d]) descr2 = OptionDescription('od', '', [descr]) - api = Config(descr2) - api.property.read_write() - assert api.option('int.int').value.get() == [0] - assert api.option('int.str', 0).value.get() == None - assert api.option('int.str1', 0).value.get() == None - api.option('int.int').value.set([0, 1]) - assert api.option('int.int').value.get() == [0, 1] - assert api.option('int.str', 0).value.get() == None - assert api.option('int.str', 1).value.get() == None - assert api.option('int.str1', 0).value.get() == None - assert api.option('int.str1', 1).value.get() == None - api.option('int.str', 1).value.set('1') - api.property.read_only() - assert api.option('int.str1', 0).value.get() == None - assert api.option('int.str1', 1).value.get() == None - api.property.read_write() - assert api.option('int.str1', 0).value.get() == None - raises(PropertiesOptionError, "api.option('int.str1', 1).value.get()") + cfg = Config(descr2) + cfg.property.read_write() + assert cfg.option('int.int').value.get() == [0] + assert cfg.option('int.str', 0).value.get() == None + assert cfg.option('int.str1', 0).value.get() == None + cfg.option('int.int').value.set([0, 1]) + assert cfg.option('int.int').value.get() == [0, 1] + assert cfg.option('int.str', 0).value.get() == None + assert cfg.option('int.str', 1).value.get() == None + assert cfg.option('int.str1', 0).value.get() == None + assert cfg.option('int.str1', 1).value.get() == None + cfg.option('int.str', 1).value.set('1') + cfg.property.read_only() + assert cfg.option('int.str1', 0).value.get() == None + assert cfg.option('int.str1', 1).value.get() == None + cfg.property.read_write() + assert cfg.option('int.str1', 0).value.get() == None + raises(PropertiesOptionError, "cfg.option('int.str1', 1).value.get()") def test_multi_with_requires_that_is_leadership_follower_inverse(): @@ -387,24 +395,24 @@ def test_multi_with_requires_that_is_leadership_follower_inverse(): d = StrOption('str1', 'Test string option', requires=[{'option': c, 'expected': None, 'action': 'hidden', 'inverse': True}], multi=True) descr = Leadership("int", "", [b, c, d]) descr2 = OptionDescription('od', '', [descr]) - api = Config(descr2) - api.property.read_write() - assert api.option('int.int').value.get() == [0] - assert api.option('int.str', 0).value.get() is None - assert api.option('int.str1', 0).value.get() is None - api.option('int.int').value.set([0, 1]) - assert api.option('int.int').value.get() == [0, 1] - assert api.option('int.str', 0).value.get() is None - assert api.option('int.str', 1).value.get() is None - assert api.option('int.str1', 0).value.get() is None - assert api.option('int.str1', 1).value.get() is None - api.option('int.str', 1).value.set('1') - api.property.read_only() - assert api.option('int.str1', 0).value.get() is None - assert api.option('int.str1', 1).value.get() is None - api.property.read_write() - assert api.option('int.str1', 0).value.get() is None - raises(PropertiesOptionError, "api.option('int.str1', 1).value.get()") + cfg = Config(descr2) + cfg.property.read_write() + assert cfg.option('int.int').value.get() == [0] + assert cfg.option('int.str', 0).value.get() is None + assert cfg.option('int.str1', 0).value.get() is None + cfg.option('int.int').value.set([0, 1]) + assert cfg.option('int.int').value.get() == [0, 1] + assert cfg.option('int.str', 0).value.get() is None + assert cfg.option('int.str', 1).value.get() is None + assert cfg.option('int.str1', 0).value.get() is None + assert cfg.option('int.str1', 1).value.get() is None + cfg.option('int.str', 1).value.set('1') + cfg.property.read_only() + assert cfg.option('int.str1', 0).value.get() is None + assert cfg.option('int.str1', 1).value.get() is None + cfg.property.read_write() + assert cfg.option('int.str1', 0).value.get() is None + raises(PropertiesOptionError, "cfg.option('int.str1', 1).value.get()") def test_multi_with_requires_that_is_not_same_leadership(): @@ -422,32 +430,32 @@ def test_multi_with_requires_that_is_not_same_leadership(): def test_multi_with_bool(): s = BoolOption("bool", "", default=[False], multi=True) descr = OptionDescription("options", "", [s]) - api = Config(descr) - api.option('bool').value.set([True, False]) - assert api.option('bool').value.get() == [True, False] + cfg = Config(descr) + cfg.option('bool').value.set([True, False]) + assert cfg.option('bool').value.get() == [True, False] def test_choice_access_with_multi(): ch = ChoiceOption("t1", "", ("a", "b"), default=["a"], multi=True) descr = OptionDescription("options", "", [ch]) - api = Config(descr) - api.option('t1').value.set(["a", "b", "a", "b"]) - assert api.option('t1').value.get() == ["a", "b", "a", "b"] + cfg = Config(descr) + cfg.option('t1').value.set(["a", "b", "a", "b"]) + assert cfg.option('t1').value.get() == ["a", "b", "a", "b"] #____________________________________________________________ def test_accepts_multiple_changes_from_option(): s = StrOption("string", "", default="string") descr = OptionDescription("options", "", [s]) - api = Config(descr) - api.option('string').value.set("egg") - assert api.option('string').option.default() == "string" - assert api.option('string').value.get() == "egg" - api.option('string').value.set('blah') - assert api.option('string').option.default() == "string" - assert api.option('string').value.get() == "blah" - api.option('string').value.set('bol') - assert api.option('string').value.get() == 'bol' + cfg = Config(descr) + cfg.option('string').value.set("egg") + assert cfg.option('string').option.default() == "string" + assert cfg.option('string').value.get() == "egg" + cfg.option('string').value.set('blah') + assert cfg.option('string').option.default() == "string" + assert cfg.option('string').value.get() == "blah" + cfg.option('string').value.set('bol') + assert cfg.option('string').value.get() == 'bol' def test_allow_multiple_changes_from_config(): @@ -459,21 +467,21 @@ def test_allow_multiple_changes_from_config(): s2 = StrOption("string2", "", default="string") suboption = OptionDescription("bip", "", [s2]) descr = OptionDescription("options", "", [s, suboption]) - api = Config(descr) - api.option('string').value.set("oh") - assert api.option('string').value.get() == "oh" - api.option('string').value.set("blah") - assert api.option('string').value.get() == "blah" + cfg = Config(descr) + cfg.option('string').value.set("oh") + assert cfg.option('string').value.get() == "oh" + cfg.option('string').value.set("blah") + assert cfg.option('string').value.get() == "blah" # ____________________________________________________________ # accessing a value by the get method def test_access_by_get(): descr = make_description() - api = Config(descr) - raises(AttributeError, "list(api.option.find('idontexist'))") - assert api.option.find('wantref', first=True).value.get() is False - assert api.option.find('dummy', first=True).value.get() is False + cfg = Config(descr) + raises(AttributeError, "list(cfg.option.find('idontexist'))") + assert cfg.option.find('wantref', first=True).value.get() is False + assert cfg.option.find('dummy', first=True).value.get() is False def test_access_by_get_whith_hide(): @@ -484,74 +492,74 @@ def test_access_by_get_whith_hide(): BoolOption("d1", "")]), BoolOption("b2", ""), BoolOption("d1", "")]) - api = Config(descr) - api.property.read_write() - raises(AttributeError, "api.option.find('b1').value.get()") + cfg = Config(descr) + cfg.property.read_write() + raises(AttributeError, "cfg.option.find('b1').value.get()") def test_append_properties(): descr = make_description() - api = Config(descr) - assert api.option('gc.dummy').property.get() == set() - api.option('gc.dummy').property.add('test') - assert api.option('gc.dummy').property.get() == {'test'} - raises(ConfigError, "api.option('gc.dummy').property.add('force_store_value')") - assert api.option('gc.dummy').property.get() == {'test'} + cfg = Config(descr) + assert cfg.option('gc.dummy').property.get() == set() + cfg.option('gc.dummy').property.add('test') + assert cfg.option('gc.dummy').property.get() == {'test'} + raises(ConfigError, "cfg.option('gc.dummy').property.add('force_store_value')") + assert cfg.option('gc.dummy').property.get() == {'test'} def test_reset_properties(): descr = make_description() - api = Config(descr) - assert api.option('gc.dummy').property.get() == set() - api.option('gc.dummy').property.add('frozen') - assert api.option('gc.dummy').property.get() == {'frozen'} - api.option('gc.dummy').property.reset() - assert api.option('gc.dummy').property.get() == set() + cfg = Config(descr) + assert cfg.option('gc.dummy').property.get() == set() + cfg.option('gc.dummy').property.add('frozen') + assert cfg.option('gc.dummy').property.get() == {'frozen'} + cfg.option('gc.dummy').property.reset() + assert cfg.option('gc.dummy').property.get() == set() def test_properties_cached(): b1 = BoolOption("b1", "", properties=('test',)) descr = OptionDescription("opt", "", [OptionDescription("sub", "", [b1])]) - api = Config(descr) - api.property.read_write() - assert api.option('sub.b1').property.get() == {'test'} + cfg = Config(descr) + cfg.property.read_write() + assert cfg.option('sub.b1').property.get() == {'test'} def test_append_properties_force_store_value(): gcdummy = BoolOption('dummy', 'dummy', default=False, properties=('force_store_value',)) gcgroup = OptionDescription('gc', '', [gcdummy]) descr = OptionDescription('tiramisu', '', [gcgroup]) - api = Config(descr) - assert api.option('gc.dummy').property.get() == {'force_store_value'} - api.option('gc.dummy').property.add('test') - assert api.option('gc.dummy').property.get() == {'force_store_value', 'test'} + cfg = Config(descr) + assert cfg.option('gc.dummy').property.get() == {'force_store_value'} + cfg.option('gc.dummy').property.add('test') + assert cfg.option('gc.dummy').property.get() == {'force_store_value', 'test'} def test_reset_properties_force_store_value(): gcdummy = BoolOption('dummy', 'dummy', default=False, properties=('force_store_value',)) gcgroup = OptionDescription('gc', '', [gcdummy]) descr = OptionDescription('tiramisu', '', [gcgroup]) - api = Config(descr) - assert api.property.exportation() == {} - api.property.add('frozen') - assert api.property.exportation() == \ + cfg = Config(descr) + assert cfg.property.exportation() == {} + cfg.property.add('frozen') + assert cfg.property.exportation() == \ {None: set(('frozen', 'cache', 'validator', 'warnings'))} - api.property.reset() - assert api.property.exportation() == {} - api.option('gc.dummy').property.add('test') - assert api.property.exportation() == {'gc.dummy': set(('test', 'force_store_value'))} - api.property.reset() - assert api.property.exportation() == {'gc.dummy': set(('test', 'force_store_value'))} - api.property.add('frozen') - assert api.property.exportation() == \ + cfg.property.reset() + assert cfg.property.exportation() == {} + cfg.option('gc.dummy').property.add('test') + assert cfg.property.exportation() == {'gc.dummy': set(('test', 'force_store_value'))} + cfg.property.reset() + assert cfg.property.exportation() == {'gc.dummy': set(('test', 'force_store_value'))} + cfg.property.add('frozen') + assert cfg.property.exportation() == \ {None: set(('frozen', 'validator', 'cache', 'warnings')), 'gc.dummy': set(('test', 'force_store_value'))} - api.property.add('frozen') - assert api.property.exportation() == \ + cfg.property.add('frozen') + assert cfg.property.exportation() == \ {None: set(('frozen', 'validator', 'cache', 'warnings')), 'gc.dummy': set(('test', 'force_store_value'))} - api.option('gc.dummy').property.add('test') - assert api.property.exportation() == \ + cfg.option('gc.dummy').property.add('test') + assert cfg.property.exportation() == \ {None: set(('frozen', 'validator', 'cache', 'warnings')), 'gc.dummy': set(('test', 'force_store_value'))} @@ -580,10 +588,10 @@ def test_set_modified_value(): gcdummy = BoolOption('dummy', 'dummy', default=False, properties=('force_store_value',)) gcgroup = OptionDescription('gc', '', [gcdummy]) descr = OptionDescription('tiramisu', '', [gcgroup]) - api = Config(descr) - assert api.property.exportation() == {} - api.property.importation({None: set(('frozen', 'cache', 'validator', 'warnings'))}) - assert api.property.exportation() == \ + cfg = Config(descr) + assert cfg.property.exportation() == {} + cfg.property.importation({None: set(('frozen', 'cache', 'validator', 'warnings'))}) + assert cfg.property.exportation() == \ {None: set(('frozen', 'cache', 'validator', 'warnings'))} @@ -611,12 +619,12 @@ def test_pprint(): val3 = StrOption('val3', "", requires=[{'option': stroption, 'expected': '2', 'action': 'hidden', 'inverse': True}]) descr = OptionDescription("options", "", [s, s2, s3, intoption, stroption, descr2, val3]) - api = Config(descr) - api.property.read_write() - api.option('int').value.set(1) + cfg = Config(descr) + cfg.property.read_write() + cfg.option('int').value.set(1) err = None try: - api.option('str').value.get() + cfg.option('str').value.get() except PropertiesOptionError as error: err = error @@ -627,7 +635,7 @@ def test_pprint(): err = None try: - api.option('options.val2').value.get() + cfg.option('options.val2').value.get() except PropertiesOptionError as error: err = error @@ -635,7 +643,7 @@ def test_pprint(): #err = None #try: - # api.option('val3').value.get() + # cfg.option('val3').value.get() #except PropertiesOptionError as error: # err = error @@ -648,7 +656,7 @@ def test_pprint(): err = None try: - api.option('string').value.get() + cfg.option('string').value.get() except Exception as error: err = error @@ -657,7 +665,7 @@ def test_pprint(): err = None try: - api.option('string3').value.get() + cfg.option('string3').value.get() except Exception as error: err = error diff --git a/tiramisu/api.py b/tiramisu/api.py index fa9b030..c8b7c8f 100644 --- a/tiramisu/api.py +++ b/tiramisu/api.py @@ -257,7 +257,16 @@ class _TiramisuOptionOption(_TiramisuOptionOptionDescription): def defaultmulti(self): """Get default value when added a value for a multi option (not for optiondescription)""" option = self._option_bag.option - return option.impl_getdefault_multi() + ret = option.impl_getdefault_multi() + if ret is None and option.impl_is_multi() and option.impl_has_callback() and not self.isfollower(): + callback, callback_params = option.impl_get_callback() + values = self._option_bag.config_bag.context.cfgimpl_get_values() + value = values.carry_out_calculation(self._option_bag, + callback, + callback_params) + if not isinstance(value, list): + ret = value + return ret def consistencies(self): """Get consistencies for an option (not for optiondescription)""" @@ -556,6 +565,11 @@ class _TiramisuOptionValueChoiceOption: option = self._option_bag.option return option.impl_get_values(self._option_bag) + def callbacks(self): + """Get callbacks for a values""" + option = self._option_bag.option + return option.get_callback() + class _TiramisuOptionValueOptionDescription: diff --git a/tiramisu/error.py b/tiramisu/error.py index f308e89..158a934 100644 --- a/tiramisu/error.py +++ b/tiramisu/error.py @@ -78,7 +78,7 @@ class PropertiesOptionError(AttributeError): self.proptype = proptype self._settings = settings self.msg = None - super(PropertiesOptionError, self).__init__(None) + super().__init__(None) def set_orig_opt(self, opt): self._orig_opt = opt @@ -168,6 +168,7 @@ class _CommonError: self.val = val self.display_type = display_type self.opt = weakref.ref(opt) + self.name = opt.impl_get_display_name() self.err_msg = err_msg self.index = index super().__init__(self.err_msg) @@ -178,7 +179,7 @@ class _CommonError: except AttributeError: self.prefix = self.tmpl.format(self.val, self.display_type, - self.opt().impl_get_display_name()) + self.name) msg = self.prefix if self.err_msg: if msg: diff --git a/tiramisu/locale/fr/LC_MESSAGES/tiramisu.po b/tiramisu/locale/fr/LC_MESSAGES/tiramisu.po index ddbe7e0..626ff57 100644 --- a/tiramisu/locale/fr/LC_MESSAGES/tiramisu.po +++ b/tiramisu/locale/fr/LC_MESSAGES/tiramisu.po @@ -75,7 +75,7 @@ msgstr "group_type inconnu: {0}" #: tiramisu/api.py:753 tiramisu/api.py:1208 msgid "please use .dict() before .updates()" -msgstr "faire .dico() avant .updates()" +msgstr "faire .dict() avant .updates()" #: tiramisu/api.py:1000 msgid "properties must be a set" diff --git a/tiramisu/option/choiceoption.py b/tiramisu/option/choiceoption.py index 5683196..108fd7b 100644 --- a/tiramisu/option/choiceoption.py +++ b/tiramisu/option/choiceoption.py @@ -81,25 +81,34 @@ class ChoiceOption(Option): properties=properties, warnings_only=warnings_only) + def get_callback(self): + values = self._choice_values + if isinstance(values, FunctionType): + return (values, getattr(self, '_choice_values_params', {})) + else: + return (None, None) + def impl_get_values(self, option_bag, current_opt=undefined): if current_opt is undefined: current_opt = self - values = self._choice_values - if isinstance(values, FunctionType): + values, values_params = self.get_callback() + if values is not None: if option_bag is undefined: values = undefined else: values = carry_out_calculation(current_opt, callback=values, - callback_params=getattr(self, '_choice_values_params', {}), + callback_params=values_params, index=None, config_bag=option_bag.config_bag, fromconsistency=[]) if values is not undefined and not isinstance(values, list): raise ConfigError(_('calculated values for {0} is not a list' '').format(self.impl_getname())) + else: + values = self._choice_values return values diff --git a/tiramisu/option/option.py b/tiramisu/option/option.py index e03a58c..d437373 100644 --- a/tiramisu/option/option.py +++ b/tiramisu/option/option.py @@ -359,10 +359,10 @@ class Option(BaseOption): '{0}'.format(err), err_index) warnings.warn_explicit(ValueErrorWarning(val, - self._display_name, - option_bag.ori_option, - '{0}'.format(err), - err_index), + self._display_name, + option_bag.ori_option, + '{0}'.format(err), + err_index), ValueErrorWarning, self.__class__.__name__, 0) @@ -707,9 +707,8 @@ class Option(BaseOption): for opt_ in [opts[idx_inf], opts[idx_inf + idx_sup + 1]]: if opt_ == current_opt: is_current = True - else: - if opt_ not in equal: - equal.append(opt_) + elif opt_ not in equal: + equal.append(opt_) if equal: if is_current: if warnings_only: diff --git a/tiramisu/setting.py b/tiramisu/setting.py index 165cd5e..2f5995f 100644 --- a/tiramisu/setting.py +++ b/tiramisu/setting.py @@ -406,7 +406,8 @@ class Settings(object): def getproperties(self, option_bag, - apply_requires=True): + apply_requires=True, + search_properties=None): """ """ opt = option_bag.option @@ -432,7 +433,8 @@ class Settings(object): opt.impl_getproperties()) if apply_requires: props |= self.apply_requires(option_bag, - False) + False, + search_properties=search_properties) props -= self.getpermissives(opt, path) if apply_requires: @@ -457,7 +459,8 @@ class Settings(object): def apply_requires(self, option_bag, - readable): + readable, + search_properties=None): """carries out the jit (just in time) requirements between options a requirement is a tuple of this form that comes from the option's @@ -517,6 +520,8 @@ class Settings(object): for requires in current_requires: for require in requires: exps, action, inverse, transitive, same_action, operator = require + #if search_properties and action not in search_properties: + # continue breaked = False for option, expected in exps: if not isinstance(option, tuple): diff --git a/tiramisu/storage/dictionary/value.py b/tiramisu/storage/dictionary/value.py index 1f9df35..8ff62be 100644 --- a/tiramisu/storage/dictionary/value.py +++ b/tiramisu/storage/dictionary/value.py @@ -65,6 +65,14 @@ class Values(Cache): # follower self._values[nb].append([value]) + def _add_new_value(self, index, nb, value): + if index is None or nb == 0: + # not follower or path + self._values[nb].append(value) + else: + # follower + self._values[nb].append([value]) + # value def setvalue(self, path, diff --git a/tiramisu/todict.py b/tiramisu/todict.py index bfd56b4..a2faa59 100644 --- a/tiramisu/todict.py +++ b/tiramisu/todict.py @@ -3,8 +3,9 @@ import warnings import sys from copy import copy -from collections import OrderedDict -from .error import ValueWarning, ValueErrorWarning, PropertiesOptionError +from itertools import chain +from .error import ValueWarning, ValueErrorWarning, PropertiesOptionError, ConfigError +from .setting import undefined from . import SynDynOption, RegexpOption, ChoiceOption, ParamContext, ParamOption from .i18n import _ @@ -57,23 +58,21 @@ class Callbacks(object): def process_properties(self, form): for callback, callback_params, path, childapi, schema, force_store_value in self.callbacks: + if childapi.option.isfollower(): + self.tiramisu_web.set_remotable(path, form, childapi) + continue has_option = False if callback_params is not None: - for callback_param in callback_params.args: + for callback_param in chain(callback_params.args, callback_params.kwargs.values()): if isinstance(callback_param, ParamContext): raise ValueError(_('context is not supported from now for {}').format(path)) if isinstance(callback_param, ParamOption): has_option = True if callback.__name__ != 'tiramisu_copy' or 'expire' in childapi.option.properties(): - if self.remotable == 'none': - raise ValueError(_('option {} only works when remotable is not "none"').format(path)) - form[callback_param.option.impl_getpath()]['remote'] = True - remote = True - if not has_option and form.get(path, {}).get('remote') == False: + self.tiramisu_web.set_remotable(callback_param.option.impl_getpath(), form) + if not has_option and form.get(path, {}).get('remote', False) == False: if 'expire' in childapi.option.properties(): - if self.remotable == 'none': - raise ValueError(_('option {} only works when remotable is not "none"').format(path)) - form.setdefault(path, {})['remote'] = True + self.tiramisu_web.set_remotable(path, form, childapi) elif childapi.owner.isdefault(): # get calculated value and set clearable schema[path]['value'] = childapi.value.get() @@ -83,7 +82,7 @@ class Callbacks(object): def manage_callbacks(self, form): for callback, callback_params, path, childapi, schema, force_store_value in self.callbacks: if callback_params is not None: - for callback_param in callback_params.args: + for callback_param in chain(callback_params.args, callback_params.kwargs.values()): if isinstance(callback_param, ParamOption) and callback.__name__ == 'tiramisu_copy': opt_path = callback_param.option.impl_getpath() if form.get(opt_path, {}).get('remote') is not True: @@ -98,41 +97,39 @@ class Callbacks(object): class Consistencies(object): def __init__(self, tiramisu_web): - self.not_equal = [] - self.options = {} + self.not_equal = {} self.tiramisu_web = tiramisu_web - def add(self, path, childapi): - child = childapi.option.get() - if isinstance(child, SynDynOption): - child = child._impl_getopt() - self.options[child] = path + def add(self, path, childapi, form): if not childapi.option.isoptiondescription(): for consistency in childapi.option.consistencies(): cons_id, func, all_cons_opts, params = consistency - if func == '_cons_not_equal': - options = [] + if func == '_cons_not_equal' and params.get('transitive', True) is True: + options_path = [] for option in all_cons_opts: + options_path.append(option()._path) + for idx, option in enumerate(all_cons_opts): option = option() - options.append(option) - # FIXME transitive - self.not_equal.append((options, params.get('warnings_only'))) + paths = options_path.copy() + paths.pop(idx) + warnings_only = params.get('warnings_only') or getattr(option, '_warnings_only', False) + self.not_equal.setdefault(option._path, {}).setdefault(warnings_only, []).extend(paths) + else: + for option in all_cons_opts: + self.tiramisu_web.set_remotable(option()._path, form) def process(self, form): - for not_equal, warnings_only in self.not_equal: - not_equal_option = [] - for option in not_equal: - not_equal_option.append(self.options[option]) - for idx, path in enumerate(not_equal_option): - if form.get(path, {}).get('remote') is True: - continue - options = copy(not_equal_option) - options.pop(idx) - form.setdefault(path, {}).setdefault('not_equal', - {'options': []}) - form[path]['not_equal']['options'].extend(options) - if warnings_only or getattr(option, '_warnings_only', False): - form[path]['not_equal']['warnings'] = True + for path in self.not_equal: + for warnings_only in self.not_equal[path]: + options = self.not_equal[path][warnings_only] + if path not in form: + form[path] = {} + if 'not_equal' not in form[path]: + form[path]['not_equal'] = [] + obj = {'options': options} + if warnings_only: + obj['warnings'] = True + form[path]['not_equal'].append(obj) class Requires(object): @@ -140,8 +137,6 @@ class Requires(object): self.requires = {} self.options = {} self.tiramisu_web = tiramisu_web - self.config = tiramisu_web.config - self.remotable = tiramisu_web.remotable def manage_requires(self, childapi, @@ -153,37 +148,36 @@ class Requires(object): for require in requires: options, action, inverse, \ transitive, same_action, operator = require - if transitive is False: + if transitive is False or same_action is False or operator == 'and': # transitive to "False" not supported yet for a requirement - if self.remotable == 'none': - raise ValueError('require set for {} but remotable is "none"' - ''.format(path)) - form.setdefault(path, {'key': path})['remote'] = True - return - if same_action is False: # same_action to "False" not supported yet for a requirement - if self.remotable == 'none': - raise ValueError('require set for {} but remotable is "none"' - ''.format(path)) - form.setdefault(path, {'key': path})['remote'] = True - return - if operator == 'and': # operator "and" not supported yet for a requirement - if self.remotable == 'none': - raise ValueError('require set for {} but remotable is "none"' - ''.format(path)) - form.setdefault(path, {'key': path})['remote'] = True + self.tiramisu_web.set_remotable(path, form, childapi) return for option, expected in options: - option_path = self.options.get(option) - if option_path is not None and action in action_hide: + option_path = option.impl_getpath() + if action in action_hide: + if isinstance(option, ChoiceOption): + choice_obj = self.tiramisu_web.config.unrestraint.option(option_path) + if choice_obj.value.is_values_callback(): + self.tiramisu_web.set_remotable(option_path, form, choice_obj) + return + else: + values = self.tiramisu_web.get_enum(choice_obj, + choice_obj.option.ismulti(), + option_path, + choice_obj.option.properties()) + for value in values: + if value not in expected: + self.requires.setdefault(path, + {'expected': {}} + )['expected'].setdefault(value, + {}).setdefault(inv_act, + []).append(option_path) if current_action is None: current_action = action elif current_action != action: - if self.remotable == 'none': - raise ValueError('require set for {} but remotable is "none"' - ''.format(path)) - form.setdefault(option_path, {'key': option_path})['remote'] = True + self.tiramisu_web.set_remotable(option_path, form) if inverse: act = 'show' inv_act = 'hide' @@ -196,25 +190,9 @@ class Requires(object): )['expected'].setdefault(exp, {}).setdefault(act, []).append(option_path) - if isinstance(option, ChoiceOption): - choice_obj = self.config.unrestraint.option(option_path) - values = self.tiramisu_web.get_enum(choice_obj, - choice_obj.option.ismulti(), - option_path, - choice_obj.option.properties()) - for value in values: - if value not in expected: - self.requires.setdefault(path, - {'expected': {}} - )['expected'].setdefault(value, - {}).setdefault(inv_act, - []).append(option_path) self.requires[path].setdefault('default', {}).setdefault(inv_act, []).append(option_path) else: - if self.remotable == 'none': - raise ValueError('require set for {} but remotable est "none"' - ''.format(path)) - form.setdefault(option_path, {'key': option_path})['remote'] = True + self.tiramisu_web.set_remotable(option_path, form) def add(self, path, childapi, form): #collect id of all options @@ -231,7 +209,7 @@ class Requires(object): current_action) def is_remote(self, path, form): - if self.remotable == 'all': + if self.tiramisu_web.remotable == 'all': return True else: return form.get(path) and form[path].get('remote', False) @@ -244,7 +222,7 @@ class Requires(object): if 'default' in values: for option in values['default'].get('show', []): if path == option: - form.setdefault(path, {'key': path})['remote'] = True + self.tiramisu_web.set_remotable(path, form) if not self.is_remote(option, form): dependencies.setdefault(option, {'default': {}, 'expected': {}} @@ -253,7 +231,7 @@ class Requires(object): dependencies[option]['default']['show'].append(path) for option in values['default'].get('hide', []): if path == option: - form.setdefault(path, {'key': path})['remote'] = True + self.tiramisu_web.set_remotable(path, form) if not self.is_remote(option, form): dependencies.setdefault(option, {'default': {}, 'expected': {}} @@ -265,7 +243,7 @@ class Requires(object): expected = '' for option in actions.get('show', []): if path == option: - form.setdefault(path, {'key': path})['remote'] = True + self.tiramisu_web.set_remotable(path, form) if not self.is_remote(option, form): dependencies.setdefault(option, {'expected': {}} @@ -275,7 +253,7 @@ class Requires(object): dependencies[option]['expected'][expected]['show'].append(path) for option in actions.get('hide', []): if path == option: - form.setdefault(path, {'key': path})['remote'] = True + self.tiramisu_web.set_remotable(path, form) if not self.is_remote(option, form): dependencies.setdefault(option, {'expected': {}} @@ -336,6 +314,18 @@ class TiramisuDict: path = root + '.' + childname yield path, childapi + def set_remotable(self, path, form, childapi=None): + if self.remotable == 'none': + raise ValueError(_('option {} only works when remotable is not "none"').format(path)) + form.setdefault(path, {})['remote'] = True + if childapi is None: + childapi = self.config.unrestraint.option(path) + if childapi.option.isfollower(): + parent_path = path.rsplit('.', 1)[0] + parent = self.config.unrestraint.option(parent_path) + leader = next(parent.list()) + form.setdefault(leader.option.path(), {})['remote'] = True + def walk(self, root, subchildapi, @@ -345,6 +335,7 @@ class TiramisuDict: order, updates_status, init=False): + error = None if init: if form is not None: self.requires = Requires(self) @@ -352,113 +343,120 @@ class TiramisuDict: self.callbacks = Callbacks(self) else: init = False - if subchildapi is None: - if root is None: - subchildapi = self.config.unrestraint.option + try: + if subchildapi is None: + if root is None: + subchildapi = self.config.unrestraint.option + else: + subchildapi = self.config.unrestraint.option(root) + isleadership = False else: - subchildapi = self.config.unrestraint.option(root) - isleadership = False - else: - isleadership = subchildapi.option.isleadership() - leader_len = None - for path, childapi in self.get_list(root, subchildapi): - if isleadership and leader_len is None: - leader_len = childapi.value.len() - props_no_requires = set(childapi.option.properties()) - if form is not None: - self.requires.add(path, - childapi, - form) - self.consistencies.add(path, - childapi) - self.callbacks.add(path, - childapi, - schema, - 'force_store_value' in props_no_requires) - childapi_option = childapi.option - if model is not None and childapi.option.isoptiondescription() or not childapi_option.issymlinkoption(): - self.gen_model(model, - childapi, - path, - leader_len, - props_no_requires, - updates_status) - if order is not None: - order.append(path) - if childapi.option.isoptiondescription(): - web_type = 'optiondescription' - if childapi_option.isleadership(): - type_ = 'array' - else: - type_ = 'object' - if schema is not None: - schema[path] = {'properties': OrderedDict(), - 'type': type_} - subschema = schema[path]['properties'] - else: - subschema = schema - self.walk(path, - childapi, - subschema, - model, - form, - order, - updates_status) - else: - child = childapi_option.get() - childtype = child.__class__.__name__ - if childtype == 'SynDynOption': - childtype = child._impl_getopt().__class__.__name__ - if childapi_option.issymlinkoption(): - web_type = 'symlink' - else: - web_type = childapi_option.type() - value = childapi.option.default() - if value not in [[], None]: - has_value = True - else: - value = None - has_value = False - - is_multi = childapi_option.ismulti() - if is_multi: - default = childapi_option.defaultmulti() - if default not in [None, []]: - has_value = True - else: - default = None - else: - default = None - - if schema is not None: - self.gen_schema(schema, - childapi, - childapi_option, - path, - props_no_requires, - value, - default, - is_multi, - web_type) + isleadership = subchildapi.option.isleadership() + leader_len = None + for path, childapi in self.get_list(root, subchildapi): + if isleadership and leader_len is None: + leader_len = childapi.value.len() + one_is_remote = False + props_no_requires = set(childapi.option.properties()) if form is not None: - self.gen_form(form, - web_type, - path, - child, - childapi_option, - childtype, - has_value) - if schema is not None: - if web_type != 'symlink': - schema[path]['title'] = childapi_option.doc() - self.add_help(schema[path], - childapi) + self.requires.add(path, + childapi, + form) + self.consistencies.add(path, + childapi, + form) + self.callbacks.add(path, + childapi, + schema, + 'force_store_value' in props_no_requires) + childapi_option = childapi.option + if model is not None and childapi.option.isoptiondescription() or not childapi_option.issymlinkoption(): + self.gen_model(model, + childapi, + path, + leader_len, + props_no_requires, + updates_status) + if order is not None: + order.append(path) + if childapi.option.isoptiondescription(): + web_type = 'optiondescription' + if childapi_option.isleadership(): + type_ = 'array' + else: + type_ = 'object' + if schema is not None: + schema[path] = {'properties': {}, + 'type': type_} + subschema = schema[path]['properties'] + else: + subschema = schema + self.walk(path, + childapi, + subschema, + model, + form, + order, + updates_status) + else: + child = childapi_option.get() + childtype = child.__class__.__name__ + if childtype == 'SynDynOption': + childtype = child._impl_getopt().__class__.__name__ + if childapi_option.issymlinkoption(): + web_type = 'symlink' + else: + web_type = childapi_option.type() + value = childapi.option.default() + if value == []: + value = None + + is_multi = childapi_option.ismulti() + if is_multi: + defaultmulti = childapi_option.defaultmulti() + if defaultmulti == []: + defaultmulti = None + else: + defaultmulti = None + + if schema is not None: + self.gen_schema(schema, + childapi, + childapi_option, + path, + props_no_requires, + value, + defaultmulti, + is_multi, + web_type, + form) + if form is not None: + self.gen_form(form, + web_type, + path, + child, + childapi_option, + childtype) + if schema is not None: + if web_type != 'symlink': + schema[path]['title'] = childapi_option.doc() + self.add_help(schema[path], + childapi) + except Exception as err: + if not init: + raise err + error = err if init and form is not None: self.callbacks.process(form) self.requires.process(form) self.consistencies.process(form) del self.requires del self.consistencies + del self.callbacks + if error: + msg = str(error) + del error + raise ConfigError(_('unable to transform tiramisu object to dict: {}').format(msg)) def gen_schema(self, @@ -468,9 +466,10 @@ class TiramisuDict: path, props_no_requires, value, - default, + defaultmulti, is_multi, - web_type): + web_type, + form): schema[path] = {'type': web_type} if childapi_option.issymlinkoption(): schema[path]['opt_path'] = childapi_option.get().impl_getopt().impl_getpath() @@ -478,8 +477,8 @@ class TiramisuDict: if value is not None: schema[path]['value'] = value - if default is not None: - schema[path]['default'] = default + if defaultmulti is not None: + schema[path]['defaultmulti'] = defaultmulti if is_multi: schema[path]['isMulti'] = is_multi @@ -491,6 +490,12 @@ class TiramisuDict: schema[path]['autoFreeze'] = True if web_type == 'choice': + values, values_params = childapi.value.callbacks() + if values_params: + for values_param in chain(values_params.args, values_params.kwargs.values()): + if isinstance(values_param, ParamOption): + self.set_remotable(path, form, childapi) + return schema[path]['enum'] = self.get_enum(childapi, is_multi, path, @@ -514,26 +519,28 @@ class TiramisuDict: path, child, childapi_option, - childtype, - has_value): + childtype): obj_form = {} if path in form: obj_form.update(form[path]) if not childapi_option.issymlinkoption(): if self.clearable == 'all': obj_form['clearable'] = True - if has_value and self.clearable != 'none': + if self.clearable != 'none': obj_form['clearable'] = True if self.remotable == 'all' or childapi_option.has_dependency(): obj_form['remote'] = True - pattern = childapi_option.pattern() - if pattern is not None: - obj_form['pattern'] = pattern + if childtype == 'IPOption' and (child.impl_get_extra('_private_only') or not child.impl_get_extra('_allow_reserved') or child.impl_get_extra('_cidr')): + obj_form['remote'] = True + if not obj_form.get('remote', False): + pattern = childapi_option.pattern() + if pattern is not None: + obj_form['pattern'] = pattern + if childtype == 'PortOption': + obj_form['min'] = child.impl_get_extra('_min_value') + obj_form['max'] = child.impl_get_extra('_max_value') if childtype == 'FloatOption': obj_form['step'] = 'any' - if childtype == 'PortOption': - obj_form['min'] = child.impl_get_extra('_min_value') - obj_form['max'] = child.impl_get_extra('_max_value') if web_type == 'choice': obj_form['type'] = 'choice' elif web_type in INPUTS: @@ -541,50 +548,67 @@ class TiramisuDict: if obj_form: form[path] = obj_form - def calc_raises_properties(self, childapi): + def calc_raises_properties(self, + obj, + childapi): old_properties = childapi._option_bag.config_bag.properties del childapi._option_bag.config_bag.properties - ret = childapi.option.properties(only_raises=True) + if 'permissive' not in childapi._option_bag.config_bag.properties: + childapi._option_bag.config_bag.properties = childapi._option_bag.config_bag.properties | {'permissive'} + # 'display=False' means cannot access only without permissive option + # 'hidden=True' means cannot access with or without permissive option + if childapi.option.properties(only_raises=True): + obj['hidden'] = True + childapi._option_bag.config_bag.properties = childapi._option_bag.config_bag.properties - {'permissive'} + if childapi.option.properties(only_raises=True): + obj['display'] = False childapi._option_bag.config_bag.properties = old_properties - return ret def _gen_model_properties(self, childapi, path, index, props_no_requires): - obj = {} isfollower = childapi.option.isfollower() if index is None and isfollower: # cannot calculated requires with follower without index props = props_no_requires else: props = set(childapi.property.get()) - if self.calc_raises_properties(childapi): - obj['display'] = False - if not isfollower and childapi.option.ismulti(): - if 'empty' in props: + obj = self.gen_properties(props, + isfollower, + childapi.option.ismulti()) + self.calc_raises_properties(obj, childapi) + return obj + + def gen_properties(self, + properties, + isfollower=False, + ismulti=False): + obj = {} + if not isfollower and ismulti: + if 'empty' in properties: obj['required'] = True - props.remove('empty') - if 'mandatory' in props: + properties.remove('empty') + if 'mandatory' in properties: obj['needs_len'] = True - props.remove('mandatory') - elif 'mandatory' in props: + properties.remove('mandatory') + elif 'mandatory' in properties: obj['required'] = True - props.remove('mandatory') - if 'frozen' in props: + properties.remove('mandatory') + if 'frozen' in properties: obj['readOnly'] = True - props.remove('frozen') - if 'hidden' in props: - obj['hidden'] = True - props.remove('hidden') - if 'disabled' in props: - obj['hidden'] = True - props.remove('disabled') - if props: - lprops = list(props) + properties.remove('frozen') + #if 'hidden' in properties: + # obj['hidden'] = True + # properties.remove('hidden') + #if 'disabled' in properties: + # obj['hidden'] = True + # properties.remove('disabled') + if properties: + lprops = list(properties) lprops.sort() - obj['properties'] = lprops + obj['props'] = lprops return obj def gen_model(self, @@ -597,14 +621,11 @@ class TiramisuDict: if childapi.option.isoptiondescription(): props = set(childapi.property.get()) obj = {} - if self.calc_raises_properties(childapi): - obj['display'] = False + self.calc_raises_properties(obj, childapi) if props: lprops = list(props) lprops.sort() obj['properties'] = lprops - if 'hidden' in props or 'disabled' in props: - obj['hidden'] = True try: self.config.option(path).option.get() except PropertiesOptionError: @@ -646,17 +667,27 @@ class TiramisuDict: obj, index, updates_status): - # FIXME unrestraint ... - try: - nchildapi = self.config.option(path, index=index) - with warnings.catch_warnings(record=True) as warns: - value = nchildapi.value.get() + if path in updates_status and index in updates_status[path]: + value = childapi.value.get() self._get_value_with_exception(obj, childapi, - warns) - except PropertiesOptionError: - value = childapi.value.get() - warns = [] + updates_status[path][index]) + del updates_status[path][index] + else: + try: + nchildapi = self.config.option(path, index=index) + with warnings.catch_warnings(record=True) as warns: + value = nchildapi.value.get() + self._get_value_with_exception(obj, + childapi, + warns) + except ValueError as err: + self._get_value_with_exception(obj, + childapi, + [err]) + value = self.config.unrestraint.option(path, index=index).value.get() + except PropertiesOptionError as err: + value = childapi.value.get() if value is not None and value != []: obj['value'] = value obj['owner'] = childapi.owner.get() @@ -666,9 +697,13 @@ class TiramisuDict: childapi, values): for value in values: - if isinstance(value.message, ValueErrorWarning): + if isinstance(value, ValueError): + obj.setdefault('error', []) + obj['error'].append(str(value)) + obj['invalid'] = True + elif isinstance(value.message, ValueErrorWarning): value.message.prefix = '' - if childapi.option.isleader(): + if childapi.option.isfollower(): obj.setdefault('invalid', []) obj['invalid'].append({'error': str(value.message), 'index': value.message.index}) @@ -681,10 +716,19 @@ class TiramisuDict: obj['warnings'].append(str(value.message)) obj['hasWarnings'] = True + def gen_global(self): + ret = {} + ret['owner'] = self.config.owner.get() + ret['properties'] = list(self.config.property.get()) + ret['properties'].sort() + ret['permissives'] = list(self.config.permissive.get()) + ret['permissives'].sort() + return ret + def get_form(self, form): ret = [] buttons = [] - dict_form = OrderedDict() + dict_form = {} for form_ in form: if 'key' in form_: dict_form[form_['key']] = form_ @@ -723,7 +767,7 @@ class TiramisuDict: childapi.value.set(value) else: multi = childapi.value.get() - if not multi and index == 0: + if len(multi) < index + 1: multi.append(value) else: multi[index] = value @@ -744,26 +788,25 @@ class TiramisuDict: if childapi_option.isfollower(): childapi = self.config.option(path, index) with warnings.catch_warnings(record=True) as warns: - #try: - if update['action'] == 'modify': - self.mod_value(childapi, - path, - index, - update.get('value')) - elif update['action'] == 'delete': - self.del_value(childapi, - path, - index) - elif update['action'] == 'add': - if childapi_option.ismulti(): - self.add_value(childapi, path, update['value']) + try: + if update['action'] == 'modify': + self.mod_value(childapi, + path, + index, + update.get('value', undefined)) + elif update['action'] == 'delete': + self.del_value(childapi, + path, + index) + elif update['action'] == 'add': + if childapi_option.ismulti(): + self.add_value(childapi, path, update['value']) + else: + raise ValueError(_('only multi option can have action "add", but "{}" is not a multi').format(path)) else: - raise ValueError(_('only multi option can have action "add", but "{}" is not a multi').format(path)) - else: - raise ValueError(_('unknown action')) - #except ValueError as err: - # updates_status.setdefault(path, {})[index] = err - # continue + raise ValueError(_('unknown action')) + except ValueError as err: + updates_status.setdefault(path, {})[index] = [err] if warns != []: updates_status.setdefault(path, {}).setdefault(index, []).extend(warns) return updates_status @@ -797,7 +840,7 @@ class TiramisuDict: updates_status={}): rootpath = self.root if build_schema: - schema = OrderedDict() + schema = {} else: schema = None if build_model: @@ -809,6 +852,7 @@ class TiramisuDict: buttons = [] else: form = None + ret = {} self.walk(rootpath, None, schema, @@ -832,6 +876,7 @@ class TiramisuDict: ret['schema'] = schema if build_model: ret['model'] = model + ret['global'] = self.gen_global() if build_form: ret['form'] = form ret['version'] = '1.0' diff --git a/tiramisu/value.py b/tiramisu/value.py index 48d16dd..e682a7d 100644 --- a/tiramisu/value.py +++ b/tiramisu/value.py @@ -77,7 +77,7 @@ class Values(object): check_error=True) # store value in cache validator = 'validator' in option_bag.config_bag.properties - if not is_cached or validator: + if not option_bag.fromconsistency and (not is_cached or validator): self._p_.setcache(option_bag.path, option_bag.index, value,