annotate Lib/test/test_linecache.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 203a77e74aa7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
1 """ Tests for the linecache module """
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
2
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
3 import linecache
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
4 import unittest
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
5 import os.path
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
6 from test import support
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
7
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
8
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
9 FILENAME = linecache.__file__
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
10 INVALID_NAME = '!@$)(!@#_1'
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
11 EMPTY = ''
70162
9a4d4506680a Issue #11614: Fix test_linecache, cjkencodings_test.py doesn't exist anymore
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66340
diff changeset
12 TESTS = 'inspect_fodder inspect_fodder2 mapping_tests'
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
13 TESTS = TESTS.split()
84884
203a77e74aa7 Close #15494: test.support is now a package rather than a module
Nick Coghlan <ncoghlan@gmail.com>
parents: 70163
diff changeset
14 TEST_PATH = os.path.dirname(__file__)
55341
ec1f32b72abe Merged revisions 74095 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53775
diff changeset
15 MODULES = "linecache abc".split()
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
16 MODULE_PATH = os.path.dirname(FILENAME)
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
17
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
18 SOURCE_1 = '''
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
19 " Docstring "
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
20
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
21 def function():
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
22 return result
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
23
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
24 '''
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
25
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
26 SOURCE_2 = '''
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
27 def f():
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
28 return 1 + 1
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
29
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
30 a = f()
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
31
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
32 '''
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
33
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
34 SOURCE_3 = '''
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
35 def f():
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
36 return 3''' # No ending newline
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
37
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
38
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
39 class LineCacheTests(unittest.TestCase):
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
40
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
41 def test_getline(self):
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
42 getline = linecache.getline
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
43
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
44 # Bad values for line number should return an empty string
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
45 self.assertEqual(getline(FILENAME, 2**15), EMPTY)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
46 self.assertEqual(getline(FILENAME, -1), EMPTY)
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
47
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
48 # Float values currently raise TypeError, should it?
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
49 self.assertRaises(TypeError, getline, FILENAME, 1.1)
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
50
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
51 # Bad filenames should return an empty string
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
52 self.assertEqual(getline(EMPTY, 1), EMPTY)
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
53 self.assertEqual(getline(INVALID_NAME, 1), EMPTY)
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
54
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
55 # Check whether lines correspond to those from file iteration
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
56 for entry in TESTS:
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
57 filename = os.path.join(TEST_PATH, entry) + '.py'
65745
1883029c7b8a Move test_linecache over to file context managers.
Brett Cannon <bcannon@gmail.com>
parents: 61828
diff changeset
58 with open(filename) as file:
1883029c7b8a Move test_linecache over to file context managers.
Brett Cannon <bcannon@gmail.com>
parents: 61828
diff changeset
59 for index, line in enumerate(file):
66310
9fe76c26ea9f #9424: Replace deprecated assert* methods in the Python test suite.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65745
diff changeset
60 self.assertEqual(line, getline(filename, index + 1))
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
61
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
62 # Check module loading
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
63 for entry in MODULES:
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
64 filename = os.path.join(MODULE_PATH, entry) + '.py'
65745
1883029c7b8a Move test_linecache over to file context managers.
Brett Cannon <bcannon@gmail.com>
parents: 61828
diff changeset
65 with open(filename) as file:
1883029c7b8a Move test_linecache over to file context managers.
Brett Cannon <bcannon@gmail.com>
parents: 61828
diff changeset
66 for index, line in enumerate(file):
66310
9fe76c26ea9f #9424: Replace deprecated assert* methods in the Python test suite.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65745
diff changeset
67 self.assertEqual(line, getline(filename, index + 1))
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
68
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
69 # Check that bogus data isn't returned (issue #1309567)
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
70 empty = linecache.getlines('a/b/c/__init__.py')
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
71 self.assertEqual(empty, [])
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
72
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
73 def test_no_ending_newline(self):
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
74 self.addCleanup(support.unlink, support.TESTFN)
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
75 with open(support.TESTFN, "w") as fp:
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
76 fp.write(SOURCE_3)
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
77 lines = linecache.getlines(support.TESTFN)
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
78 self.assertEqual(lines, ["\n", "def f():\n", " return 3\n"])
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
79
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
80 def test_clearcache(self):
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
81 cached = []
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
82 for entry in TESTS:
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
83 filename = os.path.join(TEST_PATH, entry) + '.py'
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
84 cached.append(filename)
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
85 linecache.getline(filename, 1)
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
86
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
87 # Are all files cached?
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
88 cached_empty = [fn for fn in cached if fn not in linecache.cache]
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
89 self.assertEqual(cached_empty, [])
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
90
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
91 # Can we clear the cache?
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
92 linecache.clearcache()
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
93 cached_empty = [fn for fn in cached if fn in linecache.cache]
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
94 self.assertEqual(cached_empty, [])
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
95
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
96 def test_checkcache(self):
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
97 getline = linecache.getline
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
98 # Create a source file and cache its contents
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
99 source_name = support.TESTFN + '.py'
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
100 self.addCleanup(support.unlink, source_name)
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
101 with open(source_name, 'w') as source:
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
102 source.write(SOURCE_1)
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
103 getline(source_name, 1)
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
104
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
105 # Keep a copy of the old contents
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
106 source_list = []
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
107 with open(source_name) as source:
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
108 for index, line in enumerate(source):
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
109 self.assertEqual(line, getline(source_name, index + 1))
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
110 source_list.append(line)
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
111
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
112 with open(source_name, 'w') as source:
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
113 source.write(SOURCE_2)
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
114
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
115 # Try to update a bogus cache entry
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
116 linecache.checkcache('dummy')
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
117
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
118 # Check that the cache matches the old contents
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
119 for index, line in enumerate(source_list):
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
120 self.assertEqual(line, getline(source_name, index + 1))
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
121
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
122 # Update the cache and check whether it matches the new source file
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
123 linecache.checkcache(source_name)
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
124 with open(source_name) as source:
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
125 for index, line in enumerate(source):
66340
2beb25369289 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61834
diff changeset
126 self.assertEqual(line, getline(source_name, index + 1))
61834
52495ccf61cc Merged revisions 81438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57564
diff changeset
127 source_list.append(line)
53775
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
128
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
129 def test_main():
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
130 support.run_unittest(LineCacheTests)
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
131
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
132 if __name__ == "__main__":
b12a44eef40b Merged revisions 72319-72320 via svnmerge from
Georg Brandl <georg@python.org>
parents:
diff changeset
133 test_main()