blob: c74229b860367392c56b174310c72ce6ce246d9f [file] [edit]
"""
Test that the lldb driver can target and run an executable whose path exceeds
the Windows MAX_PATH limit (260 characters).
"""
import os
import shutil
import subprocess
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
MAX_PATH = 260
@skipUnlessWindows
class DriverLongPathTestCase(TestBase):
NO_DEBUG_INFO_TESTCASE = True
def _long_path(self, path):
return lldbutil.get_extended_windows_path(path)
def _make_long_dir(self):
components = [self.getBuildArtifact("deep")] + ["d" * 80] * 3
target_dir = os.path.join(*components)
try:
os.makedirs(self._long_path(target_dir), exist_ok=True)
except OSError:
return None
return target_dir
def test_driver_runs_long_path_target(self):
self.build()
src_exe = self.getBuildArtifact("a.out")
long_dir = self._make_long_dir()
if long_dir is None:
self.skipTest("OS cannot create paths longer than MAX_PATH")
long_exe = os.path.join(long_dir, os.path.basename(src_exe))
shutil.copyfile(src_exe, self._long_path(long_exe))
self.assertGreater(len(os.path.abspath(long_exe)), MAX_PATH)
# Drive the real lldb executable in batch mode: set a breakpoint, run to
# it, and list the modules. This both launches an executable past
# MAX_PATH and prints its full path back.
proc = subprocess.run(
[
lldbtest_config.lldbExec,
"--batch",
"--no-lldbinit",
"-o",
"breakpoint set --name main",
"-o",
"run",
"-o",
"image list",
long_exe,
],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
timeout=300,
)
output = proc.stdout.decode("utf-8", errors="replace")
self.assertIn(
"stop reason = breakpoint",
output,
"the driver should launch the long-path target and hit main:\n" + output,
)
# The long directory component must appear untruncated in the output
self.assertIn(
"d" * 80, output, "the full long path must be reported:\n" + output
)