File: TestLoadUsingPaths.py

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (168 lines) | stat: -rw-r--r-- 6,409 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
"""
Test that SBProcess.LoadImageUsingPaths works correctly.
"""


import os
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


@skipIfWindows  # The Windows platform doesn't implement DoLoadImage.
class LoadUsingPathsTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Make the hidden directory in the build hierarchy:
        lldbutil.mkdir_p(self.getBuildArtifact("hidden"))

        # Invoke the default build rule.
        self.build()

        ext = "so"
        if self.platformIsDarwin():
            ext = "dylib"
        self.lib_name = "libloadunload." + ext

        self.wd = os.path.realpath(self.getBuildDir())
        self.hidden_dir = os.path.join(self.wd, "hidden")
        self.hidden_lib = os.path.join(self.hidden_dir, self.lib_name)

    @skipIfRemote
    @skipIfWindows  # Windows doesn't have dlopen and friends, dynamic libraries work differently
    @expectedFlakeyNetBSD
    @expectedFailureAll(oslist=["linux"], archs=["arm"], bugnumber="llvm.org/pr45894")
    def test_load_using_paths(self):
        """Test that we can load a module by providing a set of search paths."""
        if self.platformIsDarwin():
            dylibName = "libloadunload_d.dylib"
        else:
            dylibName = "libloadunload_d.so"

        # The directory with the dynamic library we did not link to.
        path_dir = os.path.join(self.getBuildDir(), "hidden")

        (target, process, thread, _) = lldbutil.run_to_source_breakpoint(
            self, "Break here to do the load using paths", lldb.SBFileSpec("main.cpp")
        )
        error = lldb.SBError()
        lib_spec = lldb.SBFileSpec(self.lib_name)
        paths = lldb.SBStringList()
        paths.AppendString(self.wd)
        paths.AppendString(os.path.join(self.wd, "no_such_dir"))

        out_spec = lldb.SBFileSpec()

        # First try with no correct directories on the path, and make sure that doesn't blow up:
        token = process.LoadImageUsingPaths(lib_spec, paths, out_spec, error)
        self.assertEqual(
            token, lldb.LLDB_INVALID_IMAGE_TOKEN, "Only looked on the provided path."
        )
        # Make sure we got some error back in this case.  Since we don't actually know what
        # the error will look like, let's look for the absence of "unknown reasons".
        error_str = error.description
        self.assertNotEqual(len(error_str), 0, "Got an empty error string")
        self.assertNotIn(
            "unknown reasons", error_str, "Error string had unknown reasons"
        )

        # Now add the correct dir to the paths list and try again:
        paths.AppendString(self.hidden_dir)
        token = process.LoadImageUsingPaths(lib_spec, paths, out_spec, error)

        self.assertNotEqual(token, lldb.LLDB_INVALID_IMAGE_TOKEN, "Got a valid token")
        self.assertEqual(
            out_spec, lldb.SBFileSpec(self.hidden_lib), "Found the expected library"
        )

        # Make sure this really is in the image list:
        loaded_module = target.FindModule(out_spec)

        self.assertTrue(
            loaded_module.IsValid(), "The loaded module is in the image list."
        )

        # Now see that we can call a function in the loaded module.
        value = thread.frames[0].EvaluateExpression(
            "d_function()", lldb.SBExpressionOptions()
        )
        self.assertSuccess(value.GetError(), "Got a value from the expression")
        ret_val = value.GetValueAsSigned()
        self.assertEqual(ret_val, 12345, "Got the right value")

        # Make sure the token works to unload it:
        process.UnloadImage(token)

        # Make sure this really is no longer in the image list:
        loaded_module = target.FindModule(out_spec)

        self.assertFalse(
            loaded_module.IsValid(),
            "The unloaded module is no longer in the image list.",
        )

        # Make sure a relative path also works:
        paths.Clear()
        paths.AppendString(os.path.join(self.wd, "no_such_dir"))
        paths.AppendString(self.wd)
        relative_spec = lldb.SBFileSpec(os.path.join("hidden", self.lib_name))

        out_spec = lldb.SBFileSpec()
        token = process.LoadImageUsingPaths(relative_spec, paths, out_spec, error)

        self.assertNotEqual(
            token, lldb.LLDB_INVALID_IMAGE_TOKEN, "Got a valid token with relative path"
        )
        self.assertEqual(
            out_spec,
            lldb.SBFileSpec(self.hidden_lib),
            "Found the expected library with relative path",
        )

        process.UnloadImage(token)

        # Make sure the presence of an empty path doesn't mess anything up:
        paths.Clear()
        paths.AppendString("")
        paths.AppendString(os.path.join(self.wd, "no_such_dir"))
        paths.AppendString(self.wd)
        relative_spec = lldb.SBFileSpec(os.path.join("hidden", self.lib_name))

        out_spec = lldb.SBFileSpec()
        token = process.LoadImageUsingPaths(relative_spec, paths, out_spec, error)

        self.assertNotEqual(
            token,
            lldb.LLDB_INVALID_IMAGE_TOKEN,
            "Got a valid token with included empty path",
        )
        self.assertEqual(
            out_spec,
            lldb.SBFileSpec(self.hidden_lib),
            "Found the expected library with included empty path",
        )

        process.UnloadImage(token)

        # Finally, passing in an absolute path should work like the basename:
        # This should NOT work because we've taken hidden_dir off the paths:
        abs_spec = lldb.SBFileSpec(os.path.join(self.hidden_dir, self.lib_name))

        token = process.LoadImageUsingPaths(lib_spec, paths, out_spec, error)
        self.assertEqual(
            token, lldb.LLDB_INVALID_IMAGE_TOKEN, "Only looked on the provided path."
        )

        # But it should work when we add the dir:
        # Now add the correct dir to the paths list and try again:
        paths.AppendString(self.hidden_dir)
        token = process.LoadImageUsingPaths(lib_spec, paths, out_spec, error)

        self.assertNotEqual(token, lldb.LLDB_INVALID_IMAGE_TOKEN, "Got a valid token")
        self.assertEqual(
            out_spec, lldb.SBFileSpec(self.hidden_lib), "Found the expected library"
        )