-
-
Notifications
You must be signed in to change notification settings - Fork 34.5k
bpo-25872: Add unit tests for linecache and threading #25913
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 8 commits
5143e74
fc1f92d
fc4df5d
a977922
759de2b
5666a1d
4513859
8376d21
708e348
f021de2
a396fad
833c9b9
bcc20ab
ba62b83
420a638
2c8269b
8efe040
240eb9a
f66a050
78897e7
ac550ef
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -239,5 +239,48 @@ def raise_memoryerror(*args, **kwargs): | |
| self.assertEqual(linecache.getlines(FILENAME), lines) | ||
|
|
||
|
|
||
| class LineCacheInvalidationTests(unittest.TestCase): | ||
| def setUp(self): | ||
| super().setUp() | ||
| linecache.clearcache() | ||
| self.deleted_file = os_helper.TESTFN + '.1' | ||
| self.modified_file = os_helper.TESTFN + '.2' | ||
| self.unchange_file = os_helper.TESTFN + '.3' | ||
| self.addCleanup(os_helper.unlink, self.deleted_file) | ||
| self.addCleanup(os_helper.unlink, self.modified_file) | ||
| self.addCleanup(os_helper.unlink, self.unchange_file) | ||
| with open(self.deleted_file, 'w', encoding='utf-8') as source: | ||
| source.write('print("will be deleted")') | ||
| with open(self.modified_file, 'w', encoding='utf-8') as source: | ||
| source.write('print("will be modified")') | ||
| with open(self.unchange_file, 'w', encoding='utf-8') as source: | ||
| source.write('print("unchange")') | ||
|
|
||
| linecache.getlines(self.deleted_file) | ||
| linecache.getlines(self.modified_file) | ||
| linecache.getlines(self.unchange_file) | ||
|
|
||
| os.remove(self.deleted_file) | ||
| with open(self.modified_file, 'w', encoding='utf-8') as source: | ||
| source.write('print("was modified")') | ||
|
|
||
| def test_checkcache_with_oserror(self): | ||
| self.assertEqual(3, len(linecache.cache.keys())) | ||
| linecache.checkcache(self.deleted_file) | ||
| self.assertTrue(2 == len(linecache.cache.keys()) and | ||
| self.deleted_file not in linecache.cache.keys()) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Break this up into assertEqual and assertNotIn. See the assert methods here: https://docs.python.org/3/library/unittest.html That way we get better error messages in the output when the assertion fails. |
||
|
|
||
| def test_checkcache_with_not_match_size_or_timestamp(self): | ||
|
uniocto marked this conversation as resolved.
Outdated
|
||
| self.assertEqual(3, len(linecache.cache.keys())) | ||
| linecache.checkcache(self.modified_file) | ||
| self.assertTrue(2 == len(linecache.cache.keys()) and | ||
| self.modified_file not in linecache.cache.keys()) | ||
|
|
||
| def test_checkcache_with_no_parameters(self): | ||
| self.assertEqual(3, len(linecache.cache.keys())) | ||
| linecache.checkcache() | ||
| self.assertTrue([self.unchange_file] == list(linecache.cache.keys())) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. assertEqual |
||
|
|
||
|
|
||
| if __name__ == "__main__": | ||
| unittest.main() | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -19,6 +19,7 @@ | |
| import subprocess | ||
| import signal | ||
| import textwrap | ||
| import traceback | ||
|
|
||
| from unittest import mock | ||
| from test import lock_tests | ||
|
|
@@ -1338,6 +1339,24 @@ def run(self): | |
| # explicitly break the reference cycle to not leak a dangling thread | ||
| thread.exc = None | ||
|
|
||
| def test_multithread_modify_file_noerror(self): | ||
|
uniocto marked this conversation as resolved.
|
||
| def modify_file(): | ||
| with open(__file__, 'a') as fp: | ||
|
iritkatriel marked this conversation as resolved.
Outdated
|
||
| fp.write(' ') | ||
|
iritkatriel marked this conversation as resolved.
|
||
| traceback.format_stack() | ||
|
|
||
| threads = [ | ||
| threading.Thread(target=modify_file) | ||
| for i in range(100) | ||
| ] | ||
| try: | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Which exceptions are you trying to ignore here?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nothing, sorry. I removed |
||
| for t in threads: | ||
| t.start() | ||
| for t in threads: | ||
| t.join() | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is there a reason why you don't do ?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nothing, sorry. |
||
| finally: | ||
| pass | ||
|
|
||
|
|
||
| class ThreadRunFail(threading.Thread): | ||
| def run(self): | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.