From 3be005e82e1f81699fe2f3d8854ce9e42f18d80f Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Tue, 27 Aug 2013 21:36:52 +0200 Subject: [PATCH] add test test/test_dereference.py + memoryleaks in optiondescription's cache --- test/test_dereference.py | 111 +++++++++++++++++++++++++++ test/test_storage.py | 3 + tiramisu/option.py | 10 +-- tiramisu/setting.py | 2 +- tiramisu/storage/dictionary/value.py | 2 +- tiramisu/storage/sqlite3/value.py | 2 +- tiramisu/value.py | 2 +- 7 files changed, 123 insertions(+), 9 deletions(-) create mode 100644 test/test_dereference.py diff --git a/test/test_dereference.py b/test/test_dereference.py new file mode 100644 index 0000000..be8dfde --- /dev/null +++ b/test/test_dereference.py @@ -0,0 +1,111 @@ +# coding: utf-8 +import autopath +#from py.test import raises + +from tiramisu.config import Config +from tiramisu.option import BoolOption, OptionDescription +import weakref + + +def test_deref_storage(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + c = Config(o) + w = weakref.ref(c.cfgimpl_get_values()._p_) + del(c) + assert w() is None + + +def test_deref_value(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + c = Config(o) + w = weakref.ref(c.cfgimpl_get_values()) + del(c) + assert w() is None + + +def test_deref_setting(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + c = Config(o) + w = weakref.ref(c.cfgimpl_get_settings()) + del(c) + assert w() is None + + +def test_deref_config(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + c = Config(o) + w = weakref.ref(c) + del(c) + assert w() is None + + +def test_deref_option(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + w = weakref.ref(b) + del(b) + assert w() is not None + del(o) + assert w() is None + + +def test_deref_optiondescription(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + w = weakref.ref(o) + del(b) + assert w() is not None + del(o) + assert w() is None + + +def test_deref_option_cache(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + o.impl_build_cache() + w = weakref.ref(b) + del(b) + assert w() is not None + del(o) + assert w() is None + + +def test_deref_optiondescription_cache(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + o.impl_build_cache() + w = weakref.ref(o) + del(b) + assert w() is not None + del(o) + assert w() is None + + +def test_deref_option_config(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + c = Config(o) + w = weakref.ref(b) + del(b) + assert w() is not None + del(o) + assert w() is not None + del(c) + assert w() is None + + +def test_deref_optiondescription_config(): + b = BoolOption('b', '') + o = OptionDescription('od', '', [b]) + c = Config(o) + w = weakref.ref(o) + del(b) + assert w() is not None + del(o) + assert w() is not None + del(c) + assert w() is None diff --git a/test/test_storage.py b/test/test_storage.py index 3857fb5..9b9c430 100644 --- a/test/test_storage.py +++ b/test/test_storage.py @@ -1,3 +1,4 @@ +# coding: utf-8 import autopath #from py.test import raises @@ -79,3 +80,5 @@ def test_create_persistent_retrieve(): delete_session('test_persistent') c = Config(o, session_id='test_persistent', persistent=True) assert c.b is None + +#recup d'un coté de et l'autre diff --git a/tiramisu/option.py b/tiramisu/option.py index 498ddf3..8f598b9 100644 --- a/tiramisu/option.py +++ b/tiramisu/option.py @@ -99,7 +99,7 @@ class Option(BaseInformation): __slots__ = ('_name', '_requires', '_multi', '_validator', '_default_multi', '_default', '_properties', '_callback', '_multitype', '_master_slaves', '_consistencies', '_empty', - '_calc_properties') + '_calc_properties', '__weakref__') _empty = '' def __init__(self, name, doc, default=None, default_multi=None, @@ -714,7 +714,7 @@ class OptionDescription(BaseInformation): """ __slots__ = ('_name', '_requires', '_cache_paths', '_group_type', '_properties', '_children', '_consistencies', - '_calc_properties') + '_calc_properties', '__weakref__') def __init__(self, name, doc, children, requires=None, properties=None): """ @@ -801,8 +801,8 @@ class OptionDescription(BaseInformation): else: save = False if cache_path is None: - cache_path = [self._name] - cache_option = [self] + cache_path = [] + cache_option = [] for option in self.impl_getchildren(): attr = option._name if attr.startswith('_cfgimpl'): @@ -929,7 +929,7 @@ def validate_requires_arg(requires, name): :param requires: have a look at the :meth:`tiramisu.setting.Settings.apply_requires` method to know more about - the description of the requires dictionnary + the description of the requires dictionary """ if requires is None: return None, None diff --git a/tiramisu/setting.py b/tiramisu/setting.py index d99a02e..86f900e 100644 --- a/tiramisu/setting.py +++ b/tiramisu/setting.py @@ -239,7 +239,7 @@ def delete_session(session_id): #____________________________________________________________ class Settings(object): "``Config()``'s configuration options" - __slots__ = ('context', '_owner', '_p_') + __slots__ = ('context', '_owner', '_p_', '__weakref__') def __init__(self, context, storage): """ diff --git a/tiramisu/storage/dictionary/value.py b/tiramisu/storage/dictionary/value.py index e3d41ac..9c3e1f9 100644 --- a/tiramisu/storage/dictionary/value.py +++ b/tiramisu/storage/dictionary/value.py @@ -22,7 +22,7 @@ from tiramisu.storage.dictionary.storage import Cache class Values(Cache): - __slots__ = ('_values',) + __slots__ = ('_values', '__weakref__') def __init__(self, storage): """init plugin means create values storage diff --git a/tiramisu/storage/sqlite3/value.py b/tiramisu/storage/sqlite3/value.py index a70b675..4207c43 100644 --- a/tiramisu/storage/sqlite3/value.py +++ b/tiramisu/storage/sqlite3/value.py @@ -23,7 +23,7 @@ from tiramisu.setting import owners class Values(Cache): - __slots__ = tuple() + __slots__ = ('__weakref__',) def __init__(self, storage): """init plugin means create values storage diff --git a/tiramisu/value.py b/tiramisu/value.py index c654206..1d1babc 100644 --- a/tiramisu/value.py +++ b/tiramisu/value.py @@ -32,7 +32,7 @@ class Values(object): but the values are physicaly located here, in `Values`, wich is also responsible of a caching utility. """ - __slots__ = ('context', '_p_') + __slots__ = ('context', '_p_', '__weakref__') def __init__(self, context, storage): """