[Python-Dev] [Python-checkins] Python Regression Test Failures basics (1)

Thomas Wouters thomas at python.org
Mon May 8 23:20:29 CEST 2006

On 5/8/06, Neal Norwitz <neal at metaslash.com> wrote:

> test_ctypes
> test test_ctypes failed -- Traceback (most recent call last):
>   File "/home/neal/python/trunk/Lib/ctypes/test/test_python_api.py", line
> 41, in test_PyInt_Long
>     self.failUnlessEqual(grc(42), ref42)
> AssertionError: 336 != 337

We've been seeing this error for a while now, and given the test, it isn't
entirely surprising. The test tries to do what regrtest -R:: also does:
check for refcount leakage. I'm not entirely sure why it's failing as I
can't reproduce it (although it could be because 42's refcount is actually
42 :) but it does seem to me that this kind of refleak-checking is somewhat
redundant in the Python testsuite, and it is obvious to me that the breakage
is precisely because it's being run in the Python testsuite (which is a lot
less reliable an environment than ctypes' own, standalone testsuite.)

Thomas, given the refcount-leakage-coverage the ctypes tests are getting in
the Python distribution, do you want to keep running these tests? Is there a
way to not run them in the Python testsuite, but still keep them for the
standalone tests? (If you want that, that is.) Alternatively, we could try
to fix the test. If the problem is indeed what I think it is (42's refcount
being 42 or 41 or 43 at the first grc() call there; I'm not sure) we could
perhaps work around it, using something like:

Index: Lib/ctypes/test/test_python_api.py
--- Lib/ctypes/test/test_python_api.py  (revision 45940)
+++ Lib/ctypes/test/test_python_api.py  (working copy)
@@ -35,6 +35,11 @@

     def test_PyInt_Long(self):
         ref42 = grc(42)
+        if ref42 == 42:
+            # 42's refcount was 42, but since grc() returned 42, it's now
+            # We want to adjust ref42 without tossing our own reference to
+            # (or the refcount will go back down to 42.)
+            old42, ref42 = ref42, ref42 + 1
         pythonapi.PyInt_FromLong.restype = py_object
         self.failUnlessEqual(pythonapi.PyInt_FromLong(42), 42)

(Untested, since I can't reproduce, but I think I have it right.)

Thomas Wouters <thomas at python.org>

Hi! I'm a .signature virus! copy me into your .signature file to help me
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/python-dev/attachments/20060508/25caa6dd/attachment.htm 

More information about the Python-Dev mailing list