Kill several problems at once: test_poll() failed sometimes for me.

Turns out the mysterious "expected output" file contained exactly N dots,
because test_poll() has a loop that *usually* went around N times,
printing one dot on each loop trip.  But there's no guarantee of that,
because the exact value of N depended on the vagaries of scheduling
time.sleep()s across two different processes.  So stopped printing dots,
and got rid of the expected output file.  Add a loop counter instead,
and verify that the loop goes around at least a couple of times.  Also
cut the minimum time needed for this test from 4 seconds to 1.
This commit is contained in:
Tim Peters 2004-10-13 03:43:40 +00:00
parent 4052fe5a9b
commit 29b6b4f7c7
2 changed files with 11 additions and 8 deletions

View File

@ -1,2 +0,0 @@
test_subprocess
.........

View File

@ -56,7 +56,7 @@ class ProcessTestCase(unittest.TestCase):
def test_stdout_none(self): def test_stdout_none(self):
# .stdout is None when not redirected # .stdout is None when not redirected
p = subprocess.Popen([sys.executable, "-c", p = subprocess.Popen([sys.executable, "-c",
'print " this bit of output is from a ' 'print " this bit of output is from a '
'test of stdout in a different ' 'test of stdout in a different '
'process ..."'], 'process ..."'],
@ -350,11 +350,16 @@ class ProcessTestCase(unittest.TestCase):
def test_poll(self): def test_poll(self):
p = subprocess.Popen([sys.executable, p = subprocess.Popen([sys.executable,
"-c", "import time; time.sleep(4)"]) "-c", "import time; time.sleep(1)"])
while p.poll() == None: count = 0
sys.stdout.write(".") while p.poll() is None:
sys.stdout.flush() time.sleep(0.1)
time.sleep(0.5) count += 1
# We expect that the poll loop probably went around about 10 times,
# but, based on system scheduling we can't control, it's possible
# poll() never returned None. It "should be" very rare that it
# didn't go around at least twice.
self.assert_(count >= 2)
# Subsequent invocations should just return the returncode # Subsequent invocations should just return the returncode
self.assertEqual(p.poll(), 0) self.assertEqual(p.poll(), 0)