1991f9202bede42b033e499525755daed4a1c07beGeorg Brandl""" Tests for the linecache module """
2991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
3991f9202bede42b033e499525755daed4a1c07beGeorg Brandlimport linecache
4991f9202bede42b033e499525755daed4a1c07beGeorg Brandlimport unittest
5991f9202bede42b033e499525755daed4a1c07beGeorg Brandlimport os.path
6631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collinsimport tempfile
7e4d35dc8b6fb3c071d85e2d8830566876288c180Robert Collinsimport tokenize
8991f9202bede42b033e499525755daed4a1c07beGeorg Brandlfrom test import support
9991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
10991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
11991f9202bede42b033e499525755daed4a1c07beGeorg BrandlFILENAME = linecache.__file__
126bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert CollinsNONEXISTENT_FILENAME = FILENAME + '.missing'
13991f9202bede42b033e499525755daed4a1c07beGeorg BrandlINVALID_NAME = '!@$)(!@#_1'
14991f9202bede42b033e499525755daed4a1c07beGeorg BrandlEMPTY = ''
15fb15aa1e0873043548df782ace51fe1340ea559aNick CoghlanTEST_PATH = os.path.dirname(__file__)
16bed7d04fedd800a8d3bd8a7c9c3ff823e365c236Benjamin PetersonMODULES = "linecache abc".split()
17991f9202bede42b033e499525755daed4a1c07beGeorg BrandlMODULE_PATH = os.path.dirname(FILENAME)
18991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
19991f9202bede42b033e499525755daed4a1c07beGeorg BrandlSOURCE_1 = '''
20991f9202bede42b033e499525755daed4a1c07beGeorg Brandl" Docstring "
21991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
22991f9202bede42b033e499525755daed4a1c07beGeorg Brandldef function():
23991f9202bede42b033e499525755daed4a1c07beGeorg Brandl    return result
24991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
25991f9202bede42b033e499525755daed4a1c07beGeorg Brandl'''
26991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
27991f9202bede42b033e499525755daed4a1c07beGeorg BrandlSOURCE_2 = '''
28991f9202bede42b033e499525755daed4a1c07beGeorg Brandldef f():
29991f9202bede42b033e499525755daed4a1c07beGeorg Brandl    return 1 + 1
30991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
31991f9202bede42b033e499525755daed4a1c07beGeorg Brandla = f()
32991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
33991f9202bede42b033e499525755daed4a1c07beGeorg Brandl'''
34991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
35aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin PetersonSOURCE_3 = '''
36aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Petersondef f():
37aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson    return 3''' # No ending newline
38aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson
39aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson
40631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collinsclass TempFile:
41631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
42631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    def setUp(self):
43631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        super().setUp()
44631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        with tempfile.NamedTemporaryFile(delete=False) as fp:
45631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins            self.file_name = fp.name
46631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins            fp.write(self.file_byte_string)
47631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        self.addCleanup(support.unlink, self.file_name)
48631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
49631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
50631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collinsclass GetLineTestsGoodData(TempFile):
51631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    # file_list   = ['list\n', 'of\n', 'good\n', 'strings\n']
52631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
53631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    def setUp(self):
54631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        self.file_byte_string = ''.join(self.file_list).encode('utf-8')
55631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        super().setUp()
56631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
57631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    def test_getline(self):
58e4d35dc8b6fb3c071d85e2d8830566876288c180Robert Collins        with tokenize.open(self.file_name) as fp:
59631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins            for index, line in enumerate(fp):
60631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins                if not line.endswith('\n'):
61631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins                    line += '\n'
62631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
63631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins                cached_line = linecache.getline(self.file_name, index + 1)
64631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins                self.assertEqual(line, cached_line)
65631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
66631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    def test_getlines(self):
67631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        lines = linecache.getlines(self.file_name)
68631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        self.assertEqual(lines, self.file_list)
69631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
70631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
71631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collinsclass GetLineTestsBadData(TempFile):
72631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    # file_byte_string = b'Bad data goes here'
73631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
74631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    def test_getline(self):
75631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        self.assertRaises((SyntaxError, UnicodeDecodeError),
76631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins                          linecache.getline, self.file_name, 1)
77631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
78631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    def test_getlines(self):
79631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        self.assertRaises((SyntaxError, UnicodeDecodeError),
80631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins                          linecache.getlines, self.file_name)
81631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
82631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
83631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collinsclass EmptyFile(GetLineTestsGoodData, unittest.TestCase):
84631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    file_list = []
85631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
86631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
87631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collinsclass SingleEmptyLine(GetLineTestsGoodData, unittest.TestCase):
88631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    file_list = ['\n']
89631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
90631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
91631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collinsclass GoodUnicode(GetLineTestsGoodData, unittest.TestCase):
92631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    file_list = ['á\n', 'b\n', 'abcdef\n', 'ááááá\n']
93631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
94631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
95631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collinsclass BadUnicode(GetLineTestsBadData, unittest.TestCase):
96631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins    file_byte_string = b'\x80abc'
97631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
98631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins
99991f9202bede42b033e499525755daed4a1c07beGeorg Brandlclass LineCacheTests(unittest.TestCase):
100991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
101991f9202bede42b033e499525755daed4a1c07beGeorg Brandl    def test_getline(self):
102991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        getline = linecache.getline
103991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
104991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        # Bad values for line number should return an empty string
105b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti        self.assertEqual(getline(FILENAME, 2**15), EMPTY)
106b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti        self.assertEqual(getline(FILENAME, -1), EMPTY)
107991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
108991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        # Float values currently raise TypeError, should it?
109991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        self.assertRaises(TypeError, getline, FILENAME, 1.1)
110991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
111991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        # Bad filenames should return an empty string
112b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti        self.assertEqual(getline(EMPTY, 1), EMPTY)
113b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti        self.assertEqual(getline(INVALID_NAME, 1), EMPTY)
114991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
115991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        # Check module loading
116991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        for entry in MODULES:
117991f9202bede42b033e499525755daed4a1c07beGeorg Brandl            filename = os.path.join(MODULE_PATH, entry) + '.py'
1180174368449b01720ea117898fc6d4c9341689011Brett Cannon            with open(filename) as file:
1190174368449b01720ea117898fc6d4c9341689011Brett Cannon                for index, line in enumerate(file):
120b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti                    self.assertEqual(line, getline(filename, index + 1))
121991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
122991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        # Check that bogus data isn't returned (issue #1309567)
123991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        empty = linecache.getlines('a/b/c/__init__.py')
124b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti        self.assertEqual(empty, [])
125991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
126aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson    def test_no_ending_newline(self):
127aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        self.addCleanup(support.unlink, support.TESTFN)
128aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        with open(support.TESTFN, "w") as fp:
129aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson            fp.write(SOURCE_3)
130aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        lines = linecache.getlines(support.TESTFN)
131aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        self.assertEqual(lines, ["\n", "def f():\n", "    return 3\n"])
132aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson
133991f9202bede42b033e499525755daed4a1c07beGeorg Brandl    def test_clearcache(self):
134991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        cached = []
135631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        for entry in MODULES:
136631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins            filename = os.path.join(MODULE_PATH, entry) + '.py'
137991f9202bede42b033e499525755daed4a1c07beGeorg Brandl            cached.append(filename)
138991f9202bede42b033e499525755daed4a1c07beGeorg Brandl            linecache.getline(filename, 1)
139991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
140991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        # Are all files cached?
141631a35c71a0c1f4fb31aad04407825cee2fe8a48Robert Collins        self.assertNotEqual(cached, [])
142991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        cached_empty = [fn for fn in cached if fn not in linecache.cache]
143b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti        self.assertEqual(cached_empty, [])
144991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
145991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        # Can we clear the cache?
146991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        linecache.clearcache()
147991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        cached_empty = [fn for fn in cached if fn in linecache.cache]
148b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti        self.assertEqual(cached_empty, [])
149991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
150991f9202bede42b033e499525755daed4a1c07beGeorg Brandl    def test_checkcache(self):
151991f9202bede42b033e499525755daed4a1c07beGeorg Brandl        getline = linecache.getline
152aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        # Create a source file and cache its contents
153aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        source_name = support.TESTFN + '.py'
154aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        self.addCleanup(support.unlink, source_name)
155aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        with open(source_name, 'w') as source:
156aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson            source.write(SOURCE_1)
157aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        getline(source_name, 1)
158aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson
159aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        # Keep a copy of the old contents
160aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        source_list = []
161aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        with open(source_name) as source:
162aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson            for index, line in enumerate(source):
163b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti                self.assertEqual(line, getline(source_name, index + 1))
164aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson                source_list.append(line)
165ba31105d48625d34ad8114706bc75eb59fd27405R. David Murray
166aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        with open(source_name, 'w') as source:
167aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson            source.write(SOURCE_2)
168ba31105d48625d34ad8114706bc75eb59fd27405R. David Murray
169aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        # Try to update a bogus cache entry
170aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        linecache.checkcache('dummy')
171aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson
172aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        # Check that the cache matches the old contents
173aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        for index, line in enumerate(source_list):
174b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti            self.assertEqual(line, getline(source_name, index + 1))
175aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson
176aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        # Update the cache and check whether it matches the new source file
177aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        linecache.checkcache(source_name)
178aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson        with open(source_name) as source:
179aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson            for index, line in enumerate(source):
180b3aedd48621ed9d33b5f42f946b256bce4a50673Ezio Melotti                self.assertEqual(line, getline(source_name, index + 1))
181aada7b8f7844215e56347928a55ec8f09415bc9cBenjamin Peterson                source_list.append(line)
182991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
1836bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins    def test_lazycache_no_globals(self):
1846bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        lines = linecache.getlines(FILENAME)
1856bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.clearcache()
1866bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(False, linecache.lazycache(FILENAME, None))
1876bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(lines, linecache.getlines(FILENAME))
1886bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins
1896bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins    def test_lazycache_smoke(self):
1906bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        lines = linecache.getlines(NONEXISTENT_FILENAME, globals())
1916bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.clearcache()
1926bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(
1936bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins            True, linecache.lazycache(NONEXISTENT_FILENAME, globals()))
1946bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(1, len(linecache.cache[NONEXISTENT_FILENAME]))
19546f50726a0047ae81d478c3a206f587b8f35ed08Martin Panter        # Note here that we're looking up a nonexistent filename with no
1966bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        # globals: this would error if the lazy value wasn't resolved.
1976bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(lines, linecache.getlines(NONEXISTENT_FILENAME))
1986bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins
1996bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins    def test_lazycache_provide_after_failed_lookup(self):
2006bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.clearcache()
2016bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        lines = linecache.getlines(NONEXISTENT_FILENAME, globals())
2026bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.clearcache()
2036bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.getlines(NONEXISTENT_FILENAME)
2046bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.lazycache(NONEXISTENT_FILENAME, globals())
2056bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(lines, linecache.updatecache(NONEXISTENT_FILENAME))
2066bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins
2076bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins    def test_lazycache_check(self):
2086bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.clearcache()
2096bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.lazycache(NONEXISTENT_FILENAME, globals())
2106bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.checkcache()
2116bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins
2126bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins    def test_lazycache_bad_filename(self):
2136bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.clearcache()
2146bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(False, linecache.lazycache('', globals()))
2156bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(False, linecache.lazycache('<foo>', globals()))
2166bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins
2176bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins    def test_lazycache_already_cached(self):
2186bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        linecache.clearcache()
2196bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        lines = linecache.getlines(NONEXISTENT_FILENAME, globals())
2206bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(
2216bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins            False,
2226bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins            linecache.lazycache(NONEXISTENT_FILENAME, globals()))
2236bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins        self.assertEqual(4, len(linecache.cache[NONEXISTENT_FILENAME]))
2246bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins
225c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka    def test_memoryerror(self):
226c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka        lines = linecache.getlines(FILENAME)
227c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka        self.assertTrue(lines)
228c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka        def raise_memoryerror(*args, **kwargs):
229c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka            raise MemoryError
230c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka        with support.swap_attr(linecache, 'updatecache', raise_memoryerror):
231c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka            lines2 = linecache.getlines(FILENAME)
232c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka        self.assertEqual(lines2, lines)
233c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka
234c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka        linecache.clearcache()
235c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka        with support.swap_attr(linecache, 'updatecache', raise_memoryerror):
236c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka            lines3 = linecache.getlines(FILENAME)
237c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka        self.assertEqual(lines3, [])
238c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka        self.assertEqual(linecache.getlines(FILENAME), lines)
2396bc2c1e7ebf359224e5e547f58ffc2c42cb36a39Robert Collins
240991f9202bede42b033e499525755daed4a1c07beGeorg Brandl
241991f9202bede42b033e499525755daed4a1c07beGeorg Brandlif __name__ == "__main__":
242c512adc90d49b1dae3ae14c81826e03c9ea46ba5Serhiy Storchaka    unittest.main()
243