| import sys |
| import threading |
| import time |
| |
| import unittest |
| import pydevd_referrers |
| from pydev_imports import StringIO |
| |
| #======================================================================================================================= |
| # Test |
| #======================================================================================================================= |
| class Test(unittest.TestCase): |
| |
| |
| def testGetReferrers1(self): |
| |
| container = [] |
| contained = [1, 2] |
| container.append(0) |
| container.append(contained) |
| |
| # Ok, we have the contained in this frame and inside the given list (which on turn is in this frame too). |
| # we should skip temporary references inside the get_referrer_info. |
| result = pydevd_referrers.get_referrer_info(contained) |
| assert 'list[1]' in result |
| pydevd_referrers.print_referrers(contained, stream=StringIO()) |
| |
| def testGetReferrers2(self): |
| |
| class MyClass(object): |
| def __init__(self): |
| pass |
| |
| contained = [1, 2] |
| obj = MyClass() |
| obj.contained = contained |
| del contained |
| |
| # Ok, we have the contained in this frame and inside the given list (which on turn is in this frame too). |
| # we should skip temporary references inside the get_referrer_info. |
| result = pydevd_referrers.get_referrer_info(obj.contained) |
| assert 'found_as="contained"' in result |
| assert 'MyClass' in result |
| |
| |
| def testGetReferrers3(self): |
| |
| class MyClass(object): |
| def __init__(self): |
| pass |
| |
| contained = [1, 2] |
| obj = MyClass() |
| obj.contained = contained |
| del contained |
| |
| # Ok, we have the contained in this frame and inside the given list (which on turn is in this frame too). |
| # we should skip temporary references inside the get_referrer_info. |
| result = pydevd_referrers.get_referrer_info(obj.contained) |
| assert 'found_as="contained"' in result |
| assert 'MyClass' in result |
| |
| |
| def testGetReferrers4(self): |
| |
| class MyClass(object): |
| def __init__(self): |
| pass |
| |
| obj = MyClass() |
| obj.me = obj |
| |
| # Let's see if we detect the cycle... |
| result = pydevd_referrers.get_referrer_info(obj) |
| assert 'found_as="me"' in result #Cyclic ref |
| |
| |
| def testGetReferrers5(self): |
| container = dict(a=[1]) |
| |
| # Let's see if we detect the cycle... |
| result = pydevd_referrers.get_referrer_info(container['a']) |
| assert 'testGetReferrers5' not in result #I.e.: NOT in the current method |
| assert 'found_as="a"' in result |
| assert 'dict' in result |
| assert str(id(container)) in result |
| |
| |
| def testGetReferrers6(self): |
| container = dict(a=[1]) |
| |
| def should_appear(obj): |
| # Let's see if we detect the cycle... |
| return pydevd_referrers.get_referrer_info(obj) |
| |
| result = should_appear(container['a']) |
| assert 'should_appear' in result |
| |
| |
| def testGetReferrers7(self): |
| |
| class MyThread(threading.Thread): |
| def run(self): |
| #Note: we do that because if we do |
| self.frame = sys._getframe() |
| |
| t = MyThread() |
| t.start() |
| while not hasattr(t, 'frame'): |
| time.sleep(0.01) |
| |
| result = pydevd_referrers.get_referrer_info(t.frame) |
| assert 'MyThread' in result |
| |
| |
| if __name__ == "__main__": |
| #this is so that we can run it frem the jython tests -- because we don't actually have an __main__ module |
| #(so, it won't try importing the __main__ module) |
| try: |
| import gc |
| gc.get_referrers(unittest) |
| except: |
| pass |
| else: |
| unittest.TextTestRunner().run(unittest.makeSuite(Test)) |