summaryrefslogtreecommitdiff
path: root/test/test_coverage.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2009-11-25 08:00:35 -0500
committerNed Batchelder <ned@nedbatchelder.com>2009-11-25 08:00:35 -0500
commit566932401e1801c4e860ccc2ac291fd6536952de (patch)
treec1488aa0abadffa1be0575798aecd118f088839a /test/test_coverage.py
parent64b6e0b4b67cf30486474378b831c1eb2b70327a (diff)
downloadpython-coveragepy-git-566932401e1801c4e860ccc2ac291fd6536952de.tar.gz
Split the oddball tests into their own file.
Diffstat (limited to 'test/test_coverage.py')
-rw-r--r--test/test_coverage.py236
1 files changed, 0 insertions, 236 deletions
diff --git a/test/test_coverage.py b/test/test_coverage.py
index e8f5c745..6544cddd 100644
--- a/test/test_coverage.py
+++ b/test/test_coverage.py
@@ -9,7 +9,6 @@ coverage.use_cache(0)
sys.path.insert(0, os.path.split(__file__)[0]) # Force relative import for Py3k
from coveragetest import CoverageTest
-import osinfo
class BasicCoverageTest(CoverageTest):
@@ -1392,30 +1391,6 @@ class ExcludeTest(CoverageTest):
[8,9], "", ['#pragma: NO COVER'])
-class ThreadingTest(CoverageTest):
- """Tests of the threading support."""
-
- def testThreading(self):
- self.check_coverage("""\
- import time, threading
-
- def fromMainThread():
- return "called from main thread"
-
- def fromOtherThread():
- return "called from other thread"
-
- def neverCalled():
- return "no one calls me"
-
- other = threading.Thread(target=fromOtherThread)
- other.start()
- fromMainThread()
- other.join()
- """,
- [1,3,4,6,7,9,10,12,13,14,15], "10")
-
-
if sys.hexversion >= 0x020400f0:
class Py24Test(CoverageTest):
"""Tests of new syntax in Python 2.4."""
@@ -1700,217 +1675,6 @@ class ProcessTest(CoverageTest):
self.assert_("Traceback" not in out)
-class RecursionTest(CoverageTest):
- """Check what happens when recursive code gets near limits."""
-
- def testShortRecursion(self):
- # We can definitely get close to 500 stack frames.
- self.check_coverage("""\
- def recur(n):
- if n == 0:
- return 0
- else:
- return recur(n-1)+1
-
- recur(495) # We can get at least this many stack frames.
- """,
- [1,2,3,5,7], "")
-
- def testLongRecursion(self):
- # We can't finish a very deep recursion, but we don't crash.
- self.assertRaises(RuntimeError, self.check_coverage,
- """\
- def recur(n):
- if n == 0:
- return 0
- else:
- return recur(n-1)+1
-
- recur(100000) # This is definitely too many frames.
- """,
- [1,2,3,5,7], "")
-
-
-class MemoryLeakTest(CoverageTest):
- """Attempt the impossible: test that memory doesn't leak."""
-
- def test_for_leaks(self):
- lines = list(range(301, 315))
- lines.remove(306)
- baseline_ram = osinfo.process_ram()
- # Ugly string mumbo jumbo to get 300 blank lines at the beginning..
- self.check_coverage("""\
- # blank line\n""" * 300 + """\
- def once(x):
- if x % 100 == 0:
- raise Exception("100!")
- elif x % 2:
- return 10
- else:
- return 11
- i = 0 # Portable loop without alloc'ing memory.
- while i < 10000:
- try:
- once(i)
- except:
- pass
- i += 1
- """,
- lines, "")
- ram_growth = osinfo.process_ram() - baseline_ram
- self.assert_(ram_growth < 100000, "RAM grew by %d" % (ram_growth))
-
-
-class PyexpatTest(CoverageTest):
- """Pyexpat screws up tracing. Make sure we've counter-defended properly."""
-
- def testPyexpat(self):
- # pyexpat calls the trace function explicitly (inexplicably), and does
- # it wrong for exceptions. Parsing a DOCTYPE for some reason throws
- # an exception internally, and triggers its wrong behavior. This test
- # checks that our fake PyTrace_RETURN hack in tracer.c works. It will
- # also detect if the pyexpat bug is fixed unbeknownst to us, meaning
- # we'd see two RETURNs where there should only be one.
-
- self.make_file("trydom.py", """\
- import xml.dom.minidom
-
- XML = '''\\
- <!DOCTYPE fooey SYSTEM "http://www.example.com/example.dtd">
- <root><child/><child/></root>
- '''
-
- def foo():
- dom = xml.dom.minidom.parseString(XML)
- assert len(dom.getElementsByTagName('child')) == 2
- a = 11
-
- foo()
- """)
-
- self.make_file("outer.py", "\n"*100 + "import trydom\na = 102\n")
-
- cov = coverage.coverage()
- cov.erase()
-
- # Import the python file, executing it.
- cov.start()
- self.import_module("outer")
- cov.stop()
-
- _, statements, missing, _ = cov.analysis("trydom.py")
- self.assertEqual(statements, [1,3,8,9,10,11,13])
- self.assertEqual(missing, [])
-
- _, statements, missing, _ = cov.analysis("outer.py")
- self.assertEqual(statements, [101,102])
- self.assertEqual(missing, [])
-
-
-class ExceptionTest(CoverageTest):
- """I suspect different versions of Python deal with exceptions differently
- in the trace function.
- """
-
- def testException(self):
- # Python 2.3's trace function doesn't get called with "return" if the
- # scope is exiting due to an exception. This confounds our trace
- # function which relies on scope announcements to track which files to
- # trace.
- #
- # This test is designed to sniff this out. Each function in the call
- # stack is in a different file, to try to trip up the tracer. Each
- # file has active lines in a different range so we'll see if the lines
- # get attributed to the wrong file.
-
- self.make_file("oops.py", """\
- def oops(args):
- a = 2
- raise Exception("oops")
- a = 4
- """)
-
- self.make_file("fly.py", "\n"*100 + """\
- def fly(calls):
- a = 2
- calls[0](calls[1:])
- a = 4
- """)
-
- self.make_file("catch.py", "\n"*200 + """\
- def catch(calls):
- try:
- a = 3
- calls[0](calls[1:])
- a = 5
- except:
- a = 7
- """)
-
- self.make_file("doit.py", "\n"*300 + """\
- def doit(calls):
- try:
- calls[0](calls[1:])
- except:
- a = 5
- """)
-
- # Import all the modules before starting coverage, so the def lines
- # won't be in all the results.
- for mod in "oops fly catch doit".split():
- self.import_module(mod)
-
- # Each run nests the functions differently to get different
- # combinations of catching exceptions and letting them fly.
- runs = [
- ("doit fly oops", {
- 'doit.py': [302,303,304,305],
- 'fly.py': [102,103],
- 'oops.py': [2,3],
- }),
- ("doit catch oops", {
- 'doit.py': [302,303],
- 'catch.py': [202,203,204,206,207],
- 'oops.py': [2,3],
- }),
- ("doit fly catch oops", {
- 'doit.py': [302,303],
- 'fly.py': [102,103,104],
- 'catch.py': [202,203,204,206,207],
- 'oops.py': [2,3],
- }),
- ("doit catch fly oops", {
- 'doit.py': [302,303],
- 'catch.py': [202,203,204,206,207],
- 'fly.py': [102,103],
- 'oops.py': [2,3],
- }),
- ]
-
- for callnames, lines_expected in runs:
-
- # Make the list of functions we'll call for this test.
- calls = [getattr(sys.modules[cn], cn) for cn in callnames.split()]
-
- cov = coverage.coverage()
- cov.start()
- # Call our list of functions: invoke the first, with the rest as
- # an argument.
- calls[0](calls[1:])
- cov.stop()
-
- # Clean the line data and compare to expected results.
- # The filenames are absolute, so keep just the base.
- lines = cov.data.line_data()
- clean_lines = {}
- for f, llist in lines.items():
- if f == __file__:
- # ignore this file.
- continue
- clean_lines[os.path.basename(f)] = llist
- self.assertEqual(clean_lines, lines_expected)
-
-
if __name__ == '__main__':
print("Testing under Python version: %s" % sys.version)
unittest.main()