"""Test the SBDModule APIs."""

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

import os, signal, subprocess


class SBModuleAPICase(TestBase):
    def setUp(self):
        TestBase.setUp(self)
        self.background_pid = None

    def tearDown(self):
        TestBase.tearDown(self)
        if self.background_pid:
            os.kill(self.background_pid, signal.SIGKILL)

    @skipUnlessDarwin
    @skipIfRemote
    def test_module_is_file_backed(self):
        """Test the SBModule::IsFileBacked() method"""
        self.build()
        target, _, _, _ = lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.c")
        )

        self.assertGreater(target.GetNumModules(), 0)
        main_module = target.GetModuleAtIndex(0)
        self.assertEqual(main_module.GetFileSpec().GetFilename(), "a.out")
        self.assertTrue(
            main_module.IsFileBacked(), "The module should be backed by a file on disk"
        )

        self.dbg.DeleteTarget(target)
        self.assertEqual(self.dbg.GetNumTargets(), 0)

        exe = self.getBuildArtifact("a.out")
        background_process = subprocess.Popen([exe])
        self.assertTrue(background_process, "process is not valid")
        self.background_pid = background_process.pid
        os.unlink(exe)

        target = self.dbg.CreateTarget("")
        self.assertEqual(self.dbg.GetNumTargets(), 1)
        error = lldb.SBError()
        process = target.AttachToProcessWithID(
            self.dbg.GetListener(), self.background_pid, error
        )
        self.assertTrue(error.Success() and process, PROCESS_IS_VALID)
        main_module = target.FindModule(lldb.SBFileSpec("a.out"))
        self.assertTrue(main_module is not None)
        self.assertFalse(
            main_module.IsFileBacked(),
            "The module should not be backed by a file on disk.",
        )

        error = process.Destroy()
        self.assertSuccess(
            error, "couldn't destroy process %s" % background_process.pid
        )
