14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao""" 24adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoCreate and delete FILES_PER_THREAD temp files (via tempfile.TemporaryFile) 34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoin each of NUM_THREADS threads, recording the number of successes and 44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofailures. A failure is a bug in tempfile, and may be due to: 54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao+ Trying to create more than one tempfile with the same name. 74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao+ Trying to delete a tempfile that doesn't still exist. 84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao+ Something we've never seen before. 94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 104adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoBy default, NUM_THREADS == 20 and FILES_PER_THREAD == 50. This is enough to 114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocreate about 150 failures per run under Win98SE in 2.0, and runs pretty 124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoquickly. Guido reports needing to boost FILES_PER_THREAD to 500 before 134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoprovoking a 2.0 failure under Linux. 144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao""" 154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 164adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNUM_THREADS = 20 174adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoFILES_PER_THREAD = 50 184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport tempfile 204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import threading_setup, threading_cleanup, run_unittest, import_module 224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaothreading = import_module('threading') 234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest 244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport StringIO 254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom traceback import print_exc 264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 274adfde8bc82dd39f59e0445588c3e599ada477dJosh GaostartEvent = threading.Event() 284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TempFileGreedy(threading.Thread): 304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao error_count = 0 314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ok_count = 0 324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def run(self): 344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.errors = StringIO.StringIO() 354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao startEvent.wait() 364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for i in range(FILES_PER_THREAD): 374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao f = tempfile.TemporaryFile("w+b") 394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao f.close() 404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except: 414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.error_count += 1 424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao print_exc(file=self.errors) 434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.ok_count += 1 454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ThreadedTempFileTest(unittest.TestCase): 484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def test_main(self): 494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao threads = [] 504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao thread_info = threading_setup() 514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for i in range(NUM_THREADS): 534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao t = TempFileGreedy() 544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao threads.append(t) 554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao t.start() 564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao startEvent.set() 584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ok = 0 604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errors = [] 614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for t in threads: 624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao t.join() 634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ok += t.ok_count 644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if t.error_count: 654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errors.append(str(t.getName()) + str(t.errors.getvalue())) 664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao threading_cleanup(*thread_info) 684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao msg = "Errors: errors %d ok %d\n%s" % (len(errors), ok, 704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '\n'.join(errors)) 714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(errors, [], msg) 724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.assertEqual(ok, NUM_THREADS * FILES_PER_THREAD) 734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main(): 754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao run_unittest(ThreadedTempFileTest) 764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__": 784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao test_main() 79