[Lldb-commits] [PATCH] test: ignore IOError in Base.deletePexpectChild and clean TestMySyntax test

Ilia K ki.stfu at gmail.com
Tue Dec 30 08:50:46 PST 2014


Now I have modified breakpoint's test and IOError sometimes happens:
{code}
$ *./dotest.py -v --executable $BUILDDIR/bin/lldb -f
MiBreakpointTestCase.test_lldbmi_pendbreakonsym*
['./dotest.py', '-v', '--executable',
'/Users/IliaK/p/llvm/build_ninja/bin/lldb', '-f',
'MiBreakpointTestCase.test_lldbmi_pendbreakonsym']
LLDB library dir: /Users/IliaK/p/llvm/build_ninja/bin
lldb-330.99.0
lldb.pre_flight: None
lldb.post_flight: None

Session logs for test failures/errors/unexpected successes will go into
directory '2014-12-30-19_45_12'
Command invoked: ./dotest.py -v --executable
/Users/IliaK/p/llvm/build_ninja/bin/lldb -f
MiBreakpointTestCase.test_lldbmi_pendbreakonsym
compilers=['clang']

Configuration: arch=x86_64 compiler=clang
----------------------------------------------------------------------
Collected 1 test

1: test_lldbmi_pendbreakonsym (TestMiBreakpoint.MiBreakpointTestCase)
   Test that 'lldb-mi --interpreter' works for pending symbol breakpoints.
... ERROR

======================================================================
ERROR: test_lldbmi_pendbreakonsym (TestMiBreakpoint.MiBreakpointTestCase)
   Test that 'lldb-mi --interpreter' works for pending symbol breakpoints.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1765, in
tearDown
    Base.tearDown(self)
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1087, in
tearDown
    self.deletePexpectChild()
  File "/Users/IliaK/p/llvm/tools/lldb/test/lldbtest.py", line 1072, in
deletePexpectChild
    self.child.sendline('settings set interpreter.prompt-on-quit false')
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line
966, in sendline
    n = self.send(s)
  File "/Users/IliaK/p/llvm/tools/lldb/test/pexpect-2.4/pexpect.py", line
958, in send
    c = os.write(self.child_fd, s)
OSError: [Errno 5] Input/output error
Config=x86_64-clang
----------------------------------------------------------------------
{code}

Here are my changes:
{code}
Index: test/tools/lldb-mi/TestMiBreakpoint.py
===================================================================
--- test/tools/lldb-mi/TestMiBreakpoint.py      (revision 224982)
+++ test/tools/lldb-mi/TestMiBreakpoint.py      (working copy)
@@ -48,17 +48,13 @@
                 child.expect("\^done,bkpt={number=\"1\"")

                 child.sendline("-exec-run")
-                child.sendline("") # FIXME: lldb-mi hangs here, so extra
return is needed
                 child.expect("\^running")
                 child.expect("\*stopped,reason=\"breakpoint-hit\"")

                 child.sendline("-exec-continue")
                 child.expect("\^running")
                 child.expect("\*stopped,reason=\"exited-normally\"")
-                child.expect_exact(prompt)

-                child.sendline("quit")
-
         # Now that the necessary logging is done, restore logfile to None
to
         # stop further logging.
         child.logfile_send = None
{code}

Thanks,
Ilia


On Tue, Dec 30, 2014 at 7:39 PM, Abid, Hafiz <Hafiz_Abid at mentor.com> wrote:

