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