[lldb][NFC] Rewrite TestQuoting

TestQuoting's different test methods all build their own test binaries but
we can just reuse the same test binary by merging all asserts into one method.
This reduces the test runtime from 8 seconds to 4 seconds on my machine.
This also removes the ability to have partial failures in this test, but given
how rarely this code is touched this seems like a fair tradeoff (and we will be
able to re-add this feature once we updated our test framework).

Some other small changes:
  * Fixed that we cleanup "stdout.txt" instead of "output.txt" in the cleanup.
  * Fixed some formatting issues.
  * Call `build` instead of directly calling `buildDefault`.
This commit is contained in:
Raphael Isemann 2020-10-27 10:37:26 +01:00
parent 2d59ed4e62
commit 1f933ff999
1 changed files with 40 additions and 62 deletions

View File

@ -1,10 +1,7 @@
"""
Test quoting of arguments to lldb commands
Test quoting of arguments to lldb commands.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
@ -14,81 +11,62 @@ from lldbsuite.test import lldbutil
class SettingsCommandTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
output_file_name = "output.txt"
@classmethod
def classCleanup(cls):
"""Cleanup the test byproducts."""
cls.RemoveTempFile("stdout.txt")
cls.RemoveTempFile(SettingsCommandTestCase.output_file_name)
@skipIfReproducer # Reproducers don't know about output.txt
@no_debug_info_test
def test_no_quote(self):
self.do_test_args("a b c", "a\0b\0c\0")
@no_debug_info_test
def test_single_quote(self):
self.do_test_args("'a b c'", "a b c\0")
@no_debug_info_test
def test_double_quote(self):
self.do_test_args('"a b c"', "a b c\0")
@no_debug_info_test
def test_single_quote_escape(self):
self.do_test_args("'a b\\' c", "a b\\\0c\0")
@no_debug_info_test
def test_double_quote_escape(self):
self.do_test_args('"a b\\" c"', 'a b" c\0')
@no_debug_info_test
def test_double_quote_escape2(self):
self.do_test_args('"a b\\\\" c', 'a b\\\0c\0')
@no_debug_info_test
def test_single_in_double(self):
self.do_test_args('"a\'b"', "a'b\0")
@no_debug_info_test
def test_double_in_single(self):
self.do_test_args("'a\"b'", 'a"b\0')
@no_debug_info_test
def test_combined(self):
self.do_test_args('"a b"c\'d e\'', 'a bcd e\0')
@no_debug_info_test
def test_bare_single(self):
self.do_test_args("a\\'b", "a'b\0")
@no_debug_info_test
def test_bare_double(self):
self.do_test_args('a\\"b', 'a"b\0')
@skipIfReproducer # Reproducers don't know about output.txt
def do_test_args(self, args_in, args_out):
"""Test argument parsing. Run the program with args_in. The program dumps its arguments
to stdout. Compare the stdout with args_out."""
self.buildDefault()
def test(self):
self.build()
exe = self.getBuildArtifact("a.out")
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
local_outfile = self.getBuildArtifact("output.txt")
# No quotes.
self.expect_args("a b c", "a\0b\0c\0")
# Single quotes.
self.expect_args("'a b c'", "a b c\0")
# Double quotes.
self.expect_args('"a b c"', "a b c\0")
# Single quote escape.
self.expect_args("'a b\\' c", "a b\\\0c\0")
# Double quote escape.
self.expect_args('"a b\\" c"', 'a b" c\0')
self.expect_args('"a b\\\\" c', 'a b\\\0c\0')
# Single quote in double quotes.
self.expect_args('"a\'b"', "a'b\0")
# Double quotes in single quote.
self.expect_args("'a\"b'", 'a"b\0')
# Combined quotes.
self.expect_args('"a b"c\'d e\'', 'a bcd e\0')
# Bare single/double quotes.
self.expect_args("a\\'b", "a'b\0")
self.expect_args('a\\"b', 'a"b\0')
def expect_args(self, args_in, args_out):
"""Test argument parsing. Run the program with args_in. The program dumps its arguments
to stdout. Compare the stdout with args_out."""
filename = SettingsCommandTestCase.output_file_name
if lldb.remote_platform:
remote_outfile = lldb.remote_platform.GetWorkingDirectory() + "/output.txt"
outfile = lldb.remote_platform.GetWorkingDirectory() + filename
else:
remote_outfile = local_outfile
outfile = self.getBuildArtifact(filename)
self.runCmd("process launch -- %s %s" %(remote_outfile, args_in))
self.runCmd("process launch -- %s %s" % (outfile, args_in))
if lldb.remote_platform:
src_file_spec = lldb.SBFileSpec(remote_outfile, False)
dst_file_spec = lldb.SBFileSpec(local_outfile, True)
src_file_spec = lldb.SBFileSpec(outfile, False)
dst_file_spec = lldb.SBFileSpec(outfile, True)
lldb.remote_platform.Get(src_file_spec, dst_file_spec)
with open(local_outfile, 'r') as f:
with open(outfile, 'r') as f:
output = f.read()
self.RemoveTempFile(local_outfile)
self.RemoveTempFile(outfile)
self.assertEqual(output, args_out)