Skip to content

[lldb] Fix the test TestGdbRemotePlatformFile when run with a remote target #91918

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

slydiman
Copy link
Contributor

It is necessary to transfer the test file to/from the really remote target (for example Windows host and Linux target). Also ignore chmod check in case of the Windows host.

@slydiman slydiman requested a review from JDevlieghere as a code owner May 13, 2024 06:35
@llvmbot llvmbot added the lldb label May 13, 2024
@llvmbot
Copy link
Member

llvmbot commented May 13, 2024

@llvm/pr-subscribers-lldb

Author: Dmitry Vasilyev (slydiman)

Changes

It is necessary to transfer the test file to/from the really remote target (for example Windows host and Linux target). Also ignore chmod check in case of the Windows host.


Full diff: https://github.com/llvm/llvm-project/pull/91918.diff

1 Files Affected:

  • (modified) lldb/test/API/tools/lldb-server/TestGdbRemotePlatformFile.py (+44-3)
diff --git a/lldb/test/API/tools/lldb-server/TestGdbRemotePlatformFile.py b/lldb/test/API/tools/lldb-server/TestGdbRemotePlatformFile.py
index 4c8ce01e8ba31..13274696a9a5c 100644
--- a/lldb/test/API/tools/lldb-server/TestGdbRemotePlatformFile.py
+++ b/lldb/test/API/tools/lldb-server/TestGdbRemotePlatformFile.py
@@ -1,6 +1,7 @@
 # lldb test suite imports
 from lldbsuite.test.decorators import *
 from lldbsuite.test.lldbtest import TestBase
+from lldbsuite.test import lldbutil
 
 # gdb-remote-specific imports
 import lldbgdbserverutils
@@ -108,6 +109,20 @@ def test_platform_file_wronly_fail(self):
         )
         self.expect_gdbremote_sequence()
 
+    def remote_install(self, path, filename="test"):
+        if lldb.remote_platform:
+            remote_path = lldbutil.append_to_process_working_directory(self, filename)
+            err = lldb.remote_platform.Install(
+                lldb.SBFileSpec(path, True), lldb.SBFileSpec(remote_path, False)
+            )
+            if err.Fail():
+                raise Exception(
+                    "remote_platform.Install('%s', '%s') failed: %s"
+                    % (path, remote_path, err)
+                )
+            path = remote_path
+        return path
+
     @skipIfWindows
     @add_test_categories(["llgs"])
     def test_platform_file_wronly_creat_excl_fail(self):
@@ -117,6 +132,7 @@ def test_platform_file_wronly_creat_excl_fail(self):
         temp_file = self.getBuildArtifact("test")
         with open(temp_file, "wb"):
             pass
+        temp_file = self.remote_install(temp_file)
 
         # attempt to open the file with O_CREAT|O_EXCL
         self.do_handshake()
@@ -140,6 +156,7 @@ def test_platform_file_size(self):
         test_data = b"test data of some length"
         with open(temp_path, "wb") as temp_file:
             temp_file.write(test_data)
+        temp_path = self.remote_install(temp_path)
 
         self.do_handshake()
         self.test_sequence.add_log_lines(
@@ -167,7 +184,11 @@ def test_platform_file_mode(self):
         test_mode = 0o751
 
         with open(temp_path, "wb") as temp_file:
-            os.chmod(temp_file.fileno(), test_mode)
+            if lldbplatformutil.getHostPlatform() == "windows":
+                test_mode = 0o700
+            else:
+                os.chmod(temp_file.fileno(), test_mode)
+        temp_path = self.remote_install(temp_path)
 
         self.do_handshake()
         self.test_sequence.add_log_lines(
@@ -213,6 +234,7 @@ def test_platform_file_exists(self):
         temp_path = self.getBuildArtifact("test")
         with open(temp_path, "wb"):
             pass
+        temp_path = self.remote_install(temp_path)
 
         self.do_handshake()
         self.test_sequence.add_log_lines(
@@ -244,6 +266,10 @@ def test_platform_file_exists_not(self):
         self.expect_gdbremote_sequence()
 
     @skipIfWindows
+    # FIXME: lldb.remote_platform.Install() cannot copy opened temp file on Windows.
+    # It is possible to use tempfile.NamedTemporaryFile(..., delete=False) and
+    # delete the temp file manually at the end.
+    @skipIf(hostoslist=["windows"])
     @add_test_categories(["llgs"])
     def test_platform_file_fstat(self):
         server = self.connect_to_debug_monitor()
@@ -252,12 +278,13 @@ def test_platform_file_fstat(self):
         with tempfile.NamedTemporaryFile() as temp_file:
             temp_file.write(b"some test data for stat")
             temp_file.flush()
+            temp_path = self.remote_install(temp_file.name, "temp")
 
             self.do_handshake()
             self.test_sequence.add_log_lines(
                 [
                     "read packet: $vFile:open:%s,0,0#00"
-                    % (binascii.b2a_hex(temp_file.name.encode()).decode(),),
+                    % (binascii.b2a_hex(temp_path.encode()).decode(),),
                     {
                         "direction": "send",
                         "regex": r"^\$F([0-9a-fA-F]+)#[0-9a-fA-F]{2}$",
@@ -359,9 +386,12 @@ def vFile_test(
 
         if creat:
             self.assertFalse(os.path.exists(temp_path))
+            if lldb.remote_platform:
+                temp_path = lldbutil.append_to_process_working_directory(self, "test")
         else:
             with open(temp_path, "wb") as temp_file:
                 temp_file.write(test_data.encode())
+            temp_path = self.remote_install(temp_path)
 
         # open the file for reading
         self.do_handshake()
@@ -448,8 +478,19 @@ def vFile_test(
 
         if write:
             # check if the data was actually written
+            if lldb.remote_platform:
+                local_path = self.getBuildArtifact("file_from_target")
+                error = lldb.remote_platform.Get(
+                    lldb.SBFileSpec(temp_path, False), lldb.SBFileSpec(local_path, True)
+                )
+                self.assertTrue(
+                    error.Success(),
+                    "Reading file {0} failed: {1}".format(temp_path, error),
+                )
+                temp_path = local_path
+
             with open(temp_path, "rb") as temp_file:
-                if creat:
+                if creat and lldbplatformutil.getHostPlatform() != "windows":
                     self.assertEqual(
                         os.fstat(temp_file.fileno()).st_mode & 0o7777, 0o640
                     )

@slydiman slydiman requested review from DavidSpickett and labath May 13, 2024 06:36
slydiman added a commit to slydiman/llvm-project that referenced this pull request May 13, 2024
slydiman added a commit that referenced this pull request May 14, 2024
It is necessary to transfer the test file to/from the really remote target (for example Windows host and Linux target).
Also ignore chmod check in case of Windows host.
@slydiman slydiman force-pushed the fix-lldb-test-TestGdbRemotePlatformFile branch from 24d0eb9 to 4eee83a Compare May 14, 2024 07:21
@slydiman slydiman requested a review from DavidSpickett May 14, 2024 07:23
@DavidSpickett DavidSpickett changed the title [lldb] Fix the test TestGdbRemotePlatformFile [lldb] Fix the test TestGdbRemotePlatformFile when run with a remote target May 14, 2024
@slydiman slydiman merged commit 346f2b7 into llvm:main May 14, 2024
4 checks passed
@slydiman slydiman deleted the fix-lldb-test-TestGdbRemotePlatformFile branch July 25, 2024 21:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants