"""
Test basics of mach core file debugging.
"""

from __future__ import print_function

import shutil
import struct

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


class MachCoreTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    mydir = TestBase.compute_mydir(__file__)

    def setUp(self):
        super(MachCoreTestCase, self).setUp()
        self._initial_platform = lldb.DBG.GetSelectedPlatform()

    def tearDown(self):
        lldb.DBG.SetSelectedPlatform(self._initial_platform)
        super(MachCoreTestCase, self).tearDown()

    @expectedFailureAll(bugnumber="llvm.org/pr37371", hostoslist=["windows"])
    def test_selected_thread(self):
        """Test that the right thread is selected after a core is loaded."""
        # Create core form YAML.
        self.yaml2obj("test.core.yaml", self.getBuildArtifact("test.core"))

        # Set debugger into synchronous mode
        self.dbg.SetAsync(False)

        # Create a target by the debugger.
        target = self.dbg.CreateTarget("")

        # Load OS plugin.
        python_os_plugin_path = os.path.join(self.getSourceDir(),
                                             'operating_system.py')
        command = "settings set target.process.python-os-plugin-path '{}'".format(
            python_os_plugin_path)
        self.dbg.HandleCommand(command)

        # Load core.
        process = target.LoadCore(self.getBuildArtifact("test.core"))
        self.assertTrue(process, PROCESS_IS_VALID)
        self.assertEqual(process.GetNumThreads(), 3)

        # Verify our OS plug-in threads showed up
        thread = process.GetThreadByID(0x111111111)
        self.assertTrue(thread.IsValid(
        ), "Make sure there is a thread 0x111111111 after we load the python OS plug-in"
                        )
        thread = process.GetThreadByID(0x222222222)
        self.assertTrue(thread.IsValid(
        ), "Make sure there is a thread 0x222222222 after we load the python OS plug-in"
                        )
        thread = process.GetThreadByID(0x333333333)
        self.assertTrue(thread.IsValid(
        ), "Make sure there is a thread 0x333333333 after we load the python OS plug-in"
                        )

        # Verify that the correct thread is selected
        thread = process.GetSelectedThread()
        self.assertEqual(thread.GetThreadID(), 0x333333333)
