xref: /llvm-project/lldb/test/API/python_api/sbplatform/TestLocateModuleCallback.py (revision 43b9d62018fe53278dfcd2c46f4937a1664745bd)
1f03dbdb7SKazuki Sakamoto"""
2f03dbdb7SKazuki SakamotoTest platform locate module callback functionality
3f03dbdb7SKazuki Sakamoto"""
4f03dbdb7SKazuki Sakamoto
5f03dbdb7SKazuki Sakamotoimport ctypes
6f03dbdb7SKazuki Sakamotofrom lldbsuite.test.decorators import *
7f03dbdb7SKazuki Sakamotofrom lldbsuite.test.lldbtest import *
8f03dbdb7SKazuki Sakamotofrom pathlib import Path
9f03dbdb7SKazuki Sakamoto
10f03dbdb7SKazuki Sakamotoimport lldb
11f03dbdb7SKazuki Sakamoto
12f03dbdb7SKazuki SakamotoUNITTESTS_TARGET_INPUTS_PATH = "../../../../unittests/Target/Inputs"
13f03dbdb7SKazuki SakamotoMODULE_PLATFORM_PATH = "/system/lib64/AndroidModule.so"
14f03dbdb7SKazuki SakamotoMODULE_TRIPLE = "aarch64-none-linux"
15f03dbdb7SKazuki SakamotoMODULE_RESOLVED_TRIPLE = "aarch64--linux-android"
16f03dbdb7SKazuki SakamotoMODULE_UUID = "80008338-82A0-51E5-5922-C905D23890DA-BDDEFECC"
17f03dbdb7SKazuki SakamotoMODULE_FUNCTION = "boom"
18f03dbdb7SKazuki SakamotoMODULE_HIDDEN_FUNCTION = "boom_hidden"
19f03dbdb7SKazuki SakamotoMODULE_FILE = "AndroidModule.so"
20f03dbdb7SKazuki SakamotoMODULE_NON_EXISTENT_FILE = "non-existent-file"
21f03dbdb7SKazuki SakamotoSYMBOL_FILE = "AndroidModule.unstripped.so"
22f03dbdb7SKazuki SakamotoBREAKPAD_SYMBOL_FILE = "AndroidModule.so.sym"
23f03dbdb7SKazuki SakamotoSYMBOL_STRIPPED = "stripped"
24f03dbdb7SKazuki SakamotoSYMBOL_UNSTRIPPED = "unstripped"
25f03dbdb7SKazuki Sakamoto
26f03dbdb7SKazuki Sakamoto
27f03dbdb7SKazuki Sakamotoclass LocateModuleCallbackTestCase(TestBase):
28f03dbdb7SKazuki Sakamoto    def setUp(self):
29f03dbdb7SKazuki Sakamoto        TestBase.setUp(self)
30f03dbdb7SKazuki Sakamoto        self.platform = self.dbg.GetSelectedPlatform()
31f03dbdb7SKazuki Sakamoto        self.target = self.dbg.CreateTarget("")
32f03dbdb7SKazuki Sakamoto        self.assertTrue(self.target)
33f03dbdb7SKazuki Sakamoto
34f03dbdb7SKazuki Sakamoto        self.input_dir = (
35f03dbdb7SKazuki Sakamoto            Path(self.getSourceDir()) / UNITTESTS_TARGET_INPUTS_PATH
36f03dbdb7SKazuki Sakamoto        ).resolve()
37f03dbdb7SKazuki Sakamoto        self.assertTrue(self.input_dir.is_dir())
38f03dbdb7SKazuki Sakamoto
39f03dbdb7SKazuki Sakamoto    def check_module_spec(self, module_spec: lldb.SBModuleSpec):
40f03dbdb7SKazuki Sakamoto        self.assertEqual(
41f03dbdb7SKazuki Sakamoto            MODULE_UUID.replace("-", ""),
42f03dbdb7SKazuki Sakamoto            ctypes.string_at(
43f03dbdb7SKazuki Sakamoto                int(module_spec.GetUUIDBytes()),
44f03dbdb7SKazuki Sakamoto                module_spec.GetUUIDLength(),
45f03dbdb7SKazuki Sakamoto            )
46f03dbdb7SKazuki Sakamoto            .hex()
47f03dbdb7SKazuki Sakamoto            .upper(),
48f03dbdb7SKazuki Sakamoto        )
49f03dbdb7SKazuki Sakamoto
50f03dbdb7SKazuki Sakamoto        self.assertEqual(MODULE_TRIPLE, module_spec.GetTriple())
51f03dbdb7SKazuki Sakamoto
52*43b9d620SKazuki Sakamoto        self.assertEqual(
53*43b9d620SKazuki Sakamoto            MODULE_PLATFORM_PATH, Path(module_spec.GetFileSpec().fullpath).as_posix()
54*43b9d620SKazuki Sakamoto        )
55f03dbdb7SKazuki Sakamoto
56f03dbdb7SKazuki Sakamoto    def check_module(self, module: lldb.SBModule, symbol_file: str, symbol_kind: str):
57f03dbdb7SKazuki Sakamoto        self.assertTrue(module.IsValid())
58f03dbdb7SKazuki Sakamoto
59f03dbdb7SKazuki Sakamoto        self.assertEqual(
60f03dbdb7SKazuki Sakamoto            MODULE_UUID,
61f03dbdb7SKazuki Sakamoto            module.GetUUIDString(),
62f03dbdb7SKazuki Sakamoto        )
63f03dbdb7SKazuki Sakamoto
64f03dbdb7SKazuki Sakamoto        self.assertEqual(MODULE_RESOLVED_TRIPLE, module.GetTriple())
65f03dbdb7SKazuki Sakamoto
66f03dbdb7SKazuki Sakamoto        self.assertEqual(
67*43b9d620SKazuki Sakamoto            MODULE_PLATFORM_PATH, Path(module.GetPlatformFileSpec().fullpath).as_posix()
68f03dbdb7SKazuki Sakamoto        )
69f03dbdb7SKazuki Sakamoto
70*43b9d620SKazuki Sakamoto        self.assertTrue(
71*43b9d620SKazuki Sakamoto            (self.input_dir / MODULE_FILE)
72*43b9d620SKazuki Sakamoto            .resolve()
73*43b9d620SKazuki Sakamoto            .samefile(Path(module.GetFileSpec().fullpath).resolve())
74*43b9d620SKazuki Sakamoto        )
75*43b9d620SKazuki Sakamoto
76*43b9d620SKazuki Sakamoto        self.assertTrue(
77*43b9d620SKazuki Sakamoto            (self.input_dir / symbol_file)
78*43b9d620SKazuki Sakamoto            .resolve()
79*43b9d620SKazuki Sakamoto            .samefile(Path(module.GetSymbolFileSpec().fullpath).resolve())
80f03dbdb7SKazuki Sakamoto        )
81f03dbdb7SKazuki Sakamoto
82f03dbdb7SKazuki Sakamoto        sc_list = module.FindFunctions(MODULE_FUNCTION, lldb.eSymbolTypeCode)
83f03dbdb7SKazuki Sakamoto        self.assertEqual(1, sc_list.GetSize())
84f03dbdb7SKazuki Sakamoto        sc_list = module.FindFunctions(MODULE_HIDDEN_FUNCTION, lldb.eSymbolTypeCode)
85f03dbdb7SKazuki Sakamoto        self.assertEqual(0 if symbol_kind == SYMBOL_STRIPPED else 1, sc_list.GetSize())
86f03dbdb7SKazuki Sakamoto
87f03dbdb7SKazuki Sakamoto    def test_set_non_callable(self):
88f03dbdb7SKazuki Sakamoto        # The callback should be callable.
89f03dbdb7SKazuki Sakamoto        non_callable = "a"
90f03dbdb7SKazuki Sakamoto
91f03dbdb7SKazuki Sakamoto        with self.assertRaises(TypeError, msg="Need a callable object or None!"):
92f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(non_callable)
93f03dbdb7SKazuki Sakamoto
94f03dbdb7SKazuki Sakamoto    def test_set_wrong_args(self):
95f03dbdb7SKazuki Sakamoto        # The callback should accept 3 argument.
96f03dbdb7SKazuki Sakamoto        def test_args2(a, b):
97f03dbdb7SKazuki Sakamoto            pass
98f03dbdb7SKazuki Sakamoto
99f03dbdb7SKazuki Sakamoto        with self.assertRaises(TypeError, msg="Expected 3 argument callable object"):
100f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(test_args2)
101f03dbdb7SKazuki Sakamoto
102f03dbdb7SKazuki Sakamoto    def test_default(self):
103f03dbdb7SKazuki Sakamoto        # The default behavior is to locate the module with LLDB implementation
104f03dbdb7SKazuki Sakamoto        # and AddModule should fail.
105f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
106f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
107f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
108f03dbdb7SKazuki Sakamoto            MODULE_UUID,
109f03dbdb7SKazuki Sakamoto        )
110f03dbdb7SKazuki Sakamoto
111f03dbdb7SKazuki Sakamoto        self.assertFalse(module)
112f03dbdb7SKazuki Sakamoto
113f03dbdb7SKazuki Sakamoto    def test_set_none(self):
114f03dbdb7SKazuki Sakamoto        # SetLocateModuleCallback should succeed to clear the callback with None.
115f03dbdb7SKazuki Sakamoto        # and AddModule should fail.
116f03dbdb7SKazuki Sakamoto        self.assertTrue(self.platform.SetLocateModuleCallback(None).Success())
117f03dbdb7SKazuki Sakamoto
118f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
119f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
120f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
121f03dbdb7SKazuki Sakamoto            MODULE_UUID,
122f03dbdb7SKazuki Sakamoto        )
123f03dbdb7SKazuki Sakamoto
124f03dbdb7SKazuki Sakamoto        self.assertFalse(module)
125f03dbdb7SKazuki Sakamoto
126f03dbdb7SKazuki Sakamoto    def test_return_error(self):
127f03dbdb7SKazuki Sakamoto        # The callback fails, AddModule should fail.
128f03dbdb7SKazuki Sakamoto        def test_locate_module(
129f03dbdb7SKazuki Sakamoto            module_spec: lldb.SBModuleSpec,
130f03dbdb7SKazuki Sakamoto            module_file_spec: lldb.SBFileSpec,
131f03dbdb7SKazuki Sakamoto            symbol_file_spec: lldb.SBFileSpec,
132f03dbdb7SKazuki Sakamoto        ):
133f03dbdb7SKazuki Sakamoto            self.check_module_spec(module_spec)
134f03dbdb7SKazuki Sakamoto            return lldb.SBError("locate module callback failed")
135f03dbdb7SKazuki Sakamoto
136f03dbdb7SKazuki Sakamoto        self.assertTrue(
137f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(test_locate_module).Success()
138f03dbdb7SKazuki Sakamoto        )
139f03dbdb7SKazuki Sakamoto
140f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
141f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
142f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
143f03dbdb7SKazuki Sakamoto            MODULE_UUID,
144f03dbdb7SKazuki Sakamoto        )
145f03dbdb7SKazuki Sakamoto
146f03dbdb7SKazuki Sakamoto        self.assertFalse(module)
147f03dbdb7SKazuki Sakamoto
148f03dbdb7SKazuki Sakamoto    def test_return_no_files(self):
149f03dbdb7SKazuki Sakamoto        # The callback succeeds but not return any files, AddModule should fail.
150f03dbdb7SKazuki Sakamoto        def test_locate_module(
151f03dbdb7SKazuki Sakamoto            module_spec: lldb.SBModuleSpec,
152f03dbdb7SKazuki Sakamoto            module_file_spec: lldb.SBFileSpec,
153f03dbdb7SKazuki Sakamoto            symbol_file_spec: lldb.SBFileSpec,
154f03dbdb7SKazuki Sakamoto        ):
155f03dbdb7SKazuki Sakamoto            self.check_module_spec(module_spec)
156f03dbdb7SKazuki Sakamoto            return lldb.SBError()
157f03dbdb7SKazuki Sakamoto
158f03dbdb7SKazuki Sakamoto        self.assertTrue(
159f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(test_locate_module).Success()
160f03dbdb7SKazuki Sakamoto        )
161f03dbdb7SKazuki Sakamoto
162f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
163f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
164f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
165f03dbdb7SKazuki Sakamoto            MODULE_UUID,
166f03dbdb7SKazuki Sakamoto        )
167f03dbdb7SKazuki Sakamoto
168f03dbdb7SKazuki Sakamoto        self.assertFalse(module)
169f03dbdb7SKazuki Sakamoto
170f03dbdb7SKazuki Sakamoto    def test_return_non_existent_module(self):
171f03dbdb7SKazuki Sakamoto        # The callback returns non-existent module file, AddModule should fail.
172f03dbdb7SKazuki Sakamoto        def test_locate_module(
173f03dbdb7SKazuki Sakamoto            module_spec: lldb.SBModuleSpec,
174f03dbdb7SKazuki Sakamoto            module_file_spec: lldb.SBFileSpec,
175f03dbdb7SKazuki Sakamoto            symbol_file_spec: lldb.SBFileSpec,
176f03dbdb7SKazuki Sakamoto        ):
177f03dbdb7SKazuki Sakamoto            self.check_module_spec(module_spec)
178f03dbdb7SKazuki Sakamoto
179f03dbdb7SKazuki Sakamoto            module_file_spec.SetDirectory(str(self.input_dir))
180f03dbdb7SKazuki Sakamoto            module_file_spec.SetFilename(MODULE_NON_EXISTENT_FILE)
181f03dbdb7SKazuki Sakamoto
182f03dbdb7SKazuki Sakamoto            return lldb.SBError()
183f03dbdb7SKazuki Sakamoto
184f03dbdb7SKazuki Sakamoto        self.assertTrue(
185f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(test_locate_module).Success()
186f03dbdb7SKazuki Sakamoto        )
187f03dbdb7SKazuki Sakamoto
188f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
189f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
190f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
191f03dbdb7SKazuki Sakamoto            MODULE_UUID,
192f03dbdb7SKazuki Sakamoto        )
193f03dbdb7SKazuki Sakamoto
194f03dbdb7SKazuki Sakamoto        self.assertFalse(module)
195f03dbdb7SKazuki Sakamoto
196f03dbdb7SKazuki Sakamoto    def test_return_module_with_non_existent_symbol(self):
197f03dbdb7SKazuki Sakamoto        # The callback returns a module and non-existent symbol file,
198f03dbdb7SKazuki Sakamoto        # AddModule should fail.
199f03dbdb7SKazuki Sakamoto        def test_locate_module(
200f03dbdb7SKazuki Sakamoto            module_spec: lldb.SBModuleSpec,
201f03dbdb7SKazuki Sakamoto            module_file_spec: lldb.SBFileSpec,
202f03dbdb7SKazuki Sakamoto            symbol_file_spec: lldb.SBFileSpec,
203f03dbdb7SKazuki Sakamoto        ):
204f03dbdb7SKazuki Sakamoto            self.check_module_spec(module_spec)
205f03dbdb7SKazuki Sakamoto
206f03dbdb7SKazuki Sakamoto            module_file_spec.SetDirectory(str(self.input_dir))
207f03dbdb7SKazuki Sakamoto            module_file_spec.SetFilename(MODULE_FILE)
208f03dbdb7SKazuki Sakamoto
209f03dbdb7SKazuki Sakamoto            symbol_file_spec.SetDirectory(str(self.input_dir))
210f03dbdb7SKazuki Sakamoto            symbol_file_spec.SetFilename(MODULE_NON_EXISTENT_FILE)
211f03dbdb7SKazuki Sakamoto
212f03dbdb7SKazuki Sakamoto            return lldb.SBError()
213f03dbdb7SKazuki Sakamoto
214f03dbdb7SKazuki Sakamoto        self.assertTrue(
215f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(test_locate_module).Success()
216f03dbdb7SKazuki Sakamoto        )
217f03dbdb7SKazuki Sakamoto
218f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
219f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
220f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
221f03dbdb7SKazuki Sakamoto            MODULE_UUID,
222f03dbdb7SKazuki Sakamoto        )
223f03dbdb7SKazuki Sakamoto
224f03dbdb7SKazuki Sakamoto        self.assertFalse(module)
225f03dbdb7SKazuki Sakamoto
226f03dbdb7SKazuki Sakamoto    def test_return_non_existent_symbol(self):
227f03dbdb7SKazuki Sakamoto        # The callback returns non-existent symbol file, AddModule should fail.
228f03dbdb7SKazuki Sakamoto        def test_locate_module(
229f03dbdb7SKazuki Sakamoto            module_spec: lldb.SBModuleSpec,
230f03dbdb7SKazuki Sakamoto            module_file_spec: lldb.SBFileSpec,
231f03dbdb7SKazuki Sakamoto            symbol_file_spec: lldb.SBFileSpec,
232f03dbdb7SKazuki Sakamoto        ):
233f03dbdb7SKazuki Sakamoto            self.check_module_spec(module_spec)
234f03dbdb7SKazuki Sakamoto
235f03dbdb7SKazuki Sakamoto            symbol_file_spec.SetDirectory(str(self.input_dir))
236f03dbdb7SKazuki Sakamoto            symbol_file_spec.SetFilename(MODULE_NON_EXISTENT_FILE)
237f03dbdb7SKazuki Sakamoto
238f03dbdb7SKazuki Sakamoto            return lldb.SBError()
239f03dbdb7SKazuki Sakamoto
240f03dbdb7SKazuki Sakamoto        self.assertTrue(
241f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(test_locate_module).Success()
242f03dbdb7SKazuki Sakamoto        )
243f03dbdb7SKazuki Sakamoto
244f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
245f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
246f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
247f03dbdb7SKazuki Sakamoto            MODULE_UUID,
248f03dbdb7SKazuki Sakamoto        )
249f03dbdb7SKazuki Sakamoto
250f03dbdb7SKazuki Sakamoto        self.assertFalse(module)
251f03dbdb7SKazuki Sakamoto
252f03dbdb7SKazuki Sakamoto    def test_return_module(self):
253f03dbdb7SKazuki Sakamoto        # The callback returns the module file, AddModule should succeed.
254f03dbdb7SKazuki Sakamoto        def test_locate_module(
255f03dbdb7SKazuki Sakamoto            module_spec: lldb.SBModuleSpec,
256f03dbdb7SKazuki Sakamoto            module_file_spec: lldb.SBFileSpec,
257f03dbdb7SKazuki Sakamoto            symbol_file_spec: lldb.SBFileSpec,
258f03dbdb7SKazuki Sakamoto        ):
259f03dbdb7SKazuki Sakamoto            self.check_module_spec(module_spec)
260f03dbdb7SKazuki Sakamoto
261f03dbdb7SKazuki Sakamoto            module_file_spec.SetDirectory(str(self.input_dir))
262f03dbdb7SKazuki Sakamoto            module_file_spec.SetFilename(MODULE_FILE)
263f03dbdb7SKazuki Sakamoto
264f03dbdb7SKazuki Sakamoto            return lldb.SBError()
265f03dbdb7SKazuki Sakamoto
266f03dbdb7SKazuki Sakamoto        self.assertTrue(
267f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(test_locate_module).Success()
268f03dbdb7SKazuki Sakamoto        )
269f03dbdb7SKazuki Sakamoto
270f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
271f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
272f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
273f03dbdb7SKazuki Sakamoto            MODULE_UUID,
274f03dbdb7SKazuki Sakamoto        )
275f03dbdb7SKazuki Sakamoto
276f03dbdb7SKazuki Sakamoto        self.check_module(
277f03dbdb7SKazuki Sakamoto            module=module, symbol_file=MODULE_FILE, symbol_kind=SYMBOL_STRIPPED
278f03dbdb7SKazuki Sakamoto        )
279f03dbdb7SKazuki Sakamoto
280f03dbdb7SKazuki Sakamoto    def test_return_module_with_symbol(self):
281f03dbdb7SKazuki Sakamoto        # The callback returns the module file and the symbol file,
282f03dbdb7SKazuki Sakamoto        # AddModule should succeed.
283f03dbdb7SKazuki Sakamoto        def test_locate_module(
284f03dbdb7SKazuki Sakamoto            module_spec: lldb.SBModuleSpec,
285f03dbdb7SKazuki Sakamoto            module_file_spec: lldb.SBFileSpec,
286f03dbdb7SKazuki Sakamoto            symbol_file_spec: lldb.SBFileSpec,
287f03dbdb7SKazuki Sakamoto        ):
288f03dbdb7SKazuki Sakamoto            self.check_module_spec(module_spec)
289f03dbdb7SKazuki Sakamoto
290f03dbdb7SKazuki Sakamoto            module_file_spec.SetDirectory(str(self.input_dir))
291f03dbdb7SKazuki Sakamoto            module_file_spec.SetFilename(MODULE_FILE)
292f03dbdb7SKazuki Sakamoto
293f03dbdb7SKazuki Sakamoto            symbol_file_spec.SetDirectory(str(self.input_dir))
294f03dbdb7SKazuki Sakamoto            symbol_file_spec.SetFilename(SYMBOL_FILE)
295f03dbdb7SKazuki Sakamoto
296f03dbdb7SKazuki Sakamoto            return lldb.SBError()
297f03dbdb7SKazuki Sakamoto
298f03dbdb7SKazuki Sakamoto        self.assertTrue(
299f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(test_locate_module).Success()
300f03dbdb7SKazuki Sakamoto        )
301f03dbdb7SKazuki Sakamoto
302f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
303f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
304f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
305f03dbdb7SKazuki Sakamoto            MODULE_UUID,
306f03dbdb7SKazuki Sakamoto        )
307f03dbdb7SKazuki Sakamoto
308f03dbdb7SKazuki Sakamoto        self.check_module(
309f03dbdb7SKazuki Sakamoto            module=module, symbol_file=SYMBOL_FILE, symbol_kind=SYMBOL_UNSTRIPPED
310f03dbdb7SKazuki Sakamoto        )
311f03dbdb7SKazuki Sakamoto
312f03dbdb7SKazuki Sakamoto    def test_return_module_with_breakpad_symbol(self):
313f03dbdb7SKazuki Sakamoto        # The callback returns the module file and the breakpad symbol file,
314f03dbdb7SKazuki Sakamoto        # AddModule should succeed.
315f03dbdb7SKazuki Sakamoto        def test_locate_module(
316f03dbdb7SKazuki Sakamoto            module_spec: lldb.SBModuleSpec,
317f03dbdb7SKazuki Sakamoto            module_file_spec: lldb.SBFileSpec,
318f03dbdb7SKazuki Sakamoto            symbol_file_spec: lldb.SBFileSpec,
319f03dbdb7SKazuki Sakamoto        ):
320f03dbdb7SKazuki Sakamoto            self.check_module_spec(module_spec)
321f03dbdb7SKazuki Sakamoto
322f03dbdb7SKazuki Sakamoto            module_file_spec.SetDirectory(str(self.input_dir))
323f03dbdb7SKazuki Sakamoto            module_file_spec.SetFilename(MODULE_FILE)
324f03dbdb7SKazuki Sakamoto
325f03dbdb7SKazuki Sakamoto            symbol_file_spec.SetDirectory(str(self.input_dir))
326f03dbdb7SKazuki Sakamoto            symbol_file_spec.SetFilename(BREAKPAD_SYMBOL_FILE)
327f03dbdb7SKazuki Sakamoto
328f03dbdb7SKazuki Sakamoto            return lldb.SBError()
329f03dbdb7SKazuki Sakamoto
330f03dbdb7SKazuki Sakamoto        self.assertTrue(
331f03dbdb7SKazuki Sakamoto            self.platform.SetLocateModuleCallback(test_locate_module).Success()
332f03dbdb7SKazuki Sakamoto        )
333f03dbdb7SKazuki Sakamoto
334f03dbdb7SKazuki Sakamoto        module = self.target.AddModule(
335f03dbdb7SKazuki Sakamoto            MODULE_PLATFORM_PATH,
336f03dbdb7SKazuki Sakamoto            MODULE_TRIPLE,
337f03dbdb7SKazuki Sakamoto            MODULE_UUID,
338f03dbdb7SKazuki Sakamoto        )
339f03dbdb7SKazuki Sakamoto
340f03dbdb7SKazuki Sakamoto        self.check_module(
341f03dbdb7SKazuki Sakamoto            module=module,
342f03dbdb7SKazuki Sakamoto            symbol_file=BREAKPAD_SYMBOL_FILE,
343f03dbdb7SKazuki Sakamoto            symbol_kind=SYMBOL_UNSTRIPPED,
344f03dbdb7SKazuki Sakamoto        )
345