>  I also found in the existing test cases that both ways have been used.
> So I will remove that prompt and 'quit' from the lldb-mi test cases as you
> have done from one of them. Then if you still get the IOError then we can
> apply your 2nd patch.
>
>  Thanks,
> Abid
>  ------------------------------
> *From:* Ilia K [ki.stfu at gmail.com]
> *Sent:* Tuesday, December 30, 2014 4:29 PM
> *To:* Abid, Hafiz
> *Cc:* lldb-commits at cs.uiuc.edu
> *Subject:* RE: [Lldb-commits] [PATCH] test: ignore IOError in
> Base.deletePexpectChild and clean TestMySyntax test
>
>   As I understood both of them are legal (in theory) but in practice I
> faced with IOError. I think we should ignore IOError because we can't fix
> isalive() method.
>
> Thanks,
> Ilia
> On 30 Dec 2014 19:21, "Abid, Hafiz" <Hafiz_Abid at mentor.com> wrote:
>
>>  Thanks for quick reply. Your patch is removing the following line from
>> lldb-mi test case.
>> -                child.sendline("quit")
>>
>>  I am wondering what is the convention of terminating the executable
>> that we invoked. Do the test is supposed to kill it (using 'quit') command
>> or it can be left to the other part of testing code which as you noted also
>> use sendline('quit').
>>
>>  Regards,
>> Abid
>>  ------------------------------
>> *From:* Ilia K [ki.stfu at gmail.com]
>> *Sent:* Tuesday, December 30, 2014 4:11 PM
>> *To:* Abid, Hafiz
>> *Cc:* lldb-commits at cs.uiuc.edu
>> *Subject:* Re: [Lldb-commits] [PATCH] test: ignore IOError in
>> Base.deletePexpectChild and clean TestMySyntax test
>>
>>   ** it will cause a IOError because later it will try to kill process
>> using 'sendline(quit)'.
>>
>>  Thanks,
>> Ilia
>>
>> On Tue, Dec 30, 2014 at 7:06 PM, Ilia K <ki.stfu at gmail.com> wrote:
>>
>>> Hello Abid,
>>>
>>>  I'm glad to see you.
>>>
>>>  >RE: IMHO once we have removed the extra quit call from the test
>>> cases, we will not need the check for OSErrror.
>>> Unfortunately it's not. The deletePexpectChild() sometimes causes that
>>> problem when isalive returns a false positive result.
>>> {code}
>>>          # This is for the case of directly spawning 'lldb' and
>>> interacting with it
>>>          # using pexpect.
>>>         if self.child and self.child.isalive(): *<--here*
>>>             import pexpect
>>>             with recording(self, traceAlways) as sbuf:
>>>                 print >> sbuf, "tearing down the child process...."
>>>             try:
>>>                 if self.child_in_script_interpreter:
>>>                     self.child.sendline('quit()')
>>>                     self.child.expect_exact(self.child_prompt)
>>>                  self.child.sendline('settings set
>>> interpreter.prompt-on-quit false')
>>>                  self.child.sendline('quit')
>>>                 self.child.expect(pexpect.EOF)
>>>             except (ValueError, OSError, pexpect.ExceptionPexpect):
>>>                  # child is already terminated
>>>                 pass
>>>              finally:
>>>                 # Give it one final blow to make sure the child is
>>> terminated.
>>>                 self.child.close()
>>> {code}
>>> The pexpect's isalive() method is nonblocking. It checks whether process
>>> was terminated or not. But the problem is that process may be terminated
>>> after isalive() was called -- it will cause a IOError.
>>>
>>>  Thanks,
>>> Ilia
>>>
>>>
>>> On Tue, Dec 30, 2014 at 6:46 PM, Abid, Hafiz <Hafiz_Abid at mentor.com>
>>> wrote:
>>>
>>>>  I dont see any problem with the patch that cleans up
>>>> the TestMiSyntax.py. But I see that similar cleanup is needed in  other
>>>> tests too. I will make the change and then commit all of them.
>>>>
>>>>  IMHO once we have removed the extra quit call from the test cases, we
>>>> will not need the check for OSErrror.
>>>>
>>>>  Thanks,
>>>> Abid
>>>>  ------------------------------
>>>> *From:* Ilia K [ki.stfu at gmail.com]
>>>> *Sent:* Monday, December 22, 2014 11:54 AM
>>>> *To:* Abid, Hafiz; lldb-commits at cs.uiuc.edu
>>>> *Subject:* Re: [Lldb-commits] [PATCH] test: ignore IOError in
>>>> Base.deletePexpectChild and clean TestMySyntax test
>>>>
>>>>    Hello,
>>>>
>>>>  My previous messages left without answer. I'm posting them again (see
>>>> below) with patch files.
>>>> The initial message:
>>>> http://lists.cs.uiuc.edu/pipermail/lldb-commits/Week-of-Mon-20141215/014599.html
>>>>
>>>>  Thanks,
>>>> Ilia
>>>>
>>>> On Tue, Dec 16, 2014 at 7:02 PM, Ilia K <ki.stfu at gmail.com> wrote:
>>>>
>>>>> Hello,
>>>>>
>>>>>  >RE: IOError may happen when child already exited but dotest has
>>>>> missed this and tries to exit using 'child.sendline("quit")'
>>>>> Actually it's OSError (not IOError):
>>>>>
>>>>>
>>>>> ======================================================================
>>>>> ERROR: test_lldbmi_tokens (TestMiSyntax.MiSyntaxTestCase)
>>>>>    Test that 'lldb-mi --interpreter' echos command tokens.
>>>>> ----------------------------------------------------------------------
>>>>> Traceback (most recent call last):
>>>>>   File "/Users/IliaK/p/llvm_delphi/tools/lldb/test/lldbtest.py", line
>>>>> 1770, in tearDown
>>>>>     Base.tearDown(self)
>>>>>   File "/Users/IliaK/p/llvm_delphi/tools/lldb/test/lldbtest.py", line
>>>>> 1092, in tearDown
>>>>>     self.deletePexpectChild()
>>>>>   File "/Users/IliaK/p/llvm_delphi/tools/lldb/test/lldbtest.py", line
>>>>> 1074, in deletePexpectChild
>>>>>     self.child.sendline('settings set interpreter.prompt-on-quit
>>>>> false')
>>>>>   File
>>>>> "/Users/IliaK/p/llvm_delphi/tools/lldb/test/pexpect-2.4/pexpect.py", line
>>>>> 966, in sendline
>>>>>     n = self.send(s)
>>>>>   File
>>>>> "/Users/IliaK/p/llvm_delphi/tools/lldb/test/pexpect-2.4/pexpect.py", line
>>>>> 958, in send
>>>>>     c = os.write(self.child_fd, s)
>>>>> OSError: [Errno 5] Input/output error
>>>>> Config=x86_64-clang
>>>>>
>>>>>  Therefore I updated lldbtest_ignore_ioerror_on_theardown.patch file.
>>>>> Btw, may be better to filter only IO errors from OSError class? It'll
>>>>> look like:
>>>>>
>>>>>  {code}
>>>>> try:
>>>>>     ...
>>>>> except (ValueError, pexpect.ExceptionPexpect):
>>>>>     # child is already terminated
>>>>>     pass
>>>>> except OSError, e:
>>>>>     if e.errno != errno.EIO:
>>>>>         # unexpected exception
>>>>>         raise
>>>>>      # child is already terminated
>>>>>      pass
>>>>> finally:
>>>>>     ...
>>>>> {code}
>>>>>
>>>>>  Thanks,
>>>>> Ilia
>>>>>
>>>>>
>>>>> On Tue, Dec 16, 2014 at 4:42 PM, Ilia K <ki.stfu at gmail.com> wrote:
>>>>>>
>>>>>> Hello,
>>>>>>
>>>>>>  I found the following:
>>>>>> IOError may happen when child already exited but dotest has missed
>>>>>> this and tries to exit using 'child.sendline("quit")'
>>>>>>
>>>>>>  Also, I clean syntax test. -exec-run no hangs more and 'quit' isn't
>>>>>> needed at exit.
>>>>>>
>>>>>>  Thanks,
>>>>>> Ilia
>>>>>>
>>>>>
>>>>
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20141230/86758d29/attachment.html>


More information about the lldb-commits mailing list