Statistics
| Branch: | Tag: | Revision:

root / test / pycurl_reset_unittest.py @ 1a2eb2dc

History | View | Annotate | Download (2.3 kB)

1 4fd2660d Michael Hanselmann
#!/usr/bin/python
2 4fd2660d Michael Hanselmann
#
3 4fd2660d Michael Hanselmann
4 4fd2660d Michael Hanselmann
# Copyright (C) 2011 Google Inc.
5 4fd2660d Michael Hanselmann
#
6 4fd2660d Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 4fd2660d Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 4fd2660d Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 4fd2660d Michael Hanselmann
# (at your option) any later version.
10 4fd2660d Michael Hanselmann
#
11 4fd2660d Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 4fd2660d Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 4fd2660d Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 4fd2660d Michael Hanselmann
# General Public License for more details.
15 4fd2660d Michael Hanselmann
#
16 4fd2660d Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 4fd2660d Michael Hanselmann
# along with this program; if not, write to the Free Software
18 4fd2660d Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 4fd2660d Michael Hanselmann
# 02110-1301, USA.
20 4fd2660d Michael Hanselmann
21 4fd2660d Michael Hanselmann
22 4fd2660d Michael Hanselmann
"""Script for testing for an issue in PycURL"""
23 4fd2660d Michael Hanselmann
24 4fd2660d Michael Hanselmann
import sys
25 4fd2660d Michael Hanselmann
import warnings
26 4fd2660d Michael Hanselmann
import unittest
27 4fd2660d Michael Hanselmann
import textwrap
28 4fd2660d Michael Hanselmann
import pycurl
29 4fd2660d Michael Hanselmann
30 4fd2660d Michael Hanselmann
import testutils
31 4fd2660d Michael Hanselmann
32 4fd2660d Michael Hanselmann
33 4fd2660d Michael Hanselmann
DETAILS = [
34 4fd2660d Michael Hanselmann
  ("PycURL 7.19.0 added a new function named \"reset\" on \"pycurl.Curl\""
35 4fd2660d Michael Hanselmann
   " objects to release all references to other resources. Unfortunately that"
36 4fd2660d Michael Hanselmann
   " version contains a bug with reference counting on the \"None\" singleton,"
37 4fd2660d Michael Hanselmann
   " leading to a crash of the Python interpreter after a certain amount of"
38 4fd2660d Michael Hanselmann
   " performed requests. Your system uses a version of PycURL affected by this"
39 4fd2660d Michael Hanselmann
   " issue. A patch is available at [1]. A detailed description can be found"
40 4fd2660d Michael Hanselmann
   " at [2].\n"),
41 4fd2660d Michael Hanselmann
  "\n",
42 4fd2660d Michael Hanselmann
  ("[1] http://sf.net/tracker/?"
43 4fd2660d Michael Hanselmann
   "func=detail&aid=2893665&group_id=28236&atid=392777\n"),
44 4fd2660d Michael Hanselmann
  "[2] https://bugzilla.redhat.com/show_bug.cgi?id=624559",
45 4fd2660d Michael Hanselmann
  ]
46 4fd2660d Michael Hanselmann
47 4fd2660d Michael Hanselmann
48 4fd2660d Michael Hanselmann
class TestPyCurlReset(unittest.TestCase):
49 4fd2660d Michael Hanselmann
  def test(self):
50 4fd2660d Michael Hanselmann
    start_refcount = sys.getrefcount(None)
51 4fd2660d Michael Hanselmann
    abort_refcount = int(start_refcount * 0.8)
52 4fd2660d Michael Hanselmann
53 4fd2660d Michael Hanselmann
    assert start_refcount > 100
54 4fd2660d Michael Hanselmann
55 4fd2660d Michael Hanselmann
    curl = pycurl.Curl()
56 4fd2660d Michael Hanselmann
    try:
57 4fd2660d Michael Hanselmann
      reset_fn = curl.reset
58 4fd2660d Michael Hanselmann
    except AttributeError:
59 4fd2660d Michael Hanselmann
      pass
60 4fd2660d Michael Hanselmann
    else:
61 4fd2660d Michael Hanselmann
      for i in range(start_refcount * 2):
62 4fd2660d Michael Hanselmann
        reset_fn()
63 4fd2660d Michael Hanselmann
        # The bug can be detected if calling "reset" several times continously
64 4fd2660d Michael Hanselmann
        # reduces the number of references
65 4fd2660d Michael Hanselmann
        if sys.getrefcount(None) < abort_refcount:
66 4fd2660d Michael Hanselmann
          print >>sys.stderr, "#" * 78
67 4fd2660d Michael Hanselmann
          for line in DETAILS:
68 4fd2660d Michael Hanselmann
            print >>sys.stderr, textwrap.fill(line, width=78)
69 4fd2660d Michael Hanselmann
          print >>sys.stderr, "#" * 78
70 4fd2660d Michael Hanselmann
          break
71 4fd2660d Michael Hanselmann
72 4fd2660d Michael Hanselmann
73 4fd2660d Michael Hanselmann
if __name__ == "__main__":
74 4fd2660d Michael Hanselmann
  testutils.GanetiTestProgram()