This revision was automatically updated to reflect the committed changes.
Closed by commit rL370449: dotest: improvements to the pexpect tests (authored 
by labath, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66954/new/

https://reviews.llvm.org/D66954

Files:
  
lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py
  lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/Makefile
  
lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/TestFormats.py
  lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/main.c
  
lldb/trunk/packages/Python/lldbsuite/test/iohandler/completion/TestIOHandlerCompletion.py
  lldb/trunk/packages/Python/lldbsuite/test/lldbpexpect.py

Index: lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py
+++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py
@@ -5,48 +5,28 @@
 import lldb
 from lldbsuite.test.decorators import *
 from lldbsuite.test.lldbtest import *
+from lldbsuite.test.lldbpexpect import PExpectTest
 
-class MultilineCompletionTest(TestBase):
+class MultilineCompletionTest(PExpectTest):
 
     mydir = TestBase.compute_mydir(__file__)
-    NO_DEBUG_INFO_TESTCASE = True
 
-    def setUp(self):
-        TestBase.setUp(self)
-        self.source = 'main.c'
-
-    def expect_string(self, string):
-        import pexpect
-        """This expects for "string", with timeout & EOF being test fails."""
-        try:
-            self.child.expect_exact(string)
-        except pexpect.EOF:
-            self.fail("Got EOF waiting for '%s'" % (string))
-        except pexpect.TIMEOUT:
-            self.fail("Timed out waiting for '%s'" % (string))
-
-    @expectedFailureAll(
-        oslist=["windows"],
-        bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
     def test_basic_completion(self):
         """Test that we can complete a simple multiline expression"""
         self.build()
-        self.setTearDownCleanup()
 
-        import pexpect
-        exe = self.getBuildArtifact("a.out")
         prompt = "(lldb) "
 
-        run_commands = ' -o "b main" -o "r"'
-        self.child = pexpect.spawn(
-            '%s %s %s %s' %
-            (lldbtest_config.lldbExec, self.lldbOption, run_commands, exe))
-        child = self.child
+        self.launch(executable=self.getBuildArtifact("a.out"))
+        self.expect("b main", substrs=["Breakpoint 1", "address ="])
+        self.expect("run", substrs=["stop reason ="])
 
-        self.expect_string(prompt)
         self.child.sendline("expr")
-        self.expect_string("terminate with an empty line to evaluate")
+        self.child.expect_exact("terminate with an empty line to evaluate")
         self.child.send("to_\t")
-        self.expect_string("to_complete")
+        self.child.expect_exact("to_complete")
 
-        self.deletePexpectChild()
+        self.child.send("\n\n")
+        self.expect_prompt()
+
+        self.quit()
Index: lldb/trunk/packages/Python/lldbsuite/test/iohandler/completion/TestIOHandlerCompletion.py
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/iohandler/completion/TestIOHandlerCompletion.py
+++ lldb/trunk/packages/Python/lldbsuite/test/iohandler/completion/TestIOHandlerCompletion.py
@@ -7,70 +7,46 @@
 import lldb
 from lldbsuite.test.decorators import *
 from lldbsuite.test.lldbtest import *
+from lldbsuite.test.lldbpexpect import PExpectTest
 
-class IOHandlerCompletionTest(TestBase):
+class IOHandlerCompletionTest(PExpectTest):
 
     mydir = TestBase.compute_mydir(__file__)
-    NO_DEBUG_INFO_TESTCASE = True
 
-    def setUp(self):
-        TestBase.setUp(self)
-
-    def expect_string(self, string):
-        import pexpect
-        """This expects for "string", with timeout & EOF being test fails."""
-        try:
-            self.child.expect_exact(string)
-        except pexpect.EOF:
-            self.fail("Got EOF waiting for '%s'" % (string))
-        except pexpect.TIMEOUT:
-            self.fail("Timed out waiting for '%s'" % (string))
-
-    @expectedFailureAll(
-        oslist=["windows"],
-        bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
     def test_completion(self):
-        self.setTearDownCleanup()
-
-        import pexpect
-        exe = self.getBuildArtifact("a.out")
-        prompt = "(lldb) "
-
-        self.child = pexpect.spawn(
-            '%s %s %s %s' %
-            (lldbtest_config.lldbExec, self.lldbOption, "", exe),
-            dimensions=(100, 500))
+        self.launch(dimensions=(100,500))
 
-        self.expect_string(prompt)
         # Start tab completion, go to the next page and then display all with 'a'.
         self.child.send("\t\ta")
-        self.expect_string("register")
+        self.child.expect_exact("register")
 
         # Try tab completing regi to register.
         self.child.send("regi\t")
-        self.expect_string(prompt + "register")
+        self.child.expect_exact(self.PROMPT + "register")
         self.child.send("\n")
+        self.expect_prompt()
 
         # Try tab completing directories and files. Also tests the partial
         # completion where LLDB shouldn't print a space after the directory
         # completion (as it didn't completed the full token).
         dir_without_slashes = os.path.realpath(os.path.dirname(__file__)).rstrip("/")
         self.child.send("file " + dir_without_slashes + "\t")
-        self.expect_string("iohandler/completion/")
+        self.child.expect_exact("iohandler/completion/")
         # If we get a correct partial completion without a trailing space, then this
         # should complete the current test file.
         self.child.send("TestIOHandler\t")
-        self.expect_string("TestIOHandlerCompletion.py")
+        self.child.expect_exact("TestIOHandlerCompletion.py")
         self.child.send("\n")
+        self.expect_prompt()
 
         # Start tab completion and abort showing more commands with 'n'.
         self.child.send("\t")
-        self.expect_string("More (Y/n/a)")
+        self.child.expect_exact("More (Y/n/a)")
         self.child.send("n")
-        self.expect_string(prompt)
+        self.expect_prompt()
 
         # Shouldn't crash or anything like that.
         self.child.send("regoinvalid\t")
-        self.expect_string(prompt)
+        self.expect_prompt()
 
-        self.deletePexpectChild()
+        self.quit()
Index: lldb/trunk/packages/Python/lldbsuite/test/lldbpexpect.py
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/lldbpexpect.py
+++ lldb/trunk/packages/Python/lldbsuite/test/lldbpexpect.py
@@ -13,82 +13,47 @@
 from . import lldbutil
 
 if sys.platform.startswith('win32'):
-    class PExpectTest(TestBase):
+    # llvm.org/pr22274: need a pexpect replacement for windows
+    class PExpectTest(object):
         pass
 else:
     import pexpect
 
     class PExpectTest(TestBase):
 
-        mydir = TestBase.compute_mydir(__file__)
-
-        def setUp(self):
-            TestBase.setUp(self)
+        NO_DEBUG_INFO_TESTCASE = True
+        PROMPT = "(lldb) "
 
-        def launchArgs(self):
-            return ""
+        def expect_prompt(self):
+            self.child.expect_exact(self.PROMPT)
 
-        def launch(self, timeout=None):
-            if timeout is None:
-                timeout = 30
+        def launch(self, executable=None, timeout=30, dimensions=None):
             logfile = sys.stdout if self.TraceOn() else None
+            args = ['--no-lldbinit', '--no-use-colors']
+            for cmd in self.setUpCommands():
+                args += ['-O', cmd]
+            if executable is not None:
+                args += ['--file', executable]
             self.child = pexpect.spawn(
-                '%s --no-use-colors %s' %
-                (lldbtest_config.lldbExec, self.launchArgs()), logfile=logfile)
-            self.child.timeout = timeout
-            self.timeout = timeout
-
-        def expect(self, patterns=None, timeout=None, exact=None):
-            if patterns is None:
-                return None
-            if timeout is None:
-                timeout = self.timeout
-            if exact is None:
-                exact = False
-            if exact:
-                return self.child.expect_exact(patterns, timeout=timeout)
-            else:
-                return self.child.expect(patterns, timeout=timeout)
-
-        def expectall(self, patterns=None, timeout=None, exact=None):
-            if patterns is None:
-                return None
-            if timeout is None:
-                timeout = self.timeout
-            if exact is None:
-                exact = False
-            for pattern in patterns:
-                self.expect(pattern, timeout=timeout, exact=exact)
-
-        def sendimpl(
-                self,
-                sender,
-                command,
-                patterns=None,
-                timeout=None,
-                exact=None):
-            sender(command)
-            return self.expect(patterns=patterns, timeout=timeout, exact=exact)
-
-        def send(self, command, patterns=None, timeout=None, exact=None):
-            return self.sendimpl(
-                self.child.send,
-                command,
-                patterns,
-                timeout,
-                exact)
-
-        def sendline(self, command, patterns=None, timeout=None, exact=None):
-            return self.sendimpl(
-                self.child.sendline,
-                command,
-                patterns,
-                timeout,
-                exact)
-
-        def quit(self, gracefully=None):
-            if gracefully is None:
-                gracefully = True
+                    lldbtest_config.lldbExec, args=args, logfile=logfile,
+                    timeout=timeout, dimensions=dimensions)
+            self.expect_prompt()
+            for cmd in self.setUpCommands():
+                self.child.expect_exact(cmd)
+                self.expect_prompt()
+            if executable is not None:
+                self.child.expect_exact("target create")
+                self.child.expect_exact("Current executable set to")
+                self.expect_prompt()
+
+        def expect(self, cmd, substrs=None):
+            self.child.sendline(cmd)
+            if substrs is not None:
+                for s in substrs:
+                    self.child.expect_exact(s)
+            self.expect_prompt()
+
+        def quit(self, gracefully=True):
             self.child.sendeof()
             self.child.close(force=not gracefully)
             self.child = None
Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/main.c
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/main.c
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/main.c
@@ -1,14 +0,0 @@
-//===-- main.c --------------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include <stdio.h>
-int main (int argc, char const *argv[])
-{
-    printf("testing\n");
-    return 0;
-}
Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/TestFormats.py
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/TestFormats.py
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/TestFormats.py
@@ -1,38 +0,0 @@
-"""
-Test the command history mechanism
-"""
-
-from __future__ import print_function
-
-
-import lldb
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test import lldbutil
-
-
-class TestFormats(TestBase):
-
-    mydir = TestBase.compute_mydir(__file__)
-
-    @expectedFailureAll(
-        hostoslist=["windows"],
-        bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
-    def test_formats(self):
-        """Test format string functionality."""
-        self.build()
-        exe = self.getBuildArtifact("a.out")
-        import pexpect
-        prompt = "(lldb) "
-        child = pexpect.spawn(
-            '%s %s -x -o "b main" -o r %s' %
-            (lldbtest_config.lldbExec, self.lldbOption, exe))
-        # So that the spawned lldb session gets shutdown durng teardown.
-        self.child = child
-
-        # Substitute 'Help!' for 'help' using the 'commands regex' mechanism.
-        child.expect_exact(prompt + 'target create "%s"' % exe)
-        child.expect_exact(prompt + 'b main')
-        child.expect_exact(prompt + 'r')
-        child.expect_exact(prompt)
-        child.sendline()
Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/Makefile
===================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/Makefile
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/format/Makefile
@@ -1,5 +0,0 @@
-LEVEL = ../../make
-
-C_SOURCES := main.c
-
-include $(LEVEL)/Makefile.rules
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to