set svn:keywords property for proper keywords expansion
[plcapi.git] / pycurl / tests / test_internals.py
1 #! /usr/bin/env python
2 # -*- coding: iso-8859-1 -*-
3 # vi:ts=4:et
4 # $Id$
5
6 #
7 # a simple self-test
8 #
9
10 try:
11     # need Python 2.2 or better for garbage collection
12     from gc import get_objects
13     import gc
14     del get_objects
15     gc.enable()
16 except ImportError:
17     gc = None
18 import copy, os, sys
19 from StringIO import StringIO
20 try:
21     import cPickle
22 except ImportError:
23     cPickle = None
24 try:
25     import pickle
26 except ImportError:
27     pickle = None
28
29 # update sys.path when running in the build directory
30 from util import get_sys_path
31 sys.path = get_sys_path()
32
33 import pycurl
34 from pycurl import Curl, CurlMulti
35
36
37 class opts:
38     verbose = 1
39
40 if "-q" in sys.argv:
41     opts.verbose = opts.verbose - 1
42
43
44 print "Python", sys.version
45 print "PycURL %s (compiled against 0x%x)" % (pycurl.version, pycurl.COMPILE_LIBCURL_VERSION_NUM)
46 print "PycURL version info", pycurl.version_info()
47 print "  %s, compiled %s" % (pycurl.__file__, pycurl.COMPILE_DATE)
48
49
50 # /***********************************************************************
51 # // test misc
52 # ************************************************************************/
53
54 if 1:
55     c = Curl()
56     assert c.URL is pycurl.URL
57     del c
58
59
60 # /***********************************************************************
61 # // test handles
62 # ************************************************************************/
63
64 # remove an invalid handle: this should fail
65 if 1:
66     m = CurlMulti()
67     c = Curl()
68     try:
69         m.remove_handle(c)
70     except pycurl.error:
71         pass
72     else:
73         assert 0, "internal error"
74     del m, c
75
76
77 # remove an invalid but closed handle
78 if 1:
79     m = CurlMulti()
80     c = Curl()
81     c.close()
82     m.remove_handle(c)
83     del m, c
84
85
86 # add a closed handle: this should fail
87 if 1:
88     m = CurlMulti()
89     c = Curl()
90     c.close()
91     try:
92         m.add_handle(c)
93     except pycurl.error:
94         pass
95     else:
96         assert 0, "internal error"
97     m.close()
98     del m, c
99
100
101 # add a handle twice: this should fail
102 if 1:
103     m = CurlMulti()
104     c = Curl()
105     m.add_handle(c)
106     try:
107         m.add_handle(c)
108     except pycurl.error:
109         pass
110     else:
111         assert 0, "internal error"
112     del m, c
113
114
115 # add a handle on multiple stacks: this should fail
116 if 1:
117     m1 = CurlMulti()
118     m2 = CurlMulti()
119     c = Curl()
120     m1.add_handle(c)
121     try:
122         m2.add_handle(c)
123     except pycurl.error:
124         pass
125     else:
126         assert 0, "internal error"
127     del m1, m2, c
128
129
130 # move a handle
131 if 1:
132     m1 = CurlMulti()
133     m2 = CurlMulti()
134     c = Curl()
135     m1.add_handle(c)
136     m1.remove_handle(c)
137     m2.add_handle(c)
138     del m1, m2, c
139
140
141 # /***********************************************************************
142 # // test copying and pickling - copying and pickling of
143 # // instances of Curl and CurlMulti is not allowed
144 # ************************************************************************/
145
146 if 1 and copy:
147     c = Curl()
148     m = CurlMulti()
149     try:
150         copy.copy(c)
151     except copy.Error:
152         pass
153     else:
154         assert 0, "internal error - copying should fail"
155     try:
156         copy.copy(m)
157     except copy.Error:
158         pass
159     else:
160         assert 0, "internal error - copying should fail"
161
162 if 1 and pickle:
163     c = Curl()
164     m = CurlMulti()
165     fp = StringIO()
166     p = pickle.Pickler(fp, 1)
167     try:
168         p.dump(c)
169     except pickle.PicklingError:
170         pass
171     else:
172         assert 0, "internal error - pickling should fail"
173     try:
174         p.dump(m)
175     except pickle.PicklingError:
176         pass
177     else:
178         assert 0, "internal error - pickling should fail"
179     del c, m, fp, p
180
181 if 1 and cPickle:
182     c = Curl()
183     m = CurlMulti()
184     fp = StringIO()
185     p = cPickle.Pickler(fp, 1)
186     try:
187         p.dump(c)
188     except cPickle.PicklingError:
189         pass
190     else:
191         assert 0, "internal error - pickling should fail"
192     try:
193         p.dump(m)
194     except cPickle.PicklingError:
195         pass
196     else:
197         assert 0, "internal error - pickling should fail"
198     del c, m, fp, p
199
200
201 # /***********************************************************************
202 # // test refcounts
203 # ************************************************************************/
204
205 # basic check of reference counting (use a memory checker like valgrind)
206 if 1:
207     c = Curl()
208     m = CurlMulti()
209     m.add_handle(c)
210     del m
211     m = CurlMulti()
212     c.close()
213     del m, c
214
215 # basic check of cyclic garbage collection
216 if 1 and gc:
217     gc.collect()
218     c = Curl()
219     c.m = CurlMulti()
220     c.m.add_handle(c)
221     # create some nasty cyclic references
222     c.c = c
223     c.c.c1 = c
224     c.c.c2 = c
225     c.c.c3 = c.c
226     c.c.c4 = c.m
227     c.m.c = c
228     c.m.m = c.m
229     c.m.c = c
230     # delete
231     gc.collect()
232     flags = gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_OBJECTS
233     if opts.verbose >= 1:
234         flags = flags | gc.DEBUG_STATS
235     gc.set_debug(flags)
236     gc.collect()
237     ##print gc.get_referrers(c)
238     ##print gc.get_objects()
239     if opts.verbose >= 1:
240         print "Tracked objects:", len(gc.get_objects())
241     # The `del' below should delete these 4 objects:
242     #   Curl + internal dict, CurlMulti + internal dict
243     del c
244     gc.collect()
245     if opts.verbose >= 1:
246         print "Tracked objects:", len(gc.get_objects())
247
248
249 # /***********************************************************************
250 # // done
251 # ************************************************************************/
252
253 print "All tests passed."