#from tiramisu.option import BoolOption, UnicodeOption, SymLinkOption, \ # OptionDescription #from tiramisu.config import Config #from tiramisu.setting import owners #from tiramisu.storage import delete_session #from tiramisu.error import ConfigError #from pickle import dumps, loads # # #def return_value(value=None): # return value # # #def _get_slots(opt): # slots = set() # for subclass in opt.__class__.__mro__: # if subclass is not object: # slots.update(subclass.__slots__) # return slots # # #def _no_state(opt): # for attr in _get_slots(opt): # if 'state' in attr: # try: # getattr(opt, attr) # except: # pass # else: # raise Exception('opt should have already attribute {0}'.format(attr)) # # #def _diff_opt(opt1, opt2): # attr1 = set(_get_slots(opt1)) # attr2 = set(_get_slots(opt2)) # diff1 = attr1 - attr2 # diff2 = attr2 - attr1 # if diff1 != set(): # raise Exception('more attribute in opt1 {0}'.format(list(diff1))) # if diff2 != set(): # raise Exception('more attribute in opt2 {0}'.format(list(diff2))) # for attr in attr1: # if attr in ['_cache_paths', '_cache_consistencies']: # continue # err1 = False # err2 = False # val1 = None # val2 = None # try: # val1 = getattr(opt1, attr) # except: # err1 = True # # try: # val2 = getattr(opt2, attr) # except: # err2 = True # assert err1 == err2 # if val1 is None: # assert val1 == val2 # elif attr == '_children': # assert val1[0] == val2[0] # for index, _opt in enumerate(val1[1]): # assert _opt._name == val2[1][index]._name # elif attr == '_requires': # assert val1[0][0][0]._name == val2[0][0][0]._name # assert val1[0][0][1:] == val2[0][0][1:] # elif attr == '_opt': # assert val1._name == val2._name # elif attr == '_consistencies': # # dict is only a cache # if isinstance(val1, list): # for index, consistency in enumerate(val1): # assert consistency[0] == val2[index][0] # for idx, opt in enumerate(consistency[1]): # assert opt._name == val2[index][1][idx]._name # elif attr == '_callback': # assert val1[0] == val2[0] # if val1[1] is not None: # for key, values in val1[1].items(): # for idx, value in enumerate(values): # if isinstance(value, tuple): # assert val1[1][key][idx][0]._name == val2[1][key][idx][0]._name # assert val1[1][key][idx][1] == val2[1][key][idx][1] # else: # assert val1[1][key][idx] == val2[1][key][idx] # else: # assert val1[1] == val2[1] # else: # assert val1 == val2 # # #def test_diff_opt(): # b = BoolOption('b', '') # u = UnicodeOption('u', '', requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}]) # #u.impl_add_consistency('not_equal', b) # s = SymLinkOption('s', u) # o = OptionDescription('o', '', [b, u, s]) # o1 = OptionDescription('o1', '', [o]) # # a = dumps(o1) # q = loads(a) # _diff_opt(o1, q) # _diff_opt(o1.o, q.o) # _diff_opt(o1.o.b, q.o.b) # _diff_opt(o1.o.u, q.o.u) # _diff_opt(o1.o.s, q.o.s) # # #def test_diff_opt_cache(): # b = BoolOption('b', '') # u = UnicodeOption('u', '', requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}]) # u.impl_add_consistency('not_equal', b) # s = SymLinkOption('s', u) # o = OptionDescription('o', '', [b, u, s]) # o1 = OptionDescription('o1', '', [o]) # o1.impl_build_cache() # # a = dumps(o1) # q = loads(a) # _diff_opt(o1, q) # _diff_opt(o1.o, q.o) # _diff_opt(o1.o.b, q.o.b) # _diff_opt(o1.o.u, q.o.u) # _diff_opt(o1.o.s, q.o.s) # # #def test_diff_opt_callback(): # b = BoolOption('b', '', callback=return_value) # b2 = BoolOption('b2', '', callback=return_value, callback_params={'': ('yes',)}) # b3 = BoolOption('b3', '', callback=return_value, callback_params={'': ('yes', (b, False)), 'value': ('no',)}) # o = OptionDescription('o', '', [b, b2, b3]) # o1 = OptionDescription('o1', '', [o]) # o1.impl_build_cache() # # a = dumps(o1) # q = loads(a) # _diff_opt(o1, q) # _diff_opt(o1.o, q.o) # _diff_opt(o1.o.b, q.o.b) # _diff_opt(o1.o.b2, q.o.b2) # _diff_opt(o1.o.b3, q.o.b3) # # #def test_no_state_attr(): # # all _state_xxx attributes should be deleted # b = BoolOption('b', '') # u = UnicodeOption('u', '', requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}]) # s = SymLinkOption('s', u) # o = OptionDescription('o', '', [b, u, s]) # o1 = OptionDescription('o1', '', [o]) # # a = dumps(o1) # q = loads(a) # _no_state(q) # _no_state(q.o) # _no_state(q.o.b) # _no_state(q.o.u) # _no_state(q.o.s) # # #def test_state_config(): # val1 = BoolOption('val1', "") # maconfig = OptionDescription('rootconfig', '', [val1]) # try: # cfg = Config(maconfig, persistent=True, session_id='29090931') # except ValueError: # cfg = Config(maconfig, session_id='29090931') # cfg._impl_test = True # a = dumps(cfg) # q = loads(a) # _diff_opt(maconfig, q.cfgimpl_get_description()) # assert cfg.cfgimpl_get_values().get_modified_values() == q.cfgimpl_get_values().get_modified_values() # assert cfg.cfgimpl_get_settings().get_modified_properties() == q.cfgimpl_get_settings().get_modified_properties() # assert cfg.cfgimpl_get_settings().get_modified_permissives() == q.cfgimpl_get_settings().get_modified_permissives() # try: # delete_session('29090931') # except ConfigError: # pass # # #def test_state_properties(): # val1 = BoolOption('val1', "") # maconfig = OptionDescription('rootconfig', '', [val1]) # try: # cfg = Config(maconfig, persistent=True, session_id='29090932') # except ValueError: # cfg = Config(maconfig, session_id='29090932') # cfg._impl_test = True # cfg.read_write() # cfg.cfgimpl_get_settings()[val1].append('test') # a = dumps(cfg) # q = loads(a) # _diff_opt(maconfig, q.cfgimpl_get_description()) # assert cfg.cfgimpl_get_values().get_modified_values() == q.cfgimpl_get_values().get_modified_values() # assert cfg.cfgimpl_get_settings().get_modified_properties() == q.cfgimpl_get_settings().get_modified_properties() # assert cfg.cfgimpl_get_settings().get_modified_permissives() == q.cfgimpl_get_settings().get_modified_permissives() # try: # delete_session('29090931') # except ConfigError: # pass # # #def test_state_values(): # val1 = BoolOption('val1', "") # maconfig = OptionDescription('rootconfig', '', [val1]) # try: # cfg = Config(maconfig, persistent=True, session_id='29090933') # except ValueError: # cfg = Config(maconfig, session_id='29090933') # cfg._impl_test = True # cfg.val1 = True # a = dumps(cfg) # q = loads(a) # _diff_opt(maconfig, q.cfgimpl_get_description()) # assert cfg.cfgimpl_get_values().get_modified_values() == q.cfgimpl_get_values().get_modified_values() # assert cfg.cfgimpl_get_settings().get_modified_properties() == q.cfgimpl_get_settings().get_modified_properties() # assert cfg.cfgimpl_get_settings().get_modified_permissives() == q.cfgimpl_get_settings().get_modified_permissives() # q.val1 = False # #assert cfg.val1 is True # assert q.val1 is False # try: # delete_session('29090931') # except ConfigError: # pass # # #def test_state_values_owner(): # val1 = BoolOption('val1', "") # maconfig = OptionDescription('rootconfig', '', [val1]) # try: # cfg = Config(maconfig, persistent=True, session_id='29090934') # except ValueError: # cfg = Config(maconfig, session_id='29090934') # cfg._impl_test = True # owners.addowner('newowner') # cfg.cfgimpl_get_settings().setowner(owners.newowner) # cfg.val1 = True # a = dumps(cfg) # q = loads(a) # _diff_opt(maconfig, q.cfgimpl_get_description()) # assert cfg.cfgimpl_get_values().get_modified_values() == q.cfgimpl_get_values().get_modified_values() # assert cfg.cfgimpl_get_settings().get_modified_properties() == q.cfgimpl_get_settings().get_modified_properties() # assert cfg.cfgimpl_get_settings().get_modified_permissives() == q.cfgimpl_get_settings().get_modified_permissives() # q.val1 = False # nval1 = q.cfgimpl_get_description().val1 # assert q.getowner(nval1) == owners.newowner # try: # delete_session('29090931') # except ConfigError: # pass