blob: 7fc85142b02e2baee7ba9f07ac2d32320c79e266 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
import os.path
import sys
import threading
import time
IS_JYTHON = sys.platform.find('java') != -1
try:
this_file_name = __file__
except NameError:
# stupid jython. plain old __file__ isnt working for some reason
import test_runfiles #@UnresolvedImport - importing the module itself
this_file_name = test_runfiles.__file__
desired_runfiles_path = os.path.normpath(os.path.dirname(this_file_name) + "/..")
sys.path.insert(0, desired_runfiles_path)
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))
|