[ SEA-GHOST MINI SHELL]
#! /usr/bin/env python
# -*- coding: iso-8859-1 -*-
# vi:ts=4:et
# $Id: test_internals.py,v 1.17 2003/05/01 16:48:54 mfx Exp $
#
# a simple self-test
#
try:
# need Python 2.2 or better for garbage collection
from gc import get_objects
import gc
del get_objects
gc.enable()
except ImportError:
gc = None
import copy, os, sys
from StringIO import StringIO
try:
import cPickle
except ImportError:
cPickle = None
try:
import pickle
except ImportError:
pickle = None
# update sys.path when running in the build directory
from util import get_sys_path
sys.path = get_sys_path()
import pycurl
from pycurl import Curl, CurlMulti
class opts:
verbose = 1
if "-q" in sys.argv:
opts.verbose = opts.verbose - 1
print "Python", sys.version
print "PycURL %s (compiled against 0x%x)" % (pycurl.version, pycurl.COMPILE_LIBCURL_VERSION_NUM)
print "PycURL version info", pycurl.version_info()
print " %s, compiled %s" % (pycurl.__file__, pycurl.COMPILE_DATE)
# /***********************************************************************
# // test misc
# ************************************************************************/
if 1:
c = Curl()
assert c.URL is pycurl.URL
del c
# /***********************************************************************
# // test handles
# ************************************************************************/
# remove an invalid handle: this should fail
if 1:
m = CurlMulti()
c = Curl()
try:
m.remove_handle(c)
except pycurl.error:
pass
else:
assert 0, "internal error"
del m, c
# remove an invalid but closed handle
if 1:
m = CurlMulti()
c = Curl()
c.close()
m.remove_handle(c)
del m, c
# add a closed handle: this should fail
if 1:
m = CurlMulti()
c = Curl()
c.close()
try:
m.add_handle(c)
except pycurl.error:
pass
else:
assert 0, "internal error"
m.close()
del m, c
# add a handle twice: this should fail
if 1:
m = CurlMulti()
c = Curl()
m.add_handle(c)
try:
m.add_handle(c)
except pycurl.error:
pass
else:
assert 0, "internal error"
del m, c
# add a handle on multiple stacks: this should fail
if 1:
m1 = CurlMulti()
m2 = CurlMulti()
c = Curl()
m1.add_handle(c)
try:
m2.add_handle(c)
except pycurl.error:
pass
else:
assert 0, "internal error"
del m1, m2, c
# move a handle
if 1:
m1 = CurlMulti()
m2 = CurlMulti()
c = Curl()
m1.add_handle(c)
m1.remove_handle(c)
m2.add_handle(c)
del m1, m2, c
# /***********************************************************************
# // test copying and pickling - copying and pickling of
# // instances of Curl and CurlMulti is not allowed
# ************************************************************************/
if 1 and copy:
c = Curl()
m = CurlMulti()
try:
copy.copy(c)
except copy.Error:
pass
else:
assert 0, "internal error - copying should fail"
try:
copy.copy(m)
except copy.Error:
pass
else:
assert 0, "internal error - copying should fail"
if 1 and pickle:
c = Curl()
m = CurlMulti()
fp = StringIO()
p = pickle.Pickler(fp, 1)
try:
p.dump(c)
except pickle.PicklingError:
pass
else:
assert 0, "internal error - pickling should fail"
try:
p.dump(m)
except pickle.PicklingError:
pass
else:
assert 0, "internal error - pickling should fail"
del c, m, fp, p
if 1 and cPickle:
c = Curl()
m = CurlMulti()
fp = StringIO()
p = cPickle.Pickler(fp, 1)
try:
p.dump(c)
except cPickle.PicklingError:
pass
else:
assert 0, "internal error - pickling should fail"
try:
p.dump(m)
except cPickle.PicklingError:
pass
else:
assert 0, "internal error - pickling should fail"
del c, m, fp, p
# /***********************************************************************
# // test refcounts
# ************************************************************************/
# basic check of reference counting (use a memory checker like valgrind)
if 1:
c = Curl()
m = CurlMulti()
m.add_handle(c)
del m
m = CurlMulti()
c.close()
del m, c
# basic check of cyclic garbage collection
if 1 and gc:
gc.collect()
c = Curl()
c.m = CurlMulti()
c.m.add_handle(c)
# create some nasty cyclic references
c.c = c
c.c.c1 = c
c.c.c2 = c
c.c.c3 = c.c
c.c.c4 = c.m
c.m.c = c
c.m.m = c.m
c.m.c = c
# delete
gc.collect()
flags = gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_OBJECTS
if opts.verbose >= 1:
flags = flags | gc.DEBUG_STATS
gc.set_debug(flags)
gc.collect()
##print gc.get_referrers(c)
##print gc.get_objects()
if opts.verbose >= 1:
print "Tracked objects:", len(gc.get_objects())
# The `del' below should delete these 4 objects:
# Curl + internal dict, CurlMulti + internal dict
del c
gc.collect()
if opts.verbose >= 1:
print "Tracked objects:", len(gc.get_objects())
if 1:
# Ensure that the refcounting error in "reset" is fixed:
for i in xrange(100000):
c = Curl()
c.reset()
# /***********************************************************************
# // done
# ************************************************************************/
print "All tests passed."
SEA-GHOST - SHELL CODING BY SEA-GHOST