# coding: utf-8 from py.test import raises from .autopath import do_autopath do_autopath() from .config import config_type, get_config from tiramisu import BoolOption, StrOption, SymLinkOption, \ OptionDescription, Leadership, Config from tiramisu.error import PropertiesOptionError, ConfigError from tiramisu.setting import groups, owners from tiramisu.storage import list_sessions def teardown_function(function): assert list_sessions() == [], 'session list is not empty when leaving "{}"'.format(function.__name__) def return_value(): pass #____________________________________________________________ def test_symlink_option(config_type): boolopt = BoolOption("b", "", default=False) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription("opt", "", [linkopt, OptionDescription("s1", "", [boolopt])]) cfg = Config(descr) cfg = get_config(cfg, config_type) assert cfg.option('s1.b').value.get() is False cfg.option("s1.b").value.set(True) cfg.option("s1.b").value.set(False) assert cfg.option('s1.b').value.get() is False assert cfg.option('c').value.get() is False cfg.option('s1.b').value.set(True) assert cfg.option('s1.b').value.get() is True assert cfg.option('c').value.get() is True cfg.option('s1.b').value.set(False) assert cfg.option('s1.b').value.get() is False assert cfg.option('c').value.get() is False def test_symlink_assign_option(config_type): boolopt = BoolOption("b", "", default=False) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription("opt", "", [linkopt, OptionDescription("s1", "", [boolopt])]) cfg = Config(descr) cfg = get_config(cfg, config_type) raises(ConfigError, "cfg.option('c').value.set(True)") def test_symlink_del_option(config_type): boolopt = BoolOption("b", "", default=False) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription("opt", "", [linkopt, OptionDescription("s1", "", [boolopt])]) cfg = Config(descr) cfg = get_config(cfg, config_type) raises(ConfigError, "cfg.option('c').value.reset()") def test_symlink_addproperties(): boolopt = BoolOption('b', '', default=True, properties=('test',)) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription('opt', '', [boolopt, linkopt]) cfg = Config(descr) cfg.property.read_write() raises(TypeError, "cfg.option('c').property.add('new')") try: cfg.option('c').property.reset() except AssertionError: pass else: raise Exception('must raise') def test_symlink_getpermissive(): boolopt = BoolOption('b', '', default=True, properties=('test',)) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription('opt', '', [boolopt, linkopt]) cfg = Config(descr) cfg.property.read_write() cfg.option('b').permissive.set(frozenset(['perm'])) cfg.option('c').permissive.get() == frozenset(['perm']) def test_symlink_addpermissives(): boolopt = BoolOption('b', '', default=True, properties=('test',)) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription('opt', '', [boolopt, linkopt]) cfg = Config(descr) cfg.property.read_write() raises(TypeError, "cfg.option('c').permissive.set(frozenset(['new']))") try: cfg.option('c').permissive.reset() except AssertionError: pass else: raise Exception('must raise') def test_symlink_getproperties(): boolopt = BoolOption('b', '', default=True, properties=('test',)) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription('opt', '', [boolopt, linkopt]) cfg = Config(descr) cfg.property.read_write() assert boolopt.impl_getproperties() == linkopt.impl_getproperties() == {'test'} assert boolopt.impl_has_callback() == linkopt.impl_has_callback() == False def test_symlink_getcallback(): boolopt = BoolOption('b', '', callback=return_value) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription('opt', '', [boolopt, linkopt]) cfg = Config(descr) cfg.property.read_write() assert boolopt.impl_has_callback() == linkopt.impl_has_callback() == True assert boolopt.impl_get_callback() == linkopt.impl_get_callback() == (return_value, None) def test_symlink_requires(config_type): boolopt = BoolOption('b', '', default=True) stropt = StrOption('s', '', requires=[{'option': boolopt, 'expected': False, 'action': 'disabled'}]) linkopt = SymLinkOption("c", stropt) descr = OptionDescription('opt', '', [boolopt, stropt, linkopt]) cfg = Config(descr) cfg.property.read_write() cfg = get_config(cfg, config_type) assert cfg.option('b').value.get() is True assert cfg.option('s').value.get() is None assert cfg.option('c').value.get() is None cfg.option('b').value.set(False) # props = [] try: cfg.option('s').value.get() except PropertiesOptionError as err: props = err.proptype assert props == {'disabled'} # props = [] try: cfg.option('c').value.get() except PropertiesOptionError as err: props = err.proptype assert props == {'disabled'} def test_symlink_multi(config_type): boolopt = BoolOption("b", "", default=[False], multi=True) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription("opt", "", [linkopt, OptionDescription("s1", "", [boolopt])]) cfg = Config(descr) cfg = get_config(cfg, config_type) assert cfg.option('s1.b').value.get() == [False] assert cfg.option('c').value.get() == [False] cfg.option('s1.b').value.set([True]) assert cfg.option('s1.b').value.get() == [True] assert cfg.option('c').value.get() == [True] cfg.option('s1.b').value.set([False]) assert cfg.option('s1.b').value.get() == [False] assert cfg.option('c').value.get() == [False] cfg.option('s1.b').value.set([False, True]) assert cfg.option('s1.b').value.get() == [False, True] assert cfg.option('c').value.get() == [False, True] assert boolopt.impl_is_multi() is True assert linkopt.impl_is_multi() is True def test_symlink_assign(config_type): boolopt = BoolOption("b", "", default=False) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription("opt", "", [linkopt, OptionDescription("s1", "", [boolopt])]) cfg = Config(descr) cfg = get_config(cfg, config_type) raises(ConfigError, "cfg.option('c').value.set(True)") def test_symlink_owner(config_type): boolopt = BoolOption("b", "", default=False) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription("opt", "", [linkopt, OptionDescription("s1", "", [boolopt])]) cfg = Config(descr) cfg = get_config(cfg, config_type) assert cfg.option('s1.b').owner.isdefault() assert cfg.option('c').owner.isdefault() cfg.option('s1.b').value.set(True) assert not cfg.option('s1.b').owner.isdefault() assert not cfg.option('c').owner.isdefault() def test_symlink_get_information(): boolopt = BoolOption("b", "", default=False) linkopt = SymLinkOption("c", boolopt) boolopt.impl_set_information('test', 'test') assert boolopt.impl_get_information('test') == 'test' assert linkopt.impl_get_information('test') == 'test' boolopt.impl_set_information('test', 'test2') assert boolopt.impl_get_information('test') == 'test2' assert linkopt.impl_get_information('test') == 'test2' def test_symlink_leader(): a = StrOption('a', "", multi=True) ip_admin_eth0 = SymLinkOption('ip_admin_eth0', a) netmask_admin_eth0 = StrOption('netmask_admin_eth0', "", multi=True) raises(ValueError, "Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])") def test_symlink_followers(): a = StrOption('a', "", multi=True) ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True) netmask_admin_eth0 = SymLinkOption('netmask_admin_eth0', a) raises(ValueError, "Leadership('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])") def test_symlink_with_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]) leader = SymLinkOption('leader', ip_admin_eth0) od = OptionDescription('root', '', [interface1, leader]) 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': [], 'leader': []} cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['val1', 'val2']) assert cfg.value.dict() == {'ip_admin_eth0.ip_admin_eth0': ['val1', 'val2'], 'ip_admin_eth0.netmask_admin_eth0': [None, None], 'leader': ['val1', 'val2']} def test_symlink_with_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]) follower = SymLinkOption('follower', netmask_admin_eth0) od = OptionDescription('root', '', [interface1, follower]) 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': [], 'follower': []} cfg.option('ip_admin_eth0.ip_admin_eth0').value.set(['val1', 'val2']) print(cfg.value.dict()) assert cfg.value.dict() == {'ip_admin_eth0.ip_admin_eth0': ['val1', 'val2'], 'ip_admin_eth0.netmask_admin_eth0': [None, None], 'follower': [None, None]} # 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() == None assert cfg.option('follower', 0).value.get() == None assert cfg.option('follower', 1).value.get() == None # cfg.option('ip_admin_eth0.netmask_admin_eth0', 1).value.set('val3') assert cfg.value.dict() == {'ip_admin_eth0.ip_admin_eth0': ['val1', 'val2'], 'ip_admin_eth0.netmask_admin_eth0': [None, 'val3'], 'follower': [None, 'val3']} # 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() == 'val3' assert cfg.option('follower', 0).value.get() == None assert cfg.option('follower', 1).value.get() == 'val3' #____________________________________________________________ def test_symlink_dependency(): boolopt = BoolOption("b", "", default=False) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription("opt", "", [linkopt, OptionDescription("s1", "", [boolopt])]) cfg = Config(descr) assert cfg.option('s1.b').option.has_dependency() is False assert cfg.option('c').option.has_dependency() is True assert cfg.option('s1.b').option.has_dependency(False) is True assert cfg.option('c').option.has_dependency(False) is False def test_symlink_makedict(config_type): boolopt = BoolOption("b", "", default=False) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription("opt", "", [linkopt, OptionDescription("s1", "", [boolopt])]) cfg = Config(descr) cfg = get_config(cfg, config_type) assert cfg.value.dict() == {'c': False, 's1.b': False} cfg.option('s1.b').value.set(True) assert cfg.value.dict() == {'c': True, 's1.b': True} def test_symlink_list(config_type): boolopt = BoolOption("b", "", default=False) linkopt = SymLinkOption("c", boolopt) descr = OptionDescription("opt", "", [linkopt, OptionDescription("s1", "", [boolopt])]) cfg = Config(descr) cfg = get_config(cfg, config_type) list_opt = [] for opt in cfg.option.list(): list_opt.append(opt.option.path()) assert list_opt == ['c'] # list_opt = [] for opt in cfg.option.list(recursive=True): list_opt.append(opt.option.path()) assert list_opt == ['c', 's1.b']