1ff52ef33SMed Ismail Bennani"""Test the SBDModule APIs."""
2ff52ef33SMed Ismail Bennani
3ff52ef33SMed Ismail Bennaniimport lldb
4ff52ef33SMed Ismail Bennanifrom lldbsuite.test.decorators import *
5ff52ef33SMed Ismail Bennanifrom lldbsuite.test.lldbtest import *
6ff52ef33SMed Ismail Bennanifrom lldbsuite.test import lldbutil
7ff52ef33SMed Ismail Bennani
8ff52ef33SMed Ismail Bennaniimport os, signal, subprocess
9ff52ef33SMed Ismail Bennani
10ff52ef33SMed Ismail Bennaniclass SBModuleAPICase(TestBase):
11ff52ef33SMed Ismail Bennani
12ff52ef33SMed Ismail Bennani    def setUp(self):
13ff52ef33SMed Ismail Bennani        TestBase.setUp(self)
14ff52ef33SMed Ismail Bennani        self.background_pid = None
15ff52ef33SMed Ismail Bennani
16ff52ef33SMed Ismail Bennani    def tearDown(self):
17ff52ef33SMed Ismail Bennani        TestBase.tearDown(self)
18ff52ef33SMed Ismail Bennani        if self.background_pid:
19ff52ef33SMed Ismail Bennani            os.kill(self.background_pid, signal.SIGKILL)
20ff52ef33SMed Ismail Bennani
21aae3c4f2SMed Ismail Bennani    @skipUnlessDarwin
22*66b829acSJonas Devlieghere    @skipIfRemote
23ff52ef33SMed Ismail Bennani    def test_module_is_file_backed(self):
24ff52ef33SMed Ismail Bennani        """Test the SBModule::IsFileBacked() method"""
25ff52ef33SMed Ismail Bennani        self.build()
26ff52ef33SMed Ismail Bennani        target, _, _, _  = lldbutil.run_to_source_breakpoint(self, "// break here",
27ff52ef33SMed Ismail Bennani                                                    lldb.SBFileSpec("main.c"))
28ff52ef33SMed Ismail Bennani
29ff52ef33SMed Ismail Bennani        self.assertGreater(target.GetNumModules(), 0)
30ff52ef33SMed Ismail Bennani        main_module = target.GetModuleAtIndex(0)
31ff52ef33SMed Ismail Bennani        self.assertEqual(main_module.GetFileSpec().GetFilename(), "a.out")
32ff52ef33SMed Ismail Bennani        self.assertTrue(main_module.IsFileBacked(),
33ff52ef33SMed Ismail Bennani                         "The module should be backed by a file on disk")
34ff52ef33SMed Ismail Bennani
35ff52ef33SMed Ismail Bennani        self.dbg.DeleteTarget(target)
36ff52ef33SMed Ismail Bennani        self.assertEqual(self.dbg.GetNumTargets(), 0)
37ff52ef33SMed Ismail Bennani
38ff52ef33SMed Ismail Bennani        exe = self.getBuildArtifact("a.out")
39ff52ef33SMed Ismail Bennani        background_process = subprocess.Popen([exe])
40ff52ef33SMed Ismail Bennani        self.assertTrue(background_process, "process is not valid")
41ff52ef33SMed Ismail Bennani        self.background_pid = background_process.pid
42ff52ef33SMed Ismail Bennani        os.unlink(exe)
43ff52ef33SMed Ismail Bennani
44ff52ef33SMed Ismail Bennani        target = self.dbg.CreateTarget('')
45ff52ef33SMed Ismail Bennani        self.assertEqual(self.dbg.GetNumTargets(), 1)
46ff52ef33SMed Ismail Bennani        error = lldb.SBError()
47ff52ef33SMed Ismail Bennani        process = target.AttachToProcessWithID(self.dbg.GetListener(),
48ff52ef33SMed Ismail Bennani                                               self.background_pid, error)
49a6b56243SMed Ismail Bennani        self.assertTrue(error.Success() and process,  PROCESS_IS_VALID)
50ff52ef33SMed Ismail Bennani        main_module = target.GetModuleAtIndex(0)
51ff52ef33SMed Ismail Bennani        self.assertEqual(main_module.GetFileSpec().GetFilename(), "a.out")
52ff52ef33SMed Ismail Bennani        self.assertFalse(main_module.IsFileBacked(),
53ff52ef33SMed Ismail Bennani                         "The module should not be backed by a file on disk.")
54ff52ef33SMed Ismail Bennani
55a6b56243SMed Ismail Bennani        error = process.Destroy()
56779bbbf2SDave Lee        self.assertSuccess(error, "couldn't destroy process %s" % background_process.pid)
57ff52ef33SMed Ismail Bennani
58