[Python-3000] test_profile failing
Guido van Rossum
guido at python.org
Fri Feb 29 22:15:32 CET 2008
On Fri, Feb 29, 2008 at 12:39 PM, Brett Cannon <brett at python.org> wrote:
> On Fri, Feb 29, 2008 at 11:57 AM, Barry Warsaw <barry at python.org> wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> >
> > On Feb 29, 2008, at 2:44 PM, Brett Cannon wrote:
> >
> > > On Fri, Feb 29, 2008 at 11:22 AM, Barry Warsaw <barry at python.org>
> > > wrote:
> > >>
> >
> > >> I'll see what can be done to fix this particular problem, and try to
> > >> be more attentive to buildbot failure notices when they happen so we
> > >> can nip it closer to the bud. Ultimately, it would be nice if we had
> > >> a process that prevented any breaking patch from landing, but we're
> > >> not there yet.
> > >
> > > A quick tweak to test_profile to print out what it got for output
> > > shows that some changes to io.py led to a different tracing.
> >
> > Thanks Brett. Do we just need to regen the expected output then?
>
> Ah, the joys of expected output. =)
>
> So here is the problem, and it is probably going to mean test_profile
> needs to be rewritten...
>
> When you run ``./python Lib/test/test_profile.py -r`` it runs the
> profile and rewrites the file with the golden output. That's great and
> all, but there was a slight difference with that golden output and
> what was being generated by ``./python Lib/test/test_profile.py``. You
> know what that difference was? An extra write call in io.py.
>
> Turns out that when the golden output is generated that all streams
> have their buffers empty. But when unittest prints its whole "__test__
> .. ok" output it has stuff in a buffer since the "ok" has not been
> written yet (in other words sys.stdout has not been fully flushed yet
> while the test is running). If you change the print() call in
> test_profile.regenerate_expected_output() to ``print('Regenerating %s
> ... ' % filename, end='')`` then sys.stdout gets a flush() call during
> the profiling for the golden output and everyone is happy.
>
> But guess what happens when you run ``./python Lib/test/regrtest.py
> test_profile``? That's right, there is no extra flush call!
> regrtest.py outputs a single line, runs the test, and then prints
> another line when it knows the result of the test.. Actually, there is
> one less flush call in the regrtest.py case than in the generated
> stuff, so I suspect regrtest or someone is doing an explicit flush or
> something.
>
> In other words, having the golden output have any I/O in it is making
> it impossible to test. What would probably be best is to just strip
> out any and all lines that do not directly involve profilee.py and
> only compare those lines. I have no clue if a simple 'contains' check
> will suffice because I don't know if the stat numbers are consistent
> enough.
>
> Anyway, I am out of time. Hopefully someone can finish up this work
> some time today.
Good analysis. Can't we insert a flush somewhere before the profiler
is started so that the starting point is always with empty output
buffers?
--
--Guido van Rossum (home page: http://www.python.org/~guido/)
More information about the Python-3000
mailing list