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`.
73 lines
2.3 KiB
Python
73 lines
2.3 KiB
Python
"""
|
|
Test quoting of arguments to lldb commands.
|
|
"""
|
|
|
|
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
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(SettingsCommandTestCase.output_file_name)
|
|
|
|
@skipIfReproducer # Reproducers don't know about output.txt
|
|
@no_debug_info_test
|
|
def test(self):
|
|
self.build()
|
|
exe = self.getBuildArtifact("a.out")
|
|
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
|
|
|
|
# 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:
|
|
outfile = lldb.remote_platform.GetWorkingDirectory() + filename
|
|
else:
|
|
outfile = self.getBuildArtifact(filename)
|
|
|
|
self.runCmd("process launch -- %s %s" % (outfile, args_in))
|
|
|
|
if lldb.remote_platform:
|
|
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(outfile, 'r') as f:
|
|
output = f.read()
|
|
|
|
self.RemoveTempFile(outfile)
|
|
|
|
self.assertEqual(output, args_out)
